딥러닝 개발환경

6-2. Docker에서 pytorch 환경 구축하기 with jupyter notebook

Do-Woo-Ner 2020. 2. 7. 16:50

안녕하세요~ 


이번에는 리눅스 환경에서 Docker를 이용하여 pytorch를 구축하려고해요! (윈도우 환경에서는 GPU docker가 제공이 안되요 ㅜㅜ)


(명령어 입력은 아래 사이트를 참고하고 복붙하시면될거에요!)

https://oi.readthedocs.io/en/latest/packages/gpu_env/ubuntu.html



<1. DOCKER 설치하기>


먼저 docker부터 설치해볼까요?

아래 명령어를 차례로 입력하시면 설치가 될거에요!


1) Set up the repository


sudo apt-get update






sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg-agent \
     software-properties-common








curl
-fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -







sudo apt-key fingerprint 0EBFCD88






sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
     stable"




2) Install docker engine -community


sudo apt-get update






sudo apt-get install docker-ce docker-ce-cli containerd.io





자! Docker를 만들었으니 도커 위에 올릴 컨테이너를 만들어야겠죠? 그런데 내가 어떤 컨테이너안에서 GPU를 사용하려고 하면 문제가 발생해요. 왜냐하면 컨테이너는 OS와 격리된 상태이기 때문이죠. 그렇기 때문에 이를 해결해줄 방법이 필요한데 그것이 바로 nvidia-docker에요!



<사진1> 



<사진2>











<2. NVIDIA DOCKER 설치하기>


간단하게 nvidia-docker에 대해서 말씀드릴게요.


Docker 컨테이너에서 실행되는 응용프로그램은 OS와 분리 되어 있기 때문에 docker 컨테이너내에서 gpu를 실행할 수가 없어요. 



그래서 docker 내부에서 gpu (driver) 이용하기 위해서는 host gpu driver와 docker를 연동시켜주는 driver가 있어야 하는데, 그것이 바로 nividia-docker에요! 


아래그림을 보시면 'nvidia driver'가 이미 설치되어 있어야 한다는점 명심해주세요! 

(nividia driver는 보통 컴퓨터를 구매하고 우분투를 설치하면 설치할 수 있는데, 이 부분은 따로 우분투 설치하는 방법에 대한 글을 만들게 되면 그때 링크걸도록 할게요! 검색하셔도 많은 방법들이 나오니 참고하세요!)


<사진3>




1) NVIDIA-DOCKER 설치


# Add the package repositories
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-container-toolkit
sudo systemctl restart docker






2) docker 명령어 권한 변경해주기


아래 명령어를 입력해주는 이유는 docker에 접속하거나 관련 명령어를 수행시킬때 'sudo docker ~'와 같은 형태로 입력해주어야 하기 때문이에요. 그런데, 매번 sudo를 붙이는것이 번거로우니 user모드(root모드가 아닌 현재 user모드; 아래 커맨트창에 'hyunsu@hyunsu:' 있는 부분)에서도 docker 명령어를 실행시킬 수 있게 해주도록 하기위해서 아래 명령어를 입력한답니다.


sudo usermod -aG docker $USER







3) 재부팅


변경된 권한이 부여되기 위해서는 재부팅을 시켜주어야 한답니다!






Nvidia-docker까지 만들었으니 gpu 버전의 pytorch, tensorflow 개발환경을 구성할 준비를 끝냈어요! 그럼 pytorch 컨테이너를 만들어볼까요?











<3. Pytorch 컨테이너 만들기>


Docker의 큰 장점은 pytorch를 수행시켜주기 위해서 여러 패키지들을 설치할 필요가 없다는거에요. 그저 pytorch 이미지만 다운받아주면 설치가 끝나는거죠!




1) docker에서 Pytorch 이미지 찾아보기


먼저 아래와 같이 입력해주시면, pytorch와 관련된 이미지가 어떠한 것들이 있는지 알아 수 있어요. (STARS가 가장 많은게 제일 범용적인거겠죠?)


docker search pytorch




