在云端使用 GPU 训练模型

图形处理单元 (GPU) 可显著加快许多深度学习模型的训练过程。用于图片分类、视频分析和自然语言处理等任务的训练模型涉及计算密集型矩阵乘法以及其他可利用 GPU 大规模并行架构的操作。

对于需要对超大数据集执行密集计算任务的深度学习模型,可能需要在单个处理器上运行数日才能完成训练。但是,如果您将程序设计为将这些任务分流到一个或多个 GPU,则可以将训练时间从数日缩短至数小时。

准备工作

通过 Cloud Machine Learning Engine,您可以在支持 GPU 的机器上运行任何 TensorFlow 训练应用。请参阅有关使用 GPU 的 TensorFlow 指南下面有关为 GPU 分配操作的部分以确保您的应用使用可用的 GPU。

在 GPU 上运行并不能让某些模型受益。我们建议您使用 GPU 来执行需要完成许多数学运算的大型复杂模型。即便如此,您也应该通过训练来运行较小的数据示例,以测试 GPU 支持的优势。

请求支持 GPU 的机器

要在云端使用 GPU,请对训练作业进行配置,以通过以下三种方式中的一种访问支持 GPU 的机器:使用 BASIC_GPU 调节层级、使用支持 GPU 的 Cloud ML Engine 机器类型或使用 Compute Engine 机器类型并挂接 GPU。

支持基本 GPU 的机器

如果您要了解如何使用 Cloud ML Engine 或试用支持 GPU 的机器,则可以将调节层级设置为 BASIC_GPU 以获取配备了一个 NVIDIA Tesla K80 GPU 的单个工作器实例。

配有 GPU 的机器类型

要自定义 GPU 用量,请将训练作业配置为使用支持 GPU 的机器类型:

  • 将调节层级设置为 CUSTOM
  • 根据任务所需的 GPU 数量和加速器类型,将每种工作器类型(主实例、工作器或参数服务器)配置为使用下面的一种支持 GPU 的机器类型:
    • standard_gpu:一个 NVIDIA Tesla K80 GPU
    • complex_model_m_gpu:四个 NVIDIA Tesla K80 GPU
    • complex_model_l_gpu:八个 NVIDIA Tesla K80 GPU
    • standard_p100:一个 NVIDIA Tesla P100 GPU
    • complex_model_m_p100:四个 NVIDIA Tesla P100 GPU
    • standard_v100:一个 NVIDIA Tesla V100 GPU
    • large_model_v100:一个 NVIDIA Tesla V100 GPU
    • complex_model_m_v100:四个 NVIDIA Tesla V100 GPU
    • complex_model_l_v100:八个 NVIDIA Tesla V100 GPU

以下示例展示了如何通过 gcloud 命令提交使用了支持 GPU 的机器类型的作业。

如需了解详情,请参阅比较机器类型

挂接了 GPU 的 Compute Engine 机器类型

或者,如果您将训练作业配置为使用 Compute Engine 机器类型(默认情况下不包括 GPU),则可以挂接自定义数量的 GPU 以加快作业速度:

  • 将调节层级设置为 CUSTOM
  • 将每种工作器类型(主实例、工作器或参数服务器)配置为使用有效的 Compute Engine 机器类型。
  • 将包含所需的 GPU 类型和数量的 acceleratorConfig 字段添加到 masterConfigworkerConfigparameterServerConfig,具体取决于您想要加速的虚拟机。您可以使用以下 GPU 类型:
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4(测试版)
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_V100

要创建有效的 acceleratorConfig,您必须考虑以下几项限制:

  1. 您只能在配置中使用特定数量的 GPU。例如,您可以挂接 2 个或 4 个 NVIDIA Tesla K80,但不能挂接 3 个。要了解对每种类型的 GPU 有效的限制数量,请参阅下面的兼容性表

  2. 您必须确保每项 GPU 配置都会为您挂接了 GPU 的机器类型提供足够的虚拟 CPU 和内存。例如,如果您对工作器使用 n1-standard-32,则每个工作器将配备 32 个虚拟 CPU 和 120 GB 的内存。由于每个 NVIDIA Tesla V100 最多可提供 8 个虚拟 CPU 和 52 GB 的内存,因此您必须至少将 4 个 NVIDIA Tesla V100 挂接到每个 n1-standard-32 工作器才能满足其需求。

    查看机器类型规范表比较用于处理计算工作负载的 GPU 以确定这些兼容性,或参考下面的兼容性表

    在特定情况下,请注意以下针对 Cloud ML Engine 的 GPU 资源的其他限制:

    • 配备了 8 个 NVIDIA Tesla K80 GPU 的配置在所有区域和地区最多只提供 208 GB 的内存。
    • 配备了 4 个 NVIDIA Tesla P100 GPU 的配置在所有区域和地区最多只支持 64 个虚拟 CPU 和 208 GB 的内存。
  3. 您必须将训练作业提交到支持 GPU 配置的区域。详细了解下文的区域支持。

下表提供了可以挂接到各 Compute Engine 机器类型的各类加速器数量的快速参考信息:

每种机器类型的有效 GPU 数量
机器类型 NVIDIA Tesla K80 NVIDIA Tesla P4(测试版) NVIDIA Tesla P100 NVIDIA Tesla V100
n1-standard-4 1、2、4、8 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、8
n1-standard-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-standard-32 4、8 2、4 2、4 4、8
n1-standard-64 4 8
n1-standard-96 4 8
n1-highmem-2 1、2、4、8 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、8
n1-highmem-8 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-highmem-32 4、8 2、4 2、4 4、8
n1-highmem-64 4 8
n1-highmem-96 4 8
n1-highcpu-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-highcpu-32 4、8 2、4 2、4 4、8
n1-highcpu-64 8 4 4 8
n1-highcpu-96 4 8

