2023년 2월 23일 목요일

NVIDIA GPU 도커 이미지 기반 딥러닝 모델 실행 및 vscode 디버깅 개발 환경 쉽게 만들어보기

이 글은 우분투 20.04 이상 버전에서 NVIDIA GPU 도커 이미지를 사용해 딥러닝 개발 및 vscode 디버깅 환경을 쉽게 만들어보는 방법을 간략히 정리한다.

NVIDIA GPU는 딥러닝 개발 시 필수적인 하드웨어이다. 이런 이유로, 딥러닝 개발 시 NVIDIA GPU 드라이버, CUDA, PyTorch등 라이브러리를 설치해 사용하는 경우가 많다. 하지만, 엔비디아 CUDA 기반 딥러닝 환경 설치 테크트리는 전문가가 아니면 쉽지 않은 일인데다가, 매번 변경되는 각 버전으로 인한 패키지 의존 문제, ldconfig 를 통한 버전 갱신, 설정 변경으로 인한 딥러닝 모델 서비스 코드의 각종 에러는 골치아픈 문제 중 하나다.


NVIDIA FAIL--; (질문삽질 무한반복 HELL, Stackoverflow)

이를 해결할 수 있는 여러 방법이 있는 데, 1) AWS, 에저, 구글에서 비싼 클라우드 GPU 인스턴스 서비스를 사용하거나 2) 언제 서버 데이터 날라가도 이상하지 않는 CoLab을 이용하거나 3) 업체로 부터 비싼 딥러닝 개발스택설치 서버를 구입하거나 4) 무료 제공하는 NVIDIA GPU 도커를 사용하는 방법이 있다. 여기서는 4)번 방법을 사용해 딥러닝 개발환경을 만들어 보는 방법을 간략히 공유한다.

안정적으로 동작하는 NVIDIA GPU 이미지를 만들어 두고, 이를 필요할 때 다른 도커 이미지에서 해당 라이브러리를 호출할 수 있다면, 앞의 문제를 일부 해결할 수 있다. 엔비디아 컨테이너 툴킷(엔비디아 도커)는 다른 도커 이미지가 운영되는 컨테이너에서 NVIDIA GPU를 사용할 수 있도록 자동으로 마운트해준다. 다음 그림과 같이 컴퓨터에 설치된 NVIDIA GPU카드를 소프트웨어에서 구동할 수 있도록 NVIDIA 도커 이미지가 다른 어플리케이션 도커 이미지에 라이브러리를 연결, 제공해주는 방식이다.

엔비디아 도커 이미지 구조

엔비디아 도커를 설치하면, 다른 도커 이미지에서 --gpus 란 도커 GPU 사용 옵션을 이용할 수 있다. 이 옵션을 사용하면, 자동으로 실행 도커 이미지의 NVIDIA GPU관련 라이브러리 폴더 등을 NVIDIA DOCKER이미지에 제공되는 라이브러리로 자동 마운트해주고, 버전도 맞춰줘서 매우 편리하다. 

참고로, 도커는 가상 이미지 컨테이너로 미리 만들어 놓은 이미지를 로딩해, 재활용할 수 있다. 가상머신보다 가볍고, 프로그램 실행환경을 독립적으로 구축할 수 있어, 서버에서 편리하게 사용된다. 도커 가상 이미지는 docker build란 명령으로 dockerfile에 정의된 운영체제, 라이브러리 설치 명령을 해석해 이미지로 만들어진다. 
도커 개념

도커 컨테이너에 대한 상세 내용은 다음 링크를 참고한다.

엔비디아 도커 설치
우선 우분투(설치 링크) 운영체제가 필요하다. 기본적으로 NVIDIA DRIVER는 설치되어 있다고 가정한다(드라이버 설치 방법 링크). 

이후, 터미널에서 다음 링크를 참고해 도커를 설치한다. 
도커 설치 후, 우분투 터미널에서 다음 명령을 입력해 도커 저장소에 이미지 다운로드를 위한 키를 설정한다.
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

엔비디아 도커를 다음 명령으로 설치한다.
sudo apt-get update
sudo apt-get install -y nvidia-docker2

도커 서비스를 재시작한다.
sudo systemctl restart docker

다음 명령을 실행해, 우분투 20.04 이미지를 설치하고, nvidia-smi 명령을 실행해 본다.
docker run --rm --gpus all ubuntu:20.04 nvidia-smi

