

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

# 在 PCS 上使用弹性结构适配器 (EFA) Fabric Adapt AWS er
<a name="working-with_networking_efa"></a>

 Elastic Fabric Adapter (EFA) Fabric Adapter 是一种高性能的高级网络互连，您可以将其连接到 AWS EC2 实例，以加速高性能计算 (HPC) 和机器学习应用程序。要使您的应用程序在 AWS PCS 集群上运行 EFA，需要将 AWS PCS 计算节点组实例配置为使用 EFA，如下所示。

**注意**  
在@@ **兼容 AWS PCS 的 AMI 上安装 EFA** — AWS PCS 计算节点组中使用的 AMI 必须安装并加载 EFA 驱动程序。有关如何在安装了 EFA 软件的情况下构建自定义 AMI 的信息，请参阅[适用于 AWS PCS 的自定义 Amazon 机器映像 (AMIs)](working-with_ami_custom.md)。

**Contents**
+ [识别支持 EFA 的 EC2 实例](working-with_networking_efa_identify-instances.md)
+ [创建支持 EFA 通信的安全组](working-with_networking_efa_create-sg.md)
+ [（可选）创建置放群组](working-with_networking_efa_create-placement-group.md)
+ [创建或更新 EC2 启动模板](working-with_networking_efa_create-lt.md)
+ [为 EFA 创建或更新计算节点组](working-with_networking_efa_create-cng.md)
+ [（可选）测试 EFA](working-with_networking_efa_test-efa.md)
+ [（可选）使用 CloudFormation 模板创建启用 EFA 的启动模板](working-with_networking_efa_create-lt-cfn.md)

# 识别支持 EFA 的 EC2 实例
<a name="working-with_networking_efa_identify-instances"></a>

要使用 EFA， AWS PCS 计算组允许的所有实例类型都必须支持 EFA，并且必须具有相同数量的 vCPUs （ GPUs 如果适用）。有关启用 EFA 的实例列表，请参阅《亚马逊[弹性*计算云用户指南》中的 Amazon EC2 上适用于 HPC 和 ML 工作负载的弹性*结构适配器](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-instance-types)。您还可以使用 AWS CLI 查看支持 EFA 的实例类型列表。*region-code*替换为使用 AWS PCS AWS 区域 的地方，例如`us-east-1`。

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

**注意**  
**确定有多少网络接口可用** — 某些 EC2 实例有多个网卡。这允许他们有多个 EFAs。有关更多信息，请参阅 [AWS PCS 中有多个网络接口](working-with_networking_multi-nic.md)。

# 创建支持 EFA 通信的安全组
<a name="working-with_networking_efa_create-sg"></a>

------
#### [ AWS CLI ]

您可以使用以下 AWS CLI 命令创建支持 EFA 的安全组。该命令输出一个安全组 ID。进行以下替换：
+ `region-code`— 指定在 AWS 区域 哪里使用 AWS PCS，例如`us-east-1`。
+ `vpc-id`— 指定用于 PCS 的 VP AWS C 的 ID。
+ `efa-group-name`— 提供您为安全组选择的名称。

```
aws ec2 create-security-group \
    --group-name efa-group-name \
    --description "Security group to enable EFA traffic" \
    --vpc-id vpc-id \
    --region region-code
```

使用以下命令附加入站和出站安全组规则。进行以下替换：
+ `efa-secgroup-id`— 提供您刚刚创建的 EFA 安全组的 ID。

```
aws ec2 authorize-security-group-ingress \
    --group-id efa-secgroup-id \
    --protocol -1 \
    --source-group efa-secgroup-id
    
aws ec2 authorize-security-group-egress \
    --group-id efa-secgroup-id \
    --protocol -1 \
    --source-group efa-secgroup-id
```

------
#### [ CloudFormation template ]

您可以使用 CloudFormation 模板创建支持 EFA 的安全组。从以下 URL 下载模板，然后将其上传到[AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)。

```
https://aws-hpc-recipes.s3.amazonaws.com/main/recipes/pcs/enable_efa/assets/efa-sg.yaml
```

在 AWS CloudFormation 控制台中打开模板后，输入以下选项。
+ 在 “**提供堆栈名称”** 下
  + 在**堆栈名称**下，输入一个名称，例如`efa-sg-stack`。
+ 在 “**参数**” 下
  + 在下方 **SecurityGroupName**，输入一个名称，例如`efa-sg`。
  + 在 **VPC** 下，选择您将使用 PCS 的 V AWS PC。

完成 CloudFormation 堆栈的创建并监控其状态。当它到达时`CREATE_COMPLETE`，EFA 安全组就可以使用了。

------

# （可选）创建置放群组
<a name="working-with_networking_efa_create-placement-group"></a>

