본문 바로가기
DevOps/Docker

Docker (4) - 3줄로 간단히 머신러닝/딥러닝 환경 구축하기(docker kaggle image 설치/활용하기)

by 썽하 2020. 7. 20.

이번 글은 내가 도커를 학습한 이유이다. 환경이 바뀔 때마다 매번 ML/DL 환경을 구축하는 게 귀찮았고, 타 개발자들이랑 서버를 섞어 쓰다 보면 내 의지가 아니더라도 환경이 꼬이는 경우가 있다. 그런 상황들이 싫어서 docker를 활용하고자 했고, 예상보다 훨씬 간편하게 환경 구축을 할 수 있어서 놀랐다. 이번 글은 내가 진행한 3줄짜리 환경 구축과 간단한 활용까지 진행해 볼 예정이다.

 

개발환경

 

왜 Kaggle 이미지를 사용하는가?

  • Kaggle-kernel 전용 대회에서 머신러닝을 진행하고 싶다면 단순히 이미지를 rebuild 함으로써 최신 상태로 유지할 수 있다.
  • GPU 지원이 빵빵하다.
  • XGBoost 등 유명 Boosting 계열의 패키지를 지원한다.
  • 이미지에 포함된 패키지 목록은 kaggle 커뮤니티에 의해 만들어졌고, 따라서 내가 모르던 패키지에 대한 정보를 습득함으로써 견문을 넓힐 수 있다. 또한 내가 패키지 목록을 직접 작성하지 않아도 된다.
  • 유지 관리가 Kaggle 공식 github에서 된다. 그래서 뭔가 느낌이 기성품 같아서 신용이 간다.

사실 나도 이 이미지로 제대로 된 머신러닝을 돌려본 것 이 아니기 때문에, 위 Kaggle의 장점은 인터넷에서 볼 수 있는 내용을 나열한 수준이다. 만약 사용하다가 더 나은 옵션이 발견된다면, 이 글을 수정해서 기록을 남길 예정이다.

 

3줄만에 Kaggle Image 설치하기

첫 번째 줄. git 도커 이미지를 다운로드하자.

git clone https://github.com/Kaggle/docker-python.git

처음에 왜 docker hub에서 pull 하지 않고 github에서 받을까 궁금했는데, kaggle의 docker hub 저장소에 가니 답이 나왔다. 아래와 같이 설명되어있다. kaggle docker hub는 더 이상 관리되지 않는 듯하다.

This repo was formerly an automated build, but is now handled by our own worker machines. The 
Last Pushed  subtitle is correct, though the Hub's build list is out of date, and the Dockerfile tab on the Hub is stale. Please see our Github repo for all current info.

두 번째, 세 번째 줄. 이미지를 빌드하자.

cd docker-python
./build --gpu

--gpu 옵션을 빼면 cpu버전으로 빌드된다.

또한, 여러 번 빌드할 예정이라면 --use-cache 옵션을 줄 경우 빌드가 빨라진다고 한다.

첫 번째 빌드는 약 10분 정도 소요된다.

 

... 설치가 끝났다. 단 세줄로!

 

Kaggle Image 활용하기

shell에 접속해서 활용해보기

docker run --runtime nvidia --rm -it kaggle/python-gpu-build /bin/bash
# cpu의 경우 docker run --rm -it kaggle/python-build /bin/bash
python
import xgboost
import tensorflow as tf
tf.test.is_gpu_available()

위 스크립트를 쳤을 때 에러가 없다면 성공적으로 실행이 된다는 것이다.

성공적인 실행 예

jupyter notebook환경으로 활용해보기

jupyter 환경으로 실행시키려면 스크립트가 꽤나 길다. 매번 칠 수 없으니 bash_profile에 스크립트를 저장한다.

vi ~/.bash_profile

#최하단에 다음 문구 추가
kjupyter() {
    docker run  --runtime=nvidia -v $PWD:/tmp/working \
    -v /data:/tmp/working/data -w=/tmp/working \
    -p 8888:8888 --rm -it kaggle/python-gpu-build bash \
    -c "pip install tornado==4.5.3; \
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64; \
    pip install jupyter_contrib_nbextensions; \
    pip install jupyter_nbextensions_configurator; \
    jupyter contrib nbextension install --user; \
    jupyter notebook --notebook-dir=/tmp/working --ip='*' --port=8888 --no-browser --allow-root"
}

#저장 후 실행
source ~/.bash_profile 

여기에서 옵션은 개인의 기호에 맞게 수정한다.

-v : 마운트 옵션이다. 데이터가 있는 위치를 맵핑해주면 된다.

-w : 컨테이너 안의 프로세스가 실행될 디렉터리를 설정한다.

-p : 포트 포워딩이다. jupyter 포트와 동일하게 해 주면 된다.

 

이제 언제든 kjupyter라고 치기만 하면 자동으로 일부 패키지 설치 후 jupyter notebook이 실행된다!

빨간줄과 비슷한 문구가 보이면 성공

브라우저를 통해 localhost:8888로 접속을 해보자.

ip와 포트는 <컨테이너를 실행한 머신 ip:위 kjupyter에 설정된 port>로 설정하면 된다.

로컬 환경에서 kaggle 컨테이너 notebook까지 이상 없이 접속되었다.

파이썬 노트북을 하나 생성해서 테스트해보자

tensorflow와 xgboost, gpu 활용까지 모두 잘된다.

 

Reference

 

여태까지 Docker활용을 미뤄왔는데 막상 설치/활용해보니 너무 간단해서 허무하다. 여태껏 왜 그 고생을 하면서 환경 설정을 하며 애를 썼는지 시간이 아깝기도 하다. 더 게으른 개발자가 되기 위해 열심히 배워야겠다.

댓글