좀더 GUI 스럽게 보고싶다면 아래 사이트에 접속한 후, pytorch라고 입력해주시면 해당 이미지에 대한 설명을 볼 수 있어요.





커맨드 창에다 어떻게 입력해야 이미지가 다운받아지는건지도 나와 있네요.







2) Pytorch 이미지 다운로드


Docker에서 이미지를 다운받는 명령어는 'pull'이에요.


docker pull pytorch/pytorch








3) 이미지 확인


당연히 pytorch 이미지만 다운받았기 때문에 docker에 있는 이미지를 확인했을때 pytorch 이미지 밖에 없을거에요.


docker images








4) nvidia-docker와 연동하여 pytorch 컨테이너 만들기


pytorch라는 이름의 컨테이너 (--name pytorch) 가 pytorch/pytorch라는 이미지를  사용하겠다는 선언을 해주는 작업을 하는거에요. (restart option에 대한 설명은 바로 아래 추가적으로 설명해 놓았어요!)


먼저 아래 명령어를 실행시키기 전에 자신의 user 디렉토리 (/home/hyunsu)에다가 share 폴더를 만들어주세요!!!!!!!!! (만약 자신의 사용자 이름이 mike라면 user 디렉토리가 '/home/mike' 일거에요. 그럼 아래 명령어는 -v /home/mike/share ~~~~ 와 같이 바꾸면 되겠죠?


-v, -p 옵션은 뒤에서 jupyter 패키지를 설치하고 사용할때 추가적으로 설명해드릴테니 아래와 같이 명령어를 입력해주세요!


docker run -itd --name pytorch -v /home/hyunsu/share:/root/share -p 8888:8888 --gpus all --restart=always pytorch/pytorch







etc) "4)"에서 restart 옵션주는 이유


restart option을 준 pytorch라는 컨테이너와 restart option이 없는 pytorch2라는 컨테이너를 비교해볼게요.





일단은 두 컨테이너가 모두 정상적으로 만들어 졌음을 알 수 있어요.





그리고 컴퓨터를 꺼도 docker가 종료되지만 아래 명령어를 입력해줘도 백그라운드에서 실행되는 docker가 종료되고 다시 재시작되요.




Docker가 종료되고 나면 container또한 자동으로 종료되는데요. 이때 restart를 해주지 않은 컨테이너는 'docker run -itd ~'라는 명령어를 또 입력해주어 docker container를 실행시켜줘야해요. 그래야 containter에 접속이 가능해 져요. 하지만, restart 옵션을 주게되면 자동으로 docker가 실행될때 restart 옵션이 적용된 containter도 같이 실행되요. 그래서, 곧바로 해당 컨테이너에 접속을 할 수 있게 되는거죠. (보통 container를 실행킨다고 하지 않고 container를 띄운다고 많이 표현한답니다)



만약 restart 명령어 옵션을 설정해주지 않았다면, 아래와 같이 start 명령어를 이용해 pytorch2 컨테이너를 실행시켜주고 접속하셔야해요~







5) pytorch 컨테이너 실행시키기


docker exec -it pytorch bash









6) GPU 동작 확인하기


먼저 아래 명령어를 실행시키면 pytorch 컨테이너에 CUDA version 10.1 이 인식되고 있는걸 알 수 있어요. 

글을 작성하는 기준으로 pytorch는 cuda 10.1을 기반으로 하고 있네요.


nvidia-smi







아래 명령어를 입력해보고 pytorch가 정상적으로 gpu와 연동되는지 확인하면 끝!


import torch
torch.cuda.is_available()
x = torch.rand(5, 3)

print(x)






지금까지 아래와 같은 과정을 거치셨다고 생각하면 될거에요!


 "docker 생성 -> nvidia-docker 생성 -> pytorch 이미지 다운로드 -> pytorch 컨테이너 생성 - pytorch 실행"


Docker는 이미지가 실행된 형태라고 보시면 되는데요. 

<사진4>



도커 이미지를 start하면 해당 이미지의 컨테이너가 running하게 되는거에요. 그렇기 때문에 하나의 이미지에서 여러 컨테이너를 실행시킬 수 있는 거에요.



<사진5>






