D_ontory : 개발스토리

[Docker] 머신러닝/딥러닝을 위한 docker 이야기 | docker를 써야하는 이유, 장단점, docker image 부터 container 생성까지 본문

Linux and Docker

[Docker] 머신러닝/딥러닝을 위한 docker 이야기 | docker를 써야하는 이유, 장단점, docker image 부터 container 생성까지

D_on 2023. 8. 14. 09:26
반응형

 

왜 도커를 써야만 할까?

 

머신러닝 딥러닝 모델을 개발하다보면, 수많은 오류들을 만날 때가 있다.
그리고 대부분의 오류들은 개발하는 환경의 버전 관리부터 시작된다.

내가 처음부터 끝까지 작성한 코드라고 해서 오류가 없는 것은 아니다. 단지 내가 짠 코드인 만큼 단계별로 해결한 경험이 있어서 상대적으로 쉽게 느껴질 수는 있다.

대부분 git 페이지에서 제공하는 오픈소스 코드를 사용할텐데, 이 코드가 실행한 환경과 내 서버(컴퓨터)의 환경은 다르기 때문에 오류를 많이 만나는 것 같다....(모두가 그런건 아니지만^^....)

 

현직 개발자로서, 딥러닝 모델을 개발하다 보면 여러가지 환경을 동시에 진행하는 경우도 있다.
이미지 전처리 필요한 모델도 학습하다가, 오디어 전처리도 필요하게 되는... 

아무튼, 내가 만났던 오류들 중에, 정말 코드가 잘못되서 나는 오류는 아주 드물었다.
대부분이 라이브러리의 버전 업데이트로 인해 있던 기능이 없어지고, 없던 기능이 생기면서 발생하는 오류들이다.

또한, 라이브러리 버전 뿐만 아니라, Linux라면 Ubuntu 와 CUDA 버전부터 python, tensorflow, pytorch 등등....
개발을 하기 위해 필요한 것들은 죄다 하나만 맞추면 되는게 아니라 서로 연결되어 이 버전에선 이게 안되고, 저 버전에서는 저게 안되는 상황이 발생한다.

 

하지만, 도커(Docker)를 사용한다면? 지금까지 말 한 버전 충돌 문제를 모두 해결 할 수 있다!

 

우리가 개발하는 환경은 다양하다.
한 가지 예시를 들어보자.

대부분 하나의 컴퓨터에서 하나의 모델을 개발하지는 않는다.
하루는 YOLO를 사용한 Object Detection 을 이용하여 사물 탐지 프로젝트를 진행 할 수 있고,
그 다음 주에는 U-Net을 사용한(pytorch 일수도 있고, Tensorflow 일수도...) Segmentation을 진행할수도 있다.
그 다음 주에는 긴급으로 Keras를 사용하여 간단한 머신러닝 이진 분류(classification) 모델을 개발 할 수도 있다.

앞서 말한 모든 프로젝트가 python3.9를 사용하고, 모두 tensorflow==2.5를 사용하며, 모두 pytorch==1.8을 사용한다면 참 좋겠지만, 프로젝트마다 꼭 필요한 라이브러리가 있고, 그 라이브러리가 필수로 요하는 환경이 제각각이다.

내가 하고자하는 프로젝트의 레퍼런스 git 페이지 몇개만 찾아봐도 각자 다른 환경에서 (window or ubuntu 부터 시작해서 아주 다양...) 각자의 스타일에 맞게 개발을 진행하고 있다.

때문에, 하나의 서버에서 자유자재로 버전을 관리하며, A라는 공간에서는 python3.8과 pytorch 1.7을 사용하고, B라는 공간에서는 python 3.9와 tensorflow 2.5 를 사용하는, 서로의 공간에 방해 받지 않는 프로젝트 별 독립적인 공간을 만들기 위해서 도커를 사용하는 것이다.

 

 

Docker image & Container

 

도커를 사용하기 위해서는 '이미지'와 '컨테이너'라는 개념을 정확하게 알아야 한다.
앞서 말했다 싶이, 도커는 독립적인 나만의 공간(?)을 만들어준다. 하지만 아무것도 없는 컴퓨터에서 갑자기 공간을 만들 수는 없기 때문에 예쁜 포장지에 쌓여있는 image 를 내 컴퓨터로 가져온다.

