Share via


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.dx.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 上,讓行
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    未批註,且包含 DNS 伺服器的 IP 位址。

注意:某些公司封鎖公用 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。這類隔離可減少容器化實驗覆寫或使用錯誤資料的機會。