반응형
반응형
반응형

출처: https://kyumdoctor.co.kr/18

 

nvidia-docker GPU 할당하여 사용 하는 방법 3가지

nvidia-docker 사용법

이전 포스팅에서 docker 설치 및 컨테이너 실행 옵션에 대해서 알아보았는데요. 오늘은 이어서 nvidia-docker에 대해서 적어보고자 합니다. nvidia-docker GPU 할당하여 사용 하는 방법은 굉장이 간단한데요. 

docker와 사용방법은 같은데요. 일반 docker와는 달리 nvidia driver 및 toolkit들을 사용하여 GPU를 사용할 수 있게 해주는 nvidia-docker는 설치 방법은 docker설치와 별반 다를게 없습니다. 

 

혹시 이전 Docker 설치 방법 및 실행 옵션에 대해 궁금하시다면 아래 포스팅을 참고 해주세요.

 

https://kyumdoctor.co.kr/16 

 

Docker 설치 및 컨테이너 실행 옵션 사용방법

Docker 설치 및 컨테이너 실행 옵션 사용방법 Docker? nvidia-docker2? 이번 포스팅에서는 Docker에 대해 알아보려고 합니다. 사실 이미 오래전부터 사용되었던 Docker이지만 모르는 분들을 위한 글이기

kyumdoctor.co.kr

 

nvidia-docker 설치 방법

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

gpgkey 입력 및 stable 저장소 추가 후 

 

# apt-get update
# apt-get install nvidia-docker2 -y
# systemctl restart docker

위와 같이 repository update 및 nvidia-docker2 를 설치 후 docker restart 후 간단하게 설치가 완료 됬습니다.

 

이제 NVIDIA-GPU를 할당하여 사용하는 방법 3가지에 대해서 알아보도록 하겠습니다.

 

 

 

시작하기 전에 저의 nvidia-smi 값을 먼저 보고 아래 글을 천천히 읽어주시면 될 것 같습니다.

# nvidia-smi

 

1. NV_GPU

# NV_GPU=0,1 nvidia-docker run -it \
nvcr.io/nvidia/tensorflow:20.12-tf1-py3

제 시스템은 슈퍼마이크로 4124-TNR 모델 A100 GPU 8ea를 사용중인데요.

그 중에 2개만 할당하기 위해서는 NV_GPU=0,1 의 옵션을 사용하여 nvcr.io/nvidia/tensorflow:20.12-tf1-py3 이미지를 사용하여 container에 진입하여 확인 하였습니다.

 

그렇다면 다른 옵션은 없을까요? 다른 방법으로도 GPU를 할당하여 사용하는 방법을 알려드릴께요.

 

 

 

2. NVIDIA_VISIBLE_DEVICES

# docker run -it --runtime=nvidia -e \
NVIDIA_VISIBLE_DEVICES=2,3 \
nvcr.io/nvidia/tensorflow:20.12-tf1-py3

runtime=nvidia를 사용하여 -e 환경변수로 NVIDIA_VISIBLE_DEVICES=2,3 GPU ID 혹은 UUID등으로 설정하여 GPU를 할당 하실 수 있습니다.

기존 NV_GPU와는 다르게 nvidia-docker로 시작하는 커맨드가 아닌 docker로 시작하는 command이니 잘 기억해 두시기 바랍니다.

또한 비교가 되기 위해서 NV_GPU 와는 다른 GPU를 사용하였는데요. 위 NV_GPU 사진에서 Bus-Id와 현재 NVIDIA_VISIBLE_DEVICES를 비교해 보시면 각각 다른 GPU를 사용한걸 아실 수 있습니다.

 

3. --gpus

# docker run -it --gpus '"device=0,1,2,3"' \
nvcr.io/nvidia/tensorflow:20.12-tf1-py3

다음으로는 gpus 옵션을 사용하는 것입니다.

gpus옵션을 사용하기 위해서는 위와 같이 docker run으로 시작하는데요. --gpus 뒤에 '"device="' 옵션에서는 큰 따옴표와 작은 따옴표가 반드시 필요합니다.

 

 

 

마지막으로  GPU를 한번에 다 사용하기 위해서는 --gpus all 이라는 옵션을 간단하게 사용하면 아래와 같이 모든 GPU를 할당하여 컨테이너로 진입하게 됩니다.

 

# docker run -it --gpus all \
nvcr.io/nvidia/tensorflow:20.12-tf1-py3

 

NV_GPU ? NVIDIA_VISIBLE_DEVICES? gpus?

이제 nvidia gpu 할당을 잘 하실수 있으실텐데요. NV_GPU와 NVIDIA_VISIBLE_DEVICES 및 gpus 차이점은 어떤 차이가 있는지 궁금하신 분들이 있으실텐데요.