그리고 그렇게 포장을 까고나면, 그 안에는 상자 하나가 들어있을 것이다. 그 상자가 바로 Container 이다!
상자가 생기고 나면, 그 상자는 빈 상자이기 때문에 무엇이든지 담을 수 있다.

나는 대부분 파이토치(Pytorch) Container를 자주 사용한다. (정확히 말하면 nvidia pytorch container 이다.)
pytorch container를 가져와서 포장을 풀면(docker run)  pytorch로 만들어진 빈 상자가 되는 것이다.

그 빈 상자 속 에서는 pytorch와 관련된 무엇이든지 구동할 수 있게 된다.

구글링을 통해 도커에 대한 설명을 보면, 대부분 시작을 Ubuntu image 나, python image를 사용한다.
하지만 머신/딥러닝을 위한 도커 사용법을 검색한 사람들에게 python image를 사용할  필요는 없을 테니,,,,
본론으로 바로 들어가 보기로 하자.

 

 

 

 

Tensorflow 환경 구성

 

예시로 tensorflow 환경에서 개발해야 한다고 생각하고 tensorflow docker container를 실행시켜보겠다.
pytorch 라고 해서 다를 것이 아니라. 도커 hub에서 pytorch로 검색해서 다운 받으면 pytorch docker container가 된다.

Docker를 컴퓨터에 모두 설치했다는 가정하에 설명해보겠다!

일단, 도커 이미지를 다운 받기 위해서는 아래 사이트인 Docker hub를 사용한다.
https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

docker hub에 접속해서 검색창에 내가 사용해야 하는 라이브러리를 검색해보면 웬만한건 다 나온다.

 

tensorflow를 검색한 모습이다. pytorch 를 검색해도 비슷하게 나온다.

대부분 가장 처음 나온 이미지가 공식적이고, 유명한 이미지 이기 때문에 클릭해보면, 위와 같은 화면이 나오고, Overview와 Tag가 있다. Tag를 클릭하면, tensorflow 버전 별로 받을 수 있는 이미지가 나온다.

내가 사용하고 싶은 버전의 tensorflow를 결정하고 그에 맞는 버전의 오른쪽에있는 docker pull 부분을 복사한다.

 

docker pull bitnami/tensorflow-serving:latest

서버 terminal 창에 복사한 docker pull~ 을 붙여넣기 한다.

 

 

docker 이미지가 잘 다운로드 되었는지 확인해보자.

# docker image 확인
docker images

# 도커 컨테이너 확인(-a 를 붙이면 실행중이지 않은 모든 컨테이너들도 함께 볼 수 있다) 
docker ps -a

 

docker images 라는 명령어를 통해, 내가 가지고 있는 이미지를 확인하자.

이미지 pulling (도커 이미지 다운로드)를 완료했다면, 우리가 사용하고싶은 '선물 가져오기' 단계까지를 완료한 것이다!
그렇다면, 선물을 가져왔으니 포장지를 벗겨서 그 실체(?)를 확인해야 할 것이다.
그렇게 포장지를 까서 내가 뛰어놀 수 있는 상자 상태로 만들기 위해 docker run 을 사용하여 포장지를 벗겨내고 나만의 상자 공간으로 만들어 줄 것이다.

 

docker run -it --gpus all --name 컨테이너명 -v /home/username/workspace:/workspace/ 이미지ID

가장 기본적인 포장지 벗기는 방법 을 설명해 보겠다!

docker run : 컨테이너를 실행하기 위한 가장 기본적인 명령어
-it : docker 컨테이너를 종료시키지 않고 상태를 유지해주는 명령어 (it 설정을 해주지 않으면 도커 컨테이너에 종료와 동시에 컨테이너가 사라짐)
--gpus all : gpu를 사용하기 위한 명령어
--name : 지금 만드는 컨테이너의 이름(마음대로 설정)
-v 내가프로젝트를 사용하고있는로컬의 경로:/도커내에서의 사용할경로명  (프로젝트를 진행할 경로 / 볼륨연결)
이미지ID : docker images를 검색하면 나오는 IMAGE ID 를 그대로 쳐주면 편하다. 아니면 repository와 tag를 써도 된다.

 

