

# 适用于 Amazon EC2 上 AI/ML 和 HPC 工作负载的 Elastic Fabric Adapter
<a name="efa"></a>

Elastic Fabric Adapter（EFA）是一种网络设备，可以将其附加到 Amazon EC2 实例以加速人工智能（AI）、机器学习（ML）和高性能计算（HPC）应用程序。EFA 使您能够利用 AWS 云提供的可扩展性、灵活性和弹性，实现本地 AI/ML 或 HPC 集群的应用程序性能。

与以前在基于云的 HPC 系统中使用的 TCP 传输相比，EFA 提供更低且更一致的延迟和更高的吞吐量。它提高了实例间通信的性能，这对于扩展 AI/ML 和 HPC 应用程序至关重要。它经过优化以在现有的 AWS 网络基础设施上使用，并且可以根据应用程序要求进行扩展。

EFA 与 Libfabric 集成在一起，并支持适用于 AI 和 ML 应用程序的 Nvidia Collective Communications Library (NCCL) 和 NVIDIA Inference Xfer Library (NIXL)，以及适用于 HPC 应用程序的 Open MPI 4.1 及更高版本和 Intel MPI 2019 Update 5 及更高版本。NCCL 和 MPI 与 Libfabric 1.7.0 及更高版本集成。NIXL 与 Libfabric 1.21.0 及更高版本集成。

