CNTK Docker 容器
您可以將CNTK設定為 Linux 系統上的Docker 容器。
使用 CNTK Docker 容器的方式有兩種:
使用在 Docker Hub 發佈的CNTK映射
我們會在 Docker Hub 裝載公用CNTK映射。 請參閱Docker Hub CNTK存放庫頁面提供的完整映射清單。 我們目前只裝載 執行時間 組態。 執行時間設定會對應至已安裝和設定CNTK二進位套件的環境。 此組態不包含CNTK原始程式碼,也不包含建置CNTK所需的必要條件。
請注意,您需要NVIDIA Docker才能使用已啟用 GPU 的映射CNTK。
標準 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
將會讓您CNTK針對 Python 3.5 設定的 2.7 CPU 執行時間組態。
如果您不熟悉 Docker,請閱讀此頁面 下方的章節 。
使用 Docker 容器執行CNTK Jupyter Notebook教學課程
您可以使用 CNTK Docker 容器,在本機環境中執行CNTK Jupyter Notebook。
我們假設您已經從Docker Hub提取必要的映射。 在下列範例中,我們將使用 GPU 組態。 如果您使用 CPU 組態,請在下列命令中,將所有出現的 nvidia-docker
取代為 docker
。
首先,使用公開的 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 Notebooks 會開啟瀏覽器視窗,然後移至 http://192.168.1.1:8888
。
請注意,在第一次執行期間,Jupyter Notebook應用程式會要求密碼或權杖。 使用您先前儲存的權杖。
若要停止終端機中的Jupyter Notebook伺服器傳送 Ctrl-C
順序,其中您有 Jupiter Notebook 伺服器主控台輸出,並確認關閉伺服器。 請注意,它 不會 停止 Docker 容器本身。 若要停止容器,請使用 命令:
docker stop cntk-jupyter-notebooks
警告! 上述命令會將 Jupyter Notebooks 應用程式 公開給可 存取您執行 Docker 容器之機器 IP 位址的人。
建置 CNTK Docker 映射
您可以使用相同的容器來建置和執行CNTK,這是重現參考設定的建議方法。
首先,您需要安裝 docker。 強烈建議遵循 官方 Docker 檔中的安裝程式。 隨附于 Linux 發行版本的版本可能已過期,且無法搭配 nvidia-docker
使用 (,如果您打算從相同的容器內建置和執行 GPU 映射,) 可能需要安裝這些版本。 您也應該遵循標題為 建立 Docker 群組的選擇性區段中的指示。
對應的 Docker 檔案位於 CNTK 存放庫中https://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker
若要使用CNTK及其所有相依性來建置 Docker 映射,只需複製CNTK存放庫,流覽至 CNTK/Tools/docker
並使用您想要從 (CPU 或 GPU) 建置的 Dockerfile。 例如,若要建置CNTK GPU Docker 映射,請執行:
docker build -t cntk -f CNTK-GPU-Image/Dockerfile .
自 -f <path/to/Dockerfile>
變數是必要的,因為 CPU 和 GPU dockerfiles 中常見的一些修補程式必須套用至 SWIG 原始程式碼。
如果您收到錯誤,表示 Could not resolve 'archive.ubuntu.com'
您必須提供 Docker 的 DNS 伺服器的 IP 位址。
首先,使用 命令尋找 DNS 伺服器的 IP 位址
nm-tool
或 命令
nmcli dev show
假設 DNS 伺服器的 IP 是 a.b.c.d
和 x.y.z.w
。
結果為
- 在 Ubuntu 15.10 和更新版本上, (或其他使用 systemd) 修改
/lib/systemd/system/docker.service
的 Linux 上,讓 docker 精靈以其他選項啟動--dns a.b.c.d --dns x.y.z.w
- 在 Ubuntu 15.04 和更早版本的 (或其他未使用 systemd) 編輯
/etc/default/docker
的 Linux 上,讓行
未批註,且包含 DNS 伺服器的 IP 位址。#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
注意:某些公司封鎖公用 DNS 伺服器,例如 8.8.8.8 和 8.8.4.4。 您可以嘗試使用它們,但如果問題持續發生,您應該嘗試使用 所 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
如果可行,您就會完成。 如果沒有,則表示 CUDA 版本和/或驅動程式安裝在主機上,以及CNTK docker 映射中的驅動程式不符。 特別是,核心模式 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 從主機顯示為容器中的 /data,並將 /project1/config 設為 /config。這類隔離可減少容器化實驗覆寫或使用錯誤資料的機會。