其他详情#
本节提供关于您的 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_PREFIX
、NVIDIA_GDRCOPY
和FI_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 部分。