

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# GPU 工作負載的 Amazon ECS 任務定義
<a name="ecs-gpu"></a>

您建立具有支援 GPU 容器執行個體的叢集時，Amazon ECS 支援使用 GPU 的工作負載。使用 p2、p3、p5、g3、g4 和 g5 執行個體類型的 Amazon EC2 GPU 型容器執行個體可讓您存取 NVIDIA GPU。如需詳細資訊，請參閱 *Amazon EC2 Instance Types guide* 中的 [Linux Accelerated Computing Instances](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html)。

Amazon ECS 提供的 GPU 最佳化 AMI 可與預先設定的 NVIDIA 核心驅動程式和 Docker GPU 執行時間搭配使用。如需詳細資訊，請參閱[Amazon ECS 最佳化 Linux AMI](ecs-optimized_AMI.md)。

您可以在容器定義中指定 GPU 數量，以便在容器層級考量任務放置。Amazon ECS 會對支援 GPU 的可用容器執行個體排程並將實體 GPU 固定至適當容器以獲得最佳效能。

支援下列 Amazon EC2 GPU 型執行個體類型。如需詳細資訊，請參閱 [Amazon EC2 P2 執行個體](https://aws.amazon.com/ec2/instance-types/p2/)、[Amazon EC2 P3 執行個體](https://aws.amazon.com/ec2/instance-types/p3/)、[Amazon EC2 P4d 執行個體](https://aws.amazon.com/ec2/instance-types/p4/)、[Amazon EC2 P5 執行個體](https://aws.amazon.com/ec2/instance-types/p5/)、[Amazon EC2 G3 執行個體](https://aws.amazon.com/ec2/instance-types/g3/)、[Amazon EC2 G4 執行個體](https://aws.amazon.com/ec2/instance-types/g4/)、[Amazon EC2 G5 執行個體](https://aws.amazon.com/ec2/instance-types/g5/)、[Amazon EC2 G6 執行個體](https://aws.amazon.com/ec2/instance-types/g6/)與 [Amazon EC2 G6e 執行個體](https://aws.amazon.com/ec2/instance-types/g6e/)。


|  執行個體類型  |  GPU  |  GPU 記憶體 (GiB)  |  vCPUs  |  記憶體 (GiB)  | 
| --- | --- | --- | --- | --- | 
| p3.2xlarge | 1 | 16 | 8 | 61 | 
| p3.8xlarge | 4 | 64 | 32 | 244 | 
| p3.16xlarge | 8 | 128 | 64 | 488 | 
| p3dn.24xlarge | 8 | 256 | 96 | 768 | 
| p4d.24xlarge | 8 | 320 | 96 | 1152 | 
| p5.48xlarge | 8 | 640 | 192 | 2048 | 
| g3s.xlarge | 1 | 8 | 4 | 30.5 | 
| g3.4xlarge | 1 | 8 | 16 | 122 | 
| g3.8xlarge | 2 | 16 | 32 | 244 | 
| g3.16xlarge | 4 | 32 | 64 | 488 | 
| g4dn.xlarge | 1 | 16 | 4 | 16 | 
| g4dn.2xlarge | 1 | 16 | 8 | 32 | 
| g4dn.4xlarge | 1 | 16 | 16 | 64 | 
| g4dn.8xlarge | 1 | 16 | 32 | 128 | 
| g4dn.12xlarge | 4 | 64 | 48 | 192 | 
| g4dn.16xlarge | 1 | 16 | 64 | 256 | 
| g5.xlarge | 1 | 24 | 4 | 16 | 
| g5.2xlarge | 1 | 24 | 8 | 32 | 
| g5.4xlarge | 1 | 24 | 16 | 64 | 
| g5.8xlarge | 1 | 24 | 32 | 128 | 
| g5.16xlarge | 1 | 24 | 64 | 256 | 
| g5.12xlarge | 4 | 96 | 48 | 192 | 
| g5.24xlarge | 4 | 96 | 96 | 384 | 
| g5.48xlarge | 8 | 192 | 192 | 768 | 
| g6.xlarge | 1 | 24 | 4 | 16 | 
| g6.2xlarge | 1 | 24 | 8 | 32 | 
| g6.4xlarge | 1 | 24 | 16 | 64 | 
| g6.8xlarge | 1 | 24 | 32 | 128 | 
| g6.16.xlarge | 1 | 24 | 64 | 256 | 
| g6.12xlarge | 4 | 96 | 48 | 192 | 
| g6.24xlarge | 4 | 96 | 96 | 384 | 
| g6.48xlarge | 8 | 192 | 192 | 768 | 
| g6.metal | 8 | 192 | 192 | 768 | 
| gr6.4xlarge | 1 | 24 | 16 | 128 | 
| g6e.xlarge | 1 | 48 | 4 | 32 | 
| g6e.2xlarge | 1 | 48 | 8 | 64 | 
| g6e.4xlarge | 1 | 48 | 16 | 128 | 
| g6e.8xlarge | 1 | 48 | 32 | 256 | 
| g6e16.xlarge | 1 | 48 | 64 | 512 | 
| g6e12.xlarge | 4 | 192 | 48 | 384 | 
| g6e24.xlarge | 4 | 192 | 96 | 768 | 
| g6e48.xlarge | 8 | 384 | 192 | 1536 | 
| gr6.8xlarge | 1 | 24 | 32 | 256 | 

您可以透過查詢 AWS Systems Manager 參數存放區 API 來擷取 Amazon ECS 最佳化 AMIs) ID。若使用此參數，您無需手動查詢 Amazon ECS 最佳化 AMI ID。如需 Systems Manager 參數存放區 API 的詳細資訊，請參閱 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)。您使用的使用者必須擁有 `ssm:GetParameter` IAM 許可，才能擷取 Amazon ECS 最佳化 AMI 中繼資料。

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/gpu/recommended --region {{us-east-1}}
```

## 考量事項
<a name="gpu-considerations"></a>

**注意**  
對 g2 執行個體系列類型的支援已被棄用。  
p2 執行個體系列類型僅在早於 Amazon ECS GPU 最佳化 AMI `20230912` 之前的版本上支援。如果您需要繼續使用 p2 執行個體，請參閱 [您需要 P2 執行個體時要採取的動作](#p2-instance)。  
在這兩種執行個體系列類型上就地更新 NVIDIA/CUDA 驅動程式，將導致潛在的 GPU 工作負載失敗。

建議您開始在 Amazon ECS 上使用 GPU 前考量下列事項。
+ 您的叢集可以混合 GPU 和非 GPU 容器執行個體。
+ 您可在外部執行個體上執行 GPU 工作負載。在您叢集中註冊外部執行個體時，請確保安裝指令碼中包含 `--enable-gpu` 標記。如需詳細資訊，請參閱[將外部執行個體註冊到 Amazon ECS 叢集](ecs-anywhere-registration.md)。
+ 您必須在代理程式組態檔案中將 `ECS_ENABLE_GPU_SUPPORT` 設定為 `true`。如需詳細資訊，請參閱[Amazon ECS 容器代理程式組態](ecs-agent-config.md)。
+ 執行任務或建立服務時，您可以在設定任務放置限制條件時使用執行個體類型屬性，來決定任務在哪個容器執行個體啟動。這樣便可更有效地使用您的資源。如需詳細資訊，請參閱[Amazon ECS 如何在容器執行個體上置放任務](task-placement.md)。

  以下範例會在預設叢集的 `g4dn.xlarge` 容器執行個體啟動任務。

  ```
  aws ecs run-task --cluster default --task-definition ecs-gpu-task-def \
       --placement-constraints type=memberOf,expression="attribute:ecs.instance-type ==  g4dn.xlarge" --region us-east-2
  ```
+ 對於在容器定義中指定 GPU 資源需求的每個容器，Amazon ECS 將容器執行時間設定為 NVIDIA 容器執行時間。
+ NVIDIA 容器執行時間需要在容器中設定一些環境變數才能正常運作。如需這些環境變數的清單，請參閱 [Specialized Configurations with Docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html?highlight=environment%20variable)。Amazon ECS 將 `NVIDIA_VISIBLE_DEVICES` 環境變數值設定為 Amazon ECS 指派給容器的 GPU 裝置 ID 清單。對於其他必要的環境變數，Amazon ECS 不會對其進行設定。因此，請確保容器映像會設定它們，或在容器定義中設定它們。
+ Amazon ECS GPU 最佳化 AMI 版本 `20230929` 和更新版本支援 p5 執行個體類型系列。
+ Amazon ECS GPU 最佳化 AMI 版本 `20230913` 和更新版本支援 g4 執行個體類型系列。如需詳細資訊，請參閱[Amazon ECS 最佳化 Linux AMI](ecs-optimized_AMI.md)。Amazon ECS 主控台的 Create Cluster (建立叢集) 工作流程中不支援此系列。若要使用這些執行個體類型，您必須使用 Amazon EC2 主控台 AWS CLI或 API，並將執行個體手動註冊到您的叢集。
+ p4d.24xlarge 執行個體類型僅適用於 CUDA 11 或更新版本。
+ Amazon ECS GPU 最佳化 AMI 已啟用 IPv6，這會在使用 `yum` 時導致問題。透過設定 `yum` 以搭配使用 IPv4 與下列命令，可解決此問題。

  ```
  echo "ip_resolve=4" >> /etc/yum.conf
  ```
+  在建置一個不使用 NVIDIA/CUDA 基礎映像的容器映像時，必須將 `NVIDIA_DRIVER_CAPABILITIES` 容器執行時間變數設定為下列其中一個值：
  + `utility,compute`
  + `all`

  如需如何設定變數的詳細資訊，請參閱 NVIDIA 網站上的[控制 NVIDIA 容器執行時間](https://sarus.readthedocs.io/en/stable/user/custom-cuda-images.html#controlling-the-nvidia-container-runtime)。
+ Windows 容器不支援 GPU。

## 共用 GPU
<a name="share-gpu"></a>

若想共用 GPU，您需要設定下列項目。

1. 從任務定義中移除 GPU 資源需求，如此一來，Amazon ECS 無需保留任何應共用的 GPU。

1. 若想共用 GPU，請將下列使用者資料新增至執行個體。此舉會使 nvidia 成為容器執行個體上的預設 Docker 容器執行時期，如此一來，所有 Amazon ECS 容器都可以使用 GPU。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Run commands when you launch an EC2 instance with user data input](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。

   ```
   const userData = ec2.UserData.forLinux();
    userData.addCommands(
    'sudo rm /etc/sysconfig/docker',
    'echo DAEMON_MAXFILES=1048576 | sudo tee -a /etc/sysconfig/docker',
    'echo OPTIONS="--default-ulimit nofile=32768:65536 --default-runtime nvidia" | sudo tee -a /etc/sysconfig/docker',
    'echo DAEMON_PIDFILE_TIMEOUT=10 | sudo tee -a /etc/sysconfig/docker',
    'sudo systemctl restart docker',
   );
   ```

1. 在容器上設定 `NVIDIA_VISIBLE_DEVICES` 環境變數。您可在任務定義中指定該環境變數來完成此操作。如需有效值的相關資訊，請參閱 NVIDIA 文件網站上的 [GPU Enumeration](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html#gpu-enumeration)。

## 您需要 P2 執行個體時要採取的動作
<a name="p2-instance"></a>

如果您需要使用 P2 執行個體，您可以使用下列其中一個選項來繼續使用執行個體。

您必須修改這兩個選項的執行個體使用者資料。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Run commands when you launch an EC2 instance with user data input](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。

**使用最新支援的 GPU 最佳化 AMI**

您可以使用 GPU 最佳化 AMI 的 `20230906` 版本，並將下列項目新增至執行個體使用者資料。

以您的叢集名稱取代 cluster-name。

```
#!/bin/bash
echo "exclude=*nvidia* *cuda*" >> /etc/yum.conf
echo "ECS_CLUSTER={{cluster-name}}" >> /etc/ecs/ecs.config
```

**使用最新的 GPU 最佳化 AMI，並更新使用者資料**

您可以將下列內容新增至執行個體使用者資料。這將解除安裝 Nvidia 535/Cuda12.2 驅動程式，然後安裝 Nvidia 470/Cuda11.4 驅動程式並修復該版本。

```
#!/bin/bash
yum remove -y cuda-toolkit* nvidia-driver-latest-dkms*
tmpfile=$(mktemp)
cat >$tmpfile <<EOF
[amzn2-nvidia]
name=Amazon Linux 2 Nvidia repository
mirrorlist=\$awsproto://\$amazonlinux.\$awsregion.\$awsdomain/\$releasever/amzn2-nvidia/latest/\$basearch/mirror.list
priority=20
gpgcheck=1
gpgkey=https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub
enabled=1
exclude=libglvnd-*
EOF

