优化 GPU 性能

您可以使用以下方式来提升虚拟机 (VM) 实例上的 GPU 的性能:

停用自动启动功能

当您对 NVIDIA® K80 GPU 使用自动启动功能时,系统会自动调整时钟速度,以便找到适合给定应用的最佳速率。不过,不断调整时钟速度也会导致 GPU 的性能有所下降。如需详细了解自动启动功能,请参阅使用 GPU Boost 和 K80 Autoboost 提升性能

我们建议您在 Compute Engine 上运行 NVIDIA® K80 GPU 时停用自动启动功能。

如需在挂接了 NVIDIA® K80 GPU 的实例上停用自动启动功能,请运行以下命令:

sudo nvidia-smi --auto-boost-default=DISABLED

输出类似于以下内容:

All done.

将 GPU 时钟速度设置为最高频率

如需在挂接了 NVIDIA® K80 GPU 的实例上将 GPU 时钟速度设置为最高频率,请运行以下命令:

sudo nvidia-smi --applications-clocks=2505,875

使用高达 100 Gbps 的网络带宽

创建使用更高带宽的虚拟机

在 Compute Engine 上运行的使用 NVIDIA® A100、T4 或 V100 GPU 的虚拟机上,您可以使用更高的网络带宽来提升分布式工作负载的性能。

如需详细了解 GPU 实例支持的网络带宽,请参阅网络带宽和 GPU

如需创建挂接了 GPU 且网络带宽高达 100 Gbps 的虚拟机,请执行以下操作:

  1. 查看获得可用的最大带宽时所需的最低 CPU、GPU 和内存配置。
  2. 创建挂接 A100、T4 或 V100 GPU 的虚拟机,请参阅创建挂接 GPU 的虚拟机。 此 GPU 虚拟机还必须具有以下设置:

    或者,您可以使用 Deep Learning VM (DLVM) Image 映像项目中任何受 GPU 支持的映像来创建虚拟机。GPU 支持的所有 DLVM Image 映像都预安装了 GPU 驱动程序、机器学习软件和 gVNIC。如需查看 DLVM Image 映像列表,请参阅选择映像

    示例

    例如,如需创建最大带宽为 100 Gbps、挂接了 8 个 V100 GPU 并使用 tf-latest-gpu DLVM Image 映像的虚拟机,请运行以下命令:

     gcloud compute instances create VM_NAME \
       --project PROJECT_ID \
       --custom-cpu 96 \
       --custom-memory 624 \
       --image-project=deeplearning-platform-release \
       --image-family=tf-latest-gpu \
       --accelerator type=nvidia-tesla-v100,count=8 \
       --maintenance-policy TERMINATE \
       --metadata="install-nvidia-driver=True"  \
       --boot-disk-size 200GB \
       --network-interface=nic-type=GVNIC \
       --zone=ZONE
    

    示例

    例如,如需创建最大带宽为 100 Gbps、挂接了 8 个 A100 GPU 并使用 tf-latest-gpu DLVM Image 映像的虚拟机,请运行以下命令:

    gcloud compute instances create VM_NAME \
       --project=PROJECT_ID \
       --zone=ZONE \
       --machine-type=a2-highgpu-8g \
       --maintenance-policy=TERMINATE --restart-on-failure \
       --image-family=tf-latest-gpu \
       --image-project=deeplearning-platform-release \
       --boot-disk-size=200GB \
       --network-interface=nic-type=GVNIC \
       --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
       --scopes=https://www.googleapis.com/auth/cloud-platform
    

    请替换以下内容:

    • VM_NAME:您的虚拟机的名称
    • PROJECT_ID:您的项目 ID
    • ZONE:虚拟机的可用区。此可用区必须支持该 GPU 类型。如需详细了解可用区,请参阅 GPU 区域和可用区可用性
  3. 创建虚拟机虚拟机后,您可以验证网络带宽

检查网络带宽

使用高带宽 GPU 时,您可以使用网络流量工具(如 iperf2)来测量网络带宽。

