你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

CNTK Docker 容器

可以在 Linux 系统上将CNTK设置为 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-dockerdocker

首先在分离模式下创建并启动CNTK容器, (我们使用8888端口,Jupyter Notebook应用程序) 默认端口:

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笔记本打开浏览器窗口,然后转到http://192.168.1.1:8888

请注意,在第一次运行期间,Jupyter Notebook应用程序将请求密码或令牌。 使用上面保存的令牌。

若要在终端中停止Jupyter Notebook服务器发送Ctrl-C序列,可在终端中输出 Jupiter Notebook 服务器控制台并确认关闭服务器。 请注意,它 不会 停止 Docker 容器本身。 若要停止容器,请使用以下命令:
docker stop cntk-jupyter-notebooks

警告! 上述命令将向可以访问运行 Docker 容器的计算机的 IP 地址的 每个人 公开 Jupyter Notebooks 应用程序。

生成 CNTK Docker 映像

可以使用同一容器生成和运行CNTK,这是重现引用配置的建议方法。

首先需要安装 docker。 强烈建议遵循 官方 docker 文档中的安装过程。 Linux 分发版附带的版本可能已过时,并且不适用于 nvidia-docker 除 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 源代码。 如果收到指出需要为 docker 提供 DNS 服务器的 IP 地址的错误 Could not resolve 'archive.ubuntu.com' 。 首先使用以下命令查找 DNS 服务器的 IP 地址

nm-tool

或命令

nmcli dev show

假设 DNS 服务器的 IP 是 a.b.c.dx.y.z.w。 Then

  • 在 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/nmcliDNS 服务器 IP 地址。

Restart the docker daemon via

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 驱动程序模块与用户模式模块 (这是共享库) ,如果主机上的版本与容器中的版本不完全匹配,则会发生此情况。 幸运的是,这很容易修复。 只需安装 nvidia-docker 并将其与 docker (完全一样,就无需重新生成映像) 。

nvidia-docker run --rm cntk nvidia-smi

这应该正常工作,并使CNTK能够从 docker 容器内部使用 GPU。 如果不起作用,请在 nvidia-docker GitHub 上搜索“问题”部分 -- 已记录许多解决方案。 请注意,如果 /usr 和 /var 目录位于不同的分区中,则需要执行一些额外的步骤,如下所示。 若要将交互式 shell 获取到退出后 不会 自动删除的容器

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。这种隔离可以减少容器化试验覆盖或使用错误数据的可能性。