

# 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 인스턴스 유형 가이드*의 [Linux 가속 컴퓨팅 인스턴스](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html)를 참조하세요.

Amazon ECS는 NVIDIA 커널 드라이버와 Docker GPU 실행 시간이 구성되어 있어 바로 사용할 수 있는 GPU 최적화 AMI를 제공합니다. 자세한 정보는 [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)  |  vCPU  |  메모리(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 Parameter Store API를 쿼리하여 Amazon ECS 최적화 AMI의 Amazon Machine Image(AMI) ID를 검색할 수 있습니다. 이 파라미터를 사용하면 Amazon ECS 최적화 AMI ID를 수동으로 조회할 필요가 없습니다. Systems Manager 파라미터 스토어 API에 대한 자세한 내용은 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) 섹션을 참조하세요. Amazon ECS 최적화 AMI 메타데이터를 검색하려면 사용자에 `ssm:GetParameter` IAM 권한이 있어야 합니다.

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

# Amazon ECS 관리형 인스턴스에서 GPU 사용
<a name="managed-instances-gpu"></a>

Amazon ECS 관리형 인스턴스는 다음 Amazon EC2 인스턴스 유형을 통한 기계 학습, 고성능 컴퓨팅 및 비디오 처리와 같은 워크로드에 대해 GPU 가속 컴퓨팅을 지원합니다. Amazon ECS 관리형 인스턴스에서 지원하는 인스턴스 유형에 대한 자세한 내용은 [Amazon ECS 관리형 인스턴스의 인스턴스 유형](managed-instances-instance-types.md) 섹션을 참조하세요.

다음은 Amazon ECS 관리형 인스턴스에서 지원하는 GPU 기반 인스턴스 유형의 하위 세트입니다.
+ `g4dn`: NVIDIA T4 GPUs로 구동되며 기계 학습 추론, 컴퓨터 비전 및 그래픽 집약적인 애플리케이션에 적합합니다.
+ `g5`: NVIDIA A10G GPUs로 구동되며 그래픽 집약적인 애플리케이션 및 기계 학습 워크로드에 더 높은 성능을 제공합니다.
+ `p3`: NVIDIA V100 GPUs로 구동되며 고성능 컴퓨팅 및 딥 러닝 훈련을 위해 설계되었습니다.
+ `p4d`: NVIDIA A100 GPUs로 구동되며 기계 학습 훈련 및 고성능 컴퓨팅을 위한 최고의 성능을 제공합니다.

Amazon ECS 관리형 인스턴스에서 GPU 지원 인스턴스 유형을 사용하는 경우 NVIDIA 드라이버와 CUDA 툴킷은 인스턴스에 사전 설치되어 GPU 가속 워크로드를 더 쉽게 실행할 수 있습니다.

## GPU 지원 인스턴스 선택
<a name="managed-instances-gpu-instance-selection"></a>

Amazon ECS 관리형 인스턴스 워크로드에 대해 GPU 지원 인스턴스 유형을 선택하려면 용량 공급자의 시작 템플릿에 있는 `instanceRequirements` 객체를 사용합니다. 다음 코드 조각에서는 GPU 지원 인스턴스를 선택하는 데 사용할 수 있는 속성을 보여줍니다.

```
{
  "instanceRequirements": {
    "acceleratorTypes": "gpu",
    "acceleratorCount": 1,
    "acceleratorManufacturers": ["nvidia"]
  }
}
```

다음 코드 조각에서는 시작 템플릿에서 GPU 지원 인스턴스 유형을 지정하는 데 사용할 수 있는 속성을 보여줍니다.

```
{
  "instanceRequirements": {
    "allowedInstanceTypes": ["g4dn.xlarge", "p4de.24xlarge"]
  }
}
```

## GPU 지원 컨테이너 이미지
<a name="managed-instances-gpu-container-images"></a>