如需检查带宽速度,您需要至少两个已挂接 GPU 且同时支持您正在测试的带宽速度的虚拟机。如需了解针对特定带宽的最低虚拟机配置建议,请参阅虚拟机配置

使用 iPerf 在基于 Debian 的系统上执行基准测试。

  1. 创建两个可以支持所需带宽速度的虚拟机。

  2. 两个虚拟机运行后,使用 SSH 连接到其中一个虚拟机。

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    请替换以下内容:

    • VM_NAME:第一个虚拟机的名称
    • PROJECT_ID:您的项目 ID
  3. 在第一个虚拟机上,完成以下步骤:

    1. 安装 iperf

      sudo apt-get update && sudo apt-get install iperf
      
    2. 获取此虚拟机的内部 IP 地址。记录下来以进行跟踪。

      ip a
      
    3. 启动 iPerf 服务器。

      iperf -s
      

      它会启动一个服务器来侦听连接,以便执行基准测试。在测试期间,保持运行状态。

  4. 通过新的客户端终端,用 SSH 连接到第二个虚拟机。

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    请替换以下内容:

    • VM_NAME:第二个虚拟机的名称
    • PROJECT_ID:您的项目 ID
  5. 在第二个虚拟机上,完成以下步骤:

    1. 安装 iPerf。

      sudo apt-get update && sudo apt-get install iperf
      
    2. 运行 iperf 测试,并将第一个虚拟机的 IP 地址指定为目标。

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      这将执行 30 秒的测试,并生成类似于以下输出的结果。如果 iPerf 无法访问其他虚拟机,则可能需要调整虚拟机或 Cloud Console 中的网络或防火墙设置

当您使用最大可用带宽 (100 Gbps) 时,请注意以下注意事项:

  • 由于虚拟化堆栈的以太网、IP 和 TCP 等协议的标头开销,吞吐量(以 netperf 衡量)会在值大约为 90 Gbps 时达到饱和。

    TCP 的网络速度能够达到 100 Gbps。其他协议(如 UDP)的速度目前较慢。

  • 由于协议开销和网络拥塞度等因素,数据流的端到端性能可能略低于 100 Gbps。

  • 您需要使用多个 TCP 流来实现虚拟机实例之间的最大带宽。Google 建议使用 4-16 个数据流。如果您使用 16 个数据流,您通常需要最大限度地提高吞吐量。根据您的应用和软件堆栈,您可能需要调整设置或用于设置多个数据流的代码。

  • 100 Gbps 网络带宽只能单向实现。TX + RX 的总和可能大约为 100 Gbps。

通过 Fast Socket 实现更高的网络带宽速度

NVIDIA Collective Communications Library (NCCL) 用于深度学习框架,如 TensorFlow、PyTorch、用于多 GPU 和多节点训练的 Horovod。

Fast Socket 是一种适用于 NCCL 的 Google 专有网络传输。在 Compute Engine 上,Fast Socket 通过减少多个 TCP 连接之间的争用来提高 100 Gbps 网络上的 NCCL 性能。 如需详细了解如何使用 NCCL,请参阅 NCCL 用户指南

当前评估表明,根据消息大小,Fast Socket 可将全缩减吞吐量提高 30%–60%。

如需设置 Fast Socket 环境,您可以使用 Deep Learning VM Image 映像Compute Engine 公共映像

使用 Deep Learning VM Image 映像

如需设置 Fast Socket,您可以使用 Deep Learning VM。Deep Learning VM Image 映像预安装了 GPU 驱动程序、机器学习软件、Fast Socket 和 gVNIC。

这些映像包括:

  • tf-latest-gpu-debian-10
  • tf-latest-gpu-ubuntu-1804

V100 示例

