GPU 워크로드용 Amazon ECS 태스크 정의

GPU 워크로드용 Amazon ECS 태스크 정의

Amazon ECS는 GPU를 지원하는 컨테이너 인스턴스로 클러스터를 만들면 GPU를 사용하는 워크로드를 지원해요. p2, p3, p4d, p5, g3, g4, g5, g6, g6e, g6f 인스턴스 유형을 사용하는 Amazon EC2 GPU 기반 컨테이너 인스턴스는 NVIDIA GPU에 대한 액세스를 제공합니다. 자세한 내용은 Amazon EC2 인스턴스 유형 가이드의 Linux Accelerated Computing Instances를 참고하세요. Amazon ECS는 NVIDIA 커널 드라이버와 Docker GPU 런타임이 사전 구성된 GPU 최적화 AMI를 제공해요. 자세한 내용은 Amazon ECS 최적화 Linux AMI를 참고하세요.

출처: 문서

본문

태스크 배치 고려 사항으로 태스크 정의의 컨테이너 수준에서 GPU 개수를 지정할 수 있어요. Amazon ECS는 GPU를 지원하는 사용 가능한 컨테이너 인스턴스에 스케줄링하고, 최적의 성능을 위해 물리적 GPU를 적절한 컨테이너에 고정합니다. 다음 Amazon EC2 GPU 기반 인스턴스 유형이 지원됩니다. 자세한 내용은 Amazon EC2 P2 인스턴스, Amazon EC2 P3 인스턴스, Amazon EC2 P4d 인스턴스, Amazon EC2 P5 인스턴스, Amazon EC2 G3 인스턴스, Amazon EC2 G4 인스턴스, Amazon EC2 G5 인스턴스, Amazon EC2 G6 인스턴스, Amazon EC2 G6e 인스턴스, Amazon EC2 G6f 인스턴스를 참고하세요.

인스턴스 유형 GPUs 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.16xlarge 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
g6f.large 1/8 (0.125) 3 2 8
g6f.xlarge 1/8 (0.125) 3 4 16
g6f.2xlarge 1/4 (0.25) 6 8 32
g6f.4xlarge 1/2 (0.5) 12 16 64
gr6f.4xlarge 1/2 (0.5) 12 16 128

AWS Systems Manager Parameter Store API를 조회하면 Amazon ECS 최적화 AMI의 Amazon Machine Image(AMI) ID를 가져올 수 있어요. 이 파라미터를 사용하면 Amazon ECS 최적화 AMI ID를 수동으로 조회할 필요가 없습니다. Systems Manager Parameter Store API에 대한 자세한 내용은 GetParameter를 참고하세요. 사용하는 사용자에게 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

고려 사항

참고: g2 인스턴스 패밀리 유형에 대한 지원은 더 이상 제공되지 않습니다(폐기됨). p2 인스턴스 패밀리 유형은 20230912 이전 버전의 Amazon ECS GPU 최적화 AMI에서만 지원됩니다. 계속 p2 인스턴스를 사용해야 한다면, P2 인스턴스가 필요한 경우(What to do if you need a P2 instance)를 참고하세요. 이 두 인스턴스 패밀리 유형 모두에서 NVIDIA/CUDA 드라이버를 제자리에서 업데이트하면 잠재적 GPU 워크로드 실패가 발생할 수 있어요.