nvidia-docker2가 설치가 되어 있는 상태에서는 어떠한 command로도 사용가능합니다.

다만 차이점은 아래와 같습니다.

 

NV_GPU = nvidia-docker

NVIDIA_VISIBLE_DEVICES = nvidia-docker2

gpus '"device="' = nvidia-docker2

 

nvidia-docker 버전의 차이기 때문에 상위버전은 하위호환되기 때문에 편하신 커맨드를 이용하셔서 docker를 사용하시면 될 것 같습니다.

 

해당 TEST 서버는 아래와 같습니다.

kyumdoctor.co.kr/12

반응형

'머신러닝' 카테고리의 다른 글

nvida gpu 분할 할당  (0) 2022.03.18
nvidia GPU 관련 확인 명령어  (0) 2022.03.18
머신러닝 텍스트 데이터 변형 프로세스  (0) 2022.03.18
반응형

출처 : http://choesin.com/docker-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-%ED%95%A8%EA%BB%98-nvidia-gpu%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-kubernetes-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC

 

Docker 컨테이너는 시스템의 GPU를 자동으로 보지 않습니다. 이로 인해 기계 학습 프레임워크와 같은 GPU 종속 워크로드에서 성능이 저하됩니다. 호스트의 NVIDIA GPU를 컨테이너에 노출하는 방법은 다음과 같습니다.

 

GPU가 Docker에서 작동하도록 만들기

Docker 컨테이너는 호스트의 커널을 공유하지만 자체 운영 체제 및 소프트웨어 패키지를 가져옵니다. 이는 GPU와 인터페이스하는 데 사용되는 NVIDIA 드라이버가 없음을 의미합니다. Docker는 기본적으로 컨테이너에 GPU를 추가하지 않으므로 일반 docker run 하드웨어가 전혀 표시되지 않습니다.

높은 수준에서 GPU가 작동하도록 하는 것은 이미지 내에 드라이버를 설치한 다음 런타임에 컨테이너에 GPU 장치를 추가하도록 Docker에 지시하는 2단계 절차입니다.

이 가이드는 최신 버전의 CUDA 및 Docker에 중점을 둡니다. NVIDIA Container Toolkit의 최신 릴리스는 CUDA 10 및 Docker Engine 19.03 이상의 조합을 위해 설계되었습니다. CUDA, Docker 및 NVIDIA 드라이버의 이전 빌드에는 추가 단계가 필요할 수 있습니다.

NVIDIA 드라이버 추가

Docker 구성을 계속하기 전에 호스트에서 NVIDIA 드라이버가 제대로 작동하는지 확인하십시오. 성공적으로 실행할 수 있어야 합니다. nvidia-smi GPU의 이름, 드라이버 버전 및 CUDA 버전을 확인하십시오.

광고

GPU를 Docker와 함께 사용하려면 먼저 NVIDIA Container Toolkit을 호스트에 추가하십시오. 이는 Docker 엔진에 통합되어 GPU 지원을 위해 컨테이너를 자동으로 구성합니다.

예제 명령을 사용하여 툴킷의 패키지 저장소를 시스템에 추가하십시오.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - 
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

다음 설치 nvidia-docker2 호스트의 패키지:

apt-get update
apt-get install -y nvidia-docker2

Docker 데몬을 다시 시작하여 설치를 완료합니다.

sudo systemctl restart docker

이제 Container Toolkit이 작동해야 합니다. 테스트 컨테이너를 시작할 준비가 되었습니다.

GPU 액세스로 컨테이너 시작

Docker는 기본적으로 시스템의 GPU를 제공하지 않으므로 다음을 사용하여 컨테이너를 생성해야 합니다. --gpus 하드웨어가 표시되도록 플래그를 지정합니다. 활성화하거나 사용할 특정 장치를 지정할 수 있습니다. all 예어.

그만큼 nvidia/cuda 이미지는 CUDA 바이너리 및 GPU 도구로 사전 구성됩니다. 컨테이너를 시작하고 nvidia-smi GPU의 액세스 가능 여부를 확인하는 명령입니다. 출력은 사용할 때 본 것과 일치해야 합니다. nvidia-smi 당신의 호스트에. CUDA 버전은 호스트 및 선택한 컨테이너 이미지의 툴킷 버전에 따라 다를 수 있습니다.

docker run -it --gpus all nvidia/cuda:11.4.0-base-ubuntu20.04 nvidia-smi

기본 이미지 선택

중 하나를 사용하여 nvidia/cuda 태그는 GPU 워크로드를 Docker에서 실행하는 가장 빠르고 쉬운 방법입니다. 다양한 변형을 사용할 수 있습니다. 운영 체제, CUDA 버전 및 NVIDIA 소프트웨어 옵션의 매트릭스를 제공합니다. 이미지는 여러 아키텍처용으로 빌드됩니다.