我们建议您在集群置放群组中启动所有使用 EFA 的实例，以最大限度地缩短它们之间的物理距离。为计划使用 EFA 的每个计算节点组创建一个置放群组。[AWS PCS 中 EC2 实例的置放群组](working-with_networking_placement-groups.md)要为您的计算节点组创建置放群组，请参阅。

# 创建或更新 EC2 启动模板
<a name="working-with_networking_efa_create-lt"></a>

EFA 网络接口是在 AWS PCS 计算节点组的 EC2 启动模板中设置的。如果有多个网卡，则 EFAs 可以配置多个网卡。EFA 安全组和可选置放群组也包含在启动模板中。

以下是带有两张网卡的实例的启动模板示例，例如 **hpc** 7a.96xlarge。实例将在集群置放群组`subnet-SubnetID1`中启动`pg-PlacementGroupId1`。

 必须专门向每个 EFA 接口添加安全组。每个 EFA 都需要启用 EFA 流量的安全组 (`sg-EfaSecGroupId`)。其他安全组，尤其是处理常规流量（如 SSH 或 HTTPS）的安全组，只需连接到主网络接口（由 a `DeviceIndex` of 指定`0`）即可。定义网络接口的启动模板不支持使用`SecurityGroupIds`参数设置安全组，您必须在配置的每个网络接口`Groups`中为设置一个值。

```
{
    "Placement": {
        "GroupId": "pg-PlacementGroupId1"
    },
    "NetworkInterfaces": [
        {
            "DeviceIndex": 0,
            "InterfaceType": "efa",
            "NetworkCardIndex": 0,
            "SubnetId": "subnet-SubnetId1",
            "Groups": [
                "sg-SecurityGroupId1",
                "sg-EfaSecGroupId"
            ]
        },
        {
            "DeviceIndex": 1,
            "InterfaceType": "efa",
            "NetworkCardIndex": 1,
            "SubnetId": "subnet-SubnetId1"
            "Groups": ["sg-EfaSecGroupId"]
        }
    ]
}
```

# 为 EFA 创建或更新计算节点组
<a name="working-with_networking_efa_create-cng"></a>

您的 AWS PCS 计算节点组必须包含具有相同数量的 v CPUs、处理器架构和 EFA 支持的实例。将计算节点组配置为使用安装了 EFA 软件的 AMI，并使用配置启用 EFA 的网络接口的启动模板。

# （可选）测试 EFA
<a name="working-with_networking_efa_test-efa"></a>

 您可以通过运行程序来演示计算节点组中两个节点之间启用 EFA 的通信，该`fi_pingpong`程序包含在 EFA 软件安装中。如果此测试成功，则很可能已正确配置 EFA。

 要启动，您需要在计算节点组中运行两个实例。如果您的计算节点组使用静态容量，则应该已经有可用的实例。对于使用动态容量的计算节点组，您可以使用`salloc`命令启动两个节点。以下是一个集群的示例，该群集的动态节点组名为`hpc7g`与名为的队列相关联`all`。

```
% salloc --nodes 2 -p all
salloc: Granted job allocation 6
salloc: Waiting for resource configuration
... a few minutes pass ...
salloc: Nodes hpc7g-[1-2] are ready for job
```

 使用查找两个已分配节点的 IP 地址`scontrol`。在以下示例中，地址分别是 for `hpc7g-1` 和 `10.3.140.69` f `10.3.132.211` or `hpc7g-2`。

```
% scontrol show nodes hpc7g-[1-2]
NodeName=hpc7g-1 Arch=aarch64 CoresPerSocket=1
   CPUAlloc=0 CPUEfctv=64 CPUTot=64 CPULoad=0.00
   AvailableFeatures=hpc7g
   ActiveFeatures=hpc7g
   Gres=(null)
   NodeAddr=10.3.140.69 NodeHostName=ip-10-3-140-69 Version=25.05.4
   OS=Linux 5.10.218-208.862.amzn2.aarch64 #1 SMP Tue Jun 4 16:52:10 UTC 2024
   RealMemory=124518 AllocMem=0 FreeMem=110763 Sockets=64 Boards=1
   State=IDLE+CLOUD ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=efa
   BootTime=2024-07-02T19:00:09 SlurmdStartTime=2024-07-08T19:33:25
   LastBusyTime=2024-07-08T19:33:25 ResumeAfterTime=None
   CfgTRES=cpu=64,mem=124518M,billing=64
   AllocTRES=
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/a ExtSensorsWatts=0 ExtSensorsTemp=n/a
   Reason=Maintain Minimum Number Of Instances [root@2024-07-02T18:59:00]
   InstanceId=i-04927897a9ce3c143 InstanceType=hpc7g.16xlarge

NodeName=hpc7g-2 Arch=aarch64 CoresPerSocket=1
   CPUAlloc=0 CPUEfctv=64 CPUTot=64 CPULoad=0.00
   AvailableFeatures=hpc7g
   ActiveFeatures=hpc7g
   Gres=(null)
   NodeAddr=10.3.132.211 NodeHostName=ip-10-3-132-211 Version=25.05.4
   OS=Linux 5.10.218-208.862.amzn2.aarch64 #1 SMP Tue Jun 4 16:52:10 UTC 2024
   RealMemory=124518 AllocMem=0 FreeMem=110759 Sockets=64 Boards=1
   State=IDLE+CLOUD ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=efa
   BootTime=2024-07-02T19:00:09 SlurmdStartTime=2024-07-08T19:33:25
   LastBusyTime=2024-07-08T19:33:25 ResumeAfterTime=None
   CfgTRES=cpu=64,mem=124518M,billing=64
   AllocTRES=
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/a ExtSensorsWatts=0 ExtSensorsTemp=n/a
   Reason=Maintain Minimum Number Of Instances [root@2024-07-02T18:59:00]
   InstanceId=i-0a2c82623cb1393a7 InstanceType=hpc7g.16xlarge
```

