云平台上的分布式训练指南
1. Google Cloud 上的分布式训练
1.1 Google Cloud Platform 简介
Google Cloud Platform (GCP) 是一套云计算服务,运行在谷歌为其终端用户产品(如 Google Search 和 YouTube)内部使用的相同基础设施上。为了进行分布式训练,我们将使用两个 GCP 服务:用于保存检查点和训练模型的 Google Cloud Storage (GCS),以及用于虚拟机 (VMs) 的 Compute Engine。
1.2 注册 GCP 访问权限
如果你还没有 GCP 账户,可以在 https://cloud.google.com 创建一个。谷歌为教育和学习提供 300 美元的信用额度。创建账户后,登录 https://console.cloud.google.com 的 Google Cloud 控制台,成功登录后将进入 GCP 仪表盘。
1.3 创建 Google Cloud Storage 存储桶
GCS 是 Google Cloud 上高度耐用的对象存储,可扩展以存储艾字节级的数据。GCS 存储桶类似于文件系统中的目录,有两种创建方式:
1.3.1 通过 Web UI 创建 GCS 存储桶
- 登录 https://cloud.google.com 的 Google Cloud 控制台,从左侧导航菜单中点击“Storage”,然后点击“Browse”以打开存储浏览器页面。
- 点击页面顶部的“Create Bucket”按钮。
- 在下一页中,填写存储桶名称(例如“cv_model”)并点击“Continue”。选择“Region”作为位置类型,选择合适的位置(如“us-east4 (Northern Virginia)”),然后点击“Continue”。
- 选择“Standard”作为默认存储类,然后点击“Continue”。
- 选择“Uniform”作为访问控制,然后点击“Continue”。
- 点击“Create”按钮创建存储桶。
- 在下一页中,点击“Overview”标签查看存储桶详细信息。
1.3.2 通过 Cloud Shell 创建 GCS 存储桶
如果你已经通过 Web UI 创建了存储桶,则无需执行以下步骤。通过命令行创建存储桶很简单:
1. 点击右上角的图标激活 Cloud Shell,Cloud Shell 将在屏幕底部打开。
2. 在 Cloud Shell 中执行以下命令创建存储桶:
gsutil mb -c regional -l us-east4 gs://cv_model
请在命令中提供适当的区域和存储桶名称。如果已经通过 Web UI 创建了存储桶,请确保使用不同的存储桶名称。
1.4 启动 GCP 虚拟机
我们将为练习启动以下类型的虚拟机 (VMs):
- 一个基于 GPU 的 VM:参数服务器
- 一个基于 GPU 的 VM:主节点
- 两个基于 GPU 的 VMs:工作节点
这些 VMs 将在与我们的 GCS 存储桶相同的区域(例如“us-east4”)启动。启动 VMs 的步骤如下:
1. 在主导航菜单中,点击“Compute Engine”,然后点击“VM instances”以打开显示先前启动的 VMs 列表的页面。
2. 点击“Create”启动创建实例所需的 Web 表单。
3. 我们将创建四个基于 GPU 的 VMs 来创建集群。在实例创建表单中,点击“Boot disk”下“Image”旁边的“Change”按钮。在下一个屏幕中,选择“Deep Learning on Linux”作为操作系统,选择“Deep Learning Image: TensorFlow 1.15.0 m45”作为版本。
1.5 SSH 登录每个 VM
我们将使用 Cloud Shell 和 gsutil 登录之前创建的所有四个 VMs。激活 Cloud Shell 并点击“+”图标,在每个 Cloud Shell 标签中执行以下命令通过 SSH 登录:
# SSH 到参数服务器
gcloud compute ssh parameter-server
# SSH 到主节点
gcloud compute ssh chief
# SSH 到工作节点 0
gcloud compute ssh worker-0
# SSH 到工作节点 1
gcloud compute ssh worker-1
1.6 上传分布式训练代码或克隆 GitHub 仓库
通过 SSH 登录后,在所有机器上执行以下命令克隆包含分布式模型训练代码的 GitHub 仓库:
git clone https://github.com/ansarisam/dist-tf-modeling.git
如果 git 命令不起作用,可以使用以下命令安装 git :
sudo apt-get install git
1.7 安装先决条件和 TensorFlow
“Deep Learning on Linux”镜像已经预装了所有先决条件和 TensorFlow。但是,如果需要配置环境,可以执行以下命令:
sudo apt-get update
sudo apt-get -y upgrade && sudo apt-get install -y python-pip python-dev
sudo apt-get install python3-dev python3-pip
sudo pip3 install -U virtualenv
mkdir cv
virtualenv --system-site-packages -p python3 ./cv
source ./cv/bin/activate
pip install tensorflow==1.15
1.8 运行分布式训练
确保在所有机器上克隆了 GitHub 仓库,并通过 SSH 登录到每个 VM。在每个 VM 上执行以下命令启动分布式训练:
参数服务器命令
cd dist_tf_modeling
export TF_CONFIG='{"task": {"index": 0, "type": "ps"}, "cluster": {"chief":["chief:8900"],"worker": ["worker-0:8900", "worker-1:8900"], "ps":["parameter-server:8900"]}}';python distributed_training_ps.py --output_path gs://cv_model_v1
主节点命令
cd dist_tf_modeling
export TF_CONFIG='{"task": {"index": 0, "type": "chief"}, "cluster": {"chief":["chief:8900"],"worker": ["worker-0:8900", "worker-1:8900"], "ps":["parameter-server:8900"]}}';python distributed_training_ps.py --output_path gs://cv_model_v1
工作节点 0 命令
cd dist_tf_modeling
export TF_CONFIG='{"task": {"index": 0, "type": "worker"}, "cluster": {"chief":["chief:8900"],"worker": ["worker-0:8900", "worker-1:8900"], "ps":["parameter-server:8900"]}}';python distributed_training_ps.py --output_path gs://cv_model_v1
工作节点 1 命令
cd dist_tf_modeling
export TF_CONFIG='{"task": {"index": 1, "type": "worker"}, "cluster": {"chief":["chief:8900"],"worker": ["worker-0:8900", "worker-1:8900"], "ps":["parameter-server:8900"]}}';python distributed_training_ps.py --output_path gs://cv_model_v1
请注意,所有参与节点必须能够通过 TF_CONFIG 中配置的端口与参数服务器通信,并且节点必须对 GCS 存储桶具有必要的读写权限。模型检查点将保存在 GCS 的 gs://cv_model_v1 路径下,训练好的模型将以 model.h5 格式保存在 gs://cv_model_v1 中。由于带有 GPU 的 GCP 实例很昂贵,如果不再使用,应终止它们以避免产生费用。
2. Azure 上的分布式训练
2.1 Azure 简介
Microsoft Azure 是一项云计算服务,用于通过微软管理的数据中心构建、测试、部署和管理应用程序和服务。使用 ParameterServerStrategy 的分布式训练在 Azure 上的工作方式与在 GCP 上几乎相同,但创建 VMs 节点的方式有所不同。我们将探索使用 MirroredStrategy 在具有多个 GPU 的单个节点上进行分布式训练。
2.2 创建具有多个 GPU 的 Azure VM
我们需要先在 https://azure.microsoft.com/ 注册创建一个免费账户,然后前往 https://portal.azure.com/ 登录账户。免费账户只能创建具有一个 GPU 的 VM,要创建具有多个 GPU 的 VM,必须激活计费:
1. 点击主导航(展开左上角的汉堡图标)。
2. 选择“Cost Management + Billing”,然后点击“Azure subscription”。
3. 点击“Add”。
4. 按照屏幕上的说明操作。
创建虚拟机的步骤如下:
1. 在主页上,点击“Virtual machines”图标。
2. 点击页面底部的“Create virtual machine”按钮或左上角的“+ Add”图标。
3. 填写表单以配置 VM。对于“Image”字段,选择“Ubuntu Server 10.04 LTS”。
4. 点击“Change size”链接,清除所有过滤器并搜索“NC”以找到 NC 系列的 GPUs。我们将选择“NC12_Promo”VM 大小,它提供两个 GPUs、12 个 vCPUs 和 112GB 内存。高亮显示对应“NC12_Promo”大小的行,然后点击屏幕底部的“Select”按钮。
5. 保持其他设置为默认值,点击屏幕左下角的“Review + create”按钮。在下一页中,审查配置以确保所有选项都正确选择,然后点击“Create”按钮。如果一切顺利,将创建具有两个 GPUs 的 VM,这可能需要几分钟时间。
6. VM 准备好后,如果没有离开最后所在的页面,将看到一条通知表明 VM 可以使用。也可以返回主页,点击“Virtual machines”图标查看创建的 VMs 列表,点击 VM 名称打开详细信息页面。
7. 记录或复制公共 IP 地址,我们将使用它通过 SSH 登录到 VM。使用 SSH 客户端(如 Windows 的 Putty 或 Mac/Linux 的 Shell 终端),根据之前选择的认证方法登录 VM:
# 基于密码的认证
ssh username@13.82.230.148
# 基于 SSH 公钥的认证
ssh -i ~/sshkey.pem 13.82.230.148
2.3 安装 GPU 驱动和库
要在基于 GPU 的机器上运行 TensorFlow,需要安装 GPU 驱动和一些库。执行以下步骤:
1. 在终端(确保已通过 SSH 登录)执行以下命令添加 NVIDIA 包存储库:
# 添加 NVIDIA 包存储库
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.243-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.1.243-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
- 如果成功添加了 NVIDIA 包存储库,使用以下命令安装 NVIDIA 驱动:
sudo apt-get install --no-install-recommends nvidia-driver-418
- 重启 VM 使之前的安装生效:
sudo reboot
- 再次通过 SSH 登录到 VM。
- 执行以下命令测试 NVIDIA 驱动是否成功安装:
nvidia-smi
- 安装开发和运行时库:
sudo apt-get install --no-install-recommends \
cuda-10-1 \
libcudnn7=7.6.4.38-1+cuda10.1 \
libcudnn7-dev=7.6.4.38-1+cuda10.1
- 安装 TensorRT 库:
sudo apt-get install -y --no-install-recommends libnvinfer6=6.0.1-1+cuda10.1 \
libnvinfer-dev=6.0.1-1+cuda10.1 \
libnvinfer-plugin6=6.0.1-1+cuda10.1
2.4 创建虚拟环境并安装 TensorFlow
执行以下命令安装所需的所有先决条件:
sudo apt update
sudo apt-get install python3-dev python3-pip
sudo pip3 install -U virtualenv
mkdir cv
virtualenv --system-site-packages -p python3 ./cv
source ./cv/bin/activate
pip install tensorflow
pip install tensorflow-gpu
2.5 实现 MirroredStrategy
不实例化 ParameterServerStrategy ,而是创建 MirroredStrategy 的实例:
strategy = tf.distribute.MirroredStrategy()
其他代码保持不变。我们已将实现 MirroredStrategy 用于分布式训练的修改代码提交到 GitHub 仓库 https://github.com/ansarisam/dist-tf-modeling.git ,包含 MirroredStrategy 代码的文件名为 mirrored_strategy.py 。
2.6 运行分布式训练
通过 SSH 登录到之前创建的 VM,然后克隆 GitHub 仓库:
git clone https://github.com/ansarisam/dist-tf-modeling.git
执行以下 Python 代码训练分布式模型:
python dist-tf-modeling/mirrored_strategy.py
如果一切顺利,将在终端控制台看到训练进度。要检查 GPUs 是否用于分布式训练,从另一个终端通过 SSH 登录到 VM 并执行以下命令:
nvidia-smi
如果不再需要 VM,应终止它以避免产生费用,因为基于 GPU 的 VMs 非常昂贵。在终止 VM 之前,请确保将训练好的模型和检查点下载并存储到永久存储中。
3. AWS 上的分布式训练
3.1 AWS 简介
Amazon Web Services (AWS) 是亚马逊的子公司,以计量的按需付费方式为个人、公司和政府提供云计算平台和 API。之前提到的分布式训练在 AWS 上也可以工作,我们只需要创建 VMs 并遵循训练 GCP 模型的步骤。同样,我们可以在具有多个 GPUs 的 AWS VMs 上训练基于 MirroredStrategy 的模型,除了创建多 GPU 虚拟机的方法外,所有训练说明与 Azure 相同。
3.2 Horovod 简介
Horovod 是一个用于 TensorFlow、Keras、PyTorch 和 Apache MXNet 的分布式深度学习训练框架,旨在使分布式深度学习快速且易于使用。它由 Uber 开发,由 Linux Foundation AI 托管。源代码和文档维护在 GitHub 仓库 https://github.com/horovod/horovod ,官方文档在 https://horovod.readthedocs.io/en/latest/summary_include.html 。要使用 Horovod,需要对 TensorFlow 模型训练代码进行一些小的更改,我们将使用相同的示例代码并进行修改以使其与 Horovod 兼容。
3.3 使用 Horovod 在 AWS 上进行分布式训练
3.3.1 环境准备
在使用 Horovod 进行分布式训练之前,需要在 AWS 上创建合适的虚拟机环境。可以参考前面在 GCP 和 Azure 上创建 VMs 的步骤,创建多个带有 GPU 的 VMs 用于分布式训练。确保这些 VMs 之间可以相互通信,并且安装了必要的依赖库,如 CUDA、cuDNN 等。
3.3.2 代码修改
假设我们有一个 TensorFlow 的训练代码,要使其支持 Horovod,需要进行以下修改:
1. 初始化 Horovod :在代码开头添加 Horovod 的初始化代码。
2. 配置优化器 :对优化器进行包装,使其支持 Horovod 的分布式训练。
以下是一个示例代码的修改前后对比:
原始代码 :
import tensorflow as tf
# 构建模型
model = tf.keras.Sequential([...])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 加载数据
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
# 训练模型
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))
修改后的代码 :
import tensorflow as tf
import horovod.tensorflow.keras as hvd
# 初始化 Horovod
hvd.init()
# 配置 GPU
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU')
# 构建模型
model = tf.keras.Sequential([...])
# 配置优化器
opt = tf.keras.optimizers.Adam()
opt = hvd.DistributedOptimizer(opt)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
# 加载数据
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
# 训练模型
callbacks = [
hvd.callbacks.BroadcastGlobalVariablesCallback(0),
hvd.callbacks.MetricAverageCallback(),
]
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test), callbacks=callbacks)
3.3.3 运行训练
在 AWS 的每个 VM 上运行修改后的代码。可以使用以下命令启动 Horovod 的分布式训练:
horovodrun -np <num_processes> -H <hosts> python your_training_script.py
其中, <num_processes> 是总的进程数,通常等于 VM 的数量乘以每个 VM 上的 GPU 数量; <hosts> 是所有参与训练的 VM 的主机名和端口信息,格式为 host1:port1,host2:port2,... 。
3.4 总结
在 AWS 上使用 Horovod 进行分布式训练可以充分利用多个 GPU 的计算资源,加快训练速度。通过对 TensorFlow 代码进行简单的修改,就可以实现分布式训练。在实际应用中,需要根据具体需求和资源情况,合理配置 VMs 和训练参数。
4. 不同云平台分布式训练的对比
| 云平台 | 分布式策略 | 创建 VMs 方式 | 适合场景 |
|---|---|---|---|
| Google Cloud | ParameterServerStrategy | 通过控制台或命令行创建 | 大规模分布式训练,需要多节点协作 |
| Azure | MirroredStrategy | 通过网页界面创建 | 单节点多 GPU 训练,对节点通信要求较低 |
| AWS | Horovod | 参考 GCP 和 Azure 方式创建 | 灵活的分布式训练,支持多种深度学习框架 |
5. 分布式训练流程总结
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([选择云平台]):::startend --> B(创建存储桶):::process
B --> C(启动虚拟机):::process
C --> D(SSH 登录 VM):::process
D --> E(上传或克隆代码):::process
E --> F(安装先决条件):::process
F --> G(配置分布式策略):::process
G --> H(运行分布式训练):::process
H --> I(监控训练进度):::process
I --> J(保存训练结果):::process
J --> K(终止 VM):::process
通过以上步骤,我们可以在不同的云平台上实现分布式训练。在实际操作中,需要根据具体的需求和资源情况,选择合适的云平台和分布式策略。同时,要注意 GPU 资源的使用成本,及时终止不再使用的 VM 以避免不必要的费用。希望本文能帮助你顺利开展分布式训练工作。
超级会员免费看
552

被折叠的 条评论
为什么被折叠?



