本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 EFA 客户端
使用以下过程将 Lustre 客户端设置为访问支持 EFA 的 Lustre FSx 文件系统。
安装 EFA 模块和配置接口
要使用 EFA 接口 FSx 访问 for Lustre 文件系统,必须安装 Lustre EFA 模块并配置 EFA 接口。目前,运行内核版本为 6.8 及更高版本的 Ubuntu 22 的 Lustre 客户端支持 EFA。有关安装 EFA 驱动程序的步骤,请参阅《Amazon EC2 用户指南》中的 “步骤 3:安装 EFA 软件”。
在启用 EFA 的文件系统上配置您的客户端实例
连接到您的亚马逊 EC2 实例。
复制以下脚本并将其另存为名为的文件
configure-efa-fsx-lustre-client.sh
。#!/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin echo "Started ${0} at $(date)" eth_intf="$(ip -br -4 a sh | grep $(hostname -i)/ | awk '{print $1}')" efa_version=$(modinfo efa | awk '/^version:/ {print $2}' | sed 's/[^0-9.]//g') min_efa_version="2.12.1" # Check the EFA driver version. Minimum v2.12.1 supported if [[ -z "$efa_version" ]]; then echo "Error: EFA driver not found" exit 1 fi if [[ "$(printf '%s\n' "$min_efa_version" "$efa_version" | sort -V | head -n1)" != "$min_efa_version" ]]; then echo "Error: EFA driver version $efa_version does not meet the minimum requirement $min_efa_version" exit 1 else echo "Using EFA driver version $efa_version" fi echo "Loading Lustre/EFA modules..." sudo /sbin/modprobe lnet sudo /sbin/modprobe kefalnd ipif_name="$eth_intf" sudo /sbin/modprobe ksocklnd sudo lnetctl lnet configure echo "Configuring TCP interface..." sudo lnetctl net del --net tcp 2> /dev/null sudo lnetctl net add --net tcp --if $eth_intf # For P5 instance type which supports 32 network cards, # by default add 8 EFA interfaces selecting every 4th device (1 per PCI bus) echo "Configuring EFA interface(s)..." instance_type="$(ec2-metadata --instance-type | awk '{ print $2 }')" num_efa_devices="$(ls -1 /sys/class/infiniband | wc -l)" echo "Found $num_efa_devices available EFA device(s)" if [[ "$instance_type" == "p5.48xlarge" || "$instance_type" == "p5e.48xlarge" ]]; then for intf in $(ls -1 /sys/class/infiniband | awk 'NR % 4 == 1'); do sudo lnetctl net add --net efa --if $intf --peer-credits 32 done else # Other instances: Configure 2 EFA interfaces by default if the instance supports multiple network cards, # or 1 interface for single network card instances # Can be modified to add more interfaces if instance type supports it sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | head -n1) --peer-credits 32 if [[ $num_efa_devices -gt 1 ]]; then sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | tail -n1) --peer-credits 32 fi fi echo "Setting discovery and UDSP rule" sudo lnetctl set discovery 1 sudo lnetctl udsp add --src efa --priority 0 sudo /sbin/modprobe lustre sudo lnetctl net show echo "Added $(sudo lnetctl net show | grep -c '@efa') EFA interface(s)"
运行 EFA 配置脚本。
sudo apt-get install amazon-ec2-utils cron sudo chmod +x configure-efa-fsx-lustre-client.sh ./configure-efa-fsx-lustre-client.sh
使用以下示例命令设置一个 cron 作业,该作业将在客户端实例重启后自动在客户端实例上重新配置 EFA:
(sudo crontab -l 2>/dev/null; echo "@reboot /path/to/configure-efa-fsx-lustre-client.sh > /var/log/configure-efa-fsx-lustre-client-output.log") | sudo crontab -
添加或删除 EFA 接口
每个 FSx Lustre 文件系统在所有客户端实例上都有 1024 个 EFA 连接的最大限制。
该configure-efa-fsx-lustre-client.sh
脚本会根据 EC2 实例类型自动配置实例上的 Elastic Fabric Adapter (EFA) 接口的数量。对于 P5 实例(p5.48xlarge
或p5e.48xlarge
),它默认配置 8 个 EFA 接口。对于具有多个网卡的其他实例,它会配置 2 个 EFA 接口。对于使用单个网卡的实例,它会配置 1 个 EFA 接口。当客户端实例连接到 for Lustre 文件系统时,在客户端实例上配置的每个 EFA 接口都计入 1024 个 EFA 连接限制。 FSx
与 EFA 接口较少的客户端实例相比,具有更多 EFA 接口的客户端实例通常支持更高的吞吐量水平。只要不超过 EFA 连接限制,就可以修改脚本以增加或减少每个实例的 EFA 接口数量,从而优化工作负载的每客户端吞吐量性能。
要添加 EFA 接口,请:
sudo lnetctl net add --net efa --if
device_name
--peer-credits 32
中列出的设备在device_name
哪里ls -1 /sys/class/infiniband
。
要删除 EFA 接口,请执行以下操作:
sudo lnetctl net del --net efa --if
device_name
安装 GDS 驱动程序
要在 Lustre 上使用 GPUDirect 存储 (GDS),必须使用 Amazon EC2 P5 或 G6 客户端实例,以及版本 FSx 为 2.24.2 或更高版本的 NVIDIA GDS 驱动程序。
注意
如果您使用的是深度学习 AMI 实例,则预装了 NVIDIA GPUDirect 存储 (GDS) 驱动程序,您可以跳过此驱动程序安装过程。
在您的客户端实例上安装 NVIDIA GPUDirect 存储驱动程序
克隆上可用的 NVIDIA/ gds-nvidia-fs 存储库
。 GitHub git clone https://github.com/NVIDIA/gds-nvidia-fs.git
克隆存储库后,使用以下命令构建驱动程序:
cd gds-nvidia-fs/src/ export NVFS_MAX_PEER_DEVS=128 export NVFS_MAX_PCI_DEPTH=16 sudo -E make sudo insmod nvidia-fs.ko