使用 SSH（或 SSM`hpc7g-1`）连接到其中一个节点（在本例中为）。请注意，这是一个内部 IP 地址，因此如果您使用 SSH，则可能需要从其中一个登录节点进行连接。另请注意，需要通过计算节点组启动模板使用 SSH 密钥配置实例。

```
% ssh ec2-user@10.3.140.69
```

 现在，`fi_pingpong`以服务器模式启动。

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

 连接到第二个实例 (`hpc7g-2`)。

```
% ssh ec2-user@10.3.132.211
```

 `fi_pingpong`在客户端模式下运行，连接到服务器`hpc7g-1`。您应该看到类似于以下示例的输出。

```
% /opt/amazon/efa/bin/fi_pingpong -p efa 10.3.140.69

bytes   #sent   #ack     total       time     MB/sec    usec/xfer   Mxfers/sec
64      10      =10      1.2k        0.00s      3.08      20.75       0.05
256     10      =10      5k          0.00s     21.24      12.05       0.08
1k      10      =10      20k         0.00s     82.91      12.35       0.08
4k      10      =10      80k         0.00s    311.48      13.15       0.08
[error] util/pingpong.c:1876: fi_close (-22) fid 0
```

# （可选）使用 CloudFormation 模板创建启用 EFA 的启动模板
<a name="working-with_networking_efa_create-lt-cfn"></a>

由于设置 EFA 有多种依赖关系，因此提供了一个可用于配置计算节点组的 CloudFormation 模板。它支持最多带有四个网卡的实例。要详细了解带有多个网卡的实例，请参阅 *Amazon 弹性计算云用户指南中的弹性*[网络接口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#network-cards)。

从以下 URL 下载 CloudFormation 模板，然后将其上传到您使用 AWS PCS AWS 区域 的 CloudFormation 控制台。

```
https://aws-hpc-recipes.s3.amazonaws.com/main/recipes/pcs/enable_efa/assets/pcs-lt-efa.yaml
```

在 CloudFormation 控制台中打开模板后，输入以下值。请注意，模板将提供一些默认参数值，您可以将其保留为默认值。
+ 在 “**提供堆栈名称”** 下
  + 在**堆栈名称**下，输入描述性名称。我们建议使用您将为 AWS PCS 计算节点组选择的名称，例如`NODEGROUPNAME-efa-lt`。
+ 在 “**参数**” 下
  + 在下方 **NumberOfNetworkCards**，选择您的节点组中实例中的网卡数量。
  + 在下方 **VpcId**，选择部署您的 AWS PCS 集群的 VPC。
  + 在下方 **NodeGroupSubnetId**，选择集群 VPC 中将在其中启动启用 EFA 的实例的子网。
  + 在下方 **PlacementGroupName**，将该字段留空，为该节点组创建新的集群置放群组。如果您要使用现有的置放群组，请在此处输入其名称。
  + 在下方 **ClusterSecurityGroupId**，选择您用于允许访问集群中的其他实例和 AWS PCS API 的安全组。许多客户从其集群 VPC 中选择默认安全组。
  + 在下方 **SshSecurityGroupId**，提供您用于允许对集群中节点进行入站 SSH 访问的安全组的 ID。
  + 对于 **SshKeyName**，选择用于访问集群中节点的 SSH 密钥对。
  + 对于 **LaunchTemplateName**，输入启动模板的描述性名称，例如`NODEGROUPNAME-efa-lt`。在您使用 AWS PCS 的 AWS 区域 位置 AWS 账户 中，该名称必须是唯一的。
+ **能力不足**
  + 选中 “**我确认 AWS CloudFormation 可能会创建 IAM 资源**” 复选框。

 监控 CloudFormation 堆栈的状态。当它到达`CREATE_COMPLETE`时，启动模板就可以使用了。将其与 AWS PCS 计算节点组配合使用，如上所述[为 EFA 创建或更新计算节点组](working-with_networking_efa_create-cng.md)。