

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 EFA 运行训练
<a name="your-algorithms-training-efa"></a>

 SageMaker AI 提供与 [EFA](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) 设备的集成，以加速高性能计算 (HPC) 和机器学习应用程序。通过这种集成，您可在运行分布式训练作业时利用 EFA 设备。您可以将 EFA 集成添加到您引入 SageMaker AI 的现有 Docker 容器中。以下信息概述了如何配置自己的容器，以便为分布式训练作业使用 EFA 设备。

## 先决条件
<a name="your-algorithms-training-efa-prereq"></a>

 您的容器必须满足[SageMaker 训练容器规范](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html)。  

## 安装 EFA 和所需的软件包
<a name="your-algorithms-training-efa-install"></a>

您的容器必须下载并安装 [EFA 软件](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html)。这使您的容器能够识别 EFA 设备，并提供兼容版本的 Libfabric 和 Open MPI。

容器内必须安装和管理 MPI 和 NCCL 等任意工具，才能在启用 EFA 的训练作业中使用。有关所有可用 EFA 版本的列表，请参阅[使用校验和验证 EFA 安装程序](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-verify.html)。以下示例说明如何修改启用 EFA 的容器的 Dockerfile，以便安装 EFA、MPI、OFI、NCCL 和 NCCL-TEST。

**注意**  
在容器上 PyTorch 与 EFA 一起使用时，容器的 NCCL 版本应与安装的 NCCL 版本相匹配。 PyTorch 要验证 PyTorch NCCL 版本，请使用以下命令：  

```
torch.cuda.nccl.version()
```

```
ARG OPEN_MPI_PATH=/opt/amazon/openmpi/
ENV NCCL_VERSION=2.7.8
ENV EFA_VERSION=1.30.0
ENV BRANCH_OFI=1.1.1

#################################################
## EFA and MPI SETUP
RUN cd $HOME \
  && curl -O https://s3-us-west-2.amazonaws.com/aws-efa-installer/aws-efa-installer-${EFA_VERSION}.tar.gz \
  && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \
  && cd aws-efa-installer \
  && ./efa_installer.sh -y --skip-kmod -g \

ENV PATH="$OPEN_MPI_PATH/bin:$PATH"
ENV LD_LIBRARY_PATH="$OPEN_MPI_PATH/lib/:$LD_LIBRARY_PATH"

#################################################
## NCCL, OFI, NCCL-TEST SETUP
RUN cd $HOME \
  && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \
  && cd nccl \
  && make -j64 src.build BUILDDIR=/usr/local

RUN apt-get update && apt-get install -y autoconf
RUN cd $HOME \
  && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \
  && cd aws-ofi-nccl \
  && ./autogen.sh \
  && ./configure --with-libfabric=/opt/amazon/efa \
       --with-mpi=/opt/amazon/openmpi \
       --with-cuda=/usr/local/cuda \
       --with-nccl=/usr/local --prefix=/usr/local \
  && make && make install
  
RUN cd $HOME \
  && git clone https://github.com/NVIDIA/nccl-tests \
  && cd nccl-tests \
  && make MPI=1 MPI_HOME=/opt/amazon/openmpi CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/local
```

## 创建容器时的注意事项
<a name="your-algorithms-training-efa-considerations"></a>

EFA 设备作为 `/dev/infiniband/uverbs0` 挂载到容器中，位于容器可访问的设备列表下。在 P4d 实例上，容器可以访问 4 个 EFA 设备。在容器能够访问的设备列表中可以找到 EFA 设备，如下所示：
+  `/dev/infiniband/uverbs0` 
+  `/dev/infiniband/uverbs1` 
+  `/dev/infiniband/uverbs2` 
+  `/dev/infiniband/uverbs3` 

 要从向每个容器实例提供的 `resourceconfig.json` 文件中获取主机名、对等连接主机名和网络接口（对于 MPI）等信息，请参阅[分布式训练配置](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-running-container.html#your-algorithms-training-algo-running-container-dist-training)。您的容器通过默认的弹性网络接口 (ENI) 处理对等连接之间的常规 TCP 流量，同时通过 EFA 设备处理 OFI（内核旁路）流量。

## 验证是否已识别您的 EFA 设备
<a name="your-algorithms-training-efa-verify"></a>

  要验证是否已识别 EFA 设备，请在容器内运行以下命令。

```
/opt/amazon/efa/bin/fi_info -p efa
```

您的输出应类似于以下内容。

```
provider: efa
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-rdm
    version: 2.0
    type: FI_EP_RDM
    protocol: FI_PROTO_EFA
provider: efa
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-dgrm
    version: 2.0
    type: FI_EP_DGRAM
    protocol: FI_PROTO_EFA
provider: efa;ofi_rxd
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-dgrm
    version: 1.0
    type: FI_EP_RDM
    protocol: FI_PROTO_RXD
```

## 使用 EFA 运行训练作业
<a name="your-algorithms-training-efa-run"></a>

 创建支持 EFA 的容器后，您可以像处理任何其他 Docker 镜像一样使用 SageMaker AI 估算器使用 EFA 运行训练作业。有关注册容器并将其用于训练的更多信息，请参阅[调整您自己的训练容器](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-training-container.html#byoc-training-step5)。