Updated on 2019.11.11 : VS Code 및 쉘스크립트화, 대대적인 리팩토링

Shared on Tensorflow KR facebook group. 텐ㅡ하!

제가 처음 우분투를 설치했을때, Anaconda를 이용해서 TensorFlow를 설치했습니다. 하지만, 실험 중 사고(?)로 우분투 OS가 손상되었고, 실험컴퓨터 전체를 포맷하는 아픔을 겪었습니다. 우분투 부팅디스크 만들고, OS 다시깔고, nvidia 드라이버설치, CUDA, CuDNN, anaconda 설치, openCV 설치… 재앙이 따로없었습니다.

그래서 지난 1년간 Docker를 도입해 이러한 스트레스에서 완전히 벗어났습니다.
더불어 얼마 전 Tensorflow2.0과 여러 환경이 바뀜에 따라, 새로운 가이드를 준비했습니다.

이 가이드만 따라하면, 아래와 같은 환경에서 작업할 수 있습니다.

0. 왜 Docker를 사용해야 할까?

“여러분이 열심히 구축한 컴퓨터 환경은 결국 한번쯤 포맷하게 됩니다.”

컴퓨터로 딥러닝을 돌리다보면 자칫 메모리가 넘치기 일쑤고, 우분투를 자유자제로 다루지 못한다면 삽질을 피할 수 없습니다.
전자공학과 눈물

하지만 도커를 사용하면 정말 간단하게 환경을 구축할 수 있는 것은 물론 다음과 같은 장점이 있습니다.

Docker에 대해 낯설다면, 아래 문서를 참고하시는 것을 추천드립니다.

그럼, 본격적으로 시작해보겠습니다.

via GIPHY

이만큼 쉽습니다

1. 설치 준비하기

아직 그래픽드라이버를 설치하지 않으셨다면, 아래 포스트에서 설치를 완료해주세요.

Ubuntu 18.04 설치 #1 기본 운영체제의 설치

설치의 편의성을 위해, 모든 과정을 통합해서 쉘 스크립트로 준비했습니다.
자세한 내용은 github repository를 참고해주세요.

먼저, repository를 받아옵니다.

git clone https://github.com/eungbean/Docker-for-AI-Researcher
cd Docker-for-AI-Researcher

1. 모든게 귀찮으신 분들을 위해 4줄요약

