图形处理单元 (GPU) 可显著加快许多深度学习模型的训练过程。用于图片分类、视频分析和自然语言处理等任务的训练模型涉及计算密集型矩阵乘法以及其他可利用 GPU 大规模并行架构的操作。
对于需要对超大数据集执行密集计算任务的深度学习模型,可能需要在单个处理器上运行数日才能完成训练。但是,如果您将程序设计为将这些任务分流到一个或多个 GPU,则可以将训练时间从数日缩短至数小时。
准备工作
通过 AI Platform Training,您可以在支持 GPU 的机器上运行 TensorFlow 训练应用。请参阅有关使用 GPU 的 TensorFlow 指南和本文档中有关调整训练代码以利用 GPU 的部分,以确保您的应用使用可用的 GPU。
如果您使用自定义容器进行训练,还可以将 GPU 与 TensorFlow 以外的机器学习框架搭配使用。
在 GPU 上运行并不能让某些模型受益。我们建议您使用 GPU 来执行需要完成许多数学运算的大型复杂模型。即便如此,您也应该通过训练来运行较小的数据示例,以测试 GPU 支持的优势。
请求支持 GPU 的机器
要在云端使用 GPU,请通过以下任一方式将训练作业配置为可以访问支持 GPU 的机器:
- 使用
BASIC_GPU
容量层级。 - 使用 Compute Engine 机器类型并挂接 GPU。
- 使用支持 GPU 的旧版机器类型。
支持基本 GPU 的机器
如果您要学习如何使用 AI Platform Training 或对支持 GPU 的机器进行实验,则可以将规模层级设置为 BASIC_GPU
,以获取配备一个 GPU 的单一工作器实例。
挂接了 GPU 的 Compute Engine 机器类型
如果您将训练作业配置为使用 Compute Engine 机器类型,则可以挂接自定义数量的 GPU 以加快作业速度。
- 将容量层级设置为
CUSTOM
。 - 将您的主实例工作器和作业中的任何其他任务类型(工作器、参数服务器或评估程序)配置为使用有效的 Compute Engine 机器类型。
- 添加
acceleratorConfig
字段,其中包含您希望masterConfig
、workerConfig
、parameterServerConfig
或evaluatorConfig
所需的 GPU 类型和数量,具体取决于您想要加速的虚拟机 (VM) 实例。您可以使用以下 GPU 类型:NVIDIA_TESLA_A100
NVIDIA_TESLA_P4
NVIDIA_TESLA_P100
NVIDIA_TESLA_T4
NVIDIA_TESLA_V100
要创建有效的 acceleratorConfig
,您必须考虑以下几项限制:
您的配置只能使用特定数量的 GPU。例如,您可以挂接 2 个或 4 个 NVIDIA Tesla T4,但不能挂接 3 个。要了解对每种类型的 GPU 有效的限制数量,请参阅下面的兼容性表。
您必须确保每项 GPU 配置都会为您挂接了 GPU 的机器类型提供足够的虚拟 CPU 和内存。例如,如果您对工作器使用
n1-standard-32
,则每个工作器将配备 32 个虚拟 CPU 和 120 GB 的内存。由于每个 NVIDIA Tesla V100 最多提供 12 个虚拟 CPU 和 76 GB 的内存,因此您必须至少将 4 个 NVIDIA Tesla V100 挂接到每个n1-standard-32
工作器才能满足其需求。(2 个 GPU 提供的资源就已足够,您不能指定 3 个 GPU。)查看 AI Platform Training 的机器类型列表和比较用于处理计算工作负载的 GPU 以确定这些兼容性,或参考下面的兼容性表。
请注意,以下是在特定情况下针对 AI Platform Training 的 GPU 资源的其他几项限制:
- 配备了 4 个 NVIDIA Tesla P100 GPU 的配置在所有区域和地区最多只支持 64 个虚拟 CPU 和 208 GB 的内存。
您必须将训练作业提交到支持 GPU 配置的区域。参阅下面的区域支持。
下表提供了可以挂接到各 Compute Engine 机器类型的各类加速器数量的快速参考信息:
每种机器类型的有效 GPU 数量 | ||||||
---|---|---|---|---|---|---|
机器类型 | NVIDIA A100 | NVIDIA Tesla K80 | NVIDIA Tesla P4 | NVIDIA Tesla P100 | NVIDIA Tesla T4 | NVIDIA Tesla V100 |
n1-standard-4 |
1、2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 1、2、4、8 | |
n1-standard-8 |
1、2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 1、2、4、8 | |
n1-standard-16 |
2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 2、4、8 | |
n1-standard-32 |
4、8 | 2、4 | 2、4 | 2、4 | 4、8 | |
n1-standard-64 |
4 | 4 | 8 | |||
n1-standard-96 |
4 | 4 | 8 | |||
n1-highmem-2 |
1、2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 1、2、4、8 | |
n1-highmem-4 |
1、2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 1、2、4、8 | |
n1-highmem-8 |
1、2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 1、2、4、8 | |
n1-highmem-16 |
2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 2、4、8 | |
n1-highmem-32 |
4、8 | 2、4 | 2、4 | 2、4 | 4、8 | |
n1-highmem-64 |
4 | 4 | 8 | |||
n1-highmem-96 |
4 | 4 | 8 | |||
n1-highcpu-16 |
2、4、8 | 1、2、4 | 1、2、4 | 1、2、4 | 2、4、8 | |
n1-highcpu-32 |
4、8 | 2、4 | 2、4 | 2、4 | 4、8 | |
n1-highcpu-64 |
8 | 4 | 4 | 4 | 8 | |
n1-highcpu-96 |
4 | 4 | 8 | |||
a2-highgpu-1g |
1 | |||||
a2-highgpu-2g |
2 | |||||
a2-highgpu-4g |
4 | |||||
a2-highgpu-8g |
8 | |||||
a2-megagpu-16g |
16 |
以下示例展示了如何提交使用 Compute Engine 机器类型(挂接了 GPU)的作业。
配有 GPU 的机器类型
或者,您可以选择配有 GPU 的旧版机器类型,而不使用 acceleratorConfig
:
- 将容量层级设置为
CUSTOM
。 - 根据您的任务所需的 GPU 数量和加速器类型,将您的主实例工作器和您想要加速的任何其他任务类型(工作器、参数服务器或评估程序)配置为使用以下支持 GPU 的机器类型之一:
standard_gpu
:1 个 GPUcomplex_model_m_gpu
:四个 GPUcomplex_model_l_gpu
:8 个 GPUstandard_p100
:1 个 NVIDIA Tesla P100 GPUcomplex_model_m_p100
:4 个 NVIDIA Tesla P100 GPUstandard_v100
:1 个 NVIDIA Tesla V100 GPUlarge_model_v100
:1 个 NVIDIA Tesla V100 GPUcomplex_model_m_v100
:4 个 NVIDIA Tesla V100 GPUcomplex_model_l_v100
:8 个 NVIDIA Tesla V100 GPU
以下示例展示了如何通过 gcloud
命令使用支持 GPU 的机器类型提交作业。
如需了解详情,请参阅 AI Platform Training 的机器类型。
支持 GPU 的区域
您必须在支持 GPU 的区域中运行作业。以下区域目前支持使用 GPU:
us-west1
us-west2
us-central1
us-east1
us-east4
northamerica-northeast1
southamerica-east1
europe-west1
europe-west2
europe-west4
asia-south1
asia-southeast1
asia-east1
asia-northeast1
asia-northeast3
australia-southeast1
此外,其中一些区域仅支持使用特定类型的 GPU。如需全面了解 AI Platform Training 服务(包括模型训练和在线/批量预测)的可用区域,请参阅区域指南。
如果训练作业使用多种类型的 GPU,则它们必须位于您所在区域中的同一个地区。举例来说,如果您的主实例工作器使用 NVIDIA Tesla T4 GPU、参数服务器使用 NVIDIA Tesla K80 GPU,并且工作器使用 NVIDIA Tesla P100 GPU,则无法在 us-central1
中运行作业。虽然 us-central1
中提供所有这些 GPU 以用于训练作业,但该区域中没有一个地区能提供全部三种类型的 GPU。如需详细了解 GPU 的地区可用性,请参阅比较用于处理计算工作负载的 GPU。
提交训练作业
您可以使用 gcloud ai-platform jobs submit
training
命令提交训练作业。
定义一个描述所需 GPU 的
config.yaml
文件。YAML 文件的结构表示作业资源。以下是config.yaml
文件的两个示例。第一个示例展示了使用 Compute Engine 机器类型(其中一些机器类型挂接了 GPU)的训练作业的配置文件:
trainingInput: scaleTier: CUSTOM # Configure a master worker with 4 T4 GPUs masterType: n1-highcpu-16 masterConfig: acceleratorConfig: count: 4 type: NVIDIA_TESLA_T4 # Configure 9 workers, each with 4 T4 GPUs workerCount: 9 workerType: n1-highcpu-16 workerConfig: acceleratorConfig: count: 4 type: NVIDIA_TESLA_T4 # Configure 3 parameter servers with no GPUs parameterServerCount: 3 parameterServerType: n1-highmem-8
下一个示例展示了配置与上述示例类似的作业的配置文件。但是,此配置使用的旧版机器类型配有 GPU 而不是使用
acceleratorConfig
挂接 GPU:trainingInput: scaleTier: CUSTOM # Configure a master worker with 4 GPUs masterType: complex_model_m_gpu # Configure 9 workers, each with 4 GPUs workerCount: 9 workerType: complex_model_m_gpu # Configure 3 parameter servers with no GPUs parameterServerCount: 3 parameterServerType: large_model
使用
gcloud
命令提交作业(需要在命令中添加指向config.yaml
文件的--config
参数)。以下示例假设您已为一些参数的值设置了环境变量(由$
符号后跟大写字母表示):gcloud ai-platform jobs submit training $JOB_NAME \ --package-path $APP_PACKAGE_PATH \ --module-name $MAIN_APP_MODULE \ --job-dir $JOB_DIR \ --region us-central1 \ --config config.yaml \ -- \ --user_arg_1 value_1 \ ... --user_arg_n value_n
或者,您也可以使用命令行标志(而不是在配置文件中)指定集群配置详细信息。详细了解如何使用这些标志。
以下示例展示了不使用 config.yaml
文件如何提交配置与上一示例相同的作业(使用挂接了 GPU 的 Compute Engine 机器类型):
gcloud ai-platform jobs submit training $JOB_NAME \
--package-path $APP_PACKAGE_PATH \
--module-name $MAIN_APP_MODULE \
--job-dir $JOB_DIR \
--region us-central1 \
--scale-tier custom \
--master-machine-type n1-highcpu-16 \
--master-accelerator count=4,type=nvidia-tesla-t4 \
--worker-count 9 \
--worker-machine-type n1-highcpu-16 \
--worker-accelerator count=4,type=nvidia-tesla-t4 \
--parameter-server-count 3 \
--parameter-server-machine-type n1-highmem-8 \
-- \
--user_arg_1 value_1 \
...
--user_arg_n value_n
注意:
- 如果您在配置文件 (
config.yaml
) 中指定了一个选项,同时又将该选项指定为命令行标志,则命令行中的值将覆盖配置文件中的值。 - 空
--
标志标记了gcloud
特有标志的结束以及您要传递至应用的USER_ARGS
的开始。 - AI Platform Training 特有的标志(例如
--module-name
、--runtime-version
和--job-dir
)必须位于空--
标志之前。AI Platform Training 服务可解读这些标志。 - 如果指定
--job-dir
标志,则该标志必须位于空--
标志之前,原因是 AI Platform Training 会使用--job-dir
来验证路径。 - 如果指定
--job-dir
标志,您的应用也必须对该标志进行处理。虽然--job-dir
位于空--
之前,该标志也会作为命令行标志传递至您的应用。 - 您可以根据需要定义任意数量的
USER_ARGS
。AI Platform Training 会将--user_first_arg
、--user_second_arg
等传递至您的应用。
如需详细了解作业提交选项,请参阅启动训练作业指南。
将训练代码调整为使用 GPU
如果您在 TensorFlow 训练作业中使用 Keras 或 Estimator,并希望使用具有一个 GPU 的单个虚拟机进行训练,则无需为 GPU 自定义代码。
如果您的训练集群包含多个 GPU,请在训练代码中使用 tf.distribute.Strategy
API:
- 对于具有多个 GPU 的单个虚拟机的训练,建议使用 TensorFlow 2.1 及更高版本中 Keras 完全支持的
MirroredStrategy
。 - 要针对具有 GPU 的多个虚拟机进行训练,请参阅分布式训练的建议。
要自定义 TensorFlow 向 GPU 分配特定操作的方式,请参阅使用 GPU 的 TensorFlow 指南。在这种情况下,您可能还需要参考了解 AI Platform Training 如何在每个虚拟机上设置 TF_CONFIG
环境变量。
GPU 设备字符串
standard_gpu
机器的单个 GPU 标识为 "/gpu:0"
。具有多个 GPU 的机器使用从 "/gpu:0"
开始的标识符,然后是 "/gpu:1"
,以此类推。例如,complex_model_m_gpu
机器具有四个 GPU,标识为 "/gpu:0"
至 "/gpu:3"
。
支持 GPU 的机器上的 Python 软件包
支持 GPU 的机器已预安装 tensorflow-gpu,这是提供 GPU 支持的 TensorFlow Python 软件包。如需查看所有预安装软件包的列表,请参阅运行时版本列表。
维护事件
运行 AI Platform Training 作业的支持 GPU 的虚拟机偶尔需要进行 Compute Engine 主机维护。虚拟机配置为在此类维护事件结束后自动重启,但您可能需要执行一些额外工作才能确保作业能够灵活应对这些关停问题。对训练应用进行配置,以定期保存模型检查点(通常保存在您通过 gcloud ai-platform jobs submit training
的 --job-dir
参数指定的 Cloud Storage 路径),并在某检查点已存在的情况下恢复最新的检查点。
您只需指定一个 model_dir
,TensorFlow Estimator 即可为您实现此功能。Estimator 定期将检查点保存到 model_dir
并尝试从最新的检查点进行加载,这样您就不必担心 GPU 工作器上的维护事件了。
如果您正在使用 Keras 进行训练,请使用 ModelCheckpoint
回调定期保存训练进度。如果您将 tf.distribute.Strategy
与 Keras 搭配使用,则虚拟机会使用检查点自动从重启中恢复。否则,将逻辑添加到您的训练代码中,以检查是否存在最近的检查点并从存在的检查点恢复。
如需了解更多高级案例,请参阅检查点的 TensorFlow 指南。
后续步骤
- 大致了解训练的工作原理。
- 了解并发 GPU 用量限制。
- 了解如何将 GPU 用于 TensorFlow。
- 了解较新 GPU 的性能和费用对比(如 NVIDIA Tesla T4)。