7) 추가 패키지 설치하기


pytorch 이미지에는 pytorch와 관련된 기본적인 패키지만 설치되어 있을거에요. 그렇기 때문에 다른 패키지들이 필요하다 싶으면 아래처럼 설치해주면 될거에요.


jupyter notebook 패키지를 설치할 예정인데, jupyter notebook에 대한 설명은 다음 글에서 하도록 할게요!


conda install jupyter






앞서 


 docker run -itd --name pytorch -v /home/hyunsu/share:/root/share -p 8888:8888 --gpus all --restart=always pytorch/pytorch


이와 같은 명령어를 이용해서 컨테이너를 만든것을 기억하시죠?

-v 옵션은 내 user 디렉토리의 share 폴더에 있는 파일들을 pytorch 컨테이너의 share 폴더와 공유하겠다는 의미를 지니고 있어요.



pytorch 컨테이너가 처음 실행되면 workspace라는 곳에 위치하게되는데, 그곳을 빠져나와 root/share 폴더로 접속하면, /home/share 폴더에 있는 이미지 파일들이 공유되는걸 알 수 있어요. 그래서 pytorch 컨테이너의 share 폴더의 파일을 삭제하면 /home/share 폴더의 파일도 삭제된답니다.






 docker run -itd --name pytorch -v /home/hyunsu/share:/root/share -p 8888:8888 --gpus all --restart=always pytorch/pytorch


-p 옵션은 local host의 8888 포트와 pytorch 컨테이너의 8888포트를 연결해준다는 의미에요.


만약에 위와 같은 작업을 해주지 않고 jupyter notebook을 실행시켜주면 에러가 날거에요.




share 폴더로 접속한 후 pytorch 컨테이너를 만들어줄 때 -p 옵션에 설정해준 포트번호를 입력하고 아래와 같이 jupyter notebook을 실행시켜주고 url 주소를 복사해서 웹브라우져에 붙여넣기 해주면


jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root





jupyter notebook이 실행되는걸 보실 수 있어요!



만약 저같은 경우 다른 사람들이 짜놓은 코드를 다운받아서 쓰고 싶다면 pytorch 컨테이너의 share 폴더에서 git으로 다운받아쓰면 되겠죠? (git에 대한 설명은 추후에 하도록할게요~)



만약에 내가 딥러닝을 할때 컨테이너에서 내 local 디렉토리에 있는 이미지 파일들을 이용하여 학습을 시키려고 할때, 따로 폴더명이나 파일들을 잘 지정해두시면 사용하시기 수월하실거에요~








8) 배포하기


자신이 만든 특정 컨테이너에 여러 개발도구들을 설치하여 개발환경을 구성할 수 있는데요. 


만약 누군가에게 나의 프로젝트를 실행하고 싶어한다면, 자신이 만든 컨테이너를 이미지로 만들어주어 docker hub에 배포해주면되요. 그럼 누군가가 내가 만들어 놓은 이미지를 다운받고 사용하면 이것저것 설치할 필요없이 간단하기 프로그램만 실행시켜주면 될거에요! (물론 gpu를 사용하는 프로그램이라면 우분투기반에 nvidia docker는 설치되어 있어야겠죠?)



step1. 현재 실행중인 container 확인

docker ps -a



step2. 배포할 container를 중단하기

docker stop 컨테이너이름




step3. 배포할 container를 image 파일로 만들기

docker commit 배포할컨테이너이름 이미지파일이름:버전


이곳에서는 내가 배포할 컨테이너를 지정하고, 이미지 파일을 만들때 이미지 파일 이름을 지정해주는 작업이에요. 콜론 뒤에 숫자는 이미지파일 배포버전인데 나중에 같은 이름으로 버전만 다르게하면 같은 서버(이미지파일)의 업그레이드된 버전이라고 생각할 수 있겠죠?



pytorch_distribution_test 이미지는 pytorch 이미지를 기반으로 하고 있어요. 그리고 다른 패키지들도 설치하고 다음글에서 설명할 VS code IDE와 관련된 파일도 설치되어 있기 때문에 용량이 대략 2GB 정도 증가한걸 알 수 있어요.