컨테이너에서 GPU를 사용하려면 필요한 GPU 라이브러리 및 도구가 포함된 컨테이너 이미지를 사용해야 합니다. NVIDIA는 다음을 포함하여 GPU 워크로드의 기반으로 사용할 수 있는 몇 가지 사전 빌드된 컨테이너 이미지를 제공합니다.
+ `nvidia:cuda`: GPU 컴퓨팅용 CUDA 툴킷이 포함된 기본 이미지.
+ `tensorflow/tensorflow:latest-gpu`: TensorFlow(GPU지원 포함).
+ `pytorch/pytorch:latest-cuda`: PyTorch(GPU지원 포함).

GPU 사용과 관련된 Amazon ECS 관리형 인스턴스의 Amazon ECS에 대한 태스크 정의 예제는 [Amazon ECS 작업 정의에서 GPU 지정](ecs-gpu-specifying.md) 섹션을 참조하세요.

## 고려 사항
<a name="gpu-considerations"></a>

**참고**  
g2 인스턴스 패밀리 유형에 대한 지원은 더 이상 사용되지 않습니다.  
p2 인스턴스 유형 패밀리는 `20230912` 이전 버전의 Amazon ECS GPU 최적화 AMI에서만 지원됩니다. 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는 Amazon ECS가 컨테이너에 할당하는 GPU 디바이스 ID의 목록이 될 `NVIDIA_VISIBLE_DEVICES` 환경 변수 값을 설정합니다. 다른 필수 환경 변수의 경우, Amazon ECS가 이러한 변수를 설정하지 않습니다. 따라서 컨테이너 이미지가 해당 변수를 설정하거나 컨테이너 정의에 설정되어 있어야 합니다.
+ p5 인스턴스 유형 패밀리는 `20230929` 이상 버전의 Amazon ECS GPU 최적화 AMI에서 지원됩니다.
+ g4 인스턴스 유형 패밀리는 `20230913` 이상 버전의 Amazon ECS GPU 최적화 AMI에서 지원됩니다. 자세한 내용은 [Amazon ECS 최적화 Linux AMI](ecs-optimized_AMI.md) 섹션을 참조하세요. Amazon ECS 콘솔의 클러스터 생성 워크플로에서는 지원되지 않습니다. 이러한 인스턴스 유형을 사용하려면 Amazon EC2 콘솔, AWS CLI 또는 API를 사용하고 클러스터에 인스턴스를 수동으로 등록해야 합니다.
+ p4d.24xlarge 인스턴스 유형은 CUDA 11 이상에서만 작동합니다.
+ Amazon ECS GPU 최적화 AMI는 IPv6가 활성화되어 있어서 `yum`을 사용할 때 문제가 발생합니다. 다음 명령으로 IPv4를 사용하도록 `yum`을 구성하면 문제가 해결됩니다.

  ```
  echo "ip_resolve=4" >> /etc/yum.conf
  ```