例如,如需创建最大带宽为 100 Gbps、挂接了 8 个 V100 GPU 并使用具有 Fast Socket 的 Deep Learning VM Image 映像的 Debian 10 虚拟机,请运行以下命令:

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --custom-cpu=96 \
    --custom-memory=624 \
    --image-project=deeplearning-platform-release \
    --image-family=tf-latest-gpu-debian-10 \
    --accelerator=type=nvidia-tesla-v100,count=8 \
    --maintenance-policy=TERMINATE \
    --metadata="install-nvidia-driver=True"  \
    --network-interface=nic-type=GVNIC \
    --boot-disk-size=200GB

A100 示例

例如,如需创建最大带宽为 100 Gbps、挂接了八个 A100 GPU 的 Ubuntu 18.04 虚拟机并使用带有 Fast Socket 的 Deep Learning VM Image 映像,请运行以下命令:

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a2-highgpu-8g \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=tf-latest-gpu-ubuntu-1804 \
    --image-project=deeplearning-platform-release \
    --boot-disk-size=200GB \
    --network-interface=nic-type=GVNIC \
    --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
    --scopes=https://www.googleapis.com/auth/cloud-platform

请替换以下内容:

  • VM_NAME:您的虚拟机的名称。
  • PROJECT_ID:您的项目 ID。
  • ZONE:虚拟机的可用区。此可用区必须支持该 GPU 类型。如需详细了解可用区,请参阅 GPU 区域和可用区可用性

设置环境后,您可以验证是否已启用 Fast Socket

使用 Compute Engine 公共映像

要设置 Fast Socket,您可以使用 Compute Engine 公共映像。要使用 Compute Engine 公共映像,请完成以下步骤:

  1. 创建挂接 A100、T4 或 V100 GPU 的虚拟机,请参阅创建挂接 GPU 的虚拟机

  2. 使用此映像创建挂接 A100、T4 或 V100 GPU 的虚拟机。如需了解详情,请参阅创建挂接 GPU 的虚拟机

  3. 安装 GPU 驱动程序。 如需了解详情,请参阅安装 GPU 驱动程序

  4. 安装 Fast Socket。如需查看相关说明,请参阅手动安装 Fast Socket

  5. 验证 Fast Socket 已启用。如需查看相关说明,请参阅验证 Fast Socket 是否已启用

手动安装 Fast Socket

在 Linux 虚拟机上安装 Fast Socket 之前,您需要安装 NCCL。如需了解详细说明,请参阅 NVIDIA NCCL 文档

CentOS/RHEL

如需在 CentOS 或 RHEL 虚拟机上下载和安装 Fast Socket,请完成以下步骤:

  1. 添加软件包代码库并导入公钥。

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. 安装 Fast Socket。

    sudo yum install google-fast-socket
    
  3. 验证 Fast Socket 已启用

SLES

如需在 SLES 虚拟机上下载和安装 Fast Socket,请完成以下步骤:

  1. 添加软件包代码库。

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. 添加代码库密钥。

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. 安装 Fast Socket。

    sudo zypper install google-fast-socket
    
  4. 验证 Fast Socket 已启用

Debian/Ubuntu

如需在 Debian 或 Ubuntu 虚拟机上下载和安装 Fast Socket,请完成以下步骤:

  1. 添加软件包代码库。

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. 添加代码库密钥。

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. 安装 Fast Socket。

    sudo apt update && sudo apt install google-fast-socket
    
  4. 验证 Fast Socket 已启用

验证是否已启用 Fast Socket

在您的虚拟机上,完成以下步骤:

  1. 找到 NCCL 主目录。

    sudo ldconfig -p | grep nccl

    例如,在 DLVM 映像上,您将获得以下输出:

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    这表明 NCCL 主目录为 /usr/local/nccl2

  2. 检查 NCCL 是否加载 Fast Socket 插件。要进行检查,您需要下载 NCCL 测试软件包。如需下载测试软件包,请运行以下命令:

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    NCCL_HOME_DIRECTORY 替换为 NCCL 主目录。

  3. nccl-tests 目录运行 all_reduce_perf 进程:

    NCCL_DEBUG=INFO build/all_reduce_perf

    如果启用了 Fast Socket,则输出日志中会显示 FastSocket plugin initialized 消息。

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

后续步骤