각 태그의 형식은 다음과 같습니다.

11.4.0-base-ubuntu20.04
  • 11.4.0 – CUDA 버전.
  • base – 이미지 풍미.
  • ubuntu20.04 – 운영 체제 버전.
광고

세 가지 다른 이미지 맛을 사용할 수 있습니다. 그만큼 base image는 필수 CUDA 런타임 바이너리가 포함된 최소 옵션입니다. runtime GPU 간 통신을 위한 CUDA 수학 라이브러리 및 NCCL을 포함하는 보다 완전한 기능을 갖춘 옵션입니다. 세 번째 변형은 devel 그것은 당신에게 모든 것을 제공합니다 runtime 사용자 정의 CUDA 이미지를 생성하기 위한 헤더 및 개발 도구뿐만 아니라

이미지 중 하나가 효과가 있으면 이를 기반으로 사용하는 것을 목표로 삼으십시오. Dockerfile. 그런 다음 일반 Dockerfile 지침을 사용하여 프로그래밍 언어를 설치하고 소스 코드를 복사하고 애플리케이션을 구성할 수 있습니다. 수동 GPU 설정 단계의 복잡성을 제거합니다.

FROM nvidia/cuda:11.4.0-base-ubuntu20.04
RUN apt update
RUN apt-get install -y python3 python3-pip
RUN pip install tensorflow-gpu

COPY tensor-code.py .
ENTRYPONT ["python3", "tensor-code.py"]

다음을 사용하여 이 이미지를 빌드하고 실행합니다. --gpus 플래그는 GPU 가속으로 Tensor 워크로드를 시작합니다.

수동으로 이미지 구성

다른 기반을 선택해야 하는 경우 이미지에 CUDA 지원을 수동으로 추가할 수 있습니다. 이를 달성하는 가장 좋은 방법은 공식 NVIDIA Dockerfile을 참조하는 것입니다.

CUDA 패키지 리포지토리를 추가하는 데 사용된 지침을 복사하고 라이브러리를 설치하고 경로에 연결합니다. CUDA 버전 및 운영 체제에 따라 다르기 때문에 이 가이드의 모든 단계를 재현하지는 않습니다.

Dockerfile 끝에 있는 환경 변수에 주의하십시오. 이는 이미지를 사용하는 컨테이너가 NVIDIA Container Runtime과 통합되는 방식을 정의합니다.

ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
광고

CUDA가 설치되고 환경 변수가 설정되면 이미지가 GPU를 감지해야 합니다. 이렇게 하면 이미지 내용을 더 잘 제어할 수 있지만 새 CUDA 버전이 출시되면 지침을 조정할 수 있습니다.

어떻게 작동합니까?

NVIDIA Container Toolkit은 Docker와 같은 컨테이너 런타임을 호스트의 NVIDIA 드라이버에 대한 인터페이스로 래핑하는 패키지 모음입니다. 그만큼 libnvidia-container 라이브러리는 런타임 래퍼를 통해 시스템의 GPU를 컨테이너에 자동으로 제공하는 API 및 CLI를 제공하는 역할을 합니다.

그만큼 nvidia-container-toolkit 구성 요소는 컨테이너 런타임을 구현합니다. prestart 훅. 즉, 새 컨테이너가 시작되려고 할 때 알림을 받습니다. 연결하려는 GPU를 확인하고 호출합니다. libnvidia-container 컨테이너 생성을 처리합니다.

후크는 다음에 의해 활성화됩니다. nvidia-container-runtime. 이는 NVIDIA가 다음을 보장하도록 containerd 또는 runc와 같은 “실제” 컨테이너 런타임을 래핑합니다. prestart 후크가 실행됩니다. 기존 런타임은 후크가 실행된 후 컨테이너 시작 프로세스를 계속합니다. 컨테이너 툴킷이 설치되면 Docker 데몬 구성 파일에서 선택한 NVIDIA 런타임이 표시됩니다.

요약

Docker 컨테이너 내에서 NVIDIA GPU를 사용하려면 호스트에 NVIDIA Container Toolkit을 추가해야 합니다. 이것은 NVIDIA 드라이버를 컨테이너 런타임과 통합합니다.

부름 docker run 와 더불어 --gpu 플래그는 컨테이너에서 하드웨어를 볼 수 있도록 합니다. Container Toolkit을 설치한 후 실행하는 각 컨테이너에서 설정해야 합니다.

광고

NVIDIA는 애플리케이션의 빠른 시작으로 사용할 수 있는 사전 구성된 CUDA Docker 이미지를 제공합니다. 더 구체적인 것이 필요하면 공식 Dockerfiles를 참조하여 Container Toolkit과 여전히 호환되는 자신만의 것을 조립하십시오.

반응형

+ Recent posts