+  NVIDIA/CUDA 기본 이미지를 사용하지 않는 컨테이너 이미지를 구축할 때는 `NVIDIA_DRIVER_CAPABILITIES` 컨테이너 런타임 변수를 다음 값 중 하나로 설정해야 합니다.
  + `utility,compute`
  + `all`

  변수를 설정하는 방법에 대한 자세한 정보는 NVIDIA 웹사이트에서 [NVIDIA Container Runtime 제어](https://sarus.readthedocs.io/en/stable/user/custom-cuda-images.html#controlling-the-nvidia-container-runtime)를 참조하세요.
+ GPU는 Windows 컨테이너에서 지원되지 않습니다.

# Amazon ECS에 대한 GPU 컨테이너 인스턴스 시작
<a name="gpu-launch"></a>

Amazon EC2 기반 Amazon ECS에서 GPU 인스턴스를 사용하려면 시작 템플릿과 사용자 데이터 파일을 생성하고 인스턴스를 시작해야 합니다.

그런 다음, GPU용으로 구성된 작업 정의를 사용하는 작업을 실행할 수 있습니다.

## 시작 템플릿 사용
<a name="gpu-launch-template"></a>

시작 템플릿을 생성할 수 있습니다.
+ AMI에 대해 Amazon ECS 최적화 GPU AMI ID를 사용하는 시작 템플릿을 생성합니다. 시작 템플릿을 생성하는 방법에 대한 자세한 내용은 **Amazon EC2 사용 설명서의 [정의한 파라미터를 사용하여 새 시작 템플릿 생성](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#create-launch-template-define-parameters)을 참조하세요.

  **Amazon 머신 이미지**에 대해 이전 단계의 AMI ID를 사용합니다. Systems Manager 파라미터를 사용하여 AMI ID를 지정하는 방법에 대한 자세한 내용은 Amazon EC2 사용 설명서의 [시작 템플릿에 Systems Manager 파라미터 지정](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id)을 참조하세요.**

  시작 템플릿의 **사용자 데이터**에 다음을 추가합니다. *cluster-name*을 해당 클러스터의 이름으로 바꿉니다.

  ```
  #!/bin/bash
  echo ECS_CLUSTER=cluster-name >> /etc/ecs/ecs.config;
  echo ECS_ENABLE_GPU_SUPPORT=true >> /etc/ecs/ecs.config
  ```

## AWS CLI 사용
<a name="gpu-launch-cli"></a>

AWS CLI를 사용하여 컨테이너 인스턴스를 시작할 수 있습니다.

1. `userdata.toml`이라는 파일을 생성합니다. 이 파일은 인스턴스 사용자 데이터로 사용됩니다. *cluster-name*을 해당 클러스터의 이름으로 바꿉니다.

   ```
   #!/bin/bash
   echo ECS_CLUSTER=cluster-name >> /etc/ecs/ecs.config;
   echo ECS_ENABLE_GPU_SUPPORT=true >> /etc/ecs/ecs.config
   ```

1. 다음 명령을 실행하여 GPU AMI ID를 가져옵니다. 다음 단계에서 이 정보를 사용합니다.

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

1. 다음 명령을 실행하여 GPU 인스턴스를 시작합니다. 다음 파라미터를 대체해야 합니다.
   + *subnet*을 인스턴스가 시작될 프라이빗 또는 퍼블릭 서브넷의 ID로 바꿉니다.
   + *gpu\$1ami*를 이전 단계의 AMI ID로 바꿉니다.
   + *t3.large*를 사용하려는 인스턴스 유형으로 바꿉니다.
   + *region*을 리전 코드로 바꿉니다.

   ```
   aws ec2 run-instances --key-name ecs-gpu-example \
      --subnet-id subnet \
      --image-id gpu_ami \
      --instance-type t3.large \
      --region region \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=GPU,Value=example}]' \
      --user-data file://userdata.toml \
      --iam-instance-profile Name=ecsInstanceRole
   ```

1. 다음 명령을 실행하여 컨테이너 인스턴스가 클러스터에 등록되었는지 확인합니다. 이 명령을 실행할 때 다음 파라미터를 바꿔야 합니다.
   + *cluster*를 클러스터 이름으로 바꿉니다.
   + *region*을 리전 코드로 바꿉니다.

   ```
   aws ecs list-container-instances --cluster cluster-name --region region
   ```

# Amazon ECS 작업 정의에서 GPU 지정
<a name="ecs-gpu-specifying"></a>

Docker GPU 실행 시간과 컨테이너 인스턴스의 GPU를 이용하려면 태스크 정의 시 컨테이너에 필요한 GPU 수를 지정해야 합니다. GPU를 지원하는 컨테이너가 배치되면 Amazon ECS 컨테이너 에이전트가 원하는 수의 물리적 GPU를 적절한 컨테이너에 고정합니다. 태스크의 모든 컨테이너에 예약된 GPU 수가 태스크가 실행되는 컨테이너 인스턴스에서 사용할 수 있는 GPU 수를 초과할 수 없습니다. 자세한 정보는 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](create-task-definition.md)을 참조하세요.

**중요**  
태스크 정의 때 GPU 조건을 지정하지 않으면 해당 태스크에서 기본 Docker 실행 시간이 사용됩니다.

다음은 태스크 정의 시 GPU 조건의 JSON 형식입니다.

```
{
  "containerDefinitions": [
     {
        ...
        "resourceRequirements" : [
            {
               "type" : "GPU", 
               "value" : "2"
            }
        ],
     },
...
}
```

다음 예제는 GPU 조건을 지정하는 Docker 컨테이너용 구문을 보여줍니다. 이 컨테이너는 GPU 2개를 사용하고, `nvidia-smi` 유틸리티를 실행한 후 종료합니다.

```
{
  "containerDefinitions": [
    {
      "memory": 80,
      "essential": true,
      "name": "gpu",
      "image": "nvidia/cuda:11.0.3-base",
      "resourceRequirements": [
         {
           "type":"GPU",
           "value": "2"
         }
      ],
      "command": [
        "sh",
        "-c",
        "nvidia-smi"
      ],
      "cpu": 100
    }
  ],
  "family": "example-ecs-gpu"
}
```

다음 태스크 정의 예제에서는 사용 가능한 GPU 수를 인쇄하는 TensorFlow 컨테이너를 보여줍니다. 태스크는 Amazon ECS 관리형 인스턴스에서 실행되고, 하나의 GPU가 필요하며, `g4dn.xlarge` 인스턴스를 사용합니다.

```
{
  "family": "tensorflow-gpu",
  "networkMode": "awsvpc",
  "executionRoleArn": "arn:aws:iam::account-id:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "tensorflow",
      "image": "tensorflow/tensorflow:latest-gpu",
      "essential": true,
      "command": [
        "python",
        "-c",
        "import tensorflow as tf; print('Num GPUs Available: ', len(tf.config.list_physical_devices('GPU')))"
      ],
      "resourceRequirements": [
        {
          "type": "GPU",
          "value": "1"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/tensorflow-gpu",
          "awslogs-region": "region",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "MANAGED_INSTANCES"
  ],
  "cpu": "4096",
  "memory": "8192",
}
```

## GPU 공유
<a name="share-gpu"></a>

GPU를 공유하려면 다음을 구성해야 합니다.

1. 공유되어야 하는 GPU를 Amazon ECS가 예약하지 않도록 태스크 정의에서 GPU 리소스 요구 사항을 제거합니다.

1. GPU를 공유하려면 다음과 같은 사용자 데이터를 인스턴스에 추가합니다. 이렇게 하면 nvidia가 컨테이너 인스턴스의 기본 Docker 컨테이너 런타임이 되므로 모든 Amazon ECS 컨테이너가 GPU를 사용할 수 있습니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [사용자 데이터 입력을 사용하여 EC2 인스턴스를 시작할 때 명령 실행](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 사용 설명서*의 [사용자 데이터 입력을 사용하여 EC2 인스턴스를 시작할 때 명령 실행](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. `release.auto.pkrvars.hcl` 또는 `overrides.auto.pkrvars.hcl`에서 필요한 Amazon ECS 에이전트 및 소스 Amazon Linux AMI 버전을 설정합니다.

1. 다음 명령을 실행하여 프라이빗 P2 호환 EC2 AMI를 빌드합니다.

   region을 인스턴스 리전이 리전으로 바꿉니다.

   ```
   REGION=region make al2keplergpu
   ```

1. AMI에서 다음 인스턴스 사용자 데이터를 사용하여 Amazon ECS 클러스터에 연결합니다.

   cluster-name을 해당 클러스터의 이름으로 바꿉니다.

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