mv $tmpfile /etc/yum.repos.d/amzn2-nvidia-tmp.repo
yum install -y system-release-nvidia cuda-toolkit-11-4 nvidia-driver-latest-dkms-470.182.03
yum install -y libnvidia-container-1.4.0 libnvidia-container-tools-1.4.0 nvidia-container-runtime-hook-1.4.0 docker-runtime-nvidia-1

echo "exclude=*nvidia* *cuda*" >> /etc/yum.conf
nvidia-smi
```

**建立您自己的 P2 相容 GPU 最佳化 AMI**

您可以建立與 P2 執行個體相容的自訂 Amazon ECS GPU 最佳化 AMI，然後使用 AMI 啟動 P2 執行個體。

1. 執行下列命令以複製 `amazon-ecs-ami repo`。

   ```
   git clone https://github.com/aws/amazon-ecs-ami
   ```

1. 設定所需的 Amazon ECS 代理程式，並在 `release.auto.pkrvars.hcl` 或 `overrides.auto.pkrvars.hcl` 中取得 Amazon Linux AMI 版本。

1. 執行以下命令建立私有 P2 相容的 EC2 AMI。

   將區域替換為具有執行個體區域的區域。

   ```
   REGION={{region}} make al2keplergpu
   ```

1. 將 AMI 與下列執行個體使用者資料搭配使用，以連線至 Amazon ECS 叢集。

   以您的叢集名稱取代 cluster-name。

   ```
   #!/bin/bash
   echo "ECS_CLUSTER={{cluster-name}}" >> /etc/ecs/ecs.config
   ```