你当前正在访问 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-docker
docker
。
首先在分离模式下创建并启动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.d
和 x.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 上,以便行
未注释并包含 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 地址。
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。这种隔离可以减少容器化试验覆盖或使用错误数据的可能性。