以下示例展示了如何提交使用 Compute Engine 机器类型(挂接了 GPU)的作业。

支持 GPU 的区域

您必须在支持 GPU 的区域中运行作业。以下区域目前提供对 GPU 的访问权限:

  • us-east1
  • us-central1
  • us-west1
  • asia-east1
  • europe-west1
  • europe-west4

此外,其中一些区域仅提供对特定类型的 GPU 的访问权限。如需全面了解 Cloud ML Engine 服务(包括模型训练和在线/批量预测)的适用区域,请阅读区域指南

如果训练作业使用多种类型的 GPU,则必须在您所在区域的单个地区中提供所有这些 GPU。例如,您无法使用配备了 NVIDIA Tesla V100 GPU 的主实例工作器、配备了 NVIDIA Tesla K80 GPU 的参数服务器和配备了 NVIDIA Tesla P100 GPU 的工作器在 us-central1 中运行作业。虽然所有这些 GPU 都可以用于 us-central1 中的训练作业,但该区域中没有一个地区可提供全部三种类型的 GPU。如需详细了解 GPU 的地区可用性,请参阅比较用于处理计算工作负载的 GPU

提交训练作业

您可以使用 gcloud ml-engine jobs submit training 命令提交训练作业。

  1. 定义一个描述所需 GPU 选项的 config.yaml 文件。YAML 文件的结构表示作业资源。以下是 config.yaml 文件的两个示例。

    第一个示例展示了使用 Cloud ML Engine 机器类型(其中一些机器类型配备了 GPU)的训练作业的配置文件:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    

    下一个示例展示了配置与上述示例类似的作业的配置文件。但是,此配置使用挂接了 GPU 的 Compute Engine 机器类型。此类配置处于测试版阶段:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    
  2. 使用 gcloud 命令提交作业(需要在命令中添加指向 config.yaml 文件的 --config 参数)。以下示例假设您已为一些参数的值设置环境变量(由 $ 符号后跟大写字母表示):

    gcloud ml-engine 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
    

或者,如果您安装了 gcloud beta 组件,则可以使用命令行标志(而不是在配置文件中)指定集群配置详细信息。详细了解如何使用这些标志。要安装或更新 gcloud beta 组件,请运行 gcloud components install beta

以下示例展示了如何提交配置与上一示例相同的作业(使用挂接了 GPU 的 Compute Engine 机器类型),但提交时没有使用 config.yaml 文件:

gcloud beta ml-engine 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-k80 \
        --worker-server-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-k80 \
        --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 的开始。
  • 特定于 Cloud ML Engine 的标志(如 --module-name--runtime-version--job-dir)必须位于空 -- 标志之前。Cloud ML Engine 服务可解释这些标志。
  • --job-dir 标志(如果指定)必须位于空 -- 标志之前,因为 Cloud ML Engine 使用 --job-dir 来验证路径。
  • 如果指定 --job-dir 标志,您的应用也必须进行处理。即使该标志位于空 -- 之前,--job-dir 也会作为命令行标志传递至您的应用。
  • 您可以根据需要定义任意数量的 USER_ARGS。Cloud ML Engine 将 --user_first_arg--user_second_arg 等传递至您的应用。

如需详细了解作业提交选项,请参阅启动训练作业指南。

为 GPU 分配操作

要在机器上使用 GPU,请对 TensorFlow 训练应用进行适当的更改:

  • 高级 Estimator API:只要 ClusterSpec 配置正确,就不需要更改代码。如果集群同时包含 CPU 和 GPU,请将 ps 作业名称映射到 CPU,而将 worker 作业名称映射到 GPU。

  • Core Tensorflow API:您必须在支持 GPU 的机器上分配要运行的操作。该过程与在本地将 GPU 用于 TensorFlow 的过程相同。您可以使用 tf.train.replica_device_setter 将操作分配给设备。

当您将支持 GPU 的机器分配给 Cloud ML Engine 进程时,该进程对该机器的 GPU 拥有独占访问权限;您不能在多个进程间共享集群中单个机器的 GPU。该进程与集群规范中的分布式 TensorFlow 任务相对应。分布式 TensorFlow 文档描述了集群规范和任务。

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 软件包。如需查看所有预安装软件包的列表,请参阅 Cloud ML 运行时版本列表

维护事件

如果您在训练作业中使用 GPU,请注意底层虚拟机有时会受 Compute Engine 主机维护的影响。训练作业中使用的支持 GPU 的虚拟机配置为在此类维护事件结束后自动重启,但您可能需要执行一些额外工作才能确保作业能够快速应对这些关停问题。对训练应用进行配置,以定期保存模型检查点(通常沿着您通过 --job-dir 参数指定给 gcloud ml-engine jobs submit training 的 Cloud Storage 路径),并在某检查点已存在的情况下恢复最新的检查点。

TensorFlow Estimator API 为您实现了该功能,因此如果您的模型已封装在 Estimator 中,您就不必担心 GPU 工作器发生的维护事件。

如果您无法将模型封装在 TensorFlow Estimator 中,但希望支持 GPU 的训练作业能够从维护事件中快速恢复,则必须将检查点保存和恢复功能手动编写到模型。TensorFlow 确实为 tf.train 模块中的此类实现提供了一些有用的资源(具体而言,就是 tf.train.checkpoint_existstf.train.latest_checkpoint)。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
适用于 TensorFlow 的 Cloud ML Engine