Amazon ECS에서 GPU 작업을 시작하기 전에 다음을 고려할 것을 권장합니다.

  • 클러스터에는 GPU 컨테이너 인스턴스와 비-GPU 컨테이너 인스턴스가 섞여 있을 수 있어요.
  • 외부 인스턴스에서 GPU 워크로드를 실행할 수 있습니다. 외부 인스턴스를 클러스터에 등록할 때 설치 스크립트에 --enable-gpu 플래그가 포함되었는지 확인하세요. 자세한 내용은 Amazon ECS 클러스터에 외부 인스턴스 등록(Registering an external instance to an Amazon ECS cluster)을 참고하세요.
  • 에이전트 구성 파일에서 ECS_ENABLE_GPU_SUPPORT를 true로 설정해야 합니다. 자세한 내용은 Amazon ECS 컨테이너 에이전트 구성(Amazon ECS container agent configuration)을 참고하세요.
  • 태스크를 실행하거나 서비스를 만들 때, 태스크가 시작될 컨테이너 인스턴스를 결정하기 위해 태스크 배치 제약 조건을 구성할 때 인스턴스 유형 속성을 사용할 수 있어요. 이렇게 하면 리소스를 더 효과적으로 사용할 수 있습니다. 자세한 내용은 Amazon ECS가 태스크를 컨테이너 인스턴스에 배치하는 방법(How Amazon ECS places tasks on container instances)을 참고하세요.

다음 예시는 기본 클러스터의 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 컨테이너 런타임은 제대로 작동하려면 컨테이너에 일부 환경 변수를 설정해야 합니다. 이러한 환경 변수 목록은 Docker를 사용한 특수 구성(Specialized Configurations with Docker)을 참고하세요. Amazon ECS는 NVIDIA_VISIBLE_DEVICES 환경 변수 값을 Amazon ECS가 컨테이너에 할당하는 GPU 디바이스 ID 목록으로 설정합니다. 다른 필수 환경 변수는 Amazon ECS가 설정하지 않으므로, 컨테이너 이미지가 설정하거나 컨테이너 정의에 설정되어 있는지 확인하세요.
  • p5 인스턴스 패밀리 유형은 Amazon ECS GPU 최적화 AMI의 20230929 이상 버전에서 지원됩니다.
  • g4 인스턴스 패밀리 유형은 Amazon ECS GPU 최적화 AMI의 20230913 이상 버전에서 지원됩니다. 자세한 내용은 Amazon ECS 최적화 Linux AMI를 참고하세요. 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 컨테이너 런타임 제어(Controlling the NVIDIA Container Runtime)를 참고하세요.
  • GPU는 Windows 컨테이너에서 지원되지 않습니다.

GPU 공유하기

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

  1. 공유해야 하는 GPU를 Amazon ECS가 예약하지 않도록 태스크 정의에서 GPU 리소스 요구 사항을 제거합니다.
  2. GPU를 공유하려는 인스턴스에 다음 사용자 데이터를 추가합니다. 이렇게 하면 컨테이너 인스턴스에서 nvidia가 기본 Docker 컨테이너 런타임이 되어 모든 Amazon ECS 컨테이너가 GPU를 사용할 수 있습니다. 자세한 내용은 Amazon EC2 사용자 가이드의 사용자 데이터 입력으로 EC2 인스턴스 시작 시 명령 실행(Run commands when you launch an EC2 instance with user data input)을 참고하세요.
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을 참고하세요.

P2 인스턴스가 필요한 경우 어떻게 해야 하나요?

P2 인스턴스를 사용해야 한다면 다음 옵션 중 하나로 인스턴스를 계속 사용할 수 있어요. 두 옵션 모두 인스턴스 사용자 데이터를 수정해야 합니다. 자세한 내용은 Amazon EC2 사용자 가이드의 사용자 데이터 입력으로 EC2 인스턴스 시작 시 명령 실행을 참고하세요.

마지막 지원되는 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 인스턴스를 시작할 수 있어요.

다음 명령으로 amazon-ecs-ami 리포지토리를 복제합니다:

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

release.auto.pkrvars.hcl 또는 overrides.auto.pkrvars.hcl에 필요한 Amazon ECS 에이전트와 소스 Amazon Linux AMI 버전을 설정합니다.

다음 명령으로 프라이빗 P2 호환 EC2 AMI를 빌드합니다. region을 인스턴스 리전으로 바꾸세요:

REGION=region make al2keplergpu

다음 인스턴스 사용자 데이터와 함께 AMI를 사용해 Amazon ECS 클러스터에 연결합니다. cluster-name을 클러스터 이름으로 바꾸세요.

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