step4. docker hub 로그인


앞서 가입한 docker hub를 기억하시나요?

제가 만든 'pytorch_distribution_test' 도커 이미지파일을 원격 저장소에 올려 배포하게 될 텐데요. 이때 원격저장소가 docker hub가 되는거에요. 그래서 terminal에서 원격저장소(docker hub)에 접속하는 작업을 거쳐야해요.






step5. 배포하기


docker push 도커허브아이디/배포할이미지파일:버전


(Mounted from pytorch/pytorch 메시지가 의미하는 바는 해당부분에서는 기존의 docker hub에 pytorch/pytorch 이미지가 존재하기 때문에 따로 배포하지 않는다는 맥락으로 이해하고 있으시면되요. 딱히 pytorch 부분을 변경하진 않았는데, 만약 바꾼 부분이 있다면 그 부분도 배포가 pushed 될거에요 (이 부분은 나중에 설명하는 git 부분을 보시면 더 자세히 알 수 있을거에요)

 




step6. 배포확인하기


정상적으로 배포되었는지 확인해 볼까요?

docker hub 접속 -> repositories







<사진6>








9) pytorch docker 컨테이너에서 아나콘다 가상환경 만들어줄 필요가 없는이유!


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!이 글은 pytorch docker에 가상환경을 만들 필요가 없는 이유를 다룬 글이기 때문에 굳이 안보셔도 되요~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Pytorch는 anaconda 패키지를 제공하기 때문에 pytorch 이미지에도 역시 anaconda가 있을거에요.




만약 여러 python 버전으로 pytorch를 개발하고 싶다면 하나의 pytorch 컨테이너에서 가상환경을 만들어주면 되겠죠? (아! 그리고 굳이 mkdir 폴더를 만들어줄 필요는 없어요~)


conda create -n gpu-pytorch-1.4 python=3.6








하지만 만들어진 가상환경에 접속하려고 하면 아래처럼 에러 메시지가 나올거에요. 



에러메시지대로 conda init 을 실행시켜주고 container를 빠져 나온뒤


conda init

exit

.

.



다시  pytorch 컨테이너에 접속해서 앞서 만든 가상환경을 activate하면 성공적으로 activate되는걸 확인할 수 있으실 거에요!


docker exec -it pytorch bash

conda activate gpu-pytorch-1.4



python을 동작시켜주고 아래와 같이 torch를 실행시켜주면........ 에러가 생겨요...


그 이유는 지금 pytorch 컨테이너라는 가상환경이 있는데 그 안에 다른 독립된 가상환경을 만들었기 때문에 pytorch 컨테이너와 연동이 되지 않는것 같아요!















도커 기본명령어 관련 사이트1 (실행중인 컨테이너 확인, 정지된 컨테이너 확인, 컨테이너 삭제, 이미지 삭제)

https://brunch.co.kr/@hopeless/10


도커 기본명령어 관련 사이트2

https://ahribori.com/article/5912b3ee381ff41040995a40











지금까지 Docker를 통해 pytorch 환경을 구축해보는 과정을 설명드렸어요!

Tensorflow 환경을 구축하는건 나중에 tensorflow로 개발을 시작할때 설명해보도록 할게요~



다음글에서는 VS code IDE에서 docker의 파일들을 연동하여 개발하는 방법에 대해서 알아보도록 할게요!







[글 래퍼런스]

http://swartist.blogspot.com/2018/02/docker.html



[사진 래퍼런스]

사진1

https://www.docker.com/resources/what-container

사진2

https://itnext.io/how-to-install-kafka-using-docker-a2b7c746cbdc

사진3

https://collabnix.com/deploying-application-in-the-gpu-accelerated-data-center-using-docker/

사진4

https://medium.com/platformer-blog/practical-guide-on-writing-a-dockerfile-for-your-application-89376f88b3b5

사진5

https://www.researchgate.net/figure/High-level-overview-of-Docker-architecture_fig1_308050257

사진6

https://www.claranet.de/blog/2018-04-12-wie-funktionieren-docker-container