diff --git a/chapter_computational_graph/Schedule_of_computational_graph.md b/chapter_computational_graph/schedule_of_computational_graph.md
similarity index 100%
rename from chapter_computational_graph/Schedule_of_computational_graph.md
rename to chapter_computational_graph/schedule_of_computational_graph.md
diff --git a/chapter_introduction/applicable_readers.md b/chapter_introduction/applicable_readers.md
new file mode 100644
index 0000000..ace0a2a
--- /dev/null
+++ b/chapter_introduction/applicable_readers.md
@@ -0,0 +1,13 @@
+## 适用读者
+
+本书由浅入深地讨论了机器学习系统的设计原理和实现。本书的常见读者包括:
+
+- **学生:**
+ 随着大量机器学习课程在大学中的普及,学生已经开始掌握大量机器学习的基础理论和神经网络的实现。然而,需要训练出可以实际应用的机器学习模型,需要对现代机器学习系统有充分的认识。
+
+- **科研人员:**
+ 研发新型的机器学习模型不仅仅需要会使用基础的机器学习系统接口。同时,新型的模型往往需要给系统提供新的自定义算子(Custom
+ Operators),又或者是会利用高级的分布式执行算子来实现大模型的开发。这一系列需求都需要对底层系统具有充分认识。
+
+- **开发人员:**
+ 大量的数据和AI驱动的公司都部署了机器学习基础设施。这一设施的核心就是机器学习系统。因此了解机器学习系统有助于开发人员对于系统性能调优,以定位问题,并且根据业务需求对机器学习系统进行深度定制。
\ No newline at end of file
diff --git a/chapter_introduction/components_of_machine_learning_systems.md b/chapter_introduction/components_of_machine_learning_systems.md
new file mode 100644
index 0000000..a4f2a40
--- /dev/null
+++ b/chapter_introduction/components_of_machine_learning_systems.md
@@ -0,0 +1,35 @@
+## 机器学习系统基本组成
+
+为了达到上述设计目标,一个现代的机器学习框架往往具有如图1.3.1所示的基本架构。
+
+
+:width:`600px`
+:label:`framework_architecture`
+
+- **编程接口:** 一个机器学习框架面向用户的编程接口(Programming
+ interface)需要特殊设计。编程接口提供简单易用的编程函数(往往是PyThon)从而让用户定义出各式各样的神经网络和相关的训练过程。同时,编程接口要兼顾性能:神经网络的执行可以调用硬件相关C和C++函数(许多加速器和操作系统的编程接口)。该部分的内容将在第2章展开。
+
+- **计算图:**
+ 用户定义的机器学习程序往往会表达成一个计算图(Computational
+ graph)。这个计算图使得用户并行计算和异步执行得以实现。该部分内容将在第3章展开。
+
+- **计算加速器:**
+ 现代计算加速器提供了丰富的编程接口让应用来优化其相关性能。而如何高效使用计算加速器是许多机器学习框架的核心。我们将在第4章中讨论加速器的加速原理和相关使用技巧。
+
+- **编译器前端:**
+ 在将计算图发送到加速器执行之前,机器学习框架往往会对计算图做一系列硬件无关的一系列优化,这一过程被称之为:编译器前端。其中核心步骤是对用户定义的神经网络训练实现自动微分。在此期间,计算图会被表示为中间表达(Intermediate
+ Representation),并同时应用类型系统和静态分析等一系列技术。我们将在第5章中讨论相关内容。
+
+- **编译器后端:**
+ 编译器前端生成的中间表达可以进一步针对硬件的特性(例如说,L2/L3大小,指令流水线长度)进行性能优化,硬件算子选择,内存分配。这一以硬件为核心的编译过程被称为:编译器后端,该部分内容将在第6章中讨论。
+
+- **数据处理:**
+ 机器学习框架会集成多种数据管理模块。其中包括数据预处理模块,模型参数checkpoint,模型可视化和训练结果可视化等。该部分内容将在第7章中讨论。
+
+- **模型部署:**
+ 在模型完成训练后,用乎需要对模型进行部署。该过程中,我们会根据部署硬件的特点进行模型格式的转换,针对硬件特性进行推理性能优化。同时,移动硬件往往具有小内存的特点。因此大量的模型压缩技术也在部署中得到应用。这些相关内容将在第8章中讨论。
+
+- **分布式训练:**
+ 当模型的训练需要大量内存和算力的时候,机器学习框架会提供原生的分布式执行编程接口。分布式机器学习系统已经在工业界得到大量的部署。相关内容会在第9章讨论。
+
+除了上述核心组件以外,机器学习系统作为一个依然高速发展的前沿学科,还有大量的问题正在被密集研究,相关的前沿问题将在本书的第10章中展开讨论。另外,机器学习算法相关的理论知识是本书的预备知识,本书不做深入讨论。基础的机器学习理论知识可以在附录中找到。
\ No newline at end of file
diff --git a/chapter_introduction/index.md b/chapter_introduction/index.md
index 646aa03..f406715 100644
--- a/chapter_introduction/index.md
+++ b/chapter_introduction/index.md
@@ -1,14 +1,14 @@
# 导论
-本书试图全面地讲解机器学习系统的设计和实现,从而帮助学生,工程师和科研人员理解机器学习系统背后的原理,并且可以根据自身需求改进和构建机器学习系统。
+本章第一部分首先介绍机器学习的概貌,以及其在系统角度的共性问题。
+本章第二部分介绍系统设计的需求和目标,让读者从宏观上来了解系统需要满足的内容,对系统设计的主要用例、设计规格有一个清晰的了解。
+本章最后部分介绍机器学习系统的组成原理,让读者对系统整体的实现有一个初步的、宏观的理解。
-## 机器学习应用
+```toc
+:maxdepth: 2
-通俗来讲,机器学习是指从数据中学习出有用知识的计算技术。从处理的数据类型和学习模式来说,机器学习可以分为监督学习(Supervised Learning)、无监督学习(Unsupervised Learning)、强化学习(Reinforcement Learning)等等。监督学习是已知输入输出对应关系情况下的学习,比如给定输入图像和它对应的内容标签,则学习图像分类(Classification);而无监督学习是只有输入数据但不知道输出标签情况下的学习,比如:给定一堆猫和狗的图像,自主学会猫和狗的分类,这种无监督分类也称为聚类(Clustering);强化学习则是给定一个学习环境和任务目标,算法自主地去不断尝试、改进自己、以实现任务目标。比如AlphaGo围棋就是用强化学习实现的,给定的环境是围棋的规则、而目标则是胜利得分。
-
-从应用领域上划分,主要可以包括计算机视觉、自然语言处理和智能决策这三大部分,而且这三大部分之间也有很多交集。
-狭义上来讲基于图像的应用都可归为计算机视觉方面的应用,典型的应用有人脸识别、物体识别、目标跟踪、人体姿态估计、以及图像的理解、修复、分割与检测等等。
-计算机视觉方法广泛应用于自动驾驶、智慧城市、智慧安防等领域。
-自然语言处理涉及文本或者语音方面的应用,典型的应用包括语言翻译、文本转语音、语音转文本、以及文本理解、分类、风格变换与纠错等等。
-计算机视觉和自然语言处理有很多交集,例如图像的文本描述生成、基于文本的图像生成、基于文本的图像处理等应用都同时涉及到了语言和图像两种数据类型。
-智能决策方面,往往通过结合计算机视觉、自然语言处理、强化学习、控制论等技术手段,实现决策类任务,广泛用于机器人、自动驾驶、游戏、推荐系统、智能工厂、智能电网等领域。
\ No newline at end of file
+machine_learning_applications
+requirements_for_machine_learning_systems
+components_of_machine_learning_systems
+applicable_readers
+```
\ No newline at end of file
diff --git a/chapter_introduction/machine_learning_applications.md b/chapter_introduction/machine_learning_applications.md
new file mode 100644
index 0000000..d82caed
--- /dev/null
+++ b/chapter_introduction/machine_learning_applications.md
@@ -0,0 +1,19 @@
+## 机器学习应用
+
+通俗来讲,机器学习是指从数据中学习出有用知识的计算技术。从处理的数据类型和学习模式来说,机器学习可以分为监督学习(Supervised
+Learning)、无监督学习(Unsupervised Learning)、强化学习(Reinforcement
+Learning)等等。监督学习是已知输入输出对应关系情况下的学习,比如给定输入图像和它对应的内容标签,则学习图像分类(Classification);而无监督学习是只有输入数据但不知道输出标签情况下的学习,比如:给定一堆猫和狗的图像,自主学会猫和狗的分类,这种无监督分类也称为聚类(Clustering);强化学习则是给定一个学习环境和任务目标,算法自主地去不断尝试、改进自己、以实现任务目标。比如AlphaGo围棋就是用强化学习实现的,给定的环境是围棋的规则、而目标则是胜利得分。
+
+从应用领域上划分,主要可以包括计算机视觉、自然语言处理和智能决策这三大部分,而且这三大部分之间也有很多交集。
+狭义上来讲基于图像的应用都可归为计算机视觉方面的应用,典型的应用有人脸识别、物体识别、目标跟踪、人体姿态估计、以及图像的理解、修复、分割与检测等等。
+计算机视觉方法广泛应用于自动驾驶、智慧城市、智慧安防等领域。
+自然语言处理涉及文本或者语音方面的应用,典型的应用包括语言翻译、文本转语音、语音转文本、以及文本理解、分类、风格变换与纠错等等。
+计算机视觉和自然语言处理有很多交集,例如图像的文本描述生成、基于文本的图像生成、基于文本的图像处理等应用都同时涉及到了语言和图像两种数据类型。
+智能决策方面,往往通过结合计算机视觉、自然语言处理、强化学习、控制论等技术手段,实现决策类任务,广泛用于机器人、自动驾驶、游戏、推荐系统、智能工厂、智能电网等领域。
+
+经典的机器学习算法有支持向量机(Support Vector
+Machine,SVM)、逻辑回归(Logistic Regression)、朴素贝叶斯(Naive
+Bayes)
+等方法。然而得力于大数据互联网和计算机性能的提升,以深度学习(Deep
+Learning)为代表的方法得到了广泛的研究和应用。
+虽然机器学习算法很多,但无论是经典算法还是深度学习算法的计算往往以向量、矩阵运算为主体的,因此本书主要通过深度神经网络为例子展开机器学习系统的介绍。下面我们来快速了解一下机器学习系统的设计需求、目标、以及其组成原理。
\ No newline at end of file
diff --git a/chapter_introduction/requirements_for_machine_learning_systems.md b/chapter_introduction/requirements_for_machine_learning_systems.md
new file mode 100644
index 0000000..713b42e
--- /dev/null
+++ b/chapter_introduction/requirements_for_machine_learning_systems.md
@@ -0,0 +1,42 @@
+## 机器学习系统的需求
+
+:width:`600px`
+:label:`framework_position`
+
+为了支持日益增长的机器学习应用,开发者普遍需要一个新型的系统软件:机器学习框架(如图1.2.1所示)。这种框架一方面可以帮助用户进行高效的开发,另一方面使得机器学习模型的训练和部署可以高效使用通用处理器和计算加速器。在设计机器学习框架的过程,人们总结出了以下几个设计需求:
+
+- **支持多种神经网络:**
+ 深度学习的崛起使得神经网络成为了大量机器学习应用的核心。不同的应用具有多种数据形态和机器学习的目标,因此人们设计出了大量不同的神经网络,例如,卷积神经网络(Convolutional
+ Neural Networks),图神经网络(Graph Neural
+ Networks),自注意力神经网络(Self-attention Neural
+ Networks)等等。人们需要一个统一的框架来开发各种各种的神经网络。
+
+- **支持自动微分:**
+ 神经网络模型的的一个核心优点是:其可以利用数据、标注(Label)和目标损失函数(Loss
+ Function)来自动计算计算梯度(Gradients),以实现机器学习模型的参数更新。一套神经网络模型可以应用在不同的数据场景中。为了实现这个目标,人们希望机器学习框架可以对任意神经网络自动化地计算出梯度。
+
+- **支持数据管理和处理:**
+ 机器学习的核心是数据,这其中不仅包括训练、评估和测试数据集,还包括训练后产生的模型参数(Checkpoint),以及训练过程中产生的调试数据(Debugging
+ Data)。为了方便这些数据快速导入机器学习框架,我们需要框架本身支持不同类型的数据,以及进行高效的数据处理(如:数据增强和数据清洗)。
+
+- **支持模型的训练和部署:**
+ 为了让机器学习模型达到最佳的性能,人们需要使用各种优化方法(例如Mini-Batch
+ SGD和其变种)来迭代计算梯度,最终模型的性能达到令开发者满意的状态(该过程称为训练)。同时,根据应用的要求,训练好的模型也需要部署到各种计算设备中,以提供模型推理服务(Inference)。
+
+- **高效使用计算加速器:**
+ 神经网络的相关计算可以被表达成矩阵计算,而这一类计算可以被计算加速器(如GPU)极大地加速。因此,机器学习框架需要具备高效利用加速器的能力。
+
+- **分布式计算:**
+ 随着数据量的增大和应用的复杂度上升,人们正设计出与之相对应的大型深度神经网络。这一类神经网络往往需要大量的内存来存储参数。同时它们也需要大量的加速器从而实现计算的加速。因此,机器学习框架需要具备分布式执行的能力。
+
+在设计机器学习系统之初,开发者曾尝试通过传统的**神经网络开发库**(如Theano和Caffe)、以及**大数据计算框架**(如Apache
+Spark和Google
+Pregel)等方式来达到以上设计目标。可是他们发现(如表1.2.1机器学习框架和相关系统的比较所示),
+神经网络库虽然提供了神经网络开发、自动微分和加速器的支持,但是其缺乏管理和处理大型数据集、模型部署和分布式执行的能力,使得其无法满足产品级机器学习应用的开发。
+此外,虽然大数据计算框架具有成熟的分布式执行和数据管理能力,但是其缺乏对神经网络、自动微分和加速器的支持,使得其并不适合开发以神经网络为核心的机器学习应用。因此,业界从头设计出了包括MindSpore、PaddlePaddle、TensorFlow,PyTorch等一系列机器学习框架。
+
+| | 神经网络 | 自动微分 | 数据管理和处理 | 训练和部署 | 加速器 | 分布式 |
+|:-: |:-:| :-: |:-:|:-: |:-:|:-:|
+| 神经网络库 | 是 | 是 | 否 | 否 | 是 | 否 |
+| 大数据框架 | 否 | 否 | 是 | 否 | 否 | 是 |
+| 机器学习框架 | 是 | 是 | 是 | 是 | 是 | 是 |
\ No newline at end of file
diff --git a/chapter_programming_interface/development_history.md b/chapter_programming_interface/development_history.md
index 7ac6a98..5d90b37 100644
--- a/chapter_programming_interface/development_history.md
+++ b/chapter_programming_interface/development_history.md
@@ -4,7 +4,7 @@
:width:`800px`
:label:`img_framedh`
-随着机器学习通的诞生,如何设计易用且高性能的编程接口就一直成为了框架设计者首要解决的问题。在早期的机器学习框架中(如图2.1.1所示),人们选择用Lua(Torch)和Python(Theano)等高层次编程语言来编写机器学习程序。这些早期的机器学习框架提供了机器学习必须的模型定义,自动微分等功能,其适用于编写小型和科研为导向的机器学习应用。
+随着机器学习系统的诞生,如何设计易用且高性能的编程接口就一直成为了框架设计者首要解决的问题。在早期的机器学习框架中(如图2.1.1所示),人们选择用Lua(Torch)和Python(Theano)等高层次编程语言来编写机器学习程序。这些早期的机器学习框架提供了机器学习必须的模型定义,自动微分等功能,其适用于编写小型和科研为导向的机器学习应用。
在2011年,深度神经网络快速崛起,并很快在各个AI应用领域(计算机视觉,语音识别,自然语言处理等)取得了最先进的性能。训练深度神经网络需要消耗大量的算力,而这些算力无法被以Lua和Python所主导开发的Torch和Theano所满足。与此同时,计算加速卡(如英伟达GPU)的通用编程接口(例如CUDA
C)日趋成熟,而构建于CPU多核技术之上的多线程库(POSIX
diff --git a/img/ch01/framework_architecture.svg b/img/ch01/framework_architecture.svg
new file mode 100644
index 0000000..1c58d29
--- /dev/null
+++ b/img/ch01/framework_architecture.svg
@@ -0,0 +1,442 @@
+
+
+
+
diff --git a/img/ch01/framework_position.svg b/img/ch01/framework_position.svg
new file mode 100644
index 0000000..8c30515
--- /dev/null
+++ b/img/ch01/framework_position.svg
@@ -0,0 +1,270 @@
+
+
+
+