其他详情#

本节提供关于您的 Run:ai 环境中一些重要功能的具体细节。

Amazon Elastic Fabric Adapters#

Amazon EKS 中的 DGX Cloud Run.ai 集群提供 Elastic Fabric Adapters (EFA) 以实现高速分布式计算。DGXC 客户可以使用此 fabric 来为分布式工作负载启用 GPU Direct RDMA、NCCL 和 MPI。

虽然许多为分布式计算构建的容器镜像已经捆绑了 MPI 和 NCCL 等工具,但想要利用 EFA 的工作负载必须使用 Amazon 提供的 EFA/OFI/NCCL/MPI 堆栈。为了简化 EFA 的使用,DGXC 自动为作为分布式 MPIJob 或 PyTorchJob 启动的 pod 提供 Amazon 堆栈、环境变量和 EFA 设备,方法是修改它们的 pod 定义。这被称为自动挂载 EFA。

利用自动挂载 EFA#

自动挂载 EFA 功能包括

  • /opt/amazon-efa-ofi 的卷挂载。

  • 添加的容器资源请求:vpc.amazonaws.com/efa: "32"hugepages-2Mi: 5Gi

  • LD_LIBRARY_PATH 前缀为 /opt/amazon-efa-ofi 中的各种目录。

  • 设置了环境变量 OPAL_PREFIXNVIDIA_GDRCOPYFI_EFA_USE_DEVICE_RDMA

一些工作负载仍然需要进行少量修改才能利用挂载的 Amazon EFA 堆栈

  • 容器镜像必须使用 C 工具链版本 2.34 或更高版本构建(通常,从至少 Ubuntu 21.10 或 ubi9 构建的镜像)。

  • 如果分布式作业是 PyTorchJob,通常不需要修改。由于 LD_LIBRARY_PATH 的值,将找到 Amazon 堆栈。

  • 如果分布式作业是 MPIJob,并且容器入口点或脚本调用了诸如 mpirun 之类的工具,则需要修改这些工具以调用提供的 /opt/amazon-efa-ofi/openmpi/bin/mpirun

  • 也可能有必要将关键环境变量从启动器传递到工作节点,例如 /opt/amazon-efa-ofi/openmpi/bin/mpirun -x LD_LIBRARY_PATH -x OPAL_PREFIX -x FI_EFA_USE_DEVICE_RDMA

故障排除#

用户想要确认 EFA 正在被使用:

这通常可以通过为使用 NCCL 的工作负载设置环境变量 NCCL_INFO=DEBUG 来完成。当工作负载发送消息时,它应该在日志中打印如下信息

NCCL INFO Channel 13/0 : 2[2] -> 10[2] [send] via NET/AWS Libfabric/2/GDRDMA

用户 pod 启动失败,日志可能显示以下内容:

mpirun: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.34' not found
(required by /opt/amazon-efa-ofi/openmpi/lib/libopen-rte.so.40)

这意味着容器镜像的 C 工具链太旧,无法利用自动挂载 EFA,或者调用了错误的 mpirun 二进制文件。要解决

  • 更新镜像或入口点脚本,这可能涉及到追踪基础镜像更新。

  • 或者,手动编译 Amazon EFA 堆栈并将其捆绑到镜像中,并选择退出自动挂载 EFA。

用户正在运行分布式 PyTorch,并且看到 os.fork() 抛出错误:

OSError: Cannot allocate memory

设置环境变量 FI_EFA_USE_HUGE_PAGE=0。这会导致少量性能损失,但可以防止由于操作系统耗尽大页而导致的 fork 失败。更多信息请访问 AWS OFI NCCL 仓库

用户想要确认其镜像中的 C 工具链版本:

这可以通过运行和检查镜像中的 libc.so.6 来完成。示例

$ docker run -it --entrypoint bash redhat/ubi9

[root@54fbddf47d15 /]# find / -name libc.so.6
/usr/lib64/libc.so.6

[root@54fbddf47d15 /]# /usr/lib64/libc.so.6
GNU C Library (GNU libc) stable release version 2.34.

选择退出#

在某些情况下,用户可能想要完全禁用自动挂载 EFA。当以下情况时,这很有用

  • 容器镜像的 C 工具链不兼容。

  • 镜像捆绑了其自身构建的 Amazon EFA。

  • 用户出于任何原因想要选择退出 EFA。

这可以通过向工作负载添加注释来实现:disable-auto-efa: "true"。如何添加此注释取决于工作负载的提交方式

  • Run:ai CLI

    runai submit-dist  --annotation "disable-auto-efa=true"
    
  • Run:ai UI

    当提交新的分布式训练工作负载时,找到通用部分并选择 + 注释

  • YAML 文件

    disable-auto-efa: "true" 添加到任何 pod 规范的 metadata annotations 部分。