27、云平台上的分布式训练指南

云平台上的分布式训练指南

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 存储桶
  1. 登录 https://cloud.google.com 的 Google Cloud 控制台,从左侧导航菜单中点击“Storage”,然后点击“Browse”以打开存储浏览器页面。
  2. 点击页面顶部的“Create Bucket”按钮。
  3. 在下一页中,填写存储桶名称(例如“cv_model”)并点击“Continue”。选择“Region”作为位置类型,选择合适的位置(如“us-east4 (Northern Virginia)”),然后点击“Continue”。
  4. 选择“Standard”作为默认存储类,然后点击“Continue”。
  5. 选择“Uniform”作为访问控制,然后点击“Continue”。
  6. 点击“Create”按钮创建存储桶。
  7. 在下一页中,点击“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
  1. 如果成功添加了 NVIDIA 包存储库,使用以下命令安装 NVIDIA 驱动:
sudo apt-get install --no-install-recommends nvidia-driver-418
  1. 重启 VM 使之前的安装生效:
sudo reboot
  1. 再次通过 SSH 登录到 VM。
  2. 执行以下命令测试 NVIDIA 驱动是否成功安装:
nvidia-smi
  1. 安装开发和运行时库:
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
  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 以避免不必要的费用。希望本文能帮助你顺利开展分布式训练工作。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值