EC2에 GPU환경 구축 - Nvidia Docker와 CUDA 설치 과정

소원·2024년 10월 16일

2024

목록 보기
10/10
post-thumbnail

1. 서론

docker.io를 설치해서 컨테이너를 실행하고 있었는데, 정작 GPU를 사용하지 않고 있었어요.
GPU가 있는데 GPU를 사용하지 않는다?
이거 문제가 있는거죠.

그래서 시작합니다.
EC2에서 GPU 사용하기.

2. 코드를 작성하기 전 필요한 것?

Build가 된 Docker Image를 Docker Hub로 PUSH

뭔소리야? 싶다면 이전 글의 3번까지 내용 참고
https://velog.io/@sowoncloud/Docker-EC2-%EB%B0%B0%ED%8F%AC

EC2 인스턴스 생성

중요한 점은 Ubuntu 24.04가 안된다는 점입니다.
현재 공식적으로 지원하는 버전이 22.04라서 24.04는 대부분의 Nvidia Driver나 CUDA Tool-kit에 호환성 문제가 발생할 수 있다고 합니다.

그래서 다음과 같이 22.04로 AMI를 선택해줍니다.


사실 처음에는 GPT 친구가 추천해준 Deep Learning Base OSS Nvidia Driver GPU AMI를 이용해서 다음 내용을 진행해보았습니다.
하지만 이미 설치되어있는 driver와 cuda 툴킷이 현재 프로젝트와 버전이 맞지않아 어짜피 다시 깔아야 하길래 그냥 22.04 기본버전에서 깔고 시작하겠습니다.

EC2 인스턴스 접속

EC2 Console에서 열어서 진행했습니다.
그럼 ssh 접속할 필요도 없어요. 굿.

3. GPU Driver & CUDA 설치

시작하기 전, 콘솔창에 다음 명령어를 치면 driver가 없다고 뜹니다.

nvidia-smi

GPU 드라이버 설치

sudo apt update

패키지 목록 업데이트 하기

sudo apt install -y ubuntu-drivers-common

Ubuntu,에서 드라이버 관리를 할 수 있게 도와주는 패키지 설치

sudo ubuntu-drivers autoinstall

현재 시스템에 맞는 Nvidia GPU를 설치

GPU 드라이버 설치 확인

nvidia-smi

처음과 같이 없다고 뜬다면, 재부팅하고 다시 쳐보세요.

재부팅방법
1) 인스턴스 관리로 가서 쿨하게 재부팅 누르기
2) sudo reboot 쿨하게 치기

전 쿨하게 1번방법을 주로 사용했습니다.

이후 다시 명령어를 뜨면 다음과 같이 뜹니다.

이건 GPU테스트 때문에 p3.2xlarge로 새로 만들어서 해본거니 그냥 참고로만 봐주세욥.

CUDA 설치

sudo apt install nvidia-cuda-toolkit

cuda 툴킷 설치해줍니다.

CUDA 설치 확인

nvcc --version

cuda 컴파일러 버전을 통해 설치 여부를 확인

4. Nvidia Docker 설치

sudo apt update

시작하기 전 패키지 목록 업데이트 해줍시다.

TIP
지금부터는 코드 작성하기 매우 귀찮습니다.
Linux 내에서 Ctrl Shift V 를 누르시면 복붙이 기가막히게 된답니다?

Docker 설치 전 준비

sudo apt-get install ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

Docker 설치를 위한 사전 준비 단계로, 패키지를 설치하고 Docker의 GPG 키를 추가하여 패키지의 무결성을 보장합니다.
띄어쓰기를 기준으로 각 코드를 실행해주시면 됩니다.

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
(. /etc/os-release && echo "UBUNTU_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker의 패키지 소스 리스트를 추가하여 Docker 설치를 위한 리포지토리를 설정합니다.
코드가 좀 긴데 한번에 치셔야해요.

Docker 설치

sudo apt update

시작 전 쉬어가는 타임으로 패키지 목록 업데이트를 해줍시다.
안해도 될 수도 있는데.. 그냥 매번했어요. 안하는 것 보다는 낫겠죠 뭐.

sudo apt-get install docker-ce docker-ce-cli docker-buildx-plugin docker-compose-plugin

Docker 엔진과 함게 CLI, 빌드 도구 및 컴포즈 플러그인 까지 설치합니다.
컨테이너 기반의 애플리케이션을 실행하고 관리하기 위함이라고 생각하시면 될 것 같아요.

Nvidia 컨테이너 툴킷 설치 준비

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

Nvidia 컨테이너 툴킷 설치를 위해 리포지토리와 GPG 키를 설정합니다.

Nvidia 컨테이너 툴킷 설치

sudo apt-get install -y nvidia-container-toolkit

nvidia 컨테이너 툴킷 설치합니다.

5. Docker 실행 후

docker 시작

sudo systemctl start docker

sudo systemctl enable docker

sudo usermod -aG docker ubuntu

newgrp docker

다른 글에서도 작성했던 것 처럼 코드를 작성해줍시다.
근데 제 콘솔창에서는 enable docker는 오류나더라구요..
그치만 큰 문제는 없으니 넘어가셔도 될 듯 합니다. 아니면 치지마세요ㅎ

Docker Image Hub에서 Pull하기

docker pull {내 ID}/{원하는 이름}

Push했던 Image 다시 pull 해줍시다.

Pull 확인

docker images

Docker Image 실행

docker run -d -p {포트번호}:{포트번호} {내 ID}/{원하는 이름}

Docker Image 실행 확인

docker ps

6. GPU 사용중인지 테스트

컨테이너의 로그 확인하고 싶다.

docker logs -f <container_id>

나오고 싶으면 Ctrl C 여러번 눌러보세요.

TIP!
이런식으로 코드를 작성해두면 로그 출력 시 GPU가 사용되고 있는지 확인할 수 있겠죠?

# GPU 사용 여부를 확인하고 데이터 타입 설정
  if torch.cuda.is_available() and torch.cuda.get_device_capability()[0] >= 7:
    torch_dtype = torch.bfloat16
    print("GPU 사용 가능: bfloat16")
  else:
    torch_dtype = torch.float32
    print("GPU 사용 불가능 또는 낮은 버전: float32")

컨테이너 내부에서 GPU 쓰는지 확인하고 싶다.

docker exec -it <container_id> /bin/bash

이 코드 치시면 컨테이너 내부에서 명령어를 실행할 수 있습니다.

nvidia-smi

본 적 있는 코드죠?
GPU 실행하고 있는지 확인합니다.
초반에 하셨을때처럼 나오는지 확인하세요!

명령어 실행창에서 나오고 싶다면 exit 치세요.

컨테이너 종료는?
FastAPI 프로젝트 Docker + EC2 배포하기 글 후반부를 확인하세요.
아니면 GPT한테 물어봅시다!ㅋ

0개의 댓글