Skip to content

Commit

Permalink
Fix typos and make some texts more explicit (#62)
Browse files Browse the repository at this point in the history
* fix typos
  • Loading branch information
luweizheng authored Aug 25, 2024
1 parent 138abaf commit 901766c
Show file tree
Hide file tree
Showing 31 changed files with 171 additions and 150 deletions.
2 changes: 1 addition & 1 deletion ch-dask-dataframe/dask-case-study.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"(sec-dask-case-study)=\n",
"# 基于 Dask 的数据分析案例\n",
"\n",
"本节我们将介绍 2个基于 Dask 的数据分析案例。"
"本节我们将介绍 2个基于 Dask 的数据分析案例。首先导入必要的包,并创建 Dask 集群。"
]
},
{
Expand Down
4 changes: 2 additions & 2 deletions ch-dask-dataframe/shuffle.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"width: 800px\n",
"name: fig-shuffle-tasks-p2p\n",
"---\n",
"Dask 仪表盘\n",
"Dask Shuffle: tasks v.s. p2p\n",
"```\n",
"\n",
"目前,Dask 提供了两类 Shuffle 实现策略:单机和分布式。\n",
Expand Down Expand Up @@ -114,7 +114,7 @@
"|---\t|---\t|---\t|---\t|\n",
"| [`DataFrame.set_index()`](https://docs.dask.org/en/latest/generated/dask_expr._collection.DataFrame.set_index.html) | 修改索引列,加速后续基于索引列的计算\t| 是 | 是\t|\n",
"| [`DataFrame.repartition()`](https://docs.dask.org/en/latest/generated/dask_expr._collection.DataFrame.repartition.html) | 修改 Partition 数量,多用于数据倾斜场景 | 否\t| 是 |\n",
"| [`DataFrame.shuffle()`](https://docs.dask.org/en/latest/generated/dask_expr._collection.DataFrame.shuffle.html) | 将相同的值归结到同一个 Partition | 否 | 是 |\n",
"| [`DataFrame.shuffle()`](https://docs.dask.org/en/latest/generated/dask_expr._collection.DataFrame.shuffle.html) | 将 DataFrame 重新打散并排列 | 否 | 是 |\n",
"```\n",
"\n",
"在 {numref}`sec-dask-dataframe-indexing` 我们提过,`set_index()` 将某字段设置为索引列,后续一系列计算非常依赖这个字段,`set_index()` 能显著加速后续计算。`repartition()` 主要解决数据倾斜的问题,即某些 Partiton 上的数据过大,过大的 Partition 有可能导致内存不足。"
Expand Down
2 changes: 1 addition & 1 deletion ch-dask-ml/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* 训练数据和模型可放到单机内存中,超参数调优需要多机并行;
* 训练数据无法放到单机内存中,需要进行分布式训练。

一方面,Dask 社区将主要精力投入在 Dask DataFrame 上,对 Dask-ML 和分布式训练的优化并不多;另一方面,深度学习已经冲击传统机器学习算法,Dask 设计之初并不是面向深度学习的。读者阅读本章,了解 Dask 机器学习能力后,可以根据自身需求选择适合自己的框架
一方面,Dask 社区主要集中在 Dask DataFrame 的开发上,对于 Dask-ML 以及分布式训练的优化投入相对较少;另一方面,深度学习已经对传统机器学习算法产生了显著影响,而 Dask 在设计之初并未专门针对深度学习场景。读者在阅读本章并了解 Dask 在机器学习方面的能力之后,可以根据个人的实际需求选择最适合自己的框架

```{tableofcontents}
```
6 changes: 3 additions & 3 deletions ch-dask-ml/preprocessing.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
(sec-dask-ml-preprocessing)=
# 数据预处理

{numref}`sec-data-science-lifecycle` 我们提到过,数据科学工作的重点是理解数据和处理数据,Dask 可以将很多单机的任务横向扩展到集群上,并且可以和 Python 社区数据可视化等库结合,完成探索性数据分析
{numref}`sec-data-science-lifecycle` 中提到,数据科学工作的核心在于理解数据和处理数据。Dask 能够将许多单机任务扩展到集群上执行,并能与 Python 社区中的数据可视化等库结合,以完成探索性数据分析

分布式数据预处理部分更多依赖 Dask DataFrame 和 Dask Array 的能力,这里不再赘述
在分布式数据预处理方面,更多地依赖于 Dask DataFrame 和 Dask Array 的功能,这一点在此不再赘述

特征工程部分,Dask-ML 实现了很多 `sklearn.preprocessing` 的 API,比如 [`MinMaxScaler`](https://ml.dask.org/modules/generated/dask_ml.preprocessing.MinMaxScaler.html)。对 Dask 而言,稍有不同的是其独热编码,本书写作时,Dask 使用 [`DummyEncoder`](https://ml.dask.org/modules/generated/dask_ml.preprocessing.DummyEncoder.html) 对类别特征进行独热编码,`DummyEncoder` 是 scikit-learn `OneHotEncoder` 的 Dask 替代。我们将在 {numref}`sec-dask-ml-hyperparameter` 将展示一个类型特征的案例
在特征工程部分,Dask-ML 实现了很多 `sklearn.preprocessing` 的 API,比如 [`MinMaxScaler`](https://ml.dask.org/modules/generated/dask_ml.preprocessing.MinMaxScaler.html)。对 Dask 来说,一个稍有不同的地方是其独热编码的实现。截至本书写作时,Dask 使用 [`DummyEncoder`](https://ml.dask.org/modules/generated/dask_ml.preprocessing.DummyEncoder.html) 对类别特征进行独热编码,`DummyEncoder` 是 scikit-learn `OneHotEncoder` 的 Dask 替代。我们将在 {numref}`sec-dask-ml-hyperparameter` 展示一个关于类型特征的案例
5 changes: 2 additions & 3 deletions ch-data-science/data-science-lifecycle.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -62912,7 +62912,7 @@
"网络上的开源数据往往已经被处理过,实际业务场景的数据准备难度比开源数据大很多。\n",
"因此,数据准备是最耗时的步骤,它可能会占整个项目时间的 70%-90%,然而它是整个数据科学生命周期中最重要的步骤。\n",
"\n",
"在房价预测这个场景下,当前我们使用的这个开源数据集的特征只有 8 列。为了更好地做这个任务,应该挖掘更多的信息,包括房屋面积等更详细的信息。如果能从其他数据源获取数据,并将这些数据融合,能显著提升最终要过,但数据融合需要进行数据清洗和对齐工作。\n",
"在房价预测这个场景下,当前我们使用的这个开源数据集的特征只有 8 列。为了更好地做这个任务,应该挖掘更多的信息,包括房屋面积等更详细的信息。如果能从其他数据源获取数据,并将这些数据融合,能显著提升准确度等模型性能,但数据融合需要进行数据清洗和对齐工作。\n",
"\n",
"数据的预处理非常依赖数据分析师的经验,这里不仔细展开讲解。现在我们只对数据进行切分,分为训练集和测试集。"
]
Expand Down Expand Up @@ -67549,8 +67549,7 @@
"source": [
"## 部署\n",
"\n",
"模型需要经过严格验证之后才能部署上线。在正式给所有用户使用之前,除了在离线测试之外,还需要进行线上灰度测试。离线测试,指的是只线下验证,基于历史数据,不将模型推送给线上用户;灰度测试,是在该项目正式推送给全量用户前,选择特定人群试用,根据效果逐步扩大试用者数量,由“灰”到“黑”。如果灰度测试效果不佳,还需要继续迭代,重复上面的各个步骤。\n",
"如果数据收集不正确,或数据清洗不合理,或离线测试评估指标有问题,模型都无法取得较好的线上效果。\n",
"模型在部署上线前必须经过严格的验证。在正式向所有用户开放使用之前,除了进行离线测试外,还应实施线上灰度测试。所谓离线测试,是指仅在非在线环境中进行验证,基于历史数据,不将模型推送给线上用户。灰度测试则是在项目正式全面推广前,选择特定用户群体进行试用,并根据反馈效果逐步增加试用者的数量,实现从“灰”到“全量”的过渡。如果灰度测试的结果不尽人意,需要继续迭代并重复上述所有步骤。此外,如果数据收集不准确,数据清洗处理不当,或离线测试的评估指标存在问题,模型在线上的实际效果也可能不会理想。\n",
"\n",
"## 小结\n",
"\n",
Expand Down
17 changes: 13 additions & 4 deletions ch-data-science/hyperparameter.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,20 @@ name: fig-tune-algorithms

* 网格搜索(Grid Search):网格搜索是一种穷举搜索方法,它通过遍历所有可能的超参数组合来寻找最优解,这些组合会逐一被用来训练和评估模型。网格搜索简单直观,但当超参数空间很大时,所需的计算成本会急剧增加。
* 随机搜索(Random Search):随机搜索不是遍历所有可能的组合,而是在解空间中随机选择超参数组合进行评估。这种方法的效率通常高于网格搜索,因为它不需要评估所有可能的组合,而是通过随机抽样来探索参数空间。随机搜索尤其适用于超参数空间非常大或维度很高的情况,它可以在较少的尝试中发现性能良好的超参数配置。然而,由于随机性的存在,随机搜索可能会错过一些局部最优解,因此可能需要更多的尝试次数来确保找到一个好的解。
* 贝叶斯优化(Bayesian Optimization):贝叶斯优化是一种**迭代式**超参数搜索技术。它基于贝叶斯定理,概率模型来指导搜索最优超参数。这种方法的核心思想是构建一个贝叶斯模型,通常是高斯过程(Gaussian Process),来近似评估目标函数的未知部分。贝叶斯优化能够在有限的评估次数内,智能地选择最有希望的超参数组合进行尝试,特别适用于计算成本高昂的场景。
* 自适应迭代式(Adaptive):自适应迭代式超参数搜索技术中最知名的是贝叶斯优化(Bayesian Optimization)。贝叶斯优化基于贝叶斯定理,利用概率模型来指导搜索最优超参数。这种方法的核心思想是构建一个贝叶斯模型,通常是高斯过程(Gaussian Process),来近似评估目标函数的未知部分。贝叶斯优化能够在有限的评估次数内,智能地选择最有希望的超参数组合进行尝试,特别适用于计算成本高昂的场景。

超参数调优属于一种黑盒优化过程。所谓黑盒优化,是指目标函数被视为一个黑盒,我们只能通过观察其输入和输出来推断其行为。虽然黑盒的概念可能有些难以理解,但可以与梯度下降算法进行比较。梯度下降算法不是一种黑盒优化算法,因为它能够获得目标函数的梯度(或其近似值),并利用这些梯度信息来指导搜索方向,从而找到目标函数的(局部)最优解。与此不同,黑盒优化算法通常无法获得目标函数的数学表达式或其梯度,因此无法应用基于梯度的优化技术。

贝叶斯优化、遗传算法、模拟退火等都是常见的黑盒优化方法。这些算法在超参数的搜索空间中选择一些候选解,运行目标函数以评估这些超参数组合的实际性能。基于这些实际性能的反馈,算法会不断迭代调整超参数,重复上述过程,直至满足终止条件。

超参数调优是一种黑盒优化,所谓黑盒优化,指的是目标函数是一个黑盒,我们只能通过观察其输入和输出来推断其行为。黑盒的概念比较难以理解,但是我们可以相比梯度下降算法,梯度下降算法**不是**一种黑盒优化算法,我们可以得到目标函数的梯度(或近似值),并用梯度来指导搜索方向,最终找到目标函数的(局部)最优解。黑盒优化算法一般无法找到目标函数的数学表达式和梯度,也无法使用基于梯度的优化技术。贝叶斯优化、遗传算法、模拟退火等都是黑盒优化,这些算法通常在超参数搜索空间中选择一些候选解,运行目标函数,得到超参数组合的实际性能,基于实际性能,不断迭代调整,即重复上述过程,直到满足条件。

### 贝叶斯优化

贝叶斯优化基于贝叶斯定理,这里不深入探讨详细的数学公式。简单来说,它需要先掌握搜索空间中几个观测样本点(Observation)的实际性能,构建概率模型,描述每个超参数在每个取值点上模型性能指标的**均值**和**方差**。其中,均值代表这个点最终的期望效果,均值越大表示模型最终性能指标越大,方差表示这个点的不确定性,方差越大表示这个点不确定,值得去探索。{numref}`fig-bayesian-optimization-explained` 在一个 1 维超参数搜索空间中迭代 3 步的过程,虚线是目标函数的真实值,实线是预测值(或者叫后验概率分布均值),实线上下的蓝色区域为置信区间。贝叶斯优化利用了高斯回归过程,即目标函数是由一系列观测样本点所构成的随机过程,通过高斯概率模型来描述这个随机过程的概率分布。贝叶斯优化通过不断地收集观测样本点来更新目标函数的后验分布,直到后验分布基本贴合真实分布。对应 {numref}`fig-bayesian-optimization-explained` 中,进行第 3 次迭代之前只有两个观测样本点,经过第 3 次迭代和第 4 次迭代之后中增加了新的观测样本点,这几个样本点附近的预测值逐渐接近真实值。
贝叶斯优化是一种基于贝叶斯定理的优化方法,这里不深入讨论其详细的数学公式。简而言之,贝叶斯优化首先需要在搜索空间中获取若干观测样本点(Observation)的实际性能数据,以构建一个概率模型。该模型用于描述每个超参数在不同取值点上模型性能指标的**均值****方差**。其中,均值代表该点的期望效果,均值越大,表明模型在该点的性能指标越高;方差则表示该点的不确定性,方差越大,说明该点的不确定性越高,因此更值得进一步探索。

{numref}`fig-bayesian-optimization-explained` 是在一维超参数搜索空间中迭代3步的过程,虚线表示目标函数的真实值,而实线代表预测值(或称为后验概率分布的均值)。实线上下的蓝色区域表示置信区间。贝叶斯优化利用高斯过程回归,即认为目标函数是由一系列观测样本点构成的随机过程,并通过高斯概率模型来描述这一随机过程的概率分布。

贝叶斯优化通过持续收集新的观测样本点来更新目标函数的后验分布,直至该后验分布与真实分布基本吻合。如 {numref}`fig-bayesian-optimization-explained` 所示,在进行第三次迭代之前,仅有两个观测样本点。随着第三次和第四次迭代的进行,新增的观测样本点使得这些点附近的预测值逐渐逼近真实值。

贝叶斯优化有两个核心概念:

Expand Down Expand Up @@ -118,4 +125,6 @@ width: 600px
name: fig-population-based-training
---
PBT 训练中的利用和探索。利用指模型表现不理想时,将当前模型换成其他表现较好的参数权重;探索指变异生成新的超参数。
```
```

当某个模型的性能表现未达到预期时,可以考虑替换当前模型的参数权重,采用那些表现更佳的参数权重。同时,为了进一步探索和优化模型,可以通过调整超参数来进行变异,以生成新的超参数组合。
11 changes: 5 additions & 6 deletions ch-mpi-large-model/data-parallel.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(sec-data-parallel)=
# 数据并行

数据并行是一种最常见的大模型并行方法,相对其他并行,数据并行最简单。如 {numref}`fig-data-parallel-img` 所示,模型被拷贝到不同的 GPU 设备上,训练数据被切分为多份,每份分给不同的 GPU 进行训练。这种编程范式又被称为单程序多数据(Single Program Multiple Data,SPMD)。
数据并行是大模型并行方法中最常见的一种,并且相对于其他并行方法来说,数据并行在实现上更为简单直观。如 {numref}`fig-data-parallel-img` 所示,模型的副本被加载到不同的 GPU 设备上,而训练数据则被分割成多个份,每个份由不同的 GPU 独立进行训练。这种编程模式被称为单程序多数据(Single Program Multiple Data, SPMD)。

```{figure} ../img/ch-mpi-large-model/data-parallel.svg
---
Expand All @@ -13,7 +13,7 @@ name: fig-data-parallel-img

## 非并行训练

{numref}`sec-machine-learning-intro` 介绍了神经网络模型训练的过程。我们先从非并行的场景开始,这里使用 MNIST 手写数字识别案例来演示,如 {numref}`fig-data-parallel-single` 所示,它包含了一次前向传播和一次反向传播
{numref}`sec-machine-learning-intro` 介绍了神经网络模型训练的过程。我们首先从非并行的场景开始讨论,在这一场景中,使用 MNIST 手写数字识别案例进行演示。如 {numref}`fig-data-parallel-single` 所示,该案例展示了一次前向传播和一次反向传播的过程

```{figure} ../img/ch-mpi-large-model/data-parallel-single.svg
---
Expand All @@ -25,8 +25,7 @@ name: fig-data-parallel-single

## 数据并行

数据并行将数据集切分成多份,模型权重在不同 GPU 上拷贝一份。如 {numref}`fig-data-parallel-distributed` 所示,有两块 GPU,在每块 GPU 上,有拷贝的模型权重和被切分的输入数据集;每块 GPU 上**独立**进行前向传播和反向传播,即前向传播计算每层的输出值,反向传播计算模型权重的梯度,两块 GPU 上的计算互不影响。

数据并行技术涉及将数据集分割成多份,并在不同的 GPU 上复制模型权重。如 {numref}`fig-data-parallel-distributed` 所示,假设有两块 GPU,每块 GPU 上都有一个模型权重的副本以及相应切分的输入数据子集。在每块 GPU 上,都会**独立**进行前向传播和反向传播的过程:前向传播负责计算每层的输出值,而反向传播则用于计算模型权重的梯度。这些计算在不同的 GPU 之间是相互独立的,互不干扰。

```{figure} ../img/ch-mpi-large-model/data-parallel-distributed.svg
---
Expand All @@ -44,9 +43,9 @@ $$
}
$$

同步不同 GPU 上的梯度,可以使用 MPI 提供的 `AllReduce` 原语。MPI 的 `AllReduce` 将每块 GPU 上分别计算得到的梯度收集起来,计算平均后,再将更新后的梯度重新分发给各块 GPU。
同步不同 GPU 上的梯度,可以使用 MPI 提供的 `AllReduce` 原语。MPI 的 `AllReduce` 将每块 GPU 上独立计算得到的梯度收集起来,进行平均计算,然后将计算得到的平均梯度广播回各块 GPU。

如 {numref}`fig-data-parallel-all-reduce` 所示,梯度同步阶段,MPI 的 `AllReduce` 原语将各 GPU 上的梯度进行同步
如 {numref}`fig-data-parallel-all-reduce` 所示,在梯度同步阶段,MPI 的 `AllReduce` 原语确保了各 GPU 上梯度的一致性

```{figure} ../img/ch-mpi-large-model/data-parallel-all-reduce.svg
---
Expand Down
10 changes: 5 additions & 5 deletions ch-mpi-large-model/index.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# MPI 与大模型

本章主要解释大模型的并行方法。大模型指的是神经网络的参数量很大,必须并行地进行训练和推理。大模型并行有如下特点
本章主要解释大模型的并行方法。所谓大模型,指的是参数量庞大的神经网络,它们必须通过并行方式进行训练和推理。大模型并行具有以下几个特点

* 计算运行在 GPU 这样的加速卡上;
* 加速卡非常昂贵,应尽量提高加速卡的利用率;
* 模型参数量大,无论是训练还是推理,可能有大量数据需要在加速卡之间传输,对带宽和延迟的要求都很高
* 计算运行在 GPU 这样的加速卡上,这些硬件专为提高计算效率而设计。
* 加速卡的成本非常高昂,因此应努力提高其利用率,确保投资的回报。
* 由于模型参数量巨大,在训练或推理过程中,可能需要在加速卡之间传输大量数据,这要求有很高的带宽和低延迟以保证效率

本章主要从概念和原理上进行解读,具体的实现可参考其他论文和开源库
本章将从概念和原理上进行详细解读,而具体的实现细节可以参考其他学术论文和开源库

```{tableofcontents}
```
Loading

0 comments on commit 901766c

Please sign in to comment.