지난번에 도커의 장점에 대해 이야기 했었습니다.
그런데 어느정도 무거운 작업(컨볼루션, RNN등)을 하려면 GPU 사용이 필요합니다.
Docker는 리눅스 기반의 컨테이너이기 때문에, 리눅스 환경에서 GPU 환경을 구축해서 테스트 해봤고, 잘 실행되는것을 확인했습니다. (윈도우, 맥은 확인안해봤습니다. 만, 윈도우와 맥은 가상의 환경을 구축하고 컨테이너가 올라가는 방식이라..)
CUDA, cuDNN을 설치하지 않고도 GPU환경을 구축 할 수 있다니, 너무 좋습니다.
이 페이지를 참조해 설치했으며, 순서는다음과같습니다.
- GPU 사용 가능 확인
- Nvidia-docker설치
- tensorflow-gpu docker실행
첫번째로, 그래픽 드라이버를 설치하고 다음 명령을 실행합니다. 저는 Ubuntu 18.04LTS 환경에서, 시스템 설정의 그래픽 드라이버 업데이트를 사용해 그래픽 드라이버를 설치했습니다. 드라이버를 설치한 후 다음 명령을 입력해서 확인해주세요.
lspci | grep -i nvidia
오늘(2020/11/02) 확인해보니 조금 바뀌었네요. 이곳을 참고해 주세요. 저는 우분투 환경에서 설치를 진행 했고, 다음 명령을 입력하시면 됩니다.
curl https://get.docker.com | sh \
&& sudo systemctl start docker \
&& sudo systemctl enable dockerdistribution=$(. /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.listsudo apt-get install -y nvidia-docker2sudo systemctl restart docker
마지막으로, GPU를 지원하는 tensorflow의 도커 이미지를 받아서 실행합니다.저는 tensorflow-gpu를 제공하는 도커 이미지를 베이스로 빌드해서 사용 했습니다. Dockerfile 파일을 생성한 후, 다음의 내용을 입력해 주세요.
maintainer에는 적당히 자신의 이메일등을 입력하면 될 듯 합니다. 추가로 설치할 요소가 있으면 RUN을 이용해 설치 해주세요.
설치 과정에 시간 설정 문제가 있어, ENV 항목을 추가했습니다. RUN의 apt-get과 pip3를 통해 설치하는 부분은 자유롭게 수정하시면 될 것 같습니다.
FROM tensorflow/tensorflow:2.2.0-gpu
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
MAINTAINER inaj012@gmail.com
RUN apt-get -y update
RUN apt-get -y install python3-pip
RUN pip3 install --upgrade pip
RUN pip3 install jupyter
RUN pip3 install gym
RUN pip3 install matplotlib
RUN pip3 install seaborn
RUN apt-get -y install python3-skimage
빌드 명령은 아래와 같습니다. 태그명은 빌드할 이미지의 태그명을 입력해 주시면 되고, Dockerfile 위치는 Dockerfile 파일이 있는 위치를 입력하시면 됩니다.
docker build -t {태그명} {Dockerfile 위치}
예를 들어, 도커 이미지 명을 my_rl_env:2.2.0-gpu 로, Dockerfile이 현재 디렉토리에 있다면, 다음과 같습니다.
docker build -t my_rl_env:2.2.0-gpu .
마지막으로, 실행은 다음 명령을 사용했습니다. 저는 Jupyter를 사용해 테스트해봤으며, 로컬 8888포트로 jupyter를 띄우기 위해 열어주고(-p 8888:8888), 호스트 pc의 /home/pythonws를컨테이너의 /home/py폴더에 마운트해서 작업했습니다(-v ${PWD}/pythonws:/home/py). 이미지명은 제가 빌드해서 업로드한 이미지를 사용했습니다(dkslfjskajd/ihwoo-tf:2.2.0-gpu). --gpus all --rm은 nvidia-docker를 위한 옵션입니다.
docker run --gpus all -it -p 8888:8888 -v ${PWD}/pythonws:/home/py --rm dkslfjskajd/ihwoo-tf:2.2.0-gpu
컨테이너에 진입한 후, 다음 명령을 실행해 Jupyter를 실행합니다. 0.0.0.0에서 8888포트를 사용하겠다는 옵션입니다.
jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root
테스트 코드는 위키북스의 [시작하세요,텐서플로 2.0프로그래밍]을 참고했으며, gpu 모니터링은 gmonitor를 사용했습니다. gmonitor는 다음페이지의 설치 페이지를 참고했습니다.
실행한 결과는 다음과 같습니다. GPU가 잘 사용되는 것을 확인할 수 있습니다.