EFA 支持在大多数具有 Nitro 版本 4 及更高版本的受支持实例类型上进行 RDMA（远程直接内存访问）写入。所有具有 Nitro 版本 4 及更高版本的实例均支持 RDMA 读取。有关更多信息，请参阅 [支持的实例类型](#efa-instance-types)。

**Topics**
+ [EFA 基础知识](#efa-basics)
+ [支持的接口和库](#efa-mpi)
+ [支持的实例类型](#efa-instance-types)
+ [支持的操作系统](#efa-os)
+ [EFA 限制](#efa-limits)
+ [EFA 定价](#efa-pricing)
+ [EFA 和 MPI 入门](efa-start.md)
+ [EFA 和 NCCL 入门](efa-start-nccl.md)
+ [开始使用 EFA 和 NCCL](efa-start-nixl.md)
+ [最大化网络带宽](efa-acc-inst-types.md)
+ [创建并附加 EFA](create-efa.md)
+ [分离并删除 EFA](detach-efa.md)
+ [监控 EFA](efa-working-monitor.md)
+ [验证 EFA 安装程序](efa-verify.md)
+ [发行说明](efa-changelog.md)

## EFA 基础知识
<a name="efa-basics"></a>

EFA 设备可以通过两种方式附加到 EC2 实例：

1. 使用传统 EFA 接口（也称为带 ENA 的 EFA），它可以创建 EFA 设备和 ENA 设备。

1. 使用仅限 EFA 的接口，该接口仅创建 EFA 设备。

EFA 设备通过可扩展的可靠数据报（SRD）协议提供内置操作系统绕过和拥塞控制等功能。EFA 设备功能支持低延迟、可靠的传输功能，可让 EFA 接口为 Amazon EC2 上的 HPC 和 ML 应用程序提供更理想的应用程序性能。ENA 设备则提供传统的 IP 联网。

![\[将传统的 HPC 软件堆栈与使用 EFA 的软件堆栈进行比较。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/efa_stack.png)


传统上，AI/ML 应用程序使用 NCCL 和 NIXL（用于分解推理）。HPC 应用程序使用消息传递接口 (MPI) 与系统的网络传输进行交互。在 AWS 云中，这意味着应用程序与 NCCL、NIXL 或 MPI 进行交互，然后 MPI 使用操作系统的 TCP/IP 堆栈和 ENA 设备驱动程序以启用实例之间的网络通信。

对于传统 EFA（带 ENA 的 EFA）或仅限 EFA 的接口，AI/ML 应用程序使用 NCCL 和 NIXL（带 ENA 的 EFA）或仅限 EFA 的接口（用于分解推理）。HPC 应用程序使用 MPI 直接与 Libfabric API 进行交互。Libfabric API 绕过操作系统内核，并直接与 EFA 设备通信以将数据包放在网络上。这减少了开销，并且可以更有效地运行 AL/ML 和 HPC 应用程序。

**注意**  
libfabric 是 OpenFabrics 接口 (OFI) 框架的核心组件，它定义并导出 OFI 的 user-space API。有关更多信息，请参阅 [libfabric OpenFabrics](https://ofiwg.github.io/libfabric/) 网站。

### ENA、EFA 和仅限 EFA 的网络接口之间的区别
<a name="efa-differences"></a>

Amazon EC2 提供两种类型的网络接口：
+ **ENA** 接口提供支持 VPC 的 IP 联网所需的所有传统 IP 联网和路由功能。有关更多信息，请参阅 [在 EC2 实例上使用 ENA 启用增强联网功能](enhanced-networking-ena.md)。
+ **EFA**（带 ENA 的 EFA）接口既提供用于 IP 联网的 ENA 设备，又提供用于低延迟、高吞吐量通信的 EFA 设备。
+ **仅限 EFA** 的接口仅支持 EFA 设备功能，不支持用于传统 IP 联网的 ENA 设备。

下表比较 ENA、EFA 和仅限 EFA 的网络接口。


|  | ENA | EFA（带 ENA 的 EFA） | 仅限 EFA | 
| --- | --- | --- | --- | 
| 支持 IP 联网功能 | 支持 | 是 | 否 | 
| 可以分配 IPv4 或 IPv6 地址 | 支持 | 是 | 否 | 
| 例如，可以用作主网络接口 | 支持 | 是 | 否 | 
| 计入实例的 ENI 附件限制 | 支持 | 是 | 是 | 
| 实例类型支持 | 在所有基于 Nitro 的实例类型上支持 | [支持的实例类型](#efa-instance-types) | [支持的实例类型](#efa-instance-types) | 
| EC2 API 中的参数命名 | interface | efa | efa-only | 
| EC2 控制台中的字段命名 | 未选择 | 带 ENA 的 EFA | 仅限 EFA | 

## 支持的接口和库
<a name="efa-mpi"></a>

EFA 支持以下接口和库：
+ Open MPI 4.1 及更高版本
+ Intel MPI 2019 Update 5 及更高版本
+ NVIDIA Collective Communications Library (NCCL) 2.4.2 及更高版本
+ NVIDIA Inference Xfer Library (NIXL) 1.0.0 及更高版本
+ AWS Neuron SDK 版本 2.3 及更高版本

## 支持的实例类型
<a name="efa-instance-types"></a>

以下所有实例类型均支持 EFA。此外，这些表还指示对实例类型的 RDMA 读取和 RDMA 写入支持。

------
#### [ Nitro v6 ]


| 实例类型 | RDMA 读取支持 | RDMA 写入支持 | 
| --- |--- |--- |
| 通用 | 
| --- |
| m8a.48xlarge | Yes | Yes | 
| m8a.metal-48xl | Yes | Yes | 
| m8azn.24xlarge | Yes | Yes | 
| m8azn.metal-24xl | Yes | Yes | 
| m8gb.16xlarge | Yes | Yes | 
| m8gb.24xlarge | Yes | Yes | 
| m8gb.48xlarge | Yes | Yes | 
| m8gb.metal-24xl | Yes | Yes | 
| m8gb.metal-48xl | Yes | Yes | 
| m8gn.16xlarge | Yes | Yes | 
| m8gn.24xlarge | Yes | Yes | 
| m8gn.48xlarge | Yes | Yes | 
| m8gn.metal-24xl | Yes | Yes | 
| m8gn.metal-48xl | Yes | Yes | 
| m8i.48xlarge | Yes | Yes | 
| m8i.96xlarge | Yes | Yes | 
| m8i.metal-48xl | Yes | Yes | 
| m8i.metal-96xl | Yes | Yes | 
| m8id.48xlarge | Yes | Yes | 
| m8id.96xlarge | Yes | Yes | 
| m8id.metal-48xl | Yes | Yes | 
| m8id.metal-96xl | Yes | Yes | 
| 计算优化 | 
| --- |
| c8a.48xlarge | Yes | Yes | 
| c8a.metal-48xl | Yes | Yes | 
| c8gb.16xlarge | Yes | Yes | 
| c8gb.24xlarge | Yes | Yes | 
| c8gb.48xlarge | Yes | Yes | 
| c8gb.metal-24xl | Yes | Yes | 
| c8gb.metal-48xl | Yes | Yes | 
| c8gn.16xlarge | Yes | Yes | 
| c8gn.24xlarge | Yes | Yes | 
| c8gn.48xlarge | Yes | Yes | 
| c8gn.metal-24xl | Yes | Yes | 
| c8gn.metal-48xl | Yes | Yes | 
| c8i.48xlarge | Yes | Yes | 
| c8i.96xlarge | Yes | Yes | 
| c8i.metal-48xl | Yes | Yes | 
| c8i.metal-96xl | Yes | Yes | 
| c8id.48xlarge | Yes | Yes | 
| c8id.96xlarge | Yes | Yes | 
| c8id.metal-48xl | Yes | Yes | 
| c8id.metal-96xl | Yes | Yes | 
| 内存优化 | 
| --- |
| r8a.48xlarge | Yes | Yes | 
| r8a.metal-48xl | Yes | Yes | 
| r8gb.16xlarge | Yes | Yes | 
| r8gb.24xlarge | Yes | Yes | 
| r8gb.48xlarge | Yes | Yes | 
| r8gb.metal-24xl | Yes | Yes | 
| r8gb.metal-48xl | Yes | Yes | 
| r8gn.16xlarge | Yes | Yes | 
| r8gn.24xlarge | Yes | Yes | 
| r8gn.48xlarge | Yes | Yes | 
| r8gn.metal-24xl | Yes | Yes | 
| r8gn.metal-48xl | Yes | Yes | 
| r8i.48xlarge | Yes | Yes | 
| r8i.96xlarge | Yes | Yes | 
| r8i.metal-48xl | Yes | Yes | 
| r8i.metal-96xl | Yes | Yes | 
| r8id.48xlarge | Yes | Yes | 
| r8id.96xlarge | Yes | Yes | 
| r8id.metal-48xl | Yes | Yes | 
| r8id.metal-96xl | Yes | Yes | 
| x8aedz.24xlarge | Yes | Yes | 
| x8aedz.metal-24xl | Yes | Yes | 
| x8i.48xlarge | Yes | Yes | 
| x8i.64xlarge | Yes | Yes | 
| x8i.96xlarge | Yes | Yes | 
| x8i.metal-48xl | Yes | Yes | 
| x8i.metal-96xl | Yes | Yes | 
| 存储优化 | 
| --- |
| i8ge.48xlarge | Yes | No | 
| i8ge.metal-48xl | Yes | No | 
| 加速计算 | 
| --- |
| g7e.8xlarge | Yes | Yes | 
| g7e.12xlarge | Yes | Yes | 
| g7e.24xlarge | Yes | Yes | 
| g7e.48xlarge | Yes | Yes | 
| p6-b200.48xlarge | Yes | Yes | 
| p6-b300.48xlarge | Yes | Yes | 
| 高性能计算 | 
| --- |
| hpc8a.96xlarge | Yes | Yes | 

------
#### [ Nitro v5 ]


| 实例类型 | RDMA 读取支持 | RDMA 写入支持 | 
| --- |--- |--- |
| 通用 | 
| --- |
| m8g.24xlarge | Yes | No | 
| m8g.48xlarge | Yes | No | 
| m8g.metal-24xl | Yes | No | 
| m8g.metal-48xl | Yes | No | 
| m8gd.24xlarge | No | No | 
| m8gd.48xlarge | No | No | 
| m8gd.metal-24xl | No | No | 
| m8gd.metal-48xl | No | No | 
| 计算优化 | 
| --- |
| c7gn.16xlarge | Yes | No | 
| c7gn.metal | Yes | No | 
| c8g.24xlarge | Yes | No | 
| c8g.48xlarge | Yes | No | 
| c8g.metal-24xl | Yes | No | 
| c8g.metal-48xl | Yes | No | 
| c8gd.24xlarge | No | No | 
| c8gd.48xlarge | No | No | 
| c8gd.metal-24xl | No | No | 
| c8gd.metal-48xl | No | No | 
| 内存优化 | 
| --- |
| r8g.24xlarge | No | No | 
| r8g.48xlarge | No | No | 
| r8g.metal-24xl | No | No | 
| r8g.metal-48xl | No | No | 
| r8gd.24xlarge | No | No | 
| r8gd.48xlarge | No | No | 
| r8gd.metal-24xl | No | No | 
| r8gd.metal-48xl | No | No | 
| x8g.24xlarge | No | No | 
| x8g.48xlarge | No | No | 
| x8g.metal-24xl | No | No | 
| x8g.metal-48xl | No | No | 
| 存储优化 | 
| --- |
| i7ie.48xlarge | Yes | No | 
| i7ie.metal-48xl | Yes | No | 
| i8g.48xlarge | No | No | 
| i8g.metal-48xl | No | No | 
| 加速计算 | 
| --- |
| p5en.48xlarge | Yes | Yes | 
| p6e-gb200.36xlarge | Yes | Yes | 
| trn2.3xlarge | Yes | Yes | 
| trn2.48xlarge | Yes | Yes | 
| trn2u.48xlarge | Yes | Yes | 
| 高性能计算 | 
| --- |
| hpc7g.4xlarge | Yes | No | 
| hpc7g.8xlarge | Yes | No | 
| hpc7g.16xlarge | Yes | No | 

------
#### [ Nitro v4 ]


| 实例类型 | RDMA 读取支持 | RDMA 写入支持 | 
| --- |--- |--- |
| 通用 | 
| --- |
| m6a.48xlarge | Yes | Yes | 
| m6a.metal | Yes | Yes | 
| m6i.32xlarge | Yes | Yes | 
| m6i.metal | Yes | Yes | 
| m6id.32xlarge | Yes | Yes | 
| m6id.metal | Yes | Yes | 
| m6idn.32xlarge | Yes | Yes | 
| m6idn.metal | Yes | Yes | 
| m6in.32xlarge | Yes | Yes | 
| m6in.metal | Yes | Yes | 
| m7a.48xlarge | Yes | No | 
| m7a.metal-48xl | Yes | No | 
| m7g.16xlarge | Yes | No | 
| m7g.metal | Yes | No | 
| m7gd.16xlarge | Yes | No | 
| m7gd.metal | Yes | No | 
| m7i.48xlarge | Yes | No | 
| m7i.metal-48xl | Yes | No | 
| 计算优化 | 
| --- |
| c6a.48xlarge | Yes | Yes | 
| c6a.metal | Yes | Yes | 
| c6gn.16xlarge | Yes | Yes | 
| c6i.32xlarge | Yes | Yes | 
| c6i.metal | Yes | Yes | 
| c6id.32xlarge | Yes | Yes | 
| c6id.metal | Yes | Yes | 
| c6in.32xlarge | Yes | Yes | 
| c6in.metal | Yes | Yes | 
| c7a.48xlarge | Yes | No | 
| c7a.metal-48xl | Yes | No | 
| c7g.16xlarge | Yes | Yes | 
| c7g.metal | Yes | Yes | 
| c7gd.16xlarge | Yes | No | 
| c7gd.metal | Yes | No | 
| c7i.48xlarge | Yes | No | 
| c7i.metal-48xl | Yes | No | 
| 内存优化 | 
| --- |
| r6a.48xlarge | Yes | Yes | 
| r6a.metal | Yes | Yes | 
| r6i.32xlarge | Yes | Yes | 
| r6i.metal | Yes | Yes | 
| r6id.32xlarge | Yes | Yes | 
| r6id.metal | Yes | Yes | 
| r6idn.32xlarge | Yes | Yes | 
| r6idn.metal | Yes | Yes | 
| r6in.32xlarge | Yes | Yes | 
| r6in.metal | Yes | Yes | 
| r7a.48xlarge | No | No | 
| r7a.metal-48xl | No | No | 
| r7g.16xlarge | No | No | 
| r7g.metal | No | No | 
| r7gd.16xlarge | No | No | 
| r7gd.metal | No | No | 
| r7i.48xlarge | No | No | 
| r7i.metal-48xl | No | No | 
| r7iz.32xlarge | No | No | 
| r7iz.metal-32xl | No | No | 
| u7i-6tb.112xlarge | Yes | Yes | 
| u7i-8tb.112xlarge | Yes | Yes | 
| u7i-12tb.224xlarge | Yes | Yes | 
| u7in-16tb.224xlarge | Yes | Yes | 
| u7in-24tb.224xlarge | Yes | Yes | 
| u7in-32tb.224xlarge | Yes | Yes | 
| u7inh-32tb.480xlarge | Yes | Yes | 
| x2idn.32xlarge | Yes | Yes | 
| x2idn.metal | Yes | Yes | 
| x2iedn.32xlarge | Yes | Yes | 
| x2iedn.metal | Yes | Yes | 
| 存储优化 | 
| --- |
| i4g.16xlarge | Yes | Yes | 
| i4i.32xlarge | Yes | Yes | 
| i4i.metal | Yes | Yes | 
| i7i.24xlarge | Yes | No | 
| i7i.48xlarge | Yes | No | 
| i7i.metal-48xl | Yes | No | 
| im4gn.16xlarge | Yes | Yes | 
| 加速计算 | 
| --- |
| f2.48xlarge | Yes | Yes | 
| g6.8xlarge | Yes | Yes | 
| g6.12xlarge | Yes | Yes | 
| g6.16xlarge | Yes | Yes | 
| g6.24xlarge | Yes | Yes | 
| g6.48xlarge | Yes | Yes | 
| g6e.8xlarge | Yes | Yes | 
| g6e.12xlarge | Yes | Yes | 
| g6e.16xlarge | Yes | Yes | 
| g6e.24xlarge | Yes | Yes | 
| g6e.48xlarge | Yes | Yes | 
| gr6.8xlarge | Yes | Yes | 
| p5.4xlarge | Yes | Yes | 
| p5.48xlarge | Yes | Yes | 
| p5e.48xlarge | Yes | Yes | 
| trn1.32xlarge | Yes | Yes | 
| trn1n.32xlarge | Yes | Yes | 
| 高性能计算 | 
| --- |
| hpc6a.48xlarge | Yes | Yes | 
| hpc6id.32xlarge | Yes | Yes | 
| hpc7a.12xlarge | Yes | No | 
| hpc7a.24xlarge | Yes | No | 
| hpc7a.48xlarge | Yes | No | 
| hpc7a.96xlarge | Yes | No | 

------
#### [ Nitro v3 ]


| 实例类型 | RDMA 读取支持 | RDMA 写入支持 | 
| --- |--- |--- |
| 通用 | 
| --- |
| m5dn.24xlarge | No | No | 
| m5dn.metal | No | No | 
| m5n.24xlarge | No | No | 
| m5n.metal | No | No | 
| m5zn.12xlarge | No | No | 
| m5zn.metal | No | No | 
| 计算优化 | 
| --- |
| c5n.9xlarge | No | No | 
| c5n.18xlarge | No | No | 
| c5n.metal | No | No | 
| 内存优化 | 
| --- |
| r5dn.24xlarge | No | No | 
| r5dn.metal | No | No | 
| r5n.24xlarge | No | No | 
| r5n.metal | No | No | 
| x2iezn.12xlarge | No | No | 
| x2iezn.metal | No | No | 
| 存储优化 | 
| --- |
| i3en.12xlarge | No | No | 
| i3en.24xlarge | No | No | 
| i3en.metal | No | No | 
| 加速计算 | 
| --- |
| dl1.24xlarge | Yes | No | 
| dl2q.24xlarge | No | No | 
| g4dn.8xlarge | No | No | 
| g4dn.12xlarge | No | No | 
| g4dn.16xlarge | No | No | 
| g4dn.metal | No | No | 
| g5.8xlarge | No | No | 
| g5.12xlarge | No | No | 
| g5.16xlarge | No | No | 
| g5.24xlarge | No | No | 
| g5.48xlarge | No | No | 
| inf1.24xlarge | No | No | 
| p3dn.24xlarge | No | No | 
| p4d.24xlarge | Yes | No | 
| p4de.24xlarge | Yes | No | 
| vt1.24xlarge | No | No | 
| 上一代 | 
| --- |
| p3dn.24xlarge | No | No | 

------

**查看特定区域中支持 EFA 的可用实例类型**  
可用的实例类型因区域而异。要查看某个区域中支持 EFA 的可用实例类型，请使用带 `--region` 参数的 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令。包括 `--filters` 参数以将结果范围限定为支持 EFA 的实例类型，并包括 `--query` 参数以将输出范围限定为 `InstanceType` 的值。

```
aws ec2 describe-instance-types \
    --region us-east-1  \
    --filters Name=network-info.efa-supported,Values=true \
    --query "InstanceTypes[*].[InstanceType]"  \
    --output text | sort
```

## 支持的操作系统
<a name="efa-os"></a>

操作系统支持因处理器类型而异。下表显示支持的操作系统。


| 操作系统 | Intel/AMD（`x86_64`）实例类型 | AWS Graviton（`arm64`）实例类型 | 
| --- | --- | --- | 
| Amazon Linux 2023 | ✓ | ✓ | 
| Amazon Linux 2 | ✓ | ✓ | 
| RHEL 8 和 9 | ✓ | ✓ | 
| Debian 11、12 和 13 | ✓ | ✓ | 
| Rocky Linux 8 和 9 | ✓ | ✓ | 
| Ubuntu 22.04 和 24.04 | ✓ | ✓ | 
| SUSE Linux Enterprise 15 SP2 和更高版本 | ✓ | ✓ | 
| OpenSUSE Leap 15.5 和更高版本 | ✓ |  | 

**注意**  
Intel MPI 可能不支持部分列出的操作系统。如果您使用的是 Intel MPI，请参阅 [Intel MPI 文档](https://www.intel.com/content/www/us/en/developer/articles/system-requirements/mpi-library-system-requirements.html)验证是否您的操作系统是否受支持。

## EFA 限制
<a name="efa-limits"></a>

EFA 具有以下限制：
+ 并非所有实例类型都支持 RDMA 写入。有关更多信息，请参阅 [支持的实例类型](#efa-instance-types)。
+ 目前不支持 P4d/P4de/DL1 实例与其他实例类型之间的 EFA 流量1。
+ [支持多个网卡的实例类型](using-eni.md#network-cards)可以为每个网卡配置一个 EFA。所有其他支持的实例类型每个实例仅支持一个 EFA。
+ `c7g.16xlarge`、`m7g.16xlarge` 和 `r7g.16xlarge`，当附加 EFA 时，不支持专用实例和专属主机。
+ EFA 流量1无法跨越可用区或 VPC。这不适用于来自 EFA 接口的 ENA 设备的正常 IP 流量。
+ 无法路由 EFA 流量1。仍然可以路由来自 EFA 接口的 ENA 设备的普通 IP 流量。
+ AWS Outposts 上不支持 EFA。
+ 仅在基于 AWS Cloud Digital Interface 软件开发工具包（AWS CDI SDK）的应用程序的 Windows 实例上支持 EFA（带 ENA 的 EFA）接口的 EFA 设备。如果您将 EFA（带 ENA 的 EFA）接口附加到基于非 CDI SDK 的应用程序的 Windows 实例，则该接口将充当 ENA 接口，而没有任何附加 EFA 设备功能。Windows 或 Linux 上基于 AWS CDI 的应用程序不支持仅限 EFA 的接口。有关更多信息，请参阅 [AWS Cloud Digital Interface 软件开发工具包（AWS CDI SDK）用户指南](https://docs.aws.amazon.com/CDI-SDK/latest/ug/what-is.html)。

1*EFA 流量*是指通过 EFA（带 ENA 的 EFA）或仅限 EFA 接口的 EFA 设备传输的流量。

## EFA 定价
<a name="efa-pricing"></a>

EFA 作为一项可选的 Amazon EC2 联网功能提供，您可以在任何支持的实例上启用该功能，无需支付额外费用。

# 开始使用 EFA 和 MPI 处理 Amazon EC2 上的 HPC 工作负载
<a name="efa-start"></a>

本教程可帮助您为 HPC 工作负载启动启用了 EFA 和 MPI 的实例集群。

**注意**  
`u7i-12tb.224xlarge`、`u7in-16tb.224xlarge`、`u7in-24tb.224xlarge`、和 `u7in-32tb.224xlarge` 实例使用 Open MPI 最多可以运行 128 个并行 MPI 进程，使用 Intel MPI 最多可以运行 256 个并行 MPI 进程。

**Topics**
+ [步骤 1：准备启用 EFA 的安全组](#efa-start-security)
+ [步骤 2：启动临时实例](#efa-start-tempinstance)
+ [步骤 3：安装 EFA 软件](#efa-start-enable)
+ [步骤 4：（*可选*）启用 Open MPI 5](#efa-start-ompi5)
+ [步骤 5：（*可选*）安装 Intel MPI](#efa-start-impi)
+ [步骤 6：禁用 Ptrace 保护](#efa-start-ptrace)
+ [第 7 步。确认安装](#efa-start-test)
+ [步骤 8：安装 HPC 应用程序](#efa-start-hpc-app)
+ [步骤 9：创建启用 EFA 的 AMI](#efa-start-ami)
+ [步骤 10：在集群置放群组中启动启用 EFA 的实例](#efa-start-instances)
+ [步骤 11：终止临时实例](#efa-start-terminate)
+ [步骤 12：启用无密码 SSH](#efa-start-passwordless)

## 步骤 1：准备启用 EFA 的安全组
<a name="efa-start-security"></a>

EFA 需要使用一个安全组，以允许进出安全组本身的所有入站和出站流量。以下过程创建了一个安全组，该安全组允许所有进出其本身的入站和出站流量，并允许来自任何 IPv4 地址的入站 SSH 流量进行 SSH 连接。

**重要**  
此安全组仅用于测试目的。对于您的生产环境，建议您创建入站 SSH 规则，该规则仅允许来自您连接的 IP 地址的流量，例如计算机的 IP 地址或本地网络中的一系列 IP 地址。

有关其他场景，请参阅 [针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**创建启用 EFA 的安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups (安全组)**，然后选择 **Create Security Group (创建安全组)**。

1. 在 **Create security group（创建安全组）**窗口中，执行以下操作：

   1. 对于**安全组名称**，请输入一个描述性的安全组名称，例如 `EFA-enabled security group`。

   1. （可选）对于**描述**，请输入安全组的简要描述。

   1. 对于 **VPC**，请选择要在其中启动启用了 EFA 的实例的 VPC。

   1. 选择**创建安全组**。

1. 选择您创建的安全组，然后在 **Details**（详细信息）选项卡上复制 **Security group ID**（安全组 ID）。

1. 在安全组仍然选中的情况下，依次选择 **Actions**（操作）、**Edit inbound rules**（编辑入站规则），然后执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于 **Source type**（源类型），请选择 **Custom**（自定义）并将您复制的安全组 ID 粘贴到该字段中。

   1. 选择**添加规则**。

   1. 对于 **Type**，选择 **SSH**。

   1. 对于 **Source type**（源类型），请选择 **Anywhere-IPv4**。

   1. 选择**保存规则**。

1. 在安全组仍然选中的情况下，依次选择 **Actions**（操作）、**Edit outbound rules**（编辑出站规则），然后执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于 **Destination type**（目标类型），请选择 **Custom**（自定义）并将您复制的安全组 ID 粘贴到该字段中。

   1. 选择**保存规则**。

## 步骤 2：启动临时实例
<a name="efa-start-tempinstance"></a>

启动一个临时实例，可用于安装和配置 EFA 软件组件。您使用该实例创建一个启用了 EFA 的 AMI，您可以从中启动启用了 EFA 的实例。

**启动临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，请选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）以打开新的启动实例向导。

1. （*可选*）在 **Name and tags**（名称和标签）部分中，提供实例的名称，例如 `EFA-instance`。名称作为资源标签（`Name=EFA-instance`）分配给实例。

1. 在 **Application and OS Images**（应用程序和操作系统映像）部分中，为其中一个[支持的操作系统](efa.md#efa-os)选择 AMI。

1. 在 **Instance type**（实例类型）部分中，选择 [supported instance type](efa.md#efa-instance-types)（支持的实例类型）。

1. 在 **Key pair**（密钥对）部分中，选择要用于实例的密钥对。

1. 在 **Network settings**（网络设置）部分中，请选择 **Edit**（编辑），然后执行以下操作：

   1. 对于**子网**，选择要在其中启动实例的子网。如果您未选择子网，则不能启用 EFA 的实例。

   1. 对于 **Firewall（security groups）**（防火墙（安全组）），请选择 **Select existing security group**（选择现有安全组），然后选择您在上一步中创建的安全组。

   1. 展开**高级网络配置**部分。

      对于**网络接口 1**，选择**网卡索引 = 0**、**设备索引 = 0**、**接口类型 = 带 ENA 的 EFA**。

      （可选）如果您使用的是多卡实例类型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，则对于每个额外的网络接口，选择**添加网络接口**；对于**网卡索引**，选择下一个未使用的索引，然后选择**设备索引 = 1** 和**接口类型 = 带 ENA 的 EFA** 或**仅限 EFA**。

1. 在 **Storage**（存储）部分中，根据需要配置卷。

1. 在右侧的 **Summary**（摘要）面板中，选择 **Launch instance**（启动实例）。

**注意**  
考虑要求临时实例以及您将在[步骤 9](#efa-start-ami) 中创建的 AMI 使用 IMDSv2，[除非您已将 IMDSv2 设置为账户的默认值](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)。有关 IMDSv2 配置的更多信息，请参阅 [为新实例配置实例元数据选项](configuring-IMDS-new-instances.md)。

## 步骤 3：安装 EFA 软件
<a name="efa-start-enable"></a>

在临时实例上安装支持 EFA 所需的启用 EFA 的内核、EFA 驱动程序、Libfabric 和 Open MPI 堆栈。

根据您打算将 EFA 与 Open MPI、与 Intel MPI 还是同时与这两者结合使用，这些步骤有所不同。

**注意**  
Intel MPI 可能不支持部分操作系统。如果您使用的是 Intel MPI，请参阅 [Intel MPI 文档](https://www.intel.com/content/www/us/en/developer/articles/system-requirements/mpi-library-system-requirements.html)验证是否您的操作系统是否受支持。

**安装 EFA 软件**

1. 连接到您启动的实例。有关更多信息，请参阅 [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。此过程可能需要几分钟时间。
   + Amazon Linux 2023、Amazon Linux 2、RHEL 8/9、Rocky Linux 8/9

     ```
     $ sudo yum update -y
     ```
   + Ubuntu 和 Debian

     ```
     $ sudo apt-get update && sudo apt-get upgrade -y
     ```
   + SUSE Linux Enterprise

     ```
     $ sudo zypper update -y
     ```

1. 重启实例并重新连接到它。

1. 下载 EFA 软件安装文件。软件安装文件将打包为压缩的 tarball（`.tar.gz`）文件。要下载最新的*稳定* 版本，请使用以下命令。

   您也可以通过将上面命令中的版本号替换为 `latest` 来获取最新版本。

   ```
   $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz
   ```

1. （*可选*）验证 EFA tarball（`.tar.gz`）文件的真实性和完整性。

   建议您执行此操作以验证软件发布者的身份，并检查该文件自发布以来是否已被更改或损坏。如果您不想验证 tarball 文件，请跳过此步骤。
**注意**  
或者，如果您希望使用 MD5 或 SHA256 校验和验证 tarball 文件，请参阅 [使用校验和验证 EFA 安装程序](efa-verify.md)。

   1. 下载公有 GPG 密钥并将其导入到您的密钥环中。

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key
      ```

      该命令应返回一个密钥值。请记下密钥值，因为需要在下一步中使用该值。

   1. 验证 GPG 密钥的指纹。运行以下命令并指定上一步中的密钥值。

      ```
      $ gpg --fingerprint key_value
      ```

      该命令应返回一个与 `4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC` 相同的指纹。如果指纹不匹配，请不要运行 EFA 安装脚本，并联系 支持。

   1. 下载签名文件并验证 EFA tarball 文件的签名。

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.47.0.tar.gz.sig
      ```

      下面显示了示例输出。

      ```
      gpg: Signature made Wed 29 Jul 2020 12:50:13 AM UTC using RSA key ID DD2D3CCC
      gpg: Good signature from "Amazon EC2 EFA <ec2-efa-maintainers@amazon.com>"
      gpg: WARNING: This key is not certified with a trusted signature!
      gpg:          There is no indication that the signature belongs to the owner.
      Primary key fingerprint: 4E90 91BC BB97 A96B 26B1  5E59 A054 80B1 DD2D 3CCC
      ```

      如果结果包含 `Good signature`，并且指纹与上一步中返回的指纹相匹配，请继续下一步。如果没有，请不要运行 EFA 安装脚本，并联系 支持。

1. 从压缩的 `.tar.gz` 文件中提取文件，并导航到提取的目录。

   ```
   $ tar -xf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer
   ```

1. 安装 EFA 软件。根据您的使用案例执行以下某种操作。
**注意**  
**在 SUSE Linux 操作系统下，EFA 不支持 NVIDIA GPUDirect**。如果使用的是 SUSE Linux 操作系统，则必须另外指定 `--skip-kmod` 选项来防止 kmod 安装。预设情况下，SUSE Linux 不允许树外的内核模块。

------
#### [ Open MPI and Intel MPI ]

   如果打算将 EFA 同时与 Open MPI 和 Intel MPI 结合使用，则必须安装 EFA 软件及 Libfabric 和 Open MPI，并且**必须完成步骤 5：安装 Intel MPI**。

   若要安装 EFA 软件以及 Libfabric 和 Open MPI，请运行以下命令。

**注意**  
从 EFA 1.30.0 开始，默认情况下会同时安装 Open MPI 4.1 和 Open MPI 5。您也可以指定要安装的 Open MPI 版本。要仅安装 Open MPI 4.1，请包含 `--mpi=openmpi4`。要仅安装 Open MPI 5，请指定 `--mpi=openmpi5`。要同时安装两者，请忽略 `--mpi` 选项。

   ```
   $ sudo ./efa_installer.sh -y
   ```

   Libfabric 已安装到 `/opt/amazon/efa`。Open MPI 4.1 会安装到 `/opt/amazon/openmpi`。Open MPI 5 已安装到 `/opt/amazon/openmpi5`。

------
#### [ Open MPI only ]

   如果打算将 EFA 与 Open MPI 结合使用，则必须安装 EFA 软件及 Libfabric 和 Open MPI，并且可以**跳过步骤 5：安装 Intel MPI**。若要安装 EFA 软件以及 Libfabric 和 Open MPI，请运行以下命令。

**注意**  
从 EFA 1.30.0 开始，默认情况下会同时安装 Open MPI 4.1 和 Open MPI 5。您也可以指定要安装的 Open MPI 版本。要仅安装 Open MPI 4.1，请包含 `--mpi=openmpi4`。要仅安装 Open MPI 5，请指定 `--mpi=openmpi5`。要同时安装两者，请忽略 `--mpi` 选项。

   ```
   $ sudo ./efa_installer.sh -y
   ```

   Libfabric 已安装到 `/opt/amazon/efa`。Open MPI 4.1 会安装到 `/opt/amazon/openmpi`。Open MPI 5 已安装到 `/opt/amazon/openmpi5`。

------
#### [ Intel MPI only ]

   如果您仅打算将 EFA 与 Intel MPI 结合使用，则可以安装 EFA 而不带 Libfabric 和 Open MPI。在这种情况下，Intel MPI 使用其嵌入式 Libfabric。如果选择执行此操作，则**必须完成步骤 5：安装 Intel MPI**。

   若要在没有 Libfabric 和 Open MPI 的情况下安装 EFA 软件，请运行以下命令。

   ```
   $ sudo ./efa_installer.sh -y --minimal
   ```

------

1. 如果 EFA 安装程序提示您重启实例，请执行此操作，然后重新连接到实例。否则，请注销实例，然后重新登录以完成安装。

1. 删除解压缩后的压缩包和压缩包本身。否则，这些内容将包含在您创建的启用 EFA 的 AMI 中，从而增加其大小。

## 步骤 4：（*可选*）启用 Open MPI 5
<a name="efa-start-ompi5"></a>

**注意**  
仅在打算使用 Open MPI 5 时执行此步骤。

从 EFA 1.30.0 开始，默认情况下会同时安装 Open MPI 4.1 和 Open MPI 5。您也可以选择仅安装 Open MPI 4.1 或 Open MPI 5。

如果在**步骤 3：安装 EFA 软件**中选择安装 Open MPI 5，并且打算使用该软件，则必须执行以下步骤才能将其启用。

**启用 Open MPI 5**

1. 将 Open MPI 5 添加到 PATH 环境变量中。

   ```
   $ module load openmpi5
   ```

1. 确认已启用 Open MPI 5 以供使用。

   ```
   $ which mpicc
   ```

   命令应返回 Open MPI 5 安装目录：`/opt/amazon/openmpi5`。

1. （*可选*）要确保每次启动实例时都将 Open MPI 5 添加到 PATH 环境变量中，请执行以下操作：

------
#### [ bash shell ]

   将 `module load openmpi5` 添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

------
#### [ csh and tcsh shells ]

   将 `module load openmpi5` 添加到 `/home/username/.cshrc`。

------

如果需要从 PATH 环境变量中删除 Open MPI 5，请运行以下命令，并从 Shell 启动脚本中删除该命令。

```
$ module unload openmpi5
```

## 步骤 5：（*可选*）安装 Intel MPI
<a name="efa-start-impi"></a>

**重要**  
仅在您打算使用 Intel MPI 时执行此步骤。如果您仅打算使用 Open MPI，请跳过此步骤。

Intel MPI 需要使用额外的安装和环境变量配置。

**先决条件**  
确保执行以下步骤的用户具有 sudo 权限。

**安装 Intel MPI**

1. 要下载 Intel MPI 安装脚本，请执行以下操作

   1. 访问 [Intel 网站](https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#mpi)。

   1. 在网页的 **Intel MPI Library** 部分，选择 **Intel MPI Library for Linux** **Offline** 安装程序的链接。

1. 运行您在上一个步骤中下载的安装脚本。

   ```
   $ sudo bash installation_script_name.sh
   ```

1. 在安装程序中，选择 **Accept & install**（接受并安装）。

1. 阅读 Intel 改进计划，选择适当的选项，然后选择 **Begin Installation**（开始安装）。

1. 安装完成后，选择**关闭**。

1. 默认情况下，Intel MPI 使用其嵌入式（内部）Libfabric。您可以将 Intel MPI 配置为使用 EFA 安装程序附带的 Libfabric。通常，EFA 安装程序附带的 Libfabric 版本高于 Intel MPI。在某些情况下，EFA 安装程序附带的 Libfabric 比 Intel MPI 性能更强。要将 Intel MPI 配置为使用 EFA 安装程序附带的 Libfabric，请根据您的 Shell 执行以下操作之一。

------
#### [ bash shells ]

   将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

   ```
   export I_MPI_OFI_LIBRARY_INTERNAL=0
   ```

------
#### [ csh and tcsh shells ]

   将以下语句添加到 `/home/username/.cshrc`。

   ```
   setenv I_MPI_OFI_LIBRARY_INTERNAL 0
   ```

------

1. 将以下 **source** 命令添加到 Shell 脚本中，以从安装目录获取 `vars.sh` 脚本，以便在每次启动实例时设置编译器环境。根据您的 Shell 执行下列操作之一。

------
#### [ bash shells ]

   将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

   ```
   source /opt/intel/oneapi/mpi/latest/env/vars.sh
   ```

------
#### [ csh and tcsh shells ]

   将以下语句添加到 `/home/username/.cshrc`。

   ```
   source /opt/intel/oneapi/mpi/latest/env/vars.csh
   ```

------

1. 默认情况下，如果 EFA 因配置错误而不可用，Intel MPI 将默认为 TCP/IP 网络堆栈，这可能会导致应用程序性能下降。您可以通过将 `I_MPI_OFI_PROVIDER` 设置为 `efa` 来防止这种情况。如果 EFA 不可用，这将导致 Intel MPI 出现以下错误：

   ```
   Abort (XXXXXX) on node 0 (rank 0 in comm 0): Fatal error in PMPI_Init: OtherMPI error,
   MPIR_Init_thread (XXX)........:	
   MPID_Init (XXXX)..............:
   MPIDI_OFI_mpi_init_hook (XXXX):
   open_fabric (XXXX)............:
   find_provider (XXXX)..........:
   OFI fi_getinfo() failed (ofi_init.c:2684:find_provider:
   ```

   根据您的 Shell 执行下列操作之一。

------
#### [ bash shells ]

   将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

   ```
   export I_MPI_OFI_PROVIDER=efa
   ```

------
#### [ csh and tcsh shells ]

   将以下语句添加到 `/home/username/.cshrc`。

   ```
   setenv I_MPI_OFI_PROVIDER efa
   ```

------

1. 默认情况下，Intel MPI 不会输出调试信息。您可以指定不同的详细程度来控制调试信息。可能的值（按提供的详细信息量排列）包括：`0`（默认值）、`1`、`2`、`3`、`4`、`5`。`1` 级及以上将输出 `libfabric version` 和 `libfabric provider`。使用 `libfabric version` 查看 Intel MPI 使用的是内部 Libfabric，还是 EFA 安装程序附带的 Libfabric。如果使用的是内部 Libfabric，则该版本的后缀为 `impi`。使用 `libfabric provider` 查看 Intel MPI 使用的是 EFA，还是 TCP/IP 网络。如果使用的是 EFA，则值为 `efa`。如果使用的是 TCP/IP，则值为 `tcp;ofi_rxm`。

   要启用调试信息，请根据您的 Shell 执行以下操作之一。

------
#### [ bash shells ]

   将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

   ```
   export I_MPI_DEBUG=value
   ```

------
#### [ csh and tcsh shells ]

   将以下语句添加到 `/home/username/.cshrc`。

   ```
   setenv I_MPI_DEBUG value
   ```

------

1. 默认情况下，Intel MPI 使用操作系统的共享内存 (`shm`) 进行节点内通信，且仅使用 Libfabric (`ofi`) 进行节点间通信。通常，此配置可提供最佳性能。但是，在某些情况下，Intel MPI shm 结构可能会导致某些应用程序无限期挂起。

   要解决此问题，您可以强制 Intel MPI 使用 Libfabric 进行节点内和节点间通信。为此，请根据您的 Shell 执行下列操作之一。

------
#### [ bash shells ]

   将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

   ```
   export I_MPI_FABRICS=ofi
   ```

------
#### [ csh and tcsh shells ]

   将以下语句添加到 `/home/username/.cshrc`。

   ```
   setenv I_MPI_FABRICS ofi
   ```

------
**注意**  
EFA Libfabric 提供程序使用操作系统的共享内存进行节点内通信。这意味着将 `I_MPI_FABRICS` 设置为 `ofi` 可产生与默认 `shm:ofi` 配置接近的性能。

1. 注销实例，然后重新登录。

如果您不再需要使用 Intel MPI，请从 Shell 启动脚本中删除环境变量。

## 步骤 6：禁用 Ptrace 保护
<a name="efa-start-ptrace"></a>

为了提高 HPC 应用程序的性能，当进程在同一实例上运行时，Libfabric 使用实例的本地内存进行进程间通信。

共享内存功能使用交叉内存附加 (CMA) 功能，但 *ptrace 保护*不支持该功能。如果您正在使用默认情况下启用 ptrace 保护的 Linux 发行版（例如 Ubuntu），则必须禁用它。如果您的 Linux 发行版默认未启用 ptrace 保护，请跳过此步骤。

**禁用 ptrace 保护**  
请执行下列操作之一：
+ 要临时禁用 ptrace 保护以进行测试，请运行以下命令。

  ```
  $ sudo sysctl -w kernel.yama.ptrace_scope=0
  ```
+ 要永久禁用 ptrace 保护，请将 `kernel.yama.ptrace_scope = 0` 添加到 `/etc/sysctl.d/10-ptrace.conf` 并重新启动实例。

## 第 7 步。确认安装
<a name="efa-start-test"></a>

**要确认安装成功**

1. 要确认 MPI 已成功安装，请运行以下命令：

   ```
   $ which mpicc
   ```
   + 对于 Open MPI，返回的路径应包括 `/opt/amazon/`
   + 对于 Intel MPI，返回的路径应包括 `/opt/intel/`。如果您没有得到预期的输出，请确保您已获取 Intel MPI `vars.sh` 脚本。

1. 要确认已成功安装 EFA 软件组件和 Libfabric，请运行以下命令。

   ```
   $ fi_info -p efa -t FI_EP_RDM
   ```

   该命令应返回有关 Libfabric EFA 接口的信息。以下示例显示了命令输出。

   ```
   provider: efa
       fabric: EFA-fe80::94:3dff:fe89:1b70
       domain: efa_0-rdm
       version: 2.0
       type: FI_EP_RDM
       protocol: FI_PROTO_EFA
   ```

## 步骤 8：安装 HPC 应用程序
<a name="efa-start-hpc-app"></a>

在临时实例上安装 HPC 应用程序。安装过程因特定的 HPC 应用程序而异。有关更多信息，请参阅《Amazon Linux 2 User Guide**》中的 [Manage software on your AL2 instance](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)。

**注意**  
请参阅 HPC 应用程序文档以了解安装说明。

## 步骤 9：创建启用 EFA 的 AMI
<a name="efa-start-ami"></a>

在安装所需的软件组件后，您可以创建一个 AMI，然后可以将其重复使用以启动启用了 EFA 的实例。

**从临时实例创建 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您创建的临时实例，然后依次选择 **Actions (操作)**、**Image (映像)**、**Create image (创建映像)**。

1. 对于 **Create image (创建映像)**，请执行以下操作：

   1. 对于 **Image name (映像名称)**，为 AMI 输入一个描述性名称。

   1. （可选）对于 **Image description (映像描述)**，输入 AMI 用途的简要描述。

   1. 选择**创建映像**。

1. 在导航窗格中，选择 **AMIs**。

1. 在列表中找到您创建的 AMI。等待状态从 `pending` 更改为 `available`，然后继续下一步。

## 步骤 10：在集群置放群组中启动启用 EFA 的实例
<a name="efa-start-instances"></a>

使用在**步骤 7** 中创建的启用了 EFA 的 AMI 以及在**步骤 1** 中创建的启用了 EFA 的安全组，在集群置放群组中启动启用了 EFA 的实例。

**注意**  
在集群置放群组中启动启用了 EFA 的实例并不是一个绝对要求。不过，我们建议在集群置放群组中运行启用了 EFA 的实例，因为它在单个可用区的低延迟组中启动实例。
为了确保在扩展集群实例时容量可用，您可以为集群置放群组创建容量预留。有关更多信息，请参阅 [使用集群置放群组的容量预留](cr-cpg.md)。

**启动实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，请选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）以打开新的启动实例向导。

1. （*可选*）在 **Name and tags**（名称和标签）部分中，提供实例的名称，例如 `EFA-instance`。名称作为资源标签（`Name=EFA-instance`）分配给实例。

1. 在 **Application and OS Images**（应用程序和操作系统映像）部分中，请选择 **My AMIs**（我的 AMI），然后选择您在上一步骤创建的 AMI。

1. 在 **Instance type**（实例类型）部分中，选择 [supported instance type](efa.md#efa-instance-types)（支持的实例类型）。

1. 在 **Key pair**（密钥对）部分中，选择要用于实例的密钥对。

1. 在 **Network settings**（网络设置）部分中，请选择 **Edit**（编辑），然后执行以下操作：

   1. 对于**子网**，选择要在其中启动实例的子网。如果您未选择子网，则不能启用 EFA 的实例。

   1. 对于 **Firewall（security groups）**（防火墙（安全组）），请选择 **Select existing security group**（选择现有安全组），然后选择您在上一步中创建的安全组。

   1. 展开**高级网络配置**部分。

      对于**网络接口 1**，选择**网卡索引 = 0**、**设备索引 = 0**、**接口类型 = 带 ENA 的 EFA**。

      （*可选*）如果您使用的是多卡实例类型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，则对于每个额外的网络接口，选择**添加网络接口**；对于**网卡索引**，选择下一个未使用的索引，然后选择**设备索引 1** 和**接口类型 = 带 ENA 的 EFA** 或**仅限 EFA**。

1. （*可选*）在 **Storage**（存储）部分中，根据需要配置卷。

1. 在 **Advanced details**（高级详细信息）部分中，对于**置放群组名称**，选择要在其中启动实例的集群置放群组。如果您需要创建新的集群置放群组，请选择 **Create new placement group**（创建新置放群组）。

1. 在右侧的 **Summary**（摘要）面板中，为 **Number of instances**（实例数量）输入您要启动的启用了 EAA 的实例数量，然后选择 **Launch instance**（启动实例）。

## 步骤 11：终止临时实例
<a name="efa-start-terminate"></a>

此时，您已不再需要在[步骤 2](#efa-start-tempinstance) 中启动的实例。您可以终止实例以停止产生费用。

**终止临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您创建的临时实例，然后依次选择**操作**、**实例状态**、**终止（删除）实例**。

1. 当系统提示您确认时，选择**终止（删除）**。

## 步骤 12：启用无密码 SSH
<a name="efa-start-passwordless"></a>

要使应用程序能够在集群中的所有实例上运行，您必须启用从领导节点到成员节点的无密码 SSH 访问。领导节点是从中运行应用程序的实例。集群中的其余实例是成员节点。

**在集群中的实例之间启用无密码 SSH**

1. 在集群中选择一个实例作为领导节点，然后连接到该实例。

1. 在领导节点上禁用 `strictHostKeyChecking` 并启用 `ForwardAgent`。使用首选文本编辑器打开 `~/.ssh/config`，并添加以下内容。

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. 生成 RSA 密钥对。

   ```
   $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

   密钥对在 `$HOME/.ssh/` 目录中创建。

1. 更改领导节点上私有密钥的权限。

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 使用首选文本编辑器打开 `~/.ssh/id_rsa.pub` 并复制密钥。

1. 对于集群中的每个成员节点，请执行以下操作：

   1. 连接到实例。

   1. 使用首选文本编辑器打开 `~/.ssh/authorized_keys`，并添加之前复制的公有密钥。

1. 要测试无密码 SSH 是否按预期运行，请连接到领导节点并运行以下命令。

   ```
   $ ssh member_node_private_ip
   ```

   您应该连接到成员节点，而不会收到输入密钥或密码的提示。

# 开始使用 EFA 和 NCCL 处理 Amazon EC2 上的 ML 工作负载
<a name="efa-start-nccl"></a>

NVIDIA Collective Communications Library (NCCL) 是一个标准集体通信例程库，它适用于跨单个节点或多个节点的多个 GPU。可将 NCCL 与 EFA、libfabric 和 MPI 结合使用来支持各种机器学习工作负载。有关更多信息，请参阅 [NCCL](https://developer.nvidia.com/nccl) 网站。

**要求**
+ 仅支持加速型计算 P 系列实例类型。有关更多信息，请参阅 [Amazon EC2 加速型计算实例](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html#ac-sizes)。
+ 仅支持 Amazon Linux 2023、Amazon Linux 2、Ubuntu 24.04 和 Ubuntu 22.04 基础 AMI。
+ 仅支持将 NCCL 2.4.2 及更高版本与 EFA 结合使用。

有关使用 AWS Deep Learning AMIs 运行包含 EFA 和 NCCL 的机器学习工作负载的更多信息，请参阅《AWS Deep Learning AMIs 开发者指南》**中的[在 DLAMI 上使用 EFA](https://docs.aws.amazon.com/dlami/latest/devguide/tutorial-efa-using.html)。

**Topics**
+ [步骤 1：准备启用 EFA 的安全组](#nccl-start-base-setup)
+ [步骤 2：启动临时实例](#nccl-start-base-temp)
+ [步骤 3：安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN](#nccl-start-base-drivers)
+ [步骤 4：安装 GDRCopy](#nccl-start-base-gdrcopy)
+ [步骤 5：安装 EFA 软件](#nccl-start-base-enable)
+ [步骤 6：安装 NCCL](#nccl-start-base-nccl)
+ [步骤 7：安装 NCCL 测试](#nccl-start-base-tests)
+ [步骤 8：测试 EFA 和 NCCL 配置](#nccl-start-base-test)
+ [步骤 9：安装机器学习应用程序](#nccl-start-base-app)
+ [步骤 10：创建启用了 EFA 和 NCCL 的 AMI](#nccl-start-base-ami)
+ [步骤 11：终止临时实例](#nccl-start-base-terminate)
+ [步骤 12：在集群置放群组中启动启用了 EFA 和 NCCL 的实例](#nccl-start-base-cluster)
+ [步骤 13：启用无密码 SSH](#nccl-start-base-passwordless)

## 步骤 1：准备启用 EFA 的安全组
<a name="nccl-start-base-setup"></a>

EFA 需要使用一个安全组，以允许进出安全组本身的所有入站和出站流量。以下过程创建了一个安全组，该安全组允许所有进出其本身的入站和出站流量，并允许来自任何 IPv4 地址的入站 SSH 流量进行 SSH 连接。

**重要**  
此安全组仅用于测试目的。对于您的生产环境，建议您创建入站 SSH 规则，该规则仅允许来自您连接的 IP 地址的流量，例如计算机的 IP 地址或本地网络中的一系列 IP 地址。

有关其他场景，请参阅 [针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**创建启用 EFA 的安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups (安全组)**，然后选择 **Create Security Group (创建安全组)**。

1. 在 **Create security group（创建安全组）**窗口中，执行以下操作：

   1. 对于**安全组名称**，请输入一个描述性的安全组名称，例如 `EFA-enabled security group`。

   1. （可选）对于**描述**，请输入安全组的简要描述。

   1. 对于 **VPC**，请选择要在其中启动启用了 EFA 的实例的 VPC。

   1. 选择**创建安全组**。

1. 选择您创建的安全组，然后在 **Details**（详细信息）选项卡上复制 **Security group ID**（安全组 ID）。

1. 在安全组仍然选中的情况下，依次选择 **Actions**（操作）、**Edit inbound rules**（编辑入站规则），然后执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于 **Source type**（源类型），请选择 **Custom**（自定义）并将您复制的安全组 ID 粘贴到该字段中。

   1. 选择**添加规则**。

   1. 对于 **Type**，选择 **SSH**。

   1. 对于 **Source type**（源类型），请选择 **Anywhere-IPv4**。

   1. 选择**保存规则**。

1. 在安全组仍然选中的情况下，依次选择 **Actions**（操作）、**Edit outbound rules**（编辑出站规则），然后执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于 **Destination type**（目标类型），请选择 **Custom**（自定义）并将您复制的安全组 ID 粘贴到该字段中。

   1. 选择**保存规则**。

## 步骤 2：启动临时实例
<a name="nccl-start-base-temp"></a>

启动一个临时实例，可用于安装和配置 EFA 软件组件。您使用该实例创建一个启用了 EFA 的 AMI，您可以从中启动启用了 EFA 的实例。

**启动临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，请选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）以打开新的启动实例向导。

1. （*可选*）在 **Name and tags**（名称和标签）部分中，提供实例的名称，例如 `EFA-instance`。名称作为资源标签（`Name=EFA-instance`）分配给实例。

1. 在**应用程序和操作系统映像**部分中，为其中一个支持的操作系统选择 AMI。

1. 在**实例类型**部分中，选择支持的实例类型。

1. 在 **Key pair**（密钥对）部分中，选择要用于实例的密钥对。

1. 在 **Network settings**（网络设置）部分中，请选择 **Edit**（编辑），然后执行以下操作：

   1. 对于**子网**，选择要在其中启动实例的子网。如果您未选择子网，则不能启用 EFA 的实例。

   1. 对于 **Firewall（security groups）**（防火墙（安全组）），请选择 **Select existing security group**（选择现有安全组），然后选择您在上一步中创建的安全组。

   1. 展开**高级网络配置**部分。

      对于**网络接口 1**，选择**网卡索引 = 0**、**设备索引 = 0**、**接口类型 = 带 ENA 的 EFA**。

      （*可选*）如果您使用的是多卡实例类型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，则对于每个额外的网络接口，选择**添加网络接口**；对于**网卡索引**，选择下一个未使用的索引，然后选择**设备索引 1** 和**接口类型 = 带 ENA 的 EFA** 或**仅限 EFA**。

1. 在 **Storage**（存储）部分中，根据需要配置卷。
**注意**  
您必须为 Nvidia CUDA 工具包额外预置 10 到 20 GiB 的存储空间。如果您没有预置足够的存储空间，您将在尝试安装 Nvidia 驱动程序和 CUDA 工具包时收到 `insufficient disk space` 错误。

1. 在右侧的 **Summary**（摘要）面板中，选择 **Launch instance**（启动实例）。

## 步骤 3：安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN
<a name="nccl-start-base-drivers"></a>

------
#### [ Amazon Linux 2023 and Amazon Linux 2 ]

**安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN**

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。

   ```
   $ sudo yum upgrade -y && sudo reboot
   ```

   实例重启后，重新连接到实例。

1. 安装在安装 Nvidia GPU 驱动程序和 Nvidia CUDA 工具包时需要的实用程序。

   ```
   $ sudo yum groupinstall 'Development Tools' -y
   ```

1. 禁用 `nouveau` 开源驱动程序。

   1. 为您当前运行的内核版本安装所需的实用程序和内核标头软件包。

      ```
      $ sudo yum install -y wget kernel-devel-$(uname -r) kernel-headers-$(uname -r)
      ```

   1. 将 `nouveau` 添加到`/etc/modprobe.d/blacklist.conf `拒绝列表文件。

      ```
      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
      blacklist vga16fb
      blacklist nouveau
      blacklist rivafb
      blacklist nvidiafb
      blacklist rivatv
      EOF
      ```

   1. 将 `GRUB_CMDLINE_LINUX="rdblacklist=nouveau"` 附加到 `grub` 文件并重新构建 Grub 配置。

      ```
      $ echo 'GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' | sudo tee -a /etc/default/grub \
      && sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      ```

1. 重启实例并重新连接到它。

1. 准备所需的存储库

   1. 启用 EPEL 存储库，将发行版设置为 `rhel7`。

      ```
      $ sudo amazon-linux-extras install epel \
      && distribution='rhel7'
      ```

   1. 设置 CUDA 网络存储库并更新存储库缓存。

      ```
      $ ARCH=$( /bin/arch ) \
      && sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/$distribution/${ARCH}/cuda-$distribution.repo \
      && sudo yum clean expire-cache
      ```

   1. （*仅限 5.10 内核版本*）请仅在您使用基于 5.10 内核版本的 Amazon Linux 2 时执行这些步骤。如果您使用基于 4.12 内核版本的 Amazon Linux 2，请跳过以下步骤。要检查内核版本，请运行 **uname -r**。

      1. 创建名为 `/etc/dkms/nvidia.conf` 的 Nvidia 驱动程序配置文件。

         ```
         $ sudo mkdir -p /etc/dkms \
         && echo "MAKE[0]=\"'make' -j2 module SYSSRC=\${kernel_source_dir} IGNORE_XEN_PRESENCE=1 IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 CC=/usr/bin/gcc10-gcc\"" | sudo tee /etc/dkms/nvidia.conf
         ```

      1. （仅限 `p4d.24xlarge` 和 `p5.48xlarge`）复制 Nvidia 驱动程序配置文件。

         ```
         $ sudo cp /etc/dkms/nvidia.conf /etc/dkms/nvidia-open.conf
         ```

1. 安装 Nvidia GPU 驱动程序、NVIDIA CUDA 工具包和 cuDNN。

   ```
   $ sudo yum clean all \
   && sudo yum -y install nvidia-driver-latest-dkms \
   && sudo yum -y install cuda-drivers-fabricmanager cuda libcudnn8-devel
   ```

1. 重启实例并重新连接到它。

1. （仅限 `p4d.24xlarge` 和 `p5.48xlarge`）启动 Nvidia Fabric Manager 服务，并确保其在实例启动时自动启动。NV 交换管理需要 Nvidia Fabric 管理器。

   ```
   $ sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
   ```

1. 确保每次启动实例时均设置 CUDA 路径。
   + 对于 * bash* shell，请将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

     ```
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```
   + 对于 * tcsh * shell，请将以下语句添加到 `/home/username/.cshrc`。

     ```
     setenv PATH=/usr/local/cuda/bin:$PATH
     setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```

1. 要验证 Nvidia GPU 驱动程序是否正常运行，请运行以下命令。

   ```
   $ nvidia-smi -q | head
   ```

   此命令应返回有关 Nvidia GPU、Nvidia GPU 驱动程序和 Nvidia CUDA 工具包的信息。

------
#### [ Ubuntu 24.04 and Ubuntu 22.04 ]

**安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN**

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。

   ```
   $ sudo apt-get update && sudo apt-get upgrade -y
   ```

1. 安装在安装 Nvidia GPU 驱动程序和 Nvidia CUDA 工具包时需要的实用程序。

   ```
   $ sudo apt-get update && sudo apt-get install build-essential -y
   ```

1. 要使用 Nvidia GPU 驱动程序，您必须先禁用 `nouveau` 开源驱动程序。

   1. 为您当前运行的内核版本安装所需的实用程序和内核标头软件包。

      ```
      $ sudo apt-get install -y gcc make linux-headers-$(uname -r)
      ```

   1. 将 `nouveau` 添加到`/etc/modprobe.d/blacklist.conf `拒绝列表文件。

      ```
      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
      blacklist vga16fb
      blacklist nouveau
      blacklist rivafb
      blacklist nvidiafb
      blacklist rivatv
      EOF
      ```

   1. 使用首选文本编辑器打开 `/etc/default/grub`，并添加以下内容。

      ```
      GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
      ```

   1. 重新生成 Grub 配置。

      ```
      $ sudo update-grub
      ```

1. 重启实例并重新连接到它。

1. 添加 CUDA 存储库并安装 Nvidia GPU 驱动程序、NVIDIA CUDA 工具包和 cuDNN。
   + `p3dn.24xlarge`

     ```
     $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \
     && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \
     && sudo dpkg -i /tmp/deeplearning.deb \
     && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
     && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
     && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \
     && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \
     && sudo apt update \
     && sudo apt install nvidia-dkms-535 \
     && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
     ```
   + `p4d.24xlarge` 和 `p5.48xlarge`

     ```
     $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \
     && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \
     && sudo dpkg -i /tmp/deeplearning.deb \
     && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
     && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
     && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \
     && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \
     && sudo apt update \
     && sudo apt install nvidia-kernel-open-535 \
     && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
     ```

1. 重启实例并重新连接到它。

1. （仅限 `p4d.24xlarge` 和 `p5.48xlarge`）安装 Nvidia Fabric Manager。

   1. 您必须安装与上一步中安装的 Nvidia 内核模块版本匹配的 Nvidia Fabric Manager 版本。

      运行以下命令以确定 Nvidia 内核模块的版本。

      ```
      $ cat /proc/driver/nvidia/version | grep "Kernel Module"
      ```

      下面是示例输出。

      ```
      NVRM version: NVIDIA UNIX x86_64 Kernel Module  450.42.01  Tue Jun 15 21:26:37 UTC 2021
      ```

      上述示例中安装了内核模块的主要版本 `450`。这意味着您需要安装 Nvidia Fabric Manager 版本 `450`。

   1. 安装 Nvidia Fabric Manager。运行以下命令并指定上一步中确定的主要版本。

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-major_version_number
      ```

      例如，如果已安装内核模块的主要版本 `450`，请使用以下命令安装与之匹配的 Nvidia Fabric Manager 版本。

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-450
      ```

   1. 启动服务，并确保它在实例启动时自动启动。NV 交换管理需要 Nvidia Fabric 管理器。

      ```
      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
      ```

1. 确保每次启动实例时均设置 CUDA 路径。
   + 对于 * bash* shell，请将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

     ```
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```
   + 对于 * tcsh * shell，请将以下语句添加到 `/home/username/.cshrc`。

     ```
     setenv PATH=/usr/local/cuda/bin:$PATH
     setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```

1. 要验证 Nvidia GPU 驱动程序是否正常运行，请运行以下命令。

   ```
   $ nvidia-smi -q | head
   ```

   此命令应返回有关 Nvidia GPU、Nvidia GPU 驱动程序和 Nvidia CUDA 工具包的信息。

------

## 步骤 4：安装 GDRCopy
<a name="nccl-start-base-gdrcopy"></a>

安装 GDRCopy 以提高 Libfabric 的性能。有关 GDRCopy 的更多信息，请参阅 [GDRCopy 存储库](https://github.com/NVIDIA/gdrcopy)。

------
#### [ Amazon Linux 2023 and Amazon Linux 2 ]

**安装 GDRCopy**

1. 安装所需的依赖项。

   ```
   $ sudo yum -y install dkms rpm-build make check check-devel subunit subunit-devel
   ```

1. 下载并解压缩 GDRCopy 程序包。

   ```
   $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \
   && tar xf v2.4.tar.gz ; cd gdrcopy-2.4/packages
   ```

1. 构建 GDRCopy RPM 程序包。

   ```
   $ CUDA=/usr/local/cuda ./build-rpm-packages.sh
   ```

1. 安装 GDRCopy RPM 程序包。

   ```
   $ sudo rpm -Uvh gdrcopy-kmod-2.4-1dkms.noarch*.rpm \
   && sudo rpm -Uvh gdrcopy-2.4-1.x86_64*.rpm \
   && sudo rpm -Uvh gdrcopy-devel-2.4-1.noarch*.rpm
   ```

------
#### [ Ubuntu 24.04 and Ubuntu 22.04 ]

**安装 GDRCopy**

1. 安装所需的依赖项。

   ```
   $ sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms
   ```

1. 下载并解压缩 GDRCopy 程序包。

   ```
   $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \
   && tar xf v2.4.tar.gz \
   && cd gdrcopy-2.4/packages
   ```

1. 构建 GDRCopy RPM 程序包。

   ```
   $ CUDA=/usr/local/cuda ./build-deb-packages.sh
   ```

1. 安装 GDRCopy RPM 程序包。

   ```
   $ sudo dpkg -i gdrdrv-dkms_2.4-1_amd64.*.deb \
   && sudo dpkg -i libgdrapi_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy-tests_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy_2.4-1_amd64.*.deb
   ```

------

## 步骤 5：安装 EFA 软件
<a name="nccl-start-base-enable"></a>

在实例上安装支持 EFA 所需的启用 EFA 的内核、EFA 驱动程序、Libfabric、aws-ofi-nccl 插件和 Open MPI 堆栈。

**安装 EFA 软件**

1. 连接到您启动的实例。有关更多信息，请参阅 [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。

1. 下载 EFA 软件安装文件。软件安装文件将打包为压缩的 tarball（`.tar.gz`）文件。要下载最新的*稳定* 版本，请使用以下命令。

   您也可以通过将上面命令中的版本号替换为 `latest` 来获取最新版本。

   ```
   $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz
   ```

1. （*可选*）验证 EFA tarball（`.tar.gz`）文件的真实性和完整性。

   建议您执行此操作以验证软件发布者的身份，并检查该文件自发布以来是否已被更改或损坏。如果您不想验证 tarball 文件，请跳过此步骤。
**注意**  
或者，如果您希望使用 MD5 或 SHA256 校验和验证 tarball 文件，请参阅 [使用校验和验证 EFA 安装程序](efa-verify.md)。

   1. 下载公有 GPG 密钥并将其导入到您的密钥环中。

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key
      ```

      该命令应返回一个密钥值。请记下密钥值，因为需要在下一步中使用该值。

   1. 验证 GPG 密钥的指纹。运行以下命令并指定上一步中的密钥值。

      ```
      $ gpg --fingerprint key_value
      ```

      该命令应返回一个与 `4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC` 相同的指纹。如果指纹不匹配，请不要运行 EFA 安装脚本，并联系 支持。

   1. 下载签名文件并验证 EFA tarball 文件的签名。

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.47.0.tar.gz.sig
      ```

      下面显示了示例输出。

      ```
      gpg: Signature made Wed 29 Jul 2020 12:50:13 AM UTC using RSA key ID DD2D3CCC
      gpg: Good signature from "Amazon EC2 EFA <ec2-efa-maintainers@amazon.com>"
      gpg: WARNING: This key is not certified with a trusted signature!
      gpg:          There is no indication that the signature belongs to the owner.
      Primary key fingerprint: 4E90 91BC BB97 A96B 26B1  5E59 A054 80B1 DD2D 3CCC
      ```

      如果结果包含 `Good signature`，并且指纹与上一步中返回的指纹相匹配，请继续下一步。如果没有，请不要运行 EFA 安装脚本，并联系 支持。

1. 从压缩的 `.tar.gz` 文件中提取文件，并导航到提取的目录。

   ```
   $ tar -xf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer
   ```

1. 运行 EFA 软件安装脚本。
**注意**  
从 EFA 1.30.0 开始，默认情况下会同时安装 Open MPI 4.1 和 Open MPI 5。除非需要 Open MPI 5，否则我们建议只安装 Open MPI 4.1。以下命令仅会安装 Open MPI 4.1。如果需要同时安装 Open MPI 4.1 和 Open MPI 5，请移除 `--mpi=openmpi4`。

   ```
   $ sudo ./efa_installer.sh -y --mpi=openmpi4
   ```

   **Libfabric** 安装在了 `/opt/amazon/efa` 目录中。**aws-ofi-nccl** 插件安装在了 `/opt/amazon/ofi-nccl` 目录中。**Open MPI** 安装在了 `/opt/amazon/openmpi` 目录中。

1. 如果 EFA 安装程序提示您重启实例，请执行此操作，然后重新连接到实例。否则，请注销实例，然后重新登录以完成安装。

1. 确认已成功安装 EFA 软件组件。

   ```
   $ fi_info -p efa -t FI_EP_RDM
   ```

   该命令应返回有关 Libfabric EFA 接口的信息。以下示例显示了命令输出。
   + `p3dn.24xlarge`（具有单个网络接口）

     ```
     provider: efa
     fabric: EFA-fe80::94:3dff:fe89:1b70
     domain: efa_0-rdm
     version: 2.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```
   + `p4d.24xlarge` 和 `p5.48xlarge` 具有多个网络接口

     ```
     provider: efa
     fabric: EFA-fe80::c6e:8fff:fef6:e7ff
     domain: efa_0-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c34:3eff:feb2:3c35
     domain: efa_1-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c0f:7bff:fe68:a775
     domain: efa_2-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::ca7:b0ff:fea6:5e99
     domain: efa_3-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```

## 步骤 6：安装 NCCL
<a name="nccl-start-base-nccl"></a>

安装 NCCL。有关 NCCL 的更多信息，请参阅 [NCCL 存储库](https://github.com/NVIDIA/nccl)。

**安装 NCCL**

1. 导航到 `/opt` 目录。

   ```
   $ cd /opt
   ```

1. 将官方 NCCL 存储库克隆到实例，然后导航到本地克隆的存储库。

   ```
   $ sudo git clone https://github.com/NVIDIA/nccl.git -b v2.23.4-1 && cd nccl
   ```

1. 生成并安装 NCCL，然后指定 CUDA 安装目录。

   ```
   $ sudo make -j src.build CUDA_HOME=/usr/local/cuda
   ```

## 步骤 7：安装 NCCL 测试
<a name="nccl-start-base-tests"></a>

安装 NCCL 测试。NCCL 测试使您能够确认是否已正确安装 NCCL 以及它是否正在按预期运行。有关 NCCL 测试的更多信息，请参阅 [nccl-tests 存储库](https://github.com/NVIDIA/nccl-tests)。

**安装 NCCL 测试**

1. 导航到您的主目录。

   ```
   $ cd $HOME
   ```

1. 将官方 nccl-tests 存储库克隆到实例，然后导航到本地克隆的存储库。

   ```
   $ git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
   ```

1. 将 Libfabric 目录添加到 `LD_LIBRARY_PATH` 变量。
   + Amazon Linux 2023 和 Amazon Linux 2

     ```
     $ export LD_LIBRARY_PATH=/opt/amazon/efa/lib64:$LD_LIBRARY_PATH
     ```
   + Ubuntu 24.04 和 Ubuntu 22.04

     ```
     $ export LD_LIBRARY_PATH=/opt/amazon/efa/lib:$LD_LIBRARY_PATH
     ```

1. 安装 NCCL 测试并指定 MPI、NCCL 和 CUDA 安装目录。

   ```
   $ make MPI=1 MPI_HOME=/opt/amazon/openmpi NCCL_HOME=/opt/nccl/build CUDA_HOME=/usr/local/cuda
   ```

## 步骤 8：测试 EFA 和 NCCL 配置
<a name="nccl-start-base-test"></a>

运行测试以确保为 EFA 和 NCCL 正确配置临时实例。

**测试 EFA 和 NCCL 配置**

1. 创建一个主机文件来指定要在其上运行测试的主机。以下命令创建一个名为 `my-hosts` 的主机文件，该文件包含对实例本身的引用。

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
   && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
   ```

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
   ```

------

1. 运行测试并指定主机文件 (`--hostfile`) 和要使用的 GPU 数 (`-n`)。以下命令在实例本身的 8 个 GPU 上运行 `all_reduce_perf` 测试，并指定以下环境变量。
   + `FI_EFA_USE_DEVICE_RDMA=1` –（仅 `p4d.24xlarge`）使用设备的 RDMA 功能进行单侧和双侧传输。
   + `NCCL_DEBUG=INFO`—启用详细的调试输出。您也可以指定 `VERSION` 以在测试开始时仅输出 NCCL 版本，或指定 `WARN` 以仅接收错误消息。

   有关 NCCL 测试参数的更多信息，请参阅官方 nccl-tests 存储库中的 [NCCL 测试自述文件](https://github.com/NVIDIA/nccl-tests/blob/master/README.md)。
   + `p3dn.24xlarge`

     ```
     $ /opt/amazon/openmpi/bin/mpirun \
     -x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/amazon/ofi-nccl/lib:$LD_LIBRARY_PATH \
     -x NCCL_DEBUG=INFO \
     --hostfile my-hosts -n 8 -N 8 \
     --mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
     $HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
     ```
   + `p4d.24xlarge` 和 `p5.48xlarge`

     ```
     $ /opt/amazon/openmpi/bin/mpirun \
     -x FI_EFA_USE_DEVICE_RDMA=1 \
     -x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/amazon/ofi-nccl/lib:$LD_LIBRARY_PATH \
     -x NCCL_DEBUG=INFO \
     --hostfile my-hosts -n 8 -N 8 \
     --mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
     $HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
     ```

1. 打印 `NCCL_DEBUG` 日志时，您可以确认 EFA 是否作为 NCCL 的底层提供程序处于活动状态。

   ```
   ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Selected Provider is efa*
   ```

   使用 `p4d.24xlarge` 实例时会显示以下附加信息。

   ```
   ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Running on P4d platform, Setting NCCL_TOPO_FILE environment variable to /home/ec2-user/install/plugin/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml
   ```

## 步骤 9：安装机器学习应用程序
<a name="nccl-start-base-app"></a>

在临时实例上安装机器学习应用程序。安装过程因特定的机器学习应用程序而异。有关在 Linux 实例上安装软件的更多信息，请参阅 [Manage software on your Amazon Linux 2 instance](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)。

**注意**  
请参阅机器学习应用程序文档以了解安装说明。

## 步骤 10：创建启用了 EFA 和 NCCL 的 AMI
<a name="nccl-start-base-ami"></a>

在安装所需的软件组件后，您可以创建一个 AMI，然后可以将其重复使用以启动启用了 EFA 的实例。

**从临时实例创建 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您创建的临时实例，然后依次选择 **Actions (操作)**、**Image (映像)**、**Create image (创建映像)**。

1. 对于 **Create image (创建映像)**，请执行以下操作：

   1. 对于 **Image name (映像名称)**，为 AMI 输入一个描述性名称。

   1. （可选）对于 **Image description (映像描述)**，输入 AMI 用途的简要描述。

   1. 选择**创建映像**。

1. 在导航窗格中，选择 **AMIs**。

1. 在列表中找到您创建的 AMI。等待状态从 `pending` 更改为 `available`，然后继续下一步。

## 步骤 11：终止临时实例
<a name="nccl-start-base-terminate"></a>

现在，已不再需要您启动的临时实例。您可以终止实例以停止产生费用。

**终止临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您创建的临时实例，然后依次选择 **Actions (操作)**、**Instance state (实例状态)**、**Terminate instance (终止实例)**。

1. 当系统提示您确认时，选择**终止**。

## 步骤 12：在集群置放群组中启动启用了 EFA 和 NCCL 的实例
<a name="nccl-start-base-cluster"></a>

使用启用了 EFA 的 AMI 以及之前创建的启用了 EFA 的安全组，在集群置放群组中启动启用了 EFA 和 NCCL 的实例。

**注意**  
在集群置放群组中启动启用了 EFA 的实例并不是一个绝对要求。不过，我们建议在集群置放群组中运行启用了 EFA 的实例，因为它在单个可用区的低延迟组中启动实例。
为了确保在扩展集群实例时容量可用，您可以为集群置放群组创建容量预留。有关更多信息，请参阅 [使用集群置放群组的容量预留](cr-cpg.md)。

------
#### [ New console ]

**启动临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，请选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）以打开新的启动实例向导。

1. （*可选*）在 **Name and tags**（名称和标签）部分中，提供实例的名称，例如 `EFA-instance`。名称作为资源标签（`Name=EFA-instance`）分配给实例。

1. 在 **Application and OS Images**（应用程序和操作系统映像）部分中，请选择 **My AMIs**（我的 AMI），然后选择您在上一步骤创建的 AMI。

1. 在 **Instance type**（实例类型）部分中，选择 `p3dn.24xlarge` 或 `p4d.24xlarge`。

1. 在 **Key pair**（密钥对）部分中，选择要用于实例的密钥对。

1. 在 **Network settings**（网络设置）部分中，请选择 **Edit**（编辑），然后执行以下操作：

   1. 对于**子网**，选择要在其中启动实例的子网。如果您未选择子网，则不能启用 EFA 的实例。

   1. 对于 **Firewall（security groups）**（防火墙（安全组）），请选择 **Select existing security group**（选择现有安全组），然后选择您在上一步中创建的安全组。

   1. 展开**高级网络配置**部分。

      对于**网络接口 1**，选择**网卡索引 = 0**、**设备索引 = 0**、**接口类型 = 带 ENA 的 EFA**。

      （可选）如果您使用的是多卡实例类型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，则对于每个额外的网络接口，选择**添加网络接口**；对于**网卡索引**，选择下一个未使用的索引，然后选择**设备索引 = 1** 和**接口类型 = 带 ENA 的 EFA** 或**仅限 EFA**。

1. （*可选*）在 **Storage**（存储）部分中，根据需要配置卷。

1. 在 **Advanced details**（高级详细信息）部分中，对于**置放群组名称**，选择要在其中启动实例的集群置放群组。如果您需要创建新的集群置放群组，请选择 **Create new placement group**（创建新置放群组）。

1. 在右侧的 **Summary**（摘要）面板中，为 **Number of instances**（实例数量）输入您要启动的启用了 EAA 的实例数量，然后选择 **Launch instance**（启动实例）。

------
#### [ Old console ]

**在集群置放群组中启动启用了 EFA 和 NCCL 的实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 选择 **Launch Instance（启动实例）**。

1. 在 **Choose an AMI (选择 AMI)** 页面上，选择 **My AMIs (我的 AMI)**，找到之前创建的 AMI，然后选择 **Select (选择)**。

1. 在**选择实例类型**页面上，选择 **p3dn.24xlarge**，然后选择**下一步：配置实例详细信息**。

1. 在 **Configure Instance Details (配置实例详细信息)** 页面中，执行以下操作：

   1. 对于 **Number of instances (实例的数量)**，请输入要启动的启用了 EFA 和 NCCL 的实例数量。

   1. 对于 **Network (网络)** 和 **Subnet (子网)**，请选择要在其中启动实例的 VPC 和子网。

   1. 对于 **Placement group (置放群组)**，请选择 **Add instance to placement group (将实例添加到置放群组)**。

   1. 对于 **Placement group name (置放群组名称)**，请选择 **Add to a new placement group (添加到新的置放群组)**，然后输入一个描述性的置放群组名称。然后，对于 **Placement group strategy (置放群组策略)**，请选择 **cluster (集群)**。

   1. 对于 **EFA**，请选择 **Enable (启用)**。

   1. 在 **Network Interfaces (网络接口)** 部分中，为设备 **eth0** 选择 **New network interface (新网络接口)**。您可以选择指定主 IPv4 地址以及一个或多个辅助 IPv4 地址。如果在具有关联的 IPv6 CIDR 数据块的子网中启动实例，您可以选择指定主 IPv6 地址以及一个或多个辅助 IPv6 地址。

   1. 选择**下一步：添加存储**。

1. 在 **Add Storage (添加存储)** 页面上，除了 AMI 指定的卷（如根设备卷）以外，还要指定要附加到实例的卷。然后，选择 **Next: Add Tags (下一步: 添加标签)**。

1. 在 **Add Tags (添加标签)** 页面上，为实例指定标签（例如，便于用户识别的名称），然后选择 **Next: Configure Security Group (下一步：配置安全组)**。

1. 在 **Configure Security Group (配置安全组)** 页面上，为 **Assign a security group (分配安全组)** 选择 **Select an existing security group (选择一个现有的安全组)**，然后选择之前创建的安全组。

1. 选择**审核并启动**。

1. 在 **Review Instance Launch (核查实例启动)** 页面上，检查这些设置，然后选择 **Launch (启动)** 以选择一个密钥对并启动您的实例。

------

## 步骤 13：启用无密码 SSH
<a name="nccl-start-base-passwordless"></a>

要使应用程序能够在集群中的所有实例上运行，您必须启用从领导节点到成员节点的无密码 SSH 访问。领导节点是从中运行应用程序的实例。集群中的其余实例是成员节点。

**在集群中的实例之间启用无密码 SSH**

1. 在集群中选择一个实例作为领导节点，然后连接到该实例。

1. 在领导节点上禁用 `strictHostKeyChecking` 并启用 `ForwardAgent`。使用首选文本编辑器打开 `~/.ssh/config`，并添加以下内容。

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. 生成 RSA 密钥对。

   ```
   $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

   密钥对在 `$HOME/.ssh/` 目录中创建。

1. 更改领导节点上私有密钥的权限。

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 使用首选文本编辑器打开 `~/.ssh/id_rsa.pub` 并复制密钥。

1. 对于集群中的每个成员节点，请执行以下操作：

   1. 连接到实例。

   1. 使用首选文本编辑器打开 `~/.ssh/authorized_keys`，并添加之前复制的公有密钥。

1. 要测试无密码 SSH 是否按预期运行，请连接到领导节点并运行以下命令。

   ```
   $ ssh member_node_private_ip
   ```

   您应该连接到成员节点，而不会收到输入密钥或密码的提示。

# 开始使用 EFA 和 NIXL 处理 Amazon EC2 上的推理工作负载
<a name="efa-start-nixl"></a>

NVIDIA Inference Xfer Library (NIXL) 是一个高吞吐量、低延迟的通信库，专为分解推理工作负载而设计。NIXL 可以与 EFA 和 Libfabric 一起使用，以支持预填充和解码节点之间的 KV 缓存传输，并且它可以在不同存储层之间高效地移动 KV 缓存。有关更多信息，请参阅 [NIXL](https://github.com/ai-dynamo/nixl) 网站。

**要求**
+ 仅支持 Ubuntu 24.04 和 Ubuntu 22.04 基本 AMI。
+ EFA 仅支持 NIXL 1.0.0 及更高版本。

**Topics**

## 步骤 1：准备启用 EFA 的安全组
<a name="nixl-start-base-setup"></a>

EFA 需要使用一个安全组，以允许进出安全组本身的所有入站和出站流量。以下过程创建了一个安全组，该安全组允许所有进出其本身的入站和出站流量，并允许来自任何 IPv4 地址的入站 SSH 流量进行 SSH 连接。

**重要**  
此安全组仅用于测试目的。对于您的生产环境，建议您创建入站 SSH 规则，该规则仅允许来自您连接的 IP 地址的流量，例如计算机的 IP 地址或本地网络中的一系列 IP 地址。

有关其他场景，请参阅 [针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**创建启用 EFA 的安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups (安全组)**，然后选择 **Create Security Group (创建安全组)**。

1. 在 **Create security group（创建安全组）**窗口中，执行以下操作：

   1. 对于**安全组名称**，请输入一个描述性的安全组名称，例如 `EFA-enabled security group`。

   1. （可选）对于**描述**，请输入安全组的简要描述。

   1. 对于 **VPC**，请选择要在其中启动启用了 EFA 的实例的 VPC。

   1. 选择**创建安全组**。

1. 选择您创建的安全组，然后在 **Details**（详细信息）选项卡上复制 **Security group ID**（安全组 ID）。

1. 在安全组仍然选中的情况下，依次选择 **Actions**（操作）、**Edit inbound rules**（编辑入站规则），然后执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于 **Source type**（源类型），请选择 **Custom**（自定义）并将您复制的安全组 ID 粘贴到该字段中。

   1. 选择**添加规则**。

   1. 对于 **Type**，选择 **SSH**。

   1. 对于 **Source type**（源类型），请选择 **Anywhere-IPv4**。

   1. 选择**保存规则**。

1. 在安全组仍然选中的情况下，依次选择 **Actions**（操作）、**Edit outbound rules**（编辑出站规则），然后执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于 **Destination type**（目标类型），请选择 **Custom**（自定义）并将您复制的安全组 ID 粘贴到该字段中。

   1. 选择**保存规则**。

## 步骤 2：启动临时实例
<a name="nixl-start-base-temp"></a>

启动一个临时实例，可用于安装和配置 EFA 软件组件。您使用该实例创建一个启用了 EFA 的 AMI，您可以从中启动启用了 EFA 的实例。

**启动临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，请选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）以打开新的启动实例向导。

1. （*可选*）在 **Name and tags**（名称和标签）部分中，提供实例的名称，例如 `EFA-instance`。名称作为资源标签（`Name=EFA-instance`）分配给实例。

1. 在**应用程序和操作系统映像**部分中，为其中一个支持的操作系统选择 AMI。您也可以在 [DLAMI 发行说明页面上](https://docs.aws.amazon.com/dlami/latest/devguide/appendix-ami-release-notes)选择受支持的 DLAMI。

1. 在**实例类型**部分中，选择支持的实例类型。

1. 在 **Key pair**（密钥对）部分中，选择要用于实例的密钥对。

1. 在 **Network settings**（网络设置）部分中，请选择 **Edit**（编辑），然后执行以下操作：

   1. 对于**子网**，选择要在其中启动实例的子网。如果您未选择子网，则不能启用 EFA 的实例。

   1. 对于 **Firewall（security groups）**（防火墙（安全组）），请选择 **Select existing security group**（选择现有安全组），然后选择您在上一步中创建的安全组。

   1. 展开**高级网络配置**部分。

      对于**网络接口 1**，选择**网卡索引 = 0**、**设备索引 = 0**、**接口类型 = 带 ENA 的 EFA**。

      （*可选*）如果您使用的是多卡实例类型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，则对于每个额外的网络接口，选择**添加网络接口**；对于**网卡索引**，选择下一个未使用的索引，然后选择**设备索引 1** 和**接口类型 = 带 ENA 的 EFA** 或**仅限 EFA**。

1. 在 **Storage**（存储）部分中，根据需要配置卷。
**注意**  
您必须为 Nvidia CUDA 工具包额外预置 10 到 20 GiB 的存储空间。如果您没有预置足够的存储空间，您将在尝试安装 Nvidia 驱动程序和 CUDA 工具包时收到 `insufficient disk space` 错误。

1. 在右侧的 **Summary**（摘要）面板中，选择 **Launch instance**（启动实例）。

**重要**  
如果您的 AMI 已经包含 Nvidia GPU 驱动程序、CUDA 工具包和 cuDNN，或者您使用的是非 GPU 实例，请跳过步骤 3。

## 步骤 3：安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN
<a name="nixl-start-base-drivers"></a>

**安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN**

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。

   ```
   $ sudo apt-get update && sudo apt-get upgrade -y
   ```

1. 安装在安装 Nvidia GPU 驱动程序和 Nvidia CUDA 工具包时需要的实用程序。

   ```
   $ sudo apt-get install build-essential -y
   ```

1. 要使用 Nvidia GPU 驱动程序，您必须先禁用 `nouveau` 开源驱动程序。

   1. 为您当前运行的内核版本安装所需的实用程序和内核标头软件包。

      ```
      $ sudo apt-get install -y gcc make linux-headers-$(uname -r)
      ```

   1. 将 `nouveau` 添加到`/etc/modprobe.d/blacklist.conf `拒绝列表文件。

      ```
      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
      blacklist vga16fb
      blacklist nouveau
      blacklist rivafb
      blacklist nvidiafb
      blacklist rivatv
      EOF
      ```

   1. 使用首选文本编辑器打开 `/etc/default/grub`，并添加以下内容。

      ```
      GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
      ```

   1. 重新生成 Grub 配置。

      ```
      $ sudo update-grub
      ```

1. 重启实例并重新连接到它。

1. 添加 CUDA 存储库并安装 Nvidia GPU 驱动程序、NVIDIA CUDA 工具包和 cuDNN。

   ```
   $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \
   && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \
   && sudo dpkg -i /tmp/deeplearning.deb \
   && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
   && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
   && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \
   && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \
   && sudo apt update \
   && sudo apt install nvidia-dkms-535 \
   && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
   ```

1. 重启实例并重新连接到它。

1. （仅限 `p4d.24xlarge` 和 `p5.48xlarge`）安装 Nvidia Fabric Manager。

   1. 您必须安装与上一步中安装的 Nvidia 内核模块版本匹配的 Nvidia Fabric Manager 版本。

      运行以下命令以确定 Nvidia 内核模块的版本。

      ```
      $ cat /proc/driver/nvidia/version | grep "Kernel Module"
      ```

      下面是示例输出。

      ```
      NVRM version: NVIDIA UNIX x86_64 Kernel Module  450.42.01  Tue Jun 15 21:26:37 UTC 2021
      ```

      上述示例中安装了内核模块的主要版本 `450`。这意味着您需要安装 Nvidia Fabric Manager 版本 `450`。

   1. 安装 Nvidia Fabric Manager。运行以下命令并指定上一步中确定的主要版本。

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-major_version_number
      ```

      例如，如果已安装内核模块的主要版本 `450`，请使用以下命令安装与之匹配的 Nvidia Fabric Manager 版本。

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-450
      ```

   1. 启动服务，并确保它在实例启动时自动启动。NV 交换管理需要 Nvidia Fabric 管理器。

      ```
      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
      ```

1. 确保每次启动实例时均设置 CUDA 路径。
   + 对于 * bash* shell，请将以下语句添加到 `/home/username/.bashrc` 和 `/home/username/.bash_profile`。

     ```
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```
   + 对于 * tcsh * shell，请将以下语句添加到 `/home/username/.cshrc`。

     ```
     setenv PATH=/usr/local/cuda/bin:$PATH
     setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```

1. 要验证 Nvidia GPU 驱动程序是否正常运行，请运行以下命令。

   ```
   $ nvidia-smi -q | head
   ```

   此命令应返回有关 Nvidia GPU、Nvidia GPU 驱动程序和 Nvidia CUDA 工具包的信息。

**重要**  
如果您的 AMI 已经包含 GDRCopy，或者您使用的是非 GPU 实例，请跳过步骤 4。

## 步骤 4：安装 GDRCopy
<a name="nixl-start-base-gdrcopy"></a>

安装 GDRCopy，以提高 Libfabric 在基于 GPU 的平台上的性能。有关 GDRCopy 的更多信息，请参阅 [GDRCopy 存储库](https://github.com/NVIDIA/gdrcopy)。

**安装 GDRCopy**

1. 安装所需的依赖项。

   ```
   $ sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms
   ```

1. 下载并解压缩 GDRCopy 程序包。

   ```
   $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \
   && tar xf v2.4.tar.gz \
   && cd gdrcopy-2.4/packages
   ```

1. 构建 GDRCopy DEB 程序包。

   ```
   $ CUDA=/usr/local/cuda ./build-deb-packages.sh
   ```

1. 安装 GDRCopy DEB 程序包。

   ```
   $ sudo dpkg -i gdrdrv-dkms_2.4-1_amd64.*.deb \
   && sudo dpkg -i libgdrapi_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy-tests_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy_2.4-1_amd64.*.deb
   ```

**重要**  
如果您的 AMI 已经包含最新的 EFA 安装程序，请跳过步骤 5。

## 步骤 5：安装 EFA 软件
<a name="nixl-start-base-enable"></a>

在实例上安装支持 EFA 所需的启用 EFA 的内核、EFA 驱动程序 和 Libfabric 堆栈。

**安装 EFA 软件**

1. 连接到您启动的实例。有关更多信息，请参阅 [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。

1. 下载 EFA 软件安装文件。软件安装文件将打包为压缩的 tarball（`.tar.gz`）文件。要下载最新的*稳定* 版本，请使用以下命令。

   ```
   $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz
   ```

1. 从压缩的 `.tar.gz` 文件中提取文件，删除压缩包，并导航到提取的目录。

   ```
   $ tar -xf aws-efa-installer-1.47.0.tar.gz && rm -rf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer
   ```

1. 运行 EFA 软件安装脚本。

   ```
   $ sudo ./efa_installer.sh -y
   ```

   **Libfabric** 安装在了 `/opt/amazon/efa` 目录中。

1. 如果 EFA 安装程序提示您重启实例，请执行此操作，然后重新连接到实例。否则，请注销实例，然后重新登录以完成安装。

1. 确认已成功安装 EFA 软件组件。

   ```
   $ fi_info -p efa -t FI_EP_RDM
   ```

   该命令应返回有关 Libfabric EFA 接口的信息。以下示例显示了命令输出。
   + `p3dn.24xlarge`（具有单个网络接口）

     ```
     provider: efa
     fabric: EFA-fe80::94:3dff:fe89:1b70
     domain: efa_0-rdm
     version: 2.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```
   + `p4d.24xlarge` 和 `p5.48xlarge` 具有多个网络接口

     ```
     provider: efa
     fabric: EFA-fe80::c6e:8fff:fef6:e7ff
     domain: efa_0-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c34:3eff:feb2:3c35
     domain: efa_1-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c0f:7bff:fe68:a775
     domain: efa_2-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::ca7:b0ff:fea6:5e99
     domain: efa_3-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```

## 步骤 6：安装 NIXL
<a name="nixl-start-base-nixl"></a>

安装 NIXL。有关 NIXL 的更多信息，请参阅 [NIXL 存储库](https://github.com/ai-dynamo/nixl)。

------
#### [ Pre-built distributions ]

**使用 PyPI 安装 NIXL**

1. 安装所需的依赖项。

   ```
   $ sudo apt install pip
   ```

1. 安装 NIXL。

   ```
   $ pip install nixl
   ```

------
#### [ Build from source ]

**从源代码构建和安装 NIXL**

1. 安装所需的依赖项。

   ```
   $ sudo apt install cmake pkg-config meson pybind11-dev libaio-dev nvidia-cuda-toolkit pip libhwloc-dev \
   && pip install meson ninja pybind11
   ```

1. 导航到您的主目录。

   ```
   $ cd $HOME
   ```

1. 将官方 NIXL 存储库克隆到实例，然后导航到本地克隆的存储库。

   ```
   $ sudo git clone https://github.com/ai-dynamo/nixl.git && cd nixl
   ```

1. 构建并安装 NIXL，并指定 Libfabric 安装目录的路径。

   ```
   $ sudo meson setup . nixl --prefix=/usr/local/nixl -Dlibfabric_path=/opt/amazon/efa
   $ cd nixl && sudo ninja && sudo ninja install
   ```

------

## 步骤 7：安装 NIXL Benchmark 并测试 EFA 和 NIXL 配置
<a name="nixl-start-base-tests"></a>

安装 NIXL Benchmark 并运行测试，以确保临时实例已为 EFA 和 NIXL 正确配置。通过 NIXL Benchmark，您可以确认 NIXL 已正确安装并按预期运行。有关更多信息，请参阅 [nixlbench 存储库](https://github.com/ai-dynamo/nixl/tree/main/benchmark/nixlbench)。

NIXL Benchmark (nixlbench) 需要 ETCD 来协调客户端和服务器。要将 ETCD 与 NIXL 一起使用，需要 ETCD 服务器和客户端，以及 ETCD CPP API。

------
#### [ Build from Docker ]

**使用 Docker 安装和测试 NIXL Benchmark**

1. 将官方 NIXL 存储库克隆到实例，然后导航到 nixlbench 构建目录。

   ```
   $ git clone https://github.com/ai-dynamo/nixl.git
   $ cd nixl/benchmark/nixlbench/contrib
   ```

1. 构建容器

   ```
   $ ./build.sh
   ```

   有关 Docker 构建选项的更多信息，请参阅 [nixlbench 存储库](https://github.com/ai-dynamo/nixl/tree/main/benchmark/nixlbench)。

1. 安装 Docker。

   ```
   $ sudo apt install docker.io -y
   ```

1. 启动 ETCD 服务器进行协调。

   ```
   $ docker run -d --name etcd-server \
       -p 2379:2379 -p 2380:2380 \
       quay.io/coreos/etcd:v3.5.18 \
       /usr/local/bin/etcd \
       --data-dir=/etcd-data \
       --listen-client-urls=http://0.0.0.0:2379 \
       --advertise-client-urls=http://0.0.0.0:2379 \
       --listen-peer-urls=http://0.0.0.0:2380 \
       --initial-advertise-peer-urls=http://0.0.0.0:2380 \
       --initial-cluster=default=http://0.0.0.0:2380
   ```

1. 验证 ETCD 服务器是否正在运行。

   ```
   $ curl -L http://localhost:2379/health
   ```

   预期输出：

   ```
   {"health":"true"}
   ```

1. 为该实例打开两个终端。在两个终端，运行以下命令来验证安装。该命令在同一个实例上使用 ETCD 服务器，使用 Libfabric 作为后端，并使用 GPU 内存进行操作。

   ```
   $ docker run -it --gpus all --network host nixlbench:latest \
       nixlbench --etcd_endpoints http://localhost:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM \
       --target_seg_type VRAM
   ```
**注意**  
对于非 GPU 实例，使用值 `DRAM` 代替 `VRAM`。

------
#### [ Build from source ]

**重要**  
只有在步骤 6 中选择 “**从源代码构建**” 时，才遵循此选项卡。

**安装 NIXL Benchmark**

1. 安装所需的系统依赖项。

   ```
   $ sudo apt install libgflags-dev
   ```

1. 安装 ETCD 服务器和客户端。

   ```
   $ sudo apt install -y etcd-server etcd-client
   ```

1. 安装 ETCD CPP API。

   1. 安装 ETCD CPP API 所需的依赖项。

      ```
      $ sudo apt install libboost-all-dev libssl-dev libgrpc-dev libgrpc++-dev libprotobuf-dev protobuf-compiler-grpc libcpprest-dev
      ```

   1. 克隆并安装 ETCD CPP API。

      ```
      $ cd $HOME
      $ git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
      $ cd etcd-cpp-apiv3
      $ mkdir build && cd build
      $ cmake ..
      $ sudo make -j$(nproc) && sudo make install
      ```

1. 构建和安装 nxlbench。

   ```
   $ sudo meson setup . $HOME/nixl/benchmark/nixlbench -Dnixl_path=/usr/local/nixl/
   $ sudo ninja && sudo ninja install
   ```

**测试 EFA 和 NIXL 配置**

1. 在实例上启动 ETCD 服务器。

   ```
   $ etcd --listen-client-urls "http://0.0.0.0:2379" \
       --advertise-client-urls "http://localhost:2379" &
   ```

1. 验证 ETCD 服务器是否正在运行。

   ```
   $ curl -L http://localhost:2379/health
   ```

   预期输出：

   ```
   {"health":"true"}
   ```

1. 为该实例打开两个终端。在两个终端上，完成以下步骤，运行 nixlbench。

   1. 导航到安装 nxlbench 的目录。

      ```
      $ cd /usr/local/nixlbench/bin/
      ```

   1. 运行测试并指定后端、ETCD 服务器的地址和启动器分段类型。以下命令在同一实例上使用 ETCD 服务器，使用 Libfabric 作为后端，并使用 GPU 内存进行操作。环境变量配置如下：
      + `NIXL_LOG_LEVEL=INFO` — 启用详细的调试输出。您也可以指定 `WARN` 仅接收错误消息。
      + `LD_LIBRARY_PATH` — 设置 NIXL 库的路径。

      有关 NIXL Benchmark 参数的更多信息，请参阅官方 nxlbench 存储库中的 [NIXLbench 自述文件](https://github.com/ai-dynamo/nixl/blob/main/benchmark/nixlbench/README.md)。

      ```
      $ export NIXL_LOG_LEVEL=INFO
      $ export LD_LIBRARY_PATH=/usr/local/nixl/lib/$(gcc -dumpmachine):$LD_LIBRARY_PATH
      
      $ nixlbench --etcd-endpoints 'http://localhost:2379' \
          --backend 'LIBFABRIC' \
          --initiator_seg_type 'VRAM' \
          --target_seg_type 'VRAM'
      ```
**注意**  
对于非 GPU 实例，使用值 `DRAM` 代替 `VRAM`。

------

## 步骤 8：安装机器学习应用程序
<a name="nixl-start-base-app"></a>

在临时实例上安装机器学习应用程序。安装过程因特定的机器学习应用程序而异。

**注意**  
请参阅机器学习应用程序文档以了解安装说明。

## 步骤 9：创建启用了 EFA 和 NIXL 的 AMI
<a name="nixl-start-base-ami"></a>

在安装所需的软件组件后，您可以创建一个 AMI，然后可以将其重复使用以启动启用了 EFA 的实例。

**从临时实例创建 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您创建的临时实例，然后依次选择 **Actions (操作)**、**Image (映像)**、**Create image (创建映像)**。

1. 对于 **Create image (创建映像)**，请执行以下操作：

   1. 对于 **Image name (映像名称)**，为 AMI 输入一个描述性名称。

   1. （可选）对于 **Image description (映像描述)**，输入 AMI 用途的简要描述。

   1. 选择**创建映像**。

1. 在导航窗格中，选择 **AMIs**。

1. 在列表中找到您创建的 AMI。等待状态从 `pending` 更改为 `available`，然后继续下一步。

## 步骤 10：终止临时实例
<a name="nixl-start-base-terminate"></a>

现在，已不再需要您启动的临时实例。您可以终止实例以停止产生费用。

**终止临时实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您创建的临时实例，然后依次选择 **Actions (操作)**、**Instance state (实例状态)**、**Terminate instance (终止实例)**。

1. 当系统提示您确认时，选择**终止**。

## 步骤 11：启动启用 EFA 和 Nixl 的实例
<a name="nixl-start-base-cluster"></a>

使用在**步骤 9** 中创建的启用了 EFA 的 AMI 以及在**步骤 1** 中创建的启用了 EFA 的安全组，启动启用了 EFA 和 NIXL 的实例。

**启动启用了 EFA 和 NIXL 的实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，请选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）以打开新的启动实例向导。

1. （*可选*）在 **Name and tags**（名称和标签）部分中，提供实例的名称，例如 `EFA-instance`。名称作为资源标签（`Name=EFA-instance`）分配给实例。

1. 在 **Application and OS Images**（应用程序和操作系统映像）部分中，请选择 **My AMIs**（我的 AMI），然后选择您在上一步骤创建的 AMI。

1. 在**实例类型**部分中，选择支持的实例类型。

1. 在 **Key pair**（密钥对）部分中，选择要用于实例的密钥对。

1. 在 **Network settings**（网络设置）部分中，请选择 **Edit**（编辑），然后执行以下操作：

   1. 对于**子网**，选择要在其中启动实例的子网。如果您未选择子网，则不能启用 EFA 的实例。

   1. 对于**防火墙（安全组）**，选择**选择现有安全组**，然后选择您在**步骤 1** 中创建的安全组。

   1. 展开**高级网络配置**部分。

      对于**网络接口 1**，选择**网卡索引 = 0**、**设备索引 = 0**、**接口类型 = 带 ENA 的 EFA**。

      （*可选*）如果您使用的是多卡实例类型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，则对于每个额外的网络接口，选择**添加网络接口**；对于**网卡索引**，选择下一个未使用的索引，然后选择**设备索引 1** 和**接口类型 = 带 ENA 的 EFA** 或**仅限 EFA**。

1. （*可选*）在 **Storage**（存储）部分中，根据需要配置卷。

1. 在右侧的 **Summary**（摘要）面板中，为 **Number of instances**（实例数量）输入您要启动的启用了 EAA 的实例数量，然后选择 **Launch instance**（启动实例）。

## 步骤 12：启用无密码 SSH
<a name="nixl-start-base-passwordless"></a>

要使应用程序能够在集群中的所有实例上运行，您必须启用从领导节点到成员节点的无密码 SSH 访问。领导节点是从中运行应用程序的实例。集群中的其余实例是成员节点。

**在集群中的实例之间启用无密码 SSH**

1. 在集群中选择一个实例作为领导节点，然后连接到该实例。

1. 在领导节点上禁用 `strictHostKeyChecking` 并启用 `ForwardAgent`。使用首选文本编辑器打开 `~/.ssh/config`，并添加以下内容。

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. 生成 RSA 密钥对。

   ```
   $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

   密钥对在 `$HOME/.ssh/` 目录中创建。

1. 更改领导节点上私有密钥的权限。

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 使用首选文本编辑器打开 `~/.ssh/id_rsa.pub` 并复制密钥。

1. 对于集群中的每个成员节点，请执行以下操作：

   1. 连接到实例。

   1. 使用首选文本编辑器打开 `~/.ssh/authorized_keys`，并添加之前复制的公有密钥。

1. 要测试无密码 SSH 是否按预期运行，请连接到领导节点并运行以下命令。

   ```
   $ ssh member_node_private_ip
   ```

   您应该连接到成员节点，而不会收到输入密钥或密码的提示。

**重要**  
只有在执行步骤 7 时才执行步骤 13。

## 步骤 13：跨实例测试 EFA 和 NIXL 配置
<a name="nixl-start-base-test-multi"></a>

运行测试，确保实例已为 EFA 和 NIXL 正确配置。

------
#### [ Build from Docker ]

**使用 Docker 跨实例测试 EFA 和 NIXL 配置**

1. 选择两台主机来运行 nixlbench 基准测试。使用第一台主机的 IP 地址作为 ETCD 服务器 IP 进行元数据交换。

1. 在主机 1 上启动 ETCD 服务器。

   ```
   $ docker run -d --name etcd-server \
       -p 2379:2379 -p 2380:2380 \
       quay.io/coreos/etcd:v3.5.18 \
       /usr/local/bin/etcd \
       --data-dir=/etcd-data \
       --listen-client-urls=http://0.0.0.0:2379 \
       --advertise-client-urls=http://0.0.0.0:2379 \
       --listen-peer-urls=http://0.0.0.0:2380 \
       --initial-advertise-peer-urls=http://0.0.0.0:2380 \
       --initial-cluster=default=http://0.0.0.0:2380
   ```

1. 验证 ETCD 服务器是否正在运行。

   ```
   $ curl -L http://localhost:2379/health
   ```

   ```
   {"health":"true"}
   ```

1. 在主机 1 上运行 nixlbench 基准测试。

   ```
   $ docker run -it --gpus all --network host nixlbench:latest \
       nixlbench --etcd_endpoints http://localhost:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

1. 在主机 2 上运行 nixlbench 基准测试。

   ```
   $ docker run -it --gpus all --network host nixlbench:latest \
       nixlbench --etcd_endpoints http://ETCD_SERVER_IP:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

------
#### [ Build from source ]

**重要**  
只有在步骤 6 中选择 “**从源代码构建**” 时，才遵循此选项卡。

**跨实例测试 EFA 和 NIXL 配置**

1. 选择两台主机来运行 nixlbench 基准测试。使用第一台主机的 IP 地址作为 ETCD 服务器 IP 进行元数据交换。

1. 在主机 1 上启动 ETCD 服务器。

   ```
   $ etcd --listen-client-urls "http://0.0.0.0:2379" \
       --advertise-client-urls "http://localhost:2379" &
   ```

1. 验证 ETCD 服务器是否正在运行。

   ```
   $ curl -L http://localhost:2379/health
   ```

   ```
   {"health":"true"}
   ```

1. 在主机 1 上运行 nixlbench 基准测试。

   ```
   $ export NIXL_LOG_LEVEL=INFO
   $ export LD_LIBRARY_PATH=$HOME/nixl/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
   
   $ nixlbench \
       --etcd-endpoints http://localhost:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

1. 在主机 2 上运行 nixlbench 基准测试。

   ```
   $ export NIXL_LOG_LEVEL=INFO
   $ export LD_LIBRARY_PATH=$HOME/nixl/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
   
   $ nixlbench \
       --etcd-endpoints http://ETCD_SERVER_IP:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

------

## 步骤 14：测试在 vlLM 上提供的分解推理（*可选*）
<a name="nixl-start-base-serve"></a>

安装 NIXL 后，您可以通过 LLM 推理和服务框架（例如 vLLM、SGLang 和 TensorRT-LLM）来使用 NIXL。

**使用 vLLM 为推理工作负载提供服务**

1. 安装 vLLM。

   ```
   $ pip install vllm
   ```

1. 使用 NIXL 启动 vLLM 服务器。以下示例命令为 NIXL 握手连接、KV 连接器、KV 角色和传输后端创建一个预填充（生产者）和一个解码（使用者）实例。有关详细的示例和脚本，请参阅 [NIXLConnector 使用指南](https://github.com/vllm-project/vllm/blob/2d977a7a9ead3179fde9ed55d69393ef7b6cec47/docs/features/nixl_connector_usage.md)。

   要将 NIXL 与 EFA 配合使用，请根据您的设置和使用案例设置环境变量。
   + 生产者（预填器）配置

     ```
     $ vllm serve your-application \
         --port 8200 \
         --enforce-eager \
         --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'
     ```
   + 使用者（解码器）配置

     ```
     $ vllm serve your-application \
         --port 8200 \
         --enforce-eager \
         --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'
     ```

   前面的示例配置设置了以下内容：
   + `kv_role` 到 `kv_both`，这就实现了对称功能，连接器既可以充当生产者，也可以充当使用者。这为没有预先确定角色区分的实验设置和方案提供了灵活性。
   + `kv_buffer_device` 到 `cuda`，这允许使用 GPU 内存。
   + NIXL 后端到 `LIBFABRIC`，这使得 NIXL 流量能够通过 EFA 传输。

# 使用多网卡最大化 Amazon EC2 实例上的网络带宽
<a name="efa-acc-inst-types"></a>

许多支持 EFA 的实例类型也有多个网卡。有关更多信息，请参阅 [网卡](using-eni.md#network-cards)。如果您计划将 EFA 用于其中一种实例类型，建议使用以下基本配置：
+ 对于主网络接口（网卡索引 `0`、设备索引 `0`），请创建一个 ENA 接口。您不能使用仅限 EFA 的网络接口作为主网络接口。
+ 如果网卡索引 0 支持 EFA，则为网卡索引 `0` 设备索引 `1` 创建一个仅限 EFA 的网络接口。
+ 对于其他的每个网络接口，请将下一个未使用的网卡索引、设备索引 `0` 用于仅限 EFA 的网络接口，以及/或者将设备索引 `1` 用于 ENA 网络接口，具体取决于您的使用案例，例如 ENA 带宽要求或 IP 地址空间。有关示例使用案例，请参阅 [P5 和 P5e 实例的 EFA 配置](#efa-for-p5)。

**注意**  
P5 实例需要以特定方式配置网络接口，以实现最大化网络带宽。有关更多信息，请参阅 [P5 和 P5e 实例的 EFA 配置](#efa-for-p5)。

以下示例显示如何根据这些建议启动实例。

------
#### [ Instance launch ]

**要在实例启动期间使用启动实例向导指定 EFA**

1. 在**网络设置**部分中，选择**编辑**。

1. 展开**高级网络配置**。

1. 对于主网络接口（网卡索引 `0`、设备索引 `0`），请创建一个 ENA 接口。您不能使用仅限 EFA 的网络接口作为主网络接口。

1. 如果网卡索引 0 支持 EFA，则为网卡索引 `0` 设备索引 `1` 创建一个仅限 EFA 的网络接口。

1. 对于其他的每个网络接口，请将下一个未使用的网卡索引、设备索引 `0` 用于仅限 EFA 的网络接口，以及/或者将设备索引 `1` 用于 ENA 网络接口，具体取决于您的使用案例，例如 ENA 带宽要求或 IP 地址空间。有关示例使用案例，请参阅 [P5 和 P5e 实例的 EFA 配置](#efa-for-p5)。

**要在实例启动期间使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令指定 EFA**  
对于 `--network-interfaces`，请指定所需的网络接口数量。对于主网络接口，指定 `NetworkCardIndex=0`、`DeviceIndex=0` 和 `InterfaceType=interface`。如果网卡索引 0 支持 EFA，请指定 `NetworkCardIndex=0`、`DeviceIndex=1` 和 `InterfaceType=efa-only`。对于任何其他网络接口，请将 `NetworkCardIndex` 指定为下一个未使用的索引，将 `InterfaceType=efa-only` 指定为 `DeviceIndex=0`，以及/或者将 `InterfaceType=interface` 指定为 `DeviceIndex=1`。

以下示例命令片段显示具有 32 个 EFA 设备和一个 ENA 设备的请求。

```
$ aws ec2 run-instances \
 --instance-type p5.48xlarge \
 --count 1 \
 --key-name key_pair_name \
 --image-id ami-0abcdef1234567890 \
 --network-interfaces "NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=0,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=17,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=18,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=19,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=20,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=21,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=22,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=23,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=24,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=25,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=26,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=27,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=28,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=29,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=30,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=31,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only"
...
```

------
#### [ Launch templates ]

**要使用 Amazon EC2 控制台将 EFA 添加到启动模板**

1. 在**网络设置**中，展开**高级网络配置**。

1. 对于主网络接口（网卡索引 `0`、设备索引 `0`），请创建一个 ENA 接口。您不能使用仅限 EFA 的网络接口作为主网络接口。

1. 如果网卡索引 0 支持 EFA，则为网卡索引 `0` 设备索引 `1` 创建一个仅限 EFA 的网络接口。

1. 对于其他的每个网络接口，请将下一个未使用的网卡索引、设备索引 `0` 用于仅限 EFA 的网络接口，以及/或者将设备索引 `1` 用于 ENA 网络接口，具体取决于您的使用案例，例如 ENA 带宽要求或 IP 地址空间。有关示例使用案例，请参阅 [P5 和 P5e 实例的 EFA 配置](#efa-for-p5)。

**要使用 [create-launch-template](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html) 命令将 EFA 添加到启动模板**  
对于 `NetworkInterfaces`，请指定所需的网络接口数量。对于主网络接口，指定 `NetworkCardIndex=0`、`DeviceIndex=0` 和 `InterfaceType=interface`。如果网卡索引 0 支持 EFA，请指定 `NetworkCardIndex=0`、`DeviceIndex=1` 和 `InterfaceType=efa-only`。对于任何其他网络接口，请将 `NetworkCardIndex` 指定为下一个未使用的索引，将 `InterfaceType=efa-only` 指定为 `DeviceIndex=0`，以及/或者将 `InterfaceType=interface` 指定为 `DeviceIndex=1`。

以下代码段显示可能的 32 个网络接口中 3 个网络接口的示例。

```
"NetworkInterfaces":[
{
  "NetworkCardIndex":0,
  "DeviceIndex":0,
  "InterfaceType": "interface",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 0,
  "DeviceIndex": 1,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 1,
  "DeviceIndex": 0,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 2,
  "DeviceIndex": 0,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 3,
  "DeviceIndex": 0,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
}
...
```

------

## P5 和 P5e 实例的 EFA 配置
<a name="efa-for-p5"></a>

`p5.48xlarge` 和 `p5e.48xlarge` 实例支持 32 个网卡，拥有 3200 Gbps 的总网络带宽容量，其中高达 800 Gbps 可用于 IP 网络流量。由于 EFA 和 IP 网络流量共享相同的底层资源，因此一方使用的带宽会减少另一方可用的带宽。这意味着，只要总带宽不超过 3,200 Gbps 且 IP 带宽不超过 800 Gbps，就可以按任意组合在 EFA 流量和 IP 流量之间分配网络带宽。例如，如果您使用 400 Gbps 的 IP 带宽，则可以同时获得高达 2800 Gbps 的 EFA 带宽。

**使用案例 1：保存 IP 地址并避免潜在的 Linux IP 问题**

此配置通过一个私有 IP 地址提供高达 3,200 Gbps 的 EFA 网络带宽和高达 100 Gbps 的 IP 联网带宽。此配置还有助于避免潜在的 Linux IP 问题，例如不允许自动分配公有 IP 地址和 IP 路由挑战（主机名到 IP 地址的映射问题和源 IP 地址不匹配），如果实例有多个网络接口，则可能会出现这些问题。
+ 对于主网络接口（网卡索引 0、设备索引 0），请使用一个 ENA 接口。
+ 对于网卡索引 0、设备索引 1，请创建一个仅限 EFA 的网络接口。
+ 对于其余的网络接口（网卡索引 1-31、设备索引 0），请使用仅限 EFA 的网络接口。

**使用案例 2：最大 EFA 和 IP 网络带宽**

此配置通过 8 个私有 IP 地址提供高达 3,200 Gbps 的 EFA 网络带宽和高达 800 Gbps 的 IP 联网带宽。您无法使用此配置自动分配公有 IP 地址。但是，您可以在启动后将弹性 IP 地址连接到主网络接口（网卡索引 0、设备索引 0）以实现互联网连接。
+ 对于主网络接口（网卡索引 0、设备索引 0），使用 EFA 网络接口。
+ 对于其余接口，执行以下操作：
  + 在网卡索引 0、设备索引 1 上指定仅限 EFA 的网络接口，对于网卡接口 1、2 和 3，请使用设备索引 0。
  + 在以下**每个**网卡索引子集中，指定一个 ENA 网络接口和四个仅限 EFA 的网络接口；对仅限 EFA 的网络接口，请使用设备索引 0：
    + [4、5、6、7]
    + [8、9、10、11]
    + [12、13、14、15]
    + [16、17、18、19]
    + [20、21、22、23]
    + [24、25、26、27]
    + [28、29、30、31]

下面的示例对此配置进行说明：

```
$ aws --region $REGION ec2 run-instances \
 --instance-type p5.48xlarge \
 --count 1 \
 --key-name key_pair_name \
 --image-id ami_id \
 --network-interfaces "NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=0,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=17,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=18,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=19,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=20,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=20,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=21,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=22,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=23,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=24,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=24,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=25,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=26,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=27,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=28,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=28,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=29,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=30,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=31,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only"
...
```

## P6-B200 实例的 EFA 配置
<a name="efa-for-p6-b200"></a>

P6-B200 实例的总网络带宽容量为 3200 Gbps，其中高达 1600 Gbps 可用于 ENA。这些实例有 8 个 GPU 和 8 个网卡，其中每个网卡支持高达 400 Gbps 的 EFA 带宽和 200 Gbps 的 ENA 带宽。由于 EFA 和 ENA 流量共享相同的底层资源，因此一方使用的带宽会减少另一方可用的带宽。

**使用案例 1：保存 IP 地址**

此配置每个实例至少消耗一个私有 IP 地址并支持高达 3200 Gbps 的 EFA 带宽和高达 200 Gbps 的 ENA 带宽。
+ 对于主网络接口（网卡索引 0、设备索引 0），请使用一个 ENA 接口。
+ 对于网卡索引 0、设备索引 1，请创建一个仅限 EFA 的网络接口。
+ 对于其余 7 个网卡（网卡索引 1-7，设备索引 0），使用仅限 EFA 的网络接口。

**使用案例 2：最大 EFA 和 ENA 带宽**

此配置每个实例至少消耗 8 个私有 IP 地址并支持高达 3200 Gbps 的 EFA 带宽和高达 1600 Gbps 的 ENA 带宽。
+ 对于主网络接口（网卡索引 0、设备索引 0），请使用一个 ENA 接口。
+ 对于网卡索引 0、设备索引 1，请创建一个仅限 EFA 的网络接口。
+ 对于其余 7 个网卡（网卡索引 1-7），请在设备索引 0 上创建一个仅限 EFA 的网络接口，并在设备索引 1 上创建一个 ENA 网络接口。

## P6e-GB200 实例的 EFA 配置
<a name="efa-for-p6e"></a>

P6e-GB200 实例最多可以配置 17 个网卡。下图显示 P6e-GB200 实例的物理网络接口卡（NIC）布局以及网卡索引（NCI）的映射。

![\[P6e-GB200 实例的物理网络接口卡（NIC）和网卡索引（NCI）映射。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/p6e.png)


主 NCI（索引 0）支持高达 100 Gbps 的 ENA 带宽。具有以下索引的 NCI 支持仅限 EFA 的网络接口和 400 Gbps 的 EFA 带宽：[1、3、5、7、9、11、13、15]。具有以下索引的 NCI 支持高达 200 Gbps 的 ENA 或 EFA 带宽：[2、4、6、8、10、12、14、16]。

以下组中的 NCI 共享主机上的底层物理 NIC：
+ [1 和 2]
+ [3 和 4]
+ [5 和 6]
+ [7 和 8]
+ [9 和 10]
+ [11 和 12]
+ [13 和 14]
+ [15 和 16]

每个物理 NIC 支持高达 400 Gbps 的带宽。由于这些组中的 NCI 共享相同的底层物理 NIC，因此一个 NCI 使用的带宽会减少另一个 NCI 可用的带宽。例如，如果 NCI 2 使用 200 Gbps 的 ENA 带宽，则 NCI 1 可以同时使用高达 200 Gbps 的 EFA 带宽。

主机上的每个底层 GPU 都可以通过以下几对 NCI 直接发送流量：
+ [1 和 3]
+ [5 和 7]
+ [9 和 11]
+ [13 和 15]

每个 GPU 支持高达 400 Gbps 的 EFA 带宽。由于这些组中的网卡共享相同的 GPU，因此一个网卡使用的带宽会减少另一个网卡可用的带宽。例如，如果 NCI 1 使用 200 Gbps 的 EFA 带宽，则 NCI 3 可以同时使用高达 200 Gbps 的 EFA 带宽。因此，为了实现最高 EFA 性能，我们建议您执行**以下操作之一**，以实现总计 1600 Gbps 的 EFA 带宽：
+ 在每个组中仅向一个 NCI 添加仅限 EFA 的网络接口，以实现每个网络接口 400 Gbps（*4 个 EFA 网络接口 x 400 Gbps*）。
+ 向每个组中的每个 NCI 添加仅限 EFA 的网络接口，以实现每个网络接口 200 Gbps（*8 个 EFA 网络接口 x 200 Gbps*）。

例如，以下配置使用每个 NCI 组中一个仅限 EFA 的网络接口提供高达 1600 Gbps 的 EFA 带宽，并仅使用主 NCI（索引 0）提供高达 100 Gbps 的 ENA 网络带宽。
+ 对于主 NCI（网卡索引 0、设备索引 0），使用 EFA 网络接口。
+ 将仅限 EFA 的网络接口添加到以下位置：
  + NCI 1，设备索引 0
  + NCI 5，设备索引 0
  + NCI 9，设备索引 0
  + NCI 13，设备索引 0

## P6-B300 实例的 EFA 配置
<a name="efa-for-p6-b300"></a>

对于 EFA 流量，P6-B300 实例的总网络带宽容量高达 6400 Gbps，对于 ENA 流量高达 3870 Gbps。它们有 8 个 GPU 和 17 个网卡，其中主网卡仅支持带宽高达 350 Gbps 的 ENA 网络接口。辅助网卡支持高达 400 Gbps 的 EFA 带宽和高达 220 Gbps 的 ENA 带宽。由于 EFA 和 ENA 流量共享相同的底层资源，因此一方使用的带宽会减少另一方可用的带宽。

![\[P6-B300 实例的物理网络接口卡（NIC）和网卡索引（NCI）映射。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/p6-b300.png)


**使用案例 1：保存 IP 地址**

此配置每个实例至少消耗一个私有 IP 地址并支持高达 6400 Gbps 的 EFA 带宽和高达 350 Gbps 的 ENA 带宽。
+ 对于主网络接口（网卡索引 0、设备索引 0），使用 EFA 网络接口。
+ 对于其余网卡（网卡索引 1-16，设备索引 0），请使用仅限 EFA 的网络接口。

```
--network-interfaces \
"NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only"
```

**使用案例 2：最大 EFA 和 ENA 带宽**

此配置每个实例至少消耗 17 个私有 IP 地址并支持高达 6400 Gbps 的 EFA 带宽和高达 3870 Gbps 的 ENA 带宽。
+ 对于主网络接口（网卡索引 0、设备索引 0），使用 EFA 网络接口。
+ 对于其余的网卡，请创建一个仅限 EFA 的接口（网卡索引 1-16，设备索引 0）和一个 ENA 接口（网卡索引 1-16，设备索引 1）。

```
--network-interfaces \
"NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=1,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=2,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=3,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=4,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=5,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=6,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=7,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=8,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=9,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=10,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=11,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=12,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=13,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=14,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=15,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=16,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface"
```

# 创建 Elastic Fabric Adapter 并将其附加到 Amazon EC2 实例
<a name="create-efa"></a>

您可以创建 EFA 并将其附加到 Amazon EC2 实例，就像 Amazon EC2 中的任何其他弹性网络接口一样。不过，与弹性网络接口不同，无法将 EFA 附加到处于 `running` 状态的实例，也无法将其从处于该状态的实例中分离。

**注意事项**
+  您可以更改与 EFA 关联的安全组。要启用操作系统绕过功能，EFA 必须是一个安全组的成员，以允许进出安全组本身的所有入站和出站流量。有关更多信息，请参阅 [步骤 1：准备启用 EFA 的安全组](efa-start.md#efa-start-security)。

  您可以使用更改与弹性网络接口关联的安全组的相同方式更改与 EFA 关联的安全组。有关更多信息，请参阅 [修改网络接口属性](modify-network-interface-attributes.md)。
+ 您可以使用将 IP 地址分配给弹性网络接口的相同方式将弹性 IP (IPv4) 和 IPv6 地址分配给 EFA（带 ENA 的 EFA）。有关更多信息，请参阅[管理 IP 地址](managing-network-interface-ip-addresses.md)。

  您不能为仅限 EFA 的网络接口分配 IP 地址。

**Topics**
+ [创建 EFA](#efa-create)
+ [将 EFA 附加到停止的实例](#efa-attach)
+ [在启动实例时附加 EFA](#efa-launch)
+ [将 EFA 添加到启动模板](#efa-launch-template)

## 创建 EFA
<a name="efa-create"></a>

您可以在 VPC 上的子网中创建 EFA。在创建 EFA 后，您无法将其移动到另一个子网，并且只能将其附加到同一可用区中的已停止实例。

------
#### [ Console ]

**创建 EFA（带 ENA 的 EFA 或仅限 ENA）网络接口**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Network Interfaces**（网络接口），然后选择 **Create network interface**（创建网络接口）。

1. 对于 **Description (描述)**，请输入一个描述性的 EFA 名称。

1. 对于 **Subnet (子网)**，请选择要在其中创建 EFA 的子网。

1. **接口类型**，选择以下选项之一：
   + **带 ENA 的 EFA**：创建同时支持 ENA 和 EFA 设备的网络接口。
   + **仅限 EFA**：创建仅支持 EFA 设备的网络接口。

1. （仅适用于带 ENA 的 EFA）为网络接口配置 IP 地址和前缀分配。您可以分配的 IP 地址和前缀类型取决于所选的子网。对于仅限 IPv4 的子网，您只能分配 IPv4 IP 地址和前缀。对于仅限 IPv6 的子网，您只能分配 IPv6 IP 地址和前缀。对于双堆栈子网，可同时分配 IPv4 和 IPv6 IP 地址和前缀。
**注意**  
您不能为仅限 EFA 的网络接口分配 IP 地址。

   1. 对于**私有 IPv4 地址**和/或 **IPv6 地址**，选择**自动分配**以使 Amazon EC2 从选定子网中自动分配 IP 地址，或选择**自定义**以手动指定要分配的 IP 地址。

   1. 如果您分配 IPv6 地址，则可以选择启用**分配主 IPv6 IP**。此操作将为网络接口分配一个主 IPv6 全局单播地址（GUA）。分配主要 IPv6 地址使您能够避免中断实例或 ENI 的流量。有关更多信息，请参阅 [IPv6 地址](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#vpc-ipv6-addresses)。

   1. 对于 **IPv4 前缀委派**和/或 **IPv6 前缀委派**，选择**自动分配**以使 Amazon EC2 自动从子网的 CIDR 数据块中分配前缀，或选择**自定义**以从子网的 CIDR 数据块中手动指定前缀。如果您指定前缀，则 AWS 会验证其是否已分配给其他资源。有关更多信息，请参阅 [Amazon EC2 网络接口的前缀委派](ec2-prefix-eni.md)。

   1. （可选）配置**空闲连接跟踪超时**设置。有关更多信息，请参阅 [空闲连接跟踪超时](security-group-connection-tracking.md#connection-tracking-timeouts)。
      + **TCP 建立超时**：处于已建立状态的空闲 TCP 连接的超时时间（秒）。最小值：60 秒。最大值：432000 秒（5 天）。默认值：432000 秒。建议值：小于 432000 秒。
      + **UDP 超时**：空闲 UDP 流的超时时间（秒），这些流仅在单个方向或单个请求-响应事务中看到流量。最小值：30 秒。最大值：60 秒。默认值：30 秒。
      + **UDP 流超时**：空闲 UDP 流的超时时间（秒），这些流被归类为已看到多个请求-响应事务的流。最小值：60 秒。最大值：180 秒（3 分钟）。默认值：180 秒。

1. 对于 **Security groups**，选择一个或多个安全组。

1. 选择**创建网络接口**。

------
#### [ AWS CLI ]

**创建 EFA**  
使用 [create-network-interface](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-network-interface.html) 命令。对于 `--interface-type`，针对 EFA 网络接口指定 `efa` 或针对仅限 EFA 的网络接口指定 `efa-only`。

```
aws ec2 create-network-interface \
    --subnet-id subnet-0abcdef1234567890 \
    --interface-type efa \
    --description "my efa"
```

------
#### [ PowerShell ]

**创建 EFA**  
使用 [New-EC2NetworkInterface](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2NetworkInterface.html) cmdlet。对于 `-InterfaceType`，针对 EFA 网络接口指定 `efa` 或针对仅限 EFA 的网络接口指定 `efa-only`

```
New-EC2NetworkInterface `
    -SubnetId subnet-0abcdef1234567890 `
    -InterfaceType efa `
    -Description "my efa"
```

------

## 将 EFA 附加到停止的实例
<a name="efa-attach"></a>

您可以将 EFA 附加到处于 `stopped` 状态的任何支持的实例。您无法将 EFA 附加到处于 `running` 状态的实例。有关支持的实例类型的更多信息，请参阅[支持的实例类型](efa.md#efa-instance-types)。

您可以使用将网络接口连接到实例的相同方式将 EFA 连接到实例。有关更多信息，请参阅[附加网络接口](network-interface-attachments.md#attach_eni)。

## 在启动实例时附加 EFA
<a name="efa-launch"></a>

------
#### [ AWS CLI ]

**在启动实例时附加现有的 EFA**  
使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令和 `--network-interfaces` 选项。对于主网络接口，指定 EFA 网络接口以及 `NetworkCardIndex=0`、`DeviceIndex=0`。要附加多个 EFA 网络接口，请参阅[最大化网络带宽](efa-acc-inst-types.md)。

```
--network-interfaces "NetworkCardIndex=0, \
    DeviceIndex=0, \
    NetworkInterfaceId=eni-1234567890abcdef0, \
    Groups=sg-1234567890abcdef0, \
    SubnetId=subnet-0abcdef1234567890"
```

**在启动实例时附加新的 EFA**  
使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令和 `--network-interfaces` 选项。对于主网络接口，使用 `NetworkCardIndex=0`、`DeviceIndex=0` 和 `InterfaceType=efa`。如果您要附加多个 EFA 网络接口，请参阅 [最大化网络带宽](efa-acc-inst-types.md)。

```
--network-interfaces "NetworkCardIndex=0, \
    DeviceIndex=0, \
    InterfaceType=efa, \
    Groups=sg-1234567890abcdef0, \
    SubnetId=subnet-0abcdef1234567890"
```

------
#### [ PowerShell ]

**在启动实例时附加现有的 EFA**  
将 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 与 `-NetworkInterfaces` 参数结合使用。

```
-NetworkInterface $networkInterface
```

按如下方式定义网络接口。

```
$networkInterface = New-Object Amazon.EC2.Model.InstanceNetworkInterfaceSpecification
$networkInterface.DeviceIndex = 0
$networkInterface.NetworkInterfaceId = "eni-1234567890abcdef0"
$networkInterface.Groups = @("sg-1234567890abcdef0")
$networkInterface.SubnetId = "subnet-0abcdef1234567890"
```

**在启动实例时附加新的 EFA**  
将 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 与 `-NetworkInterfaces` 参数结合使用。

```
-NetworkInterface $networkInterface
```

按如下方式定义网络接口。

```
$networkInterface = New-Object Amazon.EC2.Model.InstanceNetworkInterfaceSpecification
$networkInterface.DeviceIndex = 0
$networkInterface.InterfaceType = "efa"
$networkInterface.Groups = @("sg-1234567890abcdef0")
$networkInterface.SubnetId = "subnet-0abcdef1234567890"
```

------

## 将 EFA 添加到启动模板
<a name="efa-launch-template"></a>

您可以创建一个启动模板，其中包含启动启用了 EFA 的实例所需的配置信息。您可以在启动模板中同时指定 EFA 和仅限 EFA 的网络接口。要创建启用了 EFA 的启动模板，请创建新的启动模板并指定支持的实例类型、启用了 EFA 的 AMI 以及启用了 EFA 的安全组。对于 `NetworkInterfaces`，请指定要附加的 EFA 网络接口。对于主网络接口，使用 `NetworkCardIndex=0`、`DeviceIndex=0` 和 `InterfaceType=efa`。如果您要附加多个 EFA 网络接口，请参阅 [使用多网卡最大化 Amazon EC2 实例上的网络带宽](efa-acc-inst-types.md)。

您可以利用启动模板通过其他 AWS 服务（如 [AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/what-is-batch.html) 或 [AWS ParallelCluster](https://docs.aws.amazon.com/parallelcluster/latest/ug/what-is-aws-parallelcluster.html)）启动启用了 EFA 的实例。

有关创建启动模板的更多信息，请参阅[创建 Amazon EC2 启动模板](create-launch-template.md)。

# 将 EFA 与 Amazon EC2 实例分离并删除 EFA
<a name="detach-efa"></a>

您可以将 EFA 与 Amazon EC2 实例分离，然后将其删除，就像在 Amazon EC2 中删除任何其他弹性网络接口一样。

## 分离 EFA
<a name="efa-detach"></a>

要从实例中分离 EFA，您必须先停止该实例。您无法从处于运行状态的实例中分离 EFA。

您可以使用从实例中分离弹性网络接口的相同方式从实例中分离 EFA。有关更多信息，请参阅 [分离网络接口](network-interface-attachments.md#detach_eni)。

## 删除 EFA
<a name="efa-delete"></a>

要删除 EFA，您必须先将其从实例中分离。在附加到实例时，您无法删除 EFA。

您可以使用删除弹性网络接口的相同方式删除 EFAs。有关更多信息，请参阅 [删除网络接口](delete_eni.md)。

# 监控 Amazon EC2 上的 Elastic Fabric Adapter
<a name="efa-working-monitor"></a>

您可以使用以下功能监控 Elastic Fabric Adapters 的性能。

**Topics**
+ [Amazon EC2 实例的 EFA 驱动程序指标](#efa-driver-metrics)
+ [Amazon VPC 流日志](#efa-flowlog)
+ [Amazon CloudWatch](#efa-cloudwatch)

## Amazon EC2 实例的 EFA 驱动程序指标
<a name="efa-driver-metrics"></a>

Elastic Fabric Adapter（EFA）驱动程序实时发布来自已挂载 EFA 接口的实例的多个指标。您可以使用这些指标来排查应用程序性能和网络问题、为工作负载选择合适的集群大小、主动计划扩缩活动以及对应用程序进行基准测试，以确定是否最大限度利用了实例上可用的 EFA 性能。

**Topics**
+ [可用的 EFA 驱动程序指标](#available-efa-metrics)
+ [检索实例的 EFA 驱动程序指标](#view-efa-driver-metrics)

### 可用的 EFA 驱动程序指标
<a name="available-efa-metrics"></a>

ENA 驱动程序会实时向实例发布以下指标。这些指标提供了自实例启动或上次驱动程序重置以来的累计错误数、连接事件数以及所挂载 EFA 设备发送、接收、重新传输或丢弃的数据包数。


| 指标 | 说明 | 支持的实例类型 | 
| --- | --- | --- | 
| tx\$1bytes |  传输的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| rx\$1bytes |  收到的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| tx\$1pkts |  传输的数据包数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rx\$1pkts |  收到的数据包数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rx\$1drops |  收到但随后丢弃的数据包数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| send\$1bytes |  使用发送操作发送的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| recv\$1bytes |  通过发送操作收到的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| send\$1wrs |  使用发送操作发送的数据包数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| recv\$1wrs |  通过发送操作收到的数据包数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rdma\$1write\$1wrs |  已完成的 rdma 写入操作数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rdma\$1read\$1wrs |  已完成的 rdma 读取操作数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rdma\$1write\$1bytes |  其他实例通过 rdma 写入操作写入的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| rdma\$1read\$1bytes |  通过 rdma 读取操作收到的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| rdma\$1write\$1wr\$1err |  出现本地或远程错误的 rdma 写入操作数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rdma\$1read\$1wr\$1err |  出现本地或远程错误的 rdma 读取操作数。 单位：计数  | 支持 EFA 的所有实例类型 | 
| rdma\$1read\$1resp\$1bytes |  为响应 rdma 读取操作而发送的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| rdma\$1write\$1recv\$1bytes |  通过 rdma 写入操作收到的字节数。 单位：字节  | 支持 EFA 的所有实例类型 | 
| retrans\$1bytes |  重新传输的 EFA SRD 字节数。 单位：计数  | 支持 EFA 的 Nitro v4 及更高版本的实例类型 | 
| retrans\$1pkts |  重新传输的 EFA SRD 数据包数。 单位：字节  | 支持 EFA 的 Nitro v4 及更高版本的实例类型 | 
| retrans\$1timeout\$1events |  EFA SRD 流量超时并导致网络路径更改的次数。 单位：计数  | 支持 EFA 的 Nitro v4 及更高版本的实例类型 | 
| impaired\$1remote\$1conn\$1events |  EFA SRD 连接进入受损状态，从而导致吞吐速率限制降低的次数。 单位：计数  | 支持 EFA 的 Nitro v4 及更高版本的实例类型 | 
| unresponsive\$1remote\$1events |  EFA SRD 远程连接无响应的次数。 单位：计数  | 支持 EFA 的 Nitro v4 及更高版本的实例类型 | 

有关支持 EFA 的实例类型的更多信息，请参阅[支持的实例类型](efa.md#efa-instance-types)。

### 检索实例的 EFA 驱动程序指标
<a name="view-efa-driver-metrics"></a>

您可以使用 [rdma-tool](https://man7.org/linux/man-pages/man8/rdma.8.html) 命令行工具来检索挂载到实例的所有 EFA 接口的指标，如下所示：

```
$ rdma -p statistic show
link rdmap0s31/1 
    tx_bytes 0 
    tx_pkts 0 
    rx_bytes 0 
    rx_pkts 0 
    rx_drops 0 
    send_bytes 0 
    send_wrs 0 
    recv_bytes 0 
    recv_wrs 0 
    rdma_read_wrs 0 
    rdma_read_bytes 0 
    rdma_read_wr_err 0 
    rdma_read_resp_bytes 0 
    rdma_write_wrs 0 
    rdma_write_bytes 0 
    rdma_write_wr_err 0
    retrans_bytes 0
    retrans_pkts 0
    retrans_timeout_events 0
    unresponsive_remote_events 0
    impaired_remote_conn_events 0
```

您也可以使用以下命令从 sys 文件中检索挂载到实例的每个 EFA 接口的指标。

```
$ more /sys/class/infiniband/device_number/ports/port_number/hw_counters/* | cat
```

例如

```
$ more /sys/class/infiniband/rdmap0s31/ports/1/hw_counters/* | cat
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/lifespan
::::::::::::::
12
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_resp_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_wr_err
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_recv_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_wr_err
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/recv_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/recv_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rx_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rx_drops
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rx_pkts
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/send_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/send_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/tx_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/tx_pkts
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/retrans_bytes
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/retrans_pkts
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/retrans_timeout_events
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/unresponsive_remote_events
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/impaired_remote_conn_events
::::::::::::::
0
```

## Amazon VPC 流日志
<a name="efa-flowlog"></a>

您可以创建 Amazon VPC 流日志以捕获有关进出 EFA 的流量的信息。流日志数据可以发布到 Amazon CloudWatch Logs 和 Amazon S3。在创建流日志后，您可以在所选的目标中检索和查看其数据。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [VPC 流日志](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)。

您可以使用为弹性网络接口创建流日志的相同方式为 EFA 创建流日志。有关更多信息，请参阅《*Amazon VPC 用户指南*》中的[创建流日志](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-flow-logs.html#create-flow-log)。

在流日志条目中，EFA 流量由 `srcAddress` 和 `destAddress` 标识，二者都格式化为 MAC 地址，如以下示例中所示。

```
version accountId  eniId        srcAddress        destAddress       sourcePort destPort protocol packets bytes start      end        action log-status
2       3794735123 eni-10000001 01:23:45:67:89:ab 05:23:45:67:89:ab -          -        -        9       5689  1521232534 1524512343 ACCEPT OK
```

## Amazon CloudWatch
<a name="efa-cloudwatch"></a>

如果在 Amazon EKS 集群中使用 EFA，则可以使用 CloudWatch Container Insights 监控您的 EFA。Amazon CloudWatch Container Insights 支持所有 [EFA 驱动指标](#efa-driver-metrics)，以下指标除外：`retrans_bytes`、`retrans_pkts`、`retrans_timeout_events`、`unresponsive_remote_events` 和 `impaired_remote_conn_events`。

有关更多信息，请参阅《Amazon CloudWatch 用户指南》中的 [Amazon EKS 和 Kubernetes Container Insights 指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-enhanced-EKS.html#Container-Insights-metrics-EFA)**。

# 使用校验和验证 EFA 安装程序
<a name="efa-verify"></a>

您可以选择使用 MD5 或 SHA256 校验和来验证 EFA tarball（`.tar.gz` 文件）。建议您执行此操作以验证软件发布者的身份，并检查该应用程序自发布以来是否已被更改或损坏。

**验证 tarball**  
使用 **md5sum** 实用程序生成 MD5 校验和，或使用 **sha256sum** 实用程序生成 SHA256 校验和，并指定 tarball 文件名。必须从保存 tarball 文件的目录运行命令。
+ MD5

  ```
  $  md5sum tarball_filename.tar.gz
  ```
+ SHA256

  ```
  $  sha256sum tarball_filename.tar.gz
  ```

这些命令应返回以下格式的校验和值。

```
checksum_value tarball_filename.tar.gz
```

将命令返回的校验和值与下表中提供的校验和值进行比较。如果校验和匹配，则可以放心地运行安装脚本。如果校验和不匹配，请不要运行安装脚本，并联系 支持。

例如，以下命令使用 SHA256 校验和来验证 EFA 1.9.4 tarball。

```
$  sha256sum aws-efa-installer-1.9.4.tar.gz
```

输出示例：

```
1009b5182693490d908ef0ed2c1dd4f813cc310a5d2062ce9619c4c12b5a7f14 aws-efa-installer-1.9.4.tar.gz
```

下表列出了最近几个版本的 EFA 的校验和。


| 版本 | 校验和 | 
| --- | --- | 
| EFA 1.47.0 |  **MD5：**`c81d4caf24dabc04a6e4818590620f5f` **SHA256：**`2df4201e046833c7dc8160907bee7f52b76ff80ed147376a2d0ed8a0dd66b2db`  | 
| EFA 1.46.0 |  **MD5：**a88bbd9b71624d7ca401b54bc2fc0c19`` **SHA256：**`8302bd7849afb95c903a875d7dcb6f85b3d7629e9a8b67d020031cfc6f4d0ee1`  | 
| EFA 1.45.1 |  **MD5：**91c3c87e16bbcaca1513252c38b771bb`` **SHA256：**`9aeb20c645135b6039cc08986d8f14e63280f7839e882a74df5e83627ffeaa17`  | 
| EFA 1.45.0 |  **MD5：**800aeddfa9d9c5f139a7b8f7c4fec627`` **SHA256：**`25ba26a0877fe3317390dc126aad2f23e27fc461cf0b940004f032cb342fa539`  | 
| EFA 1.44.0 |  **MD5：**d024f6bebe080db42745103b84ca7c43`` **SHA256：**`f129a5b44a49d593d247e55a59eb9bcb57121566e1c2e42b832a4e794fa83d8a`  | 
| EFA 1.43.3 |  **MD5：**`4dbc6eeecc516760253c10cbedb6319d` **SHA256：**`6c470ebce254c7165347b5048895ac2996c88567271642297f4c597738300652`  | 
| EFA 1.43.2 |  **MD5：**`7287b25a07c9747c0d4001e8fc5f59b2` **SHA256：**`de15c5bdbc83b952afbde876110830c604ad0796680e5157c05f7c1979a41069`  | 
| EFA 1.43.1 |  **MD5：**`7cfafc8debaea51dd4966fa0b2bba673` **SHA256：**54211eda0c193138ee8ed09b5fb41c41fc76fe0a77935fa4ec8d989466342740``  | 
| EFA 1.43.0 |  **MD5：**`f2b3dd7dc8670b541f7c23fd58e5e503` **SHA256：**`786df3458c499237be33bb8e50ffd4da7c18c20e254380ffc80fb90833d8cc73`  | 
| EFA 1.42.0 |  **MD5：**`94b2b1db09da1dde08ec049db1f24370` **SHA256：**`4114fe612905ee05083ae5cb391a00a012510f3abfecc642d86c9a5ae4be9008`  | 
| EFA 1.41.0 |  **MD5：**`086181c3ee3f8da512fc6e1c795e8936` **SHA256：**`3506354cdfbe31ff552fe75f5d0d9bb7efd29cf79bd99457347d29c751c38f9f`  | 
| EFA 1.40.0 |  **MD5：**`f3ec6f73fbeaccba082327507581157c` **SHA256：**`30491b0fe7c3470d4439594538855c981b05fa69862d74f8c05eb9b97912368a`  | 
| EFA 1.39.0 |  **MD5：**`c223d5954a85a7fbcd248c942b866e43` **SHA256：**`2cbc028c03064633bb990782b47c36156637769e2f48704417a9c700a7a32101`  | 
| EFA 1.38.1 |  **MD5：**`f112569e828ab65187777f794bab542c` **SHA256：**`83923374afd388b1cfcf4b3a21a2b1ba7cf46a01a587f7b519b8386cb95e4f81`  | 
| EFA 1.38.0 |  **MD5：**`43a2a446b33a2506f40853d55059f1ea` **SHA256：**`4f436954f35ad53754b4d005fd8d0be63de3b4184de41a695b504bdce0fecb22`  | 
| EFA 1.37.0 |  **MD5：**`6328070192bae920eca45797ad4c1db1` **SHA256：**`2584fc3c8bb99f29b3285e275747ff09d67c18e162c2a652e36c976b72154bfb`  | 
| EFA 1.36.0 |  **MD5：**`1bec83180fbffb23452ab6469ca21dfa` **SHA256：**`de183f333cfb58aeb7908a67bf9106985ba3ccb7f8638b851d2a0d8dbfacaec4`  | 
| EFA 1.35.0 |  **MD5：**`252f03c978dca5f8e8d9f34e488b256e` **SHA256：**`432b6ad4368ba0cd8b902729d14a908a97be7a3dcc5239422ea994a47f35a5e1`  | 
| EFA 1.34.0 |  **MD5：**`5cd4b28d27a31677c16139b54c9acb45` **SHA256：**`bd68839e741b0afd3ec2e37d50603803cfa7a279c120f0a736cc57c2ff2d7fdc`  | 
| EFA 1.33.0 |  **MD5：**`e2f61fccbcaa11e2ccfddd3660522276` **SHA256：**`0372877b87c6a7337bb7791d255e1053b907d030489fb2c3732ba70069185fce`  | 
| EFA 1.32.0 |  **MD5：**`db8d65cc028d8d08b5a9f2d88881c1b1` **SHA256：**`5f7233760be57f6fee6de8c09acbfbf59238de848e06048dc54d156ef578fc66`  | 
| EFA 1.31.0 |  **MD5：**`856352f12bef2ccbadcd75e35aa52aaf` **SHA256：**`943325bd37902a4300ac9e5715163537d56ecb4e7b87b37827c3e547aa1897bf`  | 
| EFA 1.30.0 |  **MD5：**`31f48e1a47fe93ede8ebd273fb747358` **SHA256：**`876ab9403e07a0c3c91a1a34685a52eced890ae052df94857f6081c5f6c78a0a`  | 
| EFA 1.29.1 |  **MD5：**`e1872ca815d752c1d7c2b5c175e52a16` **SHA256：**`178b263b8c25845b63dc93b25bcdff5870df5204ec509af26f43e8d283488744`  | 
| EFA 1.29.0 |  **MD5：**`39d06a002154d94cd982ed348133f385` **SHA256：**`836655f87015547e733e7d9f7c760e4e24697f8bbc261bb5f3560abd4206bc36`  | 
| EFA 1.28.0 |  **MD5：**`9dc13b7446665822605e66febe074035` **SHA256：**`2e625d2d6d3e073b5178e8e861891273d896b66d03cb1a32244fd56789f1c435`  | 
| EFA 1.27.0 |  **MD5：**`98bfb515ea3e8d93f554020f3837fa15` **SHA256：**`1d49a97b0bf8d964d91652a79ac851f2550e33a5bf9d0cf86ec9357ff6579aa3`  | 
| EFA 1.26.1 |  **MD5：**`884e74671fdef4725501f7cd2d451d0c` **SHA256：**`c616994c924f54ebfabfab32b7fe8ac56947fae00a0ff453d975e298d174fc96`  | 
| EFA 1.26.0 |  **MD5：**`f8839f12ff2e3b9ba09ae8a82b30e663` **SHA256：**`bc1abc1f76e97d204d3755d2a9ca307fc423e51c63141f798c2f15be3715aa11`  | 
| EFA 1.25.1 |  **MD5：**`6d876b894547847a45bb8854d4431f18` **SHA256：**`d2abc553d22b89a4ce92882052c1fa6de450d3a801fe005da718b7d4b9602b06`  | 
| EFA 1.25.0 |  **MD5：**`1993836ca749596051da04694ea0d00c` **SHA256：**`98b7b26ce031a2d6a93de2297cc71b03af647194866369ca53b60d82d45ad342`  | 
| EFA 1.24.1 |  **MD5：**`211b249f39d53086f3cb0c07665f4e6f` **SHA256：**`120cfeec233af0955623ac7133b674143329f9561a9a8193e473060f596aec62`  | 
| EFA 1.24.0 |  **MD5：**`7afe0187951e2dd2c9cc4b572e62f924` **SHA256：**`878623f819a0d9099d76ecd41cf4f569d4c3aac0c9bb7ba9536347c50b6bf88e`  | 
| EFA 1.23.1 |  **MD5：**`22491e114b6ee7160a8290145dca0c28` **SHA256：**`5ca848d8e0ff4d1571cd443c36f8d27c8cdf2a0c97e9068ebf000c303fc40797`  | 
| EFA 1.23.0 |  **MD5：**`38a6d7c1861f5038dba4e441ca7683ca` **SHA256：**`555d497a60f22e3857fdeb3dfc53aa86d05926023c68c916d15d2dc3df6525bd`  | 
| EFA 1.22.1 |  **MD5：**`600c0ad7cdbc06e8e846cb763f92901b` **SHA256：**`f90f3d5f59c031b9a964466b5401e86fd0429272408f6c207c3f9048254e9665`  | 
| EFA 1.22.0 |  **MD5：**`8f100c93dc8ab519c2aeb5dab89e98f8` **SHA256：**`f329e7d54a86a03ea51da6ea9a5b68fb354fbae4a57a02f9592e21fce431dc3a`  | 
| EFA 1.21.0 |  **MD5：**`959ccc3a4347461909ec02ed3ba7c372` **SHA256：**`c64e6ca34ccfc3ebe8e82d08899ae8442b3ef552541cf5429c43d11a04333050`  | 
| EFA 1.20.0 |  **MD5：**`7ebfbb8e85f1b94709df4ab3db47913b` **SHA256：**`aeefd2681ffd5c4c631d1502867db5b831621d6eb85b61fe3ec80df983d1dcf0`  | 
| EFA 1.19.0 |  **MD5：**`2fd45324953347ec5518da7e3fefa0ec` **SHA256：**`99b77821b9e72c8dea015cc92c96193e8db307deee05b91a58094cc331f16709`  | 
| EFA 1.18.0 |  **MD5：**`fc2571a72f5d3c7b7b576ce2de38d91e` **SHA256：**`acb18a0808aedb9a5e485f1469225b9ac97f21db9af78e4cd6939700debe1cb6`  | 
| EFA 1.17.3 |  **MD5：**`0517df4a190356ab559235147174cafd` **SHA256：**`5130998b0d2883bbae189b21ab215ecbc1b01ae0231659a9b4a17b0a33ebc6ca`  | 
| EFA 1.17.2 |  **MD5：**`a329dedab53c4832df218a24449f4c9a` **SHA256：**`bca1fdde8b32b00346e175e597ffab32a09a08ee9ab136875fb38283cc4cd099`  | 
| EFA 1.17.1 |  **MD5：**`733ae2cfc9d14b52017eaf0a2ab6b0ff` **SHA256：**`f29322640a88ae9279805993cb836276ea240623820848463ca686c8ce02136f`  | 
| EFA 1.17.0 |  **MD5：**`d430fc841563c11c3805c5f82a4746b1` **SHA256：**`75ab0cee4fb6bd38889dce313183f5d3a83bd233e0a6ef6205d8352821ea901d`  | 
| EFA 1.16.0 |  **MD5：**`399548d3b0d2e812d74dd67937b696b4` **SHA256：**`cecec36495a1bc6fdc82f97761a541e4fb6c9a3cbf3cfcb145acf25ea5dbd45b`  | 
| EFA 1.15.2 |  **MD5：**`955fea580d5170b05823d51acde7ca21` **SHA256：**`84df4fbc1b3741b6c073176287789a601a589313accc8e6653434e8d4c20bd49`  | 
| EFA 1.15.1 |  **MD5：**`c4610267039f72bbe4e35d7bf53519bc` **SHA256：**`be871781a1b9a15fca342a9d169219260069942a8bda7a8ad06d4baeb5e2efd7`  | 
| EFA 1.15.0 |  **MD5：**`9861694e1cc00d884fadac07d22898be` **SHA256：**`b329862dd5729d2d098d0507fb486bf859d7c70ce18b61c302982234a3a5c88f`  | 
| EFA 1.14.1 |  **MD5：**`50ba56397d359e57872fde1f74d4168a` **SHA256：**`c7b1b48e86fe4b3eaa4299d3600930919c4fe6d88cc6e2c7e4a408a3f16452c7`  | 
| EFA 1.14.0 |  **MD5：**`40805e7fd842c36ececb9fd7f921b1ae` **SHA256：**`662d62c12de85116df33780d40e0533ef7dad92709f4f613907475a7a1b60a97`  | 
| EFA 1.13.0 |  **MD5：**`c91d16556f4fd53becadbb345828221e` **SHA256：**`ad6705eb23a3fce44af3afc0f7643091595653a723ad0374084f4f2b715192e1`  | 
| EFA 1.12.3 |  **MD5：**`818aee81f097918cfaebd724eddea678` **SHA256：**`2c225321824788b8ca3fbc118207b944cdb096b847e1e0d1d853ef2f0d727172`  | 
| EFA 1.12.2 |  **MD5：**`956bb1fc5ae0d6f0f87d2e481d49fccf` **SHA256：**`083a868a2c212a5a4fcf3e4d732b685ce39cceb3ca7e5d50d0b74e7788d06259`  | 
| EFA 1.12.1 |  **MD5：**`f5bfe52779df435188b0a2874d0633ea` **SHA256：**`5665795c2b4f09d5f3f767506d4d4c429695b36d4a17e5758b27f033aee58900`  | 
| EFA 1.12.0 |  **MD5：**`d6c6b49fafb39b770297e1cc44fe68a6` **SHA256：**`28256c57e9ecc0b0778b41c1f777a9982b4e8eae782343dfe1246079933dca59`  | 
| EFA 1.11.2 |  **MD5：**`2376cf18d1353a4551e35c33d269c404` **SHA256：**`a25786f98a3628f7f54f7f74ee2b39bc6734ea9374720507d37d3e8bf8ee1371`  | 
| EFA 1.11.1 |  **MD5：**`026b0d9a0a48780cc7406bd51997b1c0` **SHA256：**`6cb04baf5ffc58ddf319e956b5461289199c8dd805fe216f8f9ab8d102f6d02a`  | 
| EFA 1.11.0 |  **MD5：**`7d9058e010ad65bf2e14259214a36949` **SHA256：**`7891f6d45ae33e822189511c4ea1d14c9d54d000f6696f97be54e915ce2c9dfa`  | 
| EFA 1.10.1 |  **MD5：**`78521d3d668be22976f46c6fecc7b730` **SHA256：**`61564582de7320b21de319f532c3a677d26cc46785378eb3b95c636506b9bcb4`  | 
| EFA 1.10.0 |  **MD5：**`46f73f5a7afe41b4bb918c81888fefa9` **SHA256：**`136612f96f2a085a7d98296da0afb6fa807b38142e2fc0c548fa986c41186282`  | 
| EFA 1.9.5 |  **MD5：**`95edb8a209c18ba8d250409846eb6ef4` **SHA256：**`a4343308d7ea4dc943ccc21bcebed913e8868e59bfb2ac93599c61a7c87d7d25`  | 
| EFA 1.9.4 |  **MD5：**`f26dd5c350422c1a985e35947fa5aa28` **SHA256：**`1009b5182693490d908ef0ed2c1dd4f813cc310a5d2062ce9619c4c12b5a7f14`  | 
| EFA 1.9.3 |  **MD5：**`95755765a097802d3e6d5018d1a5d3d6` **SHA256：**`46ce732d6f3fcc9edf6a6e9f9df0ad136054328e24675567f7029edab90c68f1`  | 
| EFA 1.8.4 |  **MD5：**`85d594c41e831afc6c9305263140457e` **SHA256：**`0d974655a09b213d7859e658965e56dc4f23a0eee2dc44bb41b6d039cc5bab45`  | 

# Elastic Fabric Adapter 发布说明
<a name="efa-changelog"></a>

下表介绍了 Elastic Fabric Adapter 软件的版本历史记录和更改日志。


| 版本 | 更改 | 发行日期 | 
| --- | --- | --- | 
| 1.47.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2026 年 1 月 29 日 | 
| 1.46.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 12 月 12 日 | 
| 1.45.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 11 月 26 日 | 
| 1.45.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 11 月 17 日 | 
| 1.44.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 10 月 29 日 | 
| 1.43.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 10 月 1 日 | 
| 1.43.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 8 月 15 日 | 
| 1.43.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 7 月 31 日 | 
| 1.43.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 7 月 25 日 | 
| 1.42.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 6 月 6 日 | 
| 1.41.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 5 月 16 日 | 
| 1.40.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 5 月 2 日 | 
| 1.39.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 4 月 16 日 | 
| 1.38.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 3 月 3 日 | 
| 1.38.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025 年 1 月 8 日 | 
| 1.37.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 11 月 18 日 | 
| 1.36.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 11 月 7 日 | 
| 1.35.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 10 月 14 日 | 
| 1.34.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 8 月 6 日 | 
| 1.33.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 6 月 20 日 | 
| 1.32.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 4 月 18 日 | 
| 1.31.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024 年 3 月 7 日 | 
| 1.30.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 12 月 | 
| 1.29.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 12 月 | 
| 1.29.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 11 月 | 
| 1.28.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 10 月 | 
| 1.27.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 9 月 | 
| 1.26.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 9 月 | 
| 1.26.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 9 月 | 
| 1.25.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 9 月 | 
| 1.25.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 7 月 | 
| 1.24.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 7 月 | 
| 1.24.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 6 月 | 
| 1.23.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 6 月 | 
| 1.23.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 5 月 | 
| 1.22.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 3 月 | 
| 1.22.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023 年 2 月 | 
| 1.21.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 12 月 | 
| 1.20.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 11 月 | 
| 1.19.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 10 月 | 
| 1.18.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 8 月 | 
| 1.17.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 8 月 | 
| 1.17.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 7 月 | 
| 1.17.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 7 月 | 
| 1.17.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 7 月 | 
| 1.16.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 6 月 | 
| 1.15.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 5 月 | 
| 1.15.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 3 月 | 
| 1.15.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022 年 2 月 | 
| 1.14.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 10 月 | 
| 1.14.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 10 月 | 
| 1.13.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 8 月 | 
| 1.12.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 7 月 | 
| 1.12.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 6 月 | 
| 1.12.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 5 月 | 
| 1.12.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 5 月 | 
| 1.11.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021 年 2 月 | 
| 1.11.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 12 月 | 
| 1.11.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 12 月 | 
| 1.10.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 11 月 | 
| 1.10.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 10 月 | 
| 1.9.5 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 9 月 | 
| 1.9.4 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 7 月 | 
| 1.9.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 6 月 | 
| 1.8.4 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 4 月 | 
| 1.8.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 2 月 | 
| 1.8.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 1 月 | 
| 1.8.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020 年 1 月 | 
| 1.8.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 12 月 | 
| 1.7.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 12 月 | 
| 1.7.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 11 月 | 
| 1.6.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 10 月 | 
| 1.6.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 10 月 | 
| 1.5.4 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 9 月 | 
| 1.5.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 9 月 | 
| 1.5.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 8 月 | 
| 1.5.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 8 月 | 
| 1.4.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 7 月 | 
| 1.4.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019 年 7 月 | 