그리고 여기까지는 어디에서나 볼 수있는 도커 사용법일 것이다.
하지만, pytorch, Tensorflow를 사용하면서 CUDA, CUDNN과 버전이 맞지 않아 gpu가 제대로 작동하지 않는다거나, 아니면 학습이 되지 않는 경우를 많이 만날 수 있다.

그럴 땐, Nvidia docker 를 사용하는 것을 추천한다.

 

 

 

Nvidia Docker container

 

대부분 연구실이나 회사에서 Nvida RTX GPU를 많이 사용 할 것이다.
그런 환경에서 개발하는 분들에게 NVIDIA 에서 제공하는 Docker Image로 container를 구축하여 사용하면, 그동안 겪어왔던 모든 고난과 역경들로부터 벗어날 수 있을 것이다.

https://catalog.ngc.nvidia.com/?filters=&orderBy=weightPopularASC&query= 

 

GPU-optimized AI, Machine Learning, & HPC Software | NVIDIA NGC

Hub of AI frameworks including PyTorch and TensorFlow, SDKs, AI models, Jupyter Notebooks, Model Scripts, and HPC applications.

catalog.ngc.nvidia.com

nvidia catalog 라는 위 사이트에 들어가서 자신이 개발에 있어 주요 사용하는 환경을 검색한다. (pytorch/tensorflow)
이번에는 pytorch 를 사용해 보겠다.

pytorch 라고 검색하면, 가장 먼저 PyTorch Container 가 보인다!

 

 

Tags 를 클릭하면 여러 버전의 pytorch 컨테이너 리스트가 있다.
파이토치 구동에 필요한 환경이 모두 구축되어 있는 컨테이너를 이미지화 한 것으로, pull 받아주어야 한다.

docker pull 원하는tag버전

이미지를 pulling 하고 docker images 명령어를 통해 이미지가 잘 받아졌는지 확인한다.

pulling 한 이미지를 가지고 컨테이너를 만들어주면 나만의 pytorch 컨테이너 공간이 완성되는 것이다!

 

docker run -it -e DISPLAY=$DISPLAY --shm-size=32G -v /tmp/.X11-unix:/tmp/.X11-unix -e XDG_RUNTIME_DIR=/tmp -v /root/.Xauthority:/root/.Xauthority --gpus all -v /:/home/ --name 이름 nvcr.io/nvidia/pytorch:23.05-py3 bash

보통 내가 많이 사용하는 컨테이너 생성 명령어다.

-e DISPLAY 와 -v /tmp/ 어쩌구는 화면 공유를 위한 명령어라고 하는데, 잘 모르지만 아무튼 사용하고있다.
--gpus all 은 gpu를 사용해야 하므로 거의 필수로 넣고 있다. cpu만 사용하는 pc에는 필요 없다.
맨 마지막 bash 는 붙여도 그만 안해도 그만이다.

좀 더 간단한 버전을 보여주자면,

docker run --gpus all -it --shm-size=64G -v /home/내경로/:/workspace/ --name test1 nvcr.io/nvidia/pytorch:23.12-py3

--shm-size 는 꼭 설정하는 것이 좋다. 
기존 폴더를 -v 옵션으로 연결하다보면 컨테이너 내부 공유 메모리 부족 에러를 만날 때가 있다.
=> might be caused by insufficient shared memory(shm).

 

 

 

컨테이너를 실행하고 컨테이너를 벗어날 때에는 exit 을 하면 빠져나올 수 있다.
exit 하지 않고 빠져나오기 위해서는 ctrl+q+p 를 눌러주면 종료 없이 빠져 나올 수 있다.

컨테이너 밖으로 나와서 docker ps -a 을 bash 창에 입력하면 컨테이너 상황을 모두 볼 수 있다.

 

 

 

 

 

반응형
Comments