Docker 컨테이너 CNTK

Linux 시스템에서 Docker 컨테이너로 CNTK 설정할 수 있습니다.

CNTK Docker 컨테이너를 사용하는 방법에는 두 가지가 있습니다.

Docker Hub 게시된 CNTK 이미지 사용

Docker Hub 공용 CNTK 이미지를 호스트합니다. Docker Hub CNTK 리포지토리 페이지에서 사용할 수 있는 이미지의 전체 목록을 참조하세요. 현재 런타임 구성만 호스트합니다. 런타임 구성은 CNTK 이진 패키지가 설치되고 구성된 환경에 해당합니다. 이 구성에는 CNTK 소스 코드나 CNTK 빌드하는 데 필요한 필수 구성 요소가 포함되어 있지 않습니다.

CNTK GPU 사용 이미지를 사용하려면 NVIDIA Docker가 필요합니다.

표준 Docker 명령은 이미지를 가져오는 데 사용됩니다.

docker pull mcr.microsoft.com/cntk/release

최신 공식 릴리스 이미지를 가져옵니다. 즉, 현재 사용 가능한 최신 GPU 런타임 구성을 의미합니다. 또한 최신 개발 야간 이미지를 얻을 수 있습니다.

docker pull mcr.microsoft.com/cntk/nightly

특정 구성을 얻으려면 태그를 추가해야 합니다. 예:

docker pull mcr.microsoft.com/cntk/release:2.7-cpu-python3.5

는 Python 3.5에 대해 CNTK 2.7 CPU 런타임 구성을 설정합니다.

Docker에 익숙하지 않은 경우 이 페이지에서 아래 섹션 을 읽어보세요.

Docker 컨테이너를 사용하여 CNTK Jupyter Notebook 자습서 실행

CNTK Docker 컨테이너를 사용하여 로컬 환경에서 CNTK Jupyter Notebook을 실행할 수 있습니다.

Docker Hub 필요한 이미지를 이미 끌어왔다고 가정합니다. 아래 예제에서는 GPU 구성을 사용합니다. CPU 구성을 사용하는 경우 아래 명령에서 모든 항목을 .로 바꿉니다 nvidia-dockerdocker.

먼저 IP 포트가 노출된 분리 모드에서 CNTK 컨테이너를 만들고 시작합니다(Jupyter Notebook 애플리케이션의 기본 포트 8888 사용).

nvidia-docker run -d -p 8888:8888 --name cntk-jupyter-notebooks -t mcr.microsoft.com/cntk/release

이제 Docker 컨테이너에서 Jupyter Notebook 서버를 시작합니다.

docker exec -it cntk-jupyter-notebooks bash -c "source /cntk/activate-cntk && jupyter-notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/cntk/Tutorials --allow-root"

터미널에 Jupyter Notebooks 서버의 콘솔 출력이 표시됩니다. 이 출력은 다음과 같은 줄을 포함합니다.
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

표시된 토큰을 복사합니다(이 예제 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7에서는).

이제 Docker 컨테이너를 실행하는 컴퓨터의 IP 주소를 사용하여 CNTK Jupyter Notebook에 액세스할 수 있습니다. 즉, 컴퓨터 주소가 192.168.1.1 CNTK Notebook에 액세스하는 경우 브라우저 창을 열고 .http://192.168.1.1:8888

첫 번째 실행 중에 Jupyter Notebook 애플리케이션은 암호 또는 토큰을 요청합니다. 위에서 저장한 토큰을 사용합니다.

목성 노트북 서버 콘솔 출력이 있는 터미널에서 Jupyter Notebook 서버 송신 Ctrl-C 시퀀스를 중지하고 서버 종료를 확인합니다. Docker 컨테이너 자체는 중지 되지 않습니다 . 컨테이너를 중지하려면 다음 명령을 사용합니다.
docker stop cntk-jupyter-notebooks

경고! 위의 명령은 Docker 컨테이너를 실행하는 컴퓨터의 IP 주소에 액세스할 수 있는 모든 사용자에게 Jupyter Notebook 애플리케이션을 노출합니다.

CNTK Docker 이미지 빌드

동일한 컨테이너를 사용하여 CNTK 빌드하고 실행할 수 있으며 이는 참조 구성을 재현하는 데 권장되는 방법입니다.

먼저 docker를 설치해야 합니다. 공식 Docker 설명서의 설치 프로세스를 따르는 것이 좋습니다. Linux 배포와 함께 제공되는 버전은 오래되어 작동하지 nvidia-docker 않을 수 있습니다(동일한 컨테이너 내에서 GPU 이미지를 빌드하고 실행하려는 경우 docker 외에 설치해야 할 수 있음). Docker 그룹 만들기라는 선택적 섹션의 지침도 따라야 합니다.

