Pocketflow 에서 Multi-GPU를 돌리기 위해서는 docker / seven 환경을 이용해야 한다고 되어 있다.
그러나, seven 은 Pocketflow를 개발한 tecent의 내부 tool을 이용하기 때문에 실제로는 사용할 수 없다.
따라서 본 포스팅은 docker 를 활용하여 multi-gpu 버전 pocketflow 환경을 세팅하는 과정을 서술한다.
docker는 일종의 가벼운 VM인데, 이에 대해 설명하려면 포스팅이 너무 길어지므로
docker에 대하여 어느정도 알고 있다고 가정하고 서술하였다.
본격적인 설명 전에 짚고 넘어가야 하는 부분이 있다.
Pocketflow의 Tutorial site는 현재 시점(2019-12-27)에서는 참고할 만한 것이 못된다.
Pocketflow 개발사 Tecent는 이 framework에 대한 update를 중단한 상태라서,
docker image를 비롯한 대부분의 link가 깨져있다.
또한 기본 script에서 pip url이나, pretrained model download link등을 인트라넷으로 설정해놓았기 때문에 이또한 사용할 수 없다. (이왕 public에 공개할 거면 이정도 문제는 수정하고 나와야 하는 것이 아닌지?)
따라서 본 포스팅은 uber/horovod image를 다운받아 관련 package를 다운 받는 것부터 시작한다.
1. docker image 다운
-pocketflow는 더 빠른 gpu training을 하기 위하여 uber에서 만든 horovod 라이브러리를 활용한다.
-docker hub에서 uber/docker 를 검색하여 docker image를 다운 받아 사용하는 것이 편하다.
-해당 image들은 현재 시점에서 deprecated되어 있지만 (horovod/horovod로 옮겨짐) Pocketflow 자체도 deprecated된 libraray로 구성되어 있기 때문에..그대로 사용하도록 한다.
-이때, 각 이미지들은 tensorflow/python 버전에 따라 각각 다른 tag가 달려있는데, 0.15.2-tf1.12.0-torch0.4.1-py3.5 tag를 지정하여 다운받도록 한다.
--> $docker pull uber/horovod:0.15.2-tf1.12.0-torch0.4.1-py3.5
-pip list를 쳐서 다음과 같은 환경이 구성되었는지 확인한다.
2. 관련 package 설치
-다운 받은 image에 pocketflow에 필요한 패키지들을 설치한다.
-Pocketflow의 main.sh에 해당 과정이 들어있기는 하지만, 해당 pip url은 Tecent 인트라넷이기 때문에 정상적인 다운이 불가능하기 때문이다.
-필요한 패키지 목록은 다음과 같으며 $pip install [package이름] 으로 설치 가능하다:
docopt, hdfs, numpy, scipy, sklearn, pandas, mpi4py |
3. image commit
-docker에 익숙한 사람들은 알겠지만, 위와 같이 설치해도 해당 container를 끄는 순간 내가 수정한 사항들은 모두 삭제된다. 따서 위와 같이 설치한 package들이 사라지지 않게 image를 새로 commit한다.
-$docker ps -a 로 현재 돌고 있는 container의 container id를 찾은 후,
-$docker commit [Container ID] [ImageName:tag] 로 저장한다.
-$docker images로 해당 image가 저장되었는지 확인까지 하면 든든~
4. Pocketflow script 수정
- 2에서 관련 package들을 직접 설치하였기 때문에, main.sh에서 pip 관련된 line을 전부 주석처리한다.
-또한, scripts/run_docker.sh 파일에서 3에서 저장한 image를 load할 수 있게 수정한다.
-그리고, docker의 gpu동작을 위하여 docker run 이후 --gpus all 옵션을 추가한다.
-이렇게 하는 이유는, 현재 시점(2019-12-27)에서 nvidia-docker가 더이상 사용되지 않기 때문이다. 매우 중요한 부분이므로, 반드시 수정해 주도록 하자.
-최종 line은 다음과 같은 식으로 표현된다. (예시에서는, 이미지 tag를 tf1.12.0-cuda9.0 으로 지정하여 commit하였음)
------------------
여기까지 진행하면 일단 pocketflow를 실행하는 수준까지는 가능하다.
그러나 이상태에서 돌리면,
라는 에러가 뜨며 training이 종료된다.
docker로 구성한 가상환경에서 pretrained model을 찾지 못해 생기는 에러이다.
왜인지는 모르겠지만 Pocketflow python 코드에서는, pretrained model을 URL에서 직접 다운받아 사용받게 되어있는데,
문제는 해당 URL도 역시 깨져있기 때문에 이러한 에러가 발생하는 것이다.
이는 container를 실행하기 전에 host에서 pretrained model을 다운받아 놓은 폴더를 /opt/ml/model로 mount하면 해결될 수 있을 것 같다.
해당 과정은 다음 포스팅에 이어서 설명하려 한다.
'환경설정 log' 카테고리의 다른 글
Horovod + tensorflow 설치 및 세팅까지 (1) (2) | 2019.12.24 |
---|---|
mpi4py 오류 해결 log (1) | 2019.12.14 |
retinaNet-tensorflow 세팅 log (0) | 2019.09.23 |