설명을 들을 필요 없다, 그냥 믿고 설치하겠다 라고 하시는 분은 아래 명령어만 쭉쭉 실행시키시면 됩니다.
아니면 설명과 함께 진행하고 싶으신 분은, [### 3. Terminal Setup] 파트로 넘어가주세요.


# Terminal Setup
sudo sh ./01-terminal-setting.sh

# Docker installation
sudo sh ./02-docker-setup.sh

# (선택1) Jupyterlab
sudo docker run --gpus all -it \
-p 8888:8888 -p 6006-6015:6006-6015 \
-v ~/docker:/data \
--name lab \
--ipc=host eungbean/deepo:lab \
jupyter lab --no-browser \
--ip=0.0.0.0 \
--allow-root \
--NotebookApp.token= --notebook-dir='/data'

# Jupyterlab 설치하셨으면 아래 passwd 설정을 꼭 따라해주세요.

# (선택2) VSCODE
sudo docker run --gpus all -it \
-p 7000:8080 -p 7006-7015:6006-6015 \
-v ~/docker:/data \
--name code \
-e PASSWORD="0000" \
--ipc=host eungbean/deepo:code /coder/code-server

# alias 설정
sudo sh ./04-alias.sh

더 설정할 것들

끝!


3. Terminal Setup

자, 천천히 따라오실 분들은 이곳부터 보시면 됩니다.

sudo sh ./01-terminal-setting.sh

우분투 설치 직후 필수적인 패키지들을 설치합니다.
필수적인 Z shell과 플러그인, 그리고 모니터링 툴을 함께 설치합니다.### 1. 모든게 귀찮으 신 분들을 위해 4줄요약

설치되는 것들

  • Terminal tools
    • zsh
    • oh-my-zsh
    • zsh-syntax-highlighting
    • zsh-autosuggestions
    • neovim
    • spacevim
    • powerline font
  • GPU Monitoring tools
    • gpustat
    • glances[gpu]
  • git
  • ssh

4. Docker installation

sudo sh ./02-docker-setup.sh

Docker installation 공식 가이드를 쉘스크립트로 만들었습니다.
이에 더해, nvidia-docker 설치과정도 포함했습니다.
더 자세한 내용은 해당 링크를 참고해주세요.

설치되는 것들

아래와 같은 화면이 뜨면, 도커 안에서 gpu가 인식되며 설치가 성공한 것입니다.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
(이하 생략)

5. Dockerfile build and deploy container

Tensorflow에서 제공 공식이미지가 있지만, 저는 딥러닝 연구자들을 위해 구성된 ufoym/deepo 이미지를 설치하는 것을 강력추천드립니다. 이 이미지는 아래와 같은 장점이 있습니다.

. modern-deep-learning dl-docker jupyter-deeplearning Deepo
ubuntu 16.04 14.04 14.04 18.04
cuda ✖️ 8.0 6.5-8.0 8.0-10.0/None
cudnn ✖️ v5 v2-5 v7
onnx ✖️ ✖️ ✖️ ⭕️
theano ✖️ ⭕️ ⭕️ ⭕️
tensorflow ⭕️ ⭕️ ⭕️ ⭕️
sonnet ✖️ ✖️ ✖️ ⭕️
pytorch ✖️ ✖️ ✖️ ⭕️
keras ⭕️ ⭕️ ⭕️ ⭕️
lasagne ✖️ ⭕️ ⭕️ ⭕️
mxnet ✖️ ✖️ ✖️ ⭕️
cntk ✖️ ✖️ ✖️ ⭕️
chainer ✖️ ✖️ ✖️ ⭕️
caffe ⭕️ ⭕️ ⭕️ ⭕️
caffe2 ✖️ ✖️ ✖️ ⭕️
torch ✖️ ⭕️ ⭕️ ⭕️
darknet ✖️ ✖️ ✖️ ⭕️

아래 명령어를 통해 deepo 이미지를 당겨옵니다. 저는 CUDA10과 jupyter가 포함된 ufoym/deepo이미지를 사용하겠습니다.

sudo docker pull ufoym/deepo

6. Deploy container

웹상에서 바로 접속해서 쓸 수 있는 개발환경으로 Jupyterlab과 VS Code, 두가지 버전을 준비했습니다.
취향에 맞게 골라쓰세요!

6-0. 저장소 설정하기

도커는 컨테이너가 독립적으로 구동되어, 컨테이너를 종료하게 되면 모든 저장내용이 사라집니다.
따라서 컴퓨터와 컨테이너간의 폴더를 지정하여 연결시켜주어야 합니다.

먼저 컨테이너와 데이터를 공유할 폴더를 만들어줍니다.

mkdir ~/docker

이 곳에 작업할 데이터(dataset, source codes)들을 넣어주세요.
이제 이 폴더에 파일을 넣으면 docker 컨테이너에서 접근할 수 있습니다.
-v 옵션을 이용해 폴더를 지정해줍니다.

6-1. (선택1) Jupyterlab

이에 더불어, 제가 지난 1년간 jupyter를 사용해오며 유용한 플러그인들을 포함해 새로운 이미지를 만들었습니다. jupyter notebook의 상위호환인 jupyterlab 을 사용하며, 여러가지 유용한 플러그인을 함께 설치합니다. eungbean/deepo:lab 이미지는 아래 패키지들을 설치합니다.

설치되는 것들

additional pip packages

Jupyter lab extentions

아래 명령어를 통해 eungbean/deepo:lab이미지를 당겨오고 실행시킵니다.

sudo docker run --gpus all -it \
-p 8888:8888 -p 6006-6015:6006-6015 \
-v ~/docker:/data \
--name lab \
--ipc=host eungbean/deepo:lab \
jupyter lab --no-browser \
--ip=0.0.0.0 \
--allow-root \
--NotebookApp.token= --notebook-dir='/data'

이렇게 실행시킬 경우, host의 ~/docker 폴더는 컨테이너의 /data에 보입니다.


(선택) Dockerfile 역시 포함하고 있습니다.
pull 대신 직접 빌드하고 싶으신 분은, 아래 명령어를 실행해 build해 줍니다.

sudo docker build --tag eungbean/deepo:lab .

위 과정이 완료되면, 아래 명령어를 실행시켜 구동을 확인합니다.

sudo docker run --gpus all --rm eungbean/deepo:lab nvidia-smi

아래와 같은 화면이 뜨면, 이미지 빌드가 성공한 것입니다.


6-2. (선택2) VS Code

웹버전 VS Code도 사용할 수 있습니다.
아래 명령어를 실행시켜 설치하되, 두가지만 수정해주세요.

sudo docker run --gpus all -it \
-p 7000:8080 -p 7006-7015:6006-6015 \
-v ~/docker:/data \
--name code \
-e PASSWORD="0000" \
--ipc=host eungbean/deepo:code /coder/code-server

자세한 내용은 포스트: VS CODE를 웹 상에 띄워놓고 어디서든 코딩하기를 참고해주세요.


6-4. 현재 실행중인 컨테이너 보기

지금까지 따라했다면, 터미널에 jupyter 가 실행되고 있을겁니다.

(번외) docker 기본 명령어 모음

  1. 컨테이너 빠져나가기: $ exit
  2. 컨테이너 다시 실행시키기: $ docker attach ${container ID}
  3. 컨테이너 목록 확인하기: $ docker ps -a
  4. 컨테이너 중지하기: $ docker stop ${container ID}
  5. 컨테이너 제거하기: $ docker rm ${container ID#1} ${container ID#2}
  6. 이미지 목록 확인하기: $ docker images
  7. 이미지 다운로드 하기: $ docker pull
  8. 이미지 삭제하기: $ docker rmi ${image ID}
  9. 컨테이너 로그 보기: $ docker logs --tail 10 ${container ID}
  10. 실시간 컨테이너 로그 보기: $ docker logs -f ${container ID}
  11. 실행중인 컨테이너에 명령 실행하기: $ docker exec [option] container command [arg ..]

아래 기능들이 필요면 argument를 추가해서 함께 실행해줍니다.

# 일회용 : containter를 종료하면 container 삭제하기
docker run ..
--rm \
# Webcam 사용하기
--device=/dev/video0 \
..

7. Docker의 쉘에 쉽게 접속하자!

7-1. alias 설정하기

만약 위 설명을 따라서 ‘ufoym/deepo’의 jupyter version을 설치했다면 쉘 명령어를 쓰기가 난감합니다. 가끔 쉘에 접속할 필요가 있을 때가 있는데, 이를 위해서는 다음 명령어를 실행시켜야 합니다.

#tf2j 컨테이너 쉘에 접속하기
docker exec -it lab /bin/bash/

하지만 매번 이렇게 쓰는건 정말 번거롭습니다.
그래서 단축키 (alias)를 설정해주겠습니다.

이 과정 역시 shell script로 만들어놓았습니다. 여러분은 zsh를 쓰는 힙스터일테니 zsh가 아직 없다면 꼭 설치하셔야 합니다!

sudo sh ./04-alias.sh

이제 터미널에서 lab를 입력하면 해당 컨테이너의 쉘로 접속합니다! 정말 편리하죠.
뿐만 아니라, 아래와 같은 유용한 단축키도 함께 설정합니다.


8. 도커 허브 이용하기

Docker를 이용해 작업을 하다보면, 이미지에 없는 패키지를 컨테이너에 설치해서 사용할 때가 있습니다.
그럼 나만의 컨테이너가 만들어지는데요, 이런 컨테이너를 어떻게 백업할 수 있을까요?

이런 경우 git처럼 컨테이너 자체를 commit 후 DockerHub에 push를 해서 업데이트 할 수 있습니다.

자세한 내용은 아래 포스트를 참고해주세요.


9. ssh를 통해 원격에서 접속하기

그리고 노트북을 이용해 서버에 편리하게 접속해서 작업하는 방법도 꼭 설정하세요.


10. Jupyterlab 보안 설정하기

  1. 새 jupyter notebook을 만들고, 암호를 설정합니다.
In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:f24baff49ac5:863dd2ae747212ede58125302d227f0ca7b12bb3'
  1. 터미널에서 다음과 같이 실행시킵니다.
# jupyter notebook --generate-config
Writing default config to: ~/.jupyter/jupyter_notebook_config.py

# vi ~/.jupyter/jupyter_notebook_config.py
  1. 다음 내용을 입력합니다.
# Password to use for web authentication
c = get_config()
c.NotebookApp.password =
u'sha1:f24baff49ac5:863dd2ae747212ede58125302d227f0ca7b12bb3'
  1. container를 stop후 다시 실행시키면, 암호를 물어보기 시작합니다.
    $ docker stop lab
    $ docker start lab  
    

11. Ubuntu SSH 보안설정


축하합니다!

여기까지 하셨으면 이제 딥러닝 환경구축이 끝났습니다.

그럼, 좋은 연구 하세요!

오늘도 클리어!

via GIPHY


References

Comments

Eungbean Lee's Picture

About Eungbean Lee

Lee is a Student, Programmer, Engineer, Designer and a DJ

Seoul, South Korea https://eungbean.github.io