특파원 Docker 파일은 CNTK 리포지토리에 있습니다.https://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

CNTK 모든 종속성을 사용하여 Docker 이미지를 빌드하려면 CNTK 리포지토리를 복제하고 CNTK/Tools/docker 빌드하려는 Dockerfile(CPU 또는 GPU)으로 이동하여 사용합니다. 예를 들어 CNTK GPU docker 이미지를 빌드하려면 다음을 실행합니다.

docker build -t cntk -f CNTK-GPU-Image/Dockerfile .

-f <path/to/Dockerfile> CPU 및 GPU dockerfile 모두에 공통적인 일부 패치를 SWIG 소스 코드에 적용해야 하기 때문에 인수가 필요합니다. DNS 서버의 IP 주소를 Docker에 제공해야 한다는 Could not resolve 'archive.ubuntu.com' 오류가 표시되는 경우 먼저 명령을 사용하여 DNS 서버의 IP 주소를 찾습니다.

nm-tool

또는 명령

nmcli dev show

DNS 서버의 IP는 다음과 x.y.z.w같습니다a.b.c.d. 결과

  • Ubuntu 15.10 이상(또는 systemd를 사용하는 다른 Linux)에서 docker 디먼이 추가 옵션으로 시작되도록 수정 /lib/systemd/system/docker.service--dns a.b.c.d --dns x.y.z.w
  • Ubuntu 15.04 및 이전 버전(또는 systemd를 사용하지 않는 다른 Linux)에서 줄을 편집 /etc/default/docker 합니다.
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    가 주석 처리되지 않고 DNS 서버의 IP 주소를 포함합니다.

참고: 일부 회사에서는 8.8.8.8 및 8.8.4.4와 같은 공용 DNS 서버를 차단합니다. 사용할 수 있지만 문제가 지속되면 보고 nm-tool/nmcli한 DNS 서버 IP 주소를 사용해야 합니다.

를 통해 Docker 디먼을 다시 시작합니다.

sudo service docker restart

잘못된 DNS 설정으로 만든 Docker 이미지를 삭제합니다. 모든 Docker 이미지를 삭제하려면

docker rmi $(docker images -q)

모든 Docker 컨테이너를 삭제하려면 다음을 수행합니다.

docker rm $(docker ps -a -q)

이제 다시 시도

docker build -t cntk -f CNTK-GPU-Image/Dockerfile .

GPU가 있는 경우 이미지를 빌드한 후 Docker 컨테이너를 통해 액세스할 수 있는지 테스트합니다. 다음 명령을 사용하세요.

docker run --rm cntk nvidia-smi

작동하면 완료됩니다. 그렇지 않은 경우 호스트와 CNTK docker 이미지에 설치된 CUDA 버전 및/또는 드라이버가 일치하지 않음을 의미합니다. 특히 커널 모드 NVidia 드라이버 모듈과 사용자 모드 모듈(공유 lib) 간에 불일치가 발생하며 호스트의 버전이 컨테이너의 버전과 정확히 일치하지 않는 경우 발생합니다. 다행히 이 문제는 쉽게 해결할 수 있습니다. nvidia-docker를 설치하고 docker와 똑같이 사용합니다(이미지를 다시 빌드할 필요가 없음).

nvidia-docker run --rm cntk nvidia-smi

이렇게 하면 CNTK docker 컨테이너 내에서 GPU를 사용할 수 있습니다. 이것이 작동하지 않으면 nvidia-docker GitHub 문제 섹션을 검색합니다. 많은 솔루션이 이미 문서화되어 있습니다. /usr 및 /var 디렉터리를 다른 파티션에 있는 경우 다음과 같은 몇 가지 추가 단계가 필요합니다. 종료 후 자동으로 삭제 되지 않는 컨테이너에 대화형 셸을 얻으려면

nvidia-docker run --name cntk_container1 -ti cntk bash

호스트(컴퓨터 또는 VM)와 CNTK 사용하는 컨테이너 간에 데이터 및 구성을 공유하려면 -v 옵션(예:

nvidia-docker run --name cntk_container1 -ti -v /project1/data:/data -v /project1/config:/config cntk bash

이렇게 하면 호스트의 /project1/데이터가 컨테이너의 /data로 표시되고 /project1/config가 /config로 표시됩니다. 이러한 격리는 컨테이너화된 실험이 잘못된 데이터를 덮어쓰거나 사용할 가능성을 줄입니다.