다음과 같은 화면이 나오면 제대로 설치된 것이다.

vscode 도커 디버깅을 위해 도커 그룹을 생성하고, 현재 사용자를 해당 그룹에 추가한다.
sudo groupadd docker
sudo usermod -aG docker $USER 

도커 이미지 기반 vscode 디버깅 환경 구축
우선 vscode 개발도구를 설치한다.
설치 후, vscode를 실행한다. vscode에서 다음과 같이 좌측 Extension 설치 메뉴를 선택해, Remote Development, docker, docker explorer  확장모듈을 설치한다. 이를 통해, 원격으로 도커 이미지와 vscode를 연결해 사용할 수 있다. 

vscode와 연결해 디버깅하기를 원하는 도커를 터미널에서 실행한다. 다음은 도커 실행 예시이다. vscode가 도커 디버깅할 수 있도록 newgrp로 docker그룹 변경한 후(이후 도커 그룹 빠져나올때는 exit 명령 입력), 도커 이미지를 실행한다. local host와 docker remote host간의 폴더 마운트를 위해 -v 옵션을 사용한다. 
newgrp docker
docker run -v ~:/tf --gpus all -it pytorch/pytorch bash

참고로, vscode에서 파이썬 디버깅 개발 환경이 필요하다면, 당연히 해당 도커 이미지에 파이썬 패키지가 제대로 설치되어 있어야 한다. 

다음, 상태창의 녹색 remote development 아이콘을 선택하고, 메뉴 중 Attach to Running Container 메뉴를 선택해, 실행 중인 도커 이미지와 연결한다. 
상태창의 remote development 아이콘

remote development 메뉴 리스트

해당 도커와 연결되어 실행된 vscode의 terminal 메뉴를 실행한다. 

터미널에서 다음 명령을 실행한다. 결과가 그림과 같으면 제대로 도커 이미지와 연결된 것이다.
nvidia-smi

다음과 같이 마운팅된 root의 tf폴더를 Open한다.

그럼 다음과 같이 마운팅된 폴더를 확인할 수 있다.

이제 파이썬 코드를 vscode의 new file 메뉴로 하나 생성한다. 

해당 소스파일에 아래 코드를 입력한다.
import math

value = math.cos(math.pi)
print(value)

확장모듈 중 Python Extention Pack과 Intellicode 모듈을 다음과 같이 설치한다.


이제, vscode의 디버깅 모드를 실행하고, 파이썬 인터프린터를 선택한다. 만약, 파이썬 디버깅이 불가능하다면, 프로젝트에 launch.json 파일을 추가해, 아래와 같이 파이썬 디버깅 환경 정보를 추가해야 한다(참고).
{
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "$(file)",
            "console": "integratedTerminal"
        }
   ]
}

이제 해당 파이썬 코드를 실행되면, 다음과 같이 디버깅할 수 있다.

로컬 호스트의 폴더를 보면, 도커에서 작성된 파일을 확인할 수 있다.

GPU기반 딥러닝 개발을 테스트하기 위해, 다음과 같이 PyTorch 코드를 입력해 본다.
import torch
flag = torch.cuda.is_available()
if flag:
print(torch.cuda.device_count())
print(torch.cuda.current_device())
print(torch.cuda.device(0))
print(torch.cuda.get_device_name(0))

브레이크 포인트를 설정하고, 디버깅해본다. 다음과 같이 실행되면 성공한 것이다.

마무리
엔비디아 도커 이미지를 이용하면, 다른 도커 이미지에서 패키지, 드라이버 의존 에러 지옥에 빠지지 않고 편리하게 딥러닝 모델을 개발, 실행할 수 있다. vscode의 remote development 확장모듈을 이용하면, 도커 이미지, ssh와 같이 원격으로 접속해 실행되는 프로그램 소스를 손쉽게 디버깅할 수 있다. 
이를 통해, 엔비디아 CUDA 기반 딥러닝 개발 환경의 복잡한 테크트리와 각종 문제에서 벗어날 수 있다. 

레퍼런스
부록: launch.json 설정
프로그램을 디버깅할 때 명령행 인자 등을 미리 설정해야 할 때가 있다. 이 경우, 프로젝트 폴더에 launch.json 파일을 생성하고, args 키를 정의해 인자를 추가해야 한다. 다음 영상을 참고한다.


댓글 없음:

댓글 쓰기