![](/img/trans.png)
[英]How do I use docker-compose.yml with Tensorflow + Jupyter Notebook + GPU
[英]How do I start tensorflow docker jupyter notebook
我已经在 ubuntu 机器上安装了 tensorflow docker 容器。 tensorflow docker设置说明指定:
docker run -it b.gcr.io/tensorflow/tensorflow
这让我进入了 docker 容器终端,我可以运行 python 并执行 Hello World 示例。 我也可以手动运行 .\\run_jupyter.sh 来启动 jupyter notebook。 但是,我无法从主机访问笔记本。
如何启动 jupyter 笔记本,以便我可以从主机使用该笔记本? 理想情况下,我想使用 docker 来启动容器并在单个命令中启动 jupyter。
对于 Linux 主机,Robert Graves 的答案是可行的,但对于 Mac OS X 或 Windows,还有更多工作要做,因为 docker 在虚拟机中运行。
因此,要开始启动 docker shell(或任何 shell,如果您使用的是 Linux)并运行以下命令来启动一个新的 TensorFlow 容器:
docker run -p 8888:8888 -p 6006:6006 b.gcr.io/tensorflow/tensorflow ./run_jupyter.sh
然后对于 Mac OS X 和 Windows,您只需执行以下操作一次:
$ cd
$ docker run -it -p 8888:8888 -p 6006:6006 -v /$(pwd)/tensorflow:/notebooks --name tf b.gcr.io/tensorflow/tensorflow
$ docker start -i tf
如果您不在 Windows 上,您可能应该将
/$(pwd)
更改为$(pwd)
您将在主目录中获得一个名为tensorflow
的空文件夹,用作项目文件(例如 Ipython Notebooks 和数据集)的持久存储。
cd
以确保您位于主目录中。-it
代表interactive,所以你可以在终端环境中与容器进行交互。-v host_folder:container_folder
启用在主机和容器之间共享文件夹。 主机文件夹应该在您的主目录中。 /$(pwd)
在 Windows 10 中转换为//c/Users/YOUR_USER_DIR
。此文件夹被视为容器中的notebooks
目录,由 Ipython/Jupyter Notebook 使用。--name tf
分配名称tf
的容器。-p 8888:8888 -p 6006:6006
将容器端口映射到主机,第一对用于 Jupyter notebook,第二对用于 Tensorboard-i
代表交互式进一步阅读docker 文档后,我有一个适合我的解决方案:
docker run -p 8888:8888 -p 6006:6006 b.gcr.io/tensorflow/tensorflow ./run_jupyter.sh
-p 8888:8888 和 -p 6006:6006 将容器端口暴露给相同端口号的主机。 如果您只使用 -p 8888,则会在主机上分配一个随机端口。
./run_jupyter.sh 告诉 docker 在容器内执行什么。
使用此命令,我可以使用主机上的浏览器连接到http://localhost:8888/并访问 jupyter notebook。
更新:在 Windows 上与 docker 搏斗后,我切换回了带有 docker 的 Ubuntu 机器。 我的笔记本在 docker 会话之间被擦除,这在阅读更多 docker 文档后是有道理的。 这是一个更新的命令,它还会在容器内挂载一个主机目录,并启动指向该挂载目录的 jupyter。 现在我的笔记本保存在主机上,下次启动 tensorflow 时就可以使用了。
docker run -p 8888:8888 -p 6006:6006 -v /home/rob/notebook:/notebook b.gcr.io/tensorflow/tensorflow sh -c "jupyter notebook /notebook"
如果你是一个使用 Windows 机器的 docker noob,这些步骤对我有用。
版本:Windows 8.1、docker 1.10.3、tensorflow r0.7
docker-machine ip
并记下。 让我们称之为“IP地址”。 看起来像这样:192.168.99.104(这个IP地址是我编的)将此命令粘贴到 docker 终端上:
docker run -p 8888:8888 -p 6006:6006 b.gcr.io/tensorflow/tensorflow
。
如果您是第一次运行它,它将在这个轻量级虚拟机上下载并安装映像。 然后它应该说'The Jupyter notebook is running at ....' -> 这是一个好兆头!
<your ip address (see above)>:8888
。 例如。 192.168.99.104:8888/Jupyter 现在可以为 TensorFlow 运行Docker 镜像:
docker run -d -v $(pwd):/home/jovyan/work -p 8888:8888 jupyter/tensorflow-notebook
为了让它在 hyper-v 下运行。 执行以下步骤:
1)使用https://blogs.msdn.microsoft.com/scicoria/2014/10/09/getting-docker-running-on-hyper-v-8-1-2012-r2/创建一个docker虚拟机为您提供一个可用的 docker 容器。 您可以通过控制台或 ssh 连接到它。 我会放置至少 8GB 的内存,因为我确定这会占用大量内存。
2)运行“ifconfig”来确定Docker VM的IP地址
3) 在 docker shell 提示符下键入:
docker run -p 8888:8888 -p 6006:6006 -it b.gcr.io/tensorflow/tensorflow
4) 使用 http:/[ifconfig address]:8888/ 连接到 Jupyter Workbench
为了稍微整理一下,我想给出一些额外的解释,因为我在使用 tensorflow 设置 docker 时也遇到了很多麻烦。 为此,我参考了这个视频,不幸的是,它在所有情况下都不是不言自明的。 我假设您已经安装了 docker。 视频中真正有趣的一般部分从 0:44 分钟开始,他最终启动了 docker。 在那里他只将 tensorflow repo 下载到文件夹中,然后他将其安装到容器中。 您当然可以将其他任何内容放入容器中,然后在 docker VM 中访问它。
首先,他运行长docker run –dit -v /c/Users/Jay/:/media/disk –p 8000 –p 8888 –p 6006 b.gcr.io/tensorflow/tensorflow
命令docker run –dit -v /c/Users/Jay/:/media/disk –p 8000 –p 8888 –p 6006 b.gcr.io/tensorflow/tensorflow
。 “run”命令启动容器。 在这种情况下,它启动容器“b.gcr.io/tensorflow/tensorflow”,其地址在tensorflow docker 安装教程中提供。 如果本地尚不可用,则 docker 将下载该容器。 然后他提供了两种额外的参数: 他在给定的容器路径上挂载主机系统的文件夹。 不要忘记在开头给出分区(例如“/c/”)。 此外,他使用 params -p 声明稍后可从主机使用的端口。 从所有这些命令中,您将获得此容器执行的 [CONTAINER_ID]! 您始终可以通过在 docker 控制台中运行“docker ps”来查看当前正在运行的容器。 您上面创建的容器应该以相同的 ID 出现在此列表中。
下一步:随着容器的运行,您现在想要在其中执行一些操作。 在我们的例子中,jupyter notebook 或 tensorflow 或其他:为此,您让 docker 在新创建的容器上执行 bash: docker exec –ti [CONTAINER_ID] bash
。 此命令现在会在您的容器上启动 bash shell。 你看到这个是因为“$”现在变成了 root@[CONTAINER_ID]:。 从此无路可退。 如果你想回到 docker 终端,你必须像他在 1:10 分钟所做的那样启动另一个新的 docker 控制台。 现在有了在容器中运行的 bash shell,你可以做任何你想做的事情,并执行 Jupiter 或 tensorflow 或其他任何东西。 您在运行命令中给出的主机系统文件夹现在应该在“/media/disk”下可用。
访问 VM 输出的最后一步。 它仍然不想为我工作,我无法访问我的笔记本。 您仍然需要找到正确的 IP 和端口才能访问已启动的笔记本、张量板会话或其他任何内容。 首先使用docker-machine –ls
找出主IP。 在此列表中,您可以获得 URL。 (如果它是您唯一的容器,则称为默认容器。)您可以不使用此处给出的端口。 然后从docker ps
你得到转发端口的列表。 当列表中写入 0.0.0.32776->6006/tcp 时,您可以使用首先提供的端口(Awkyard)从主机访问它。 所以在我的例子中,容器中执行的张量板说“在端口 6006 上启动”。 然后从我的主机我需要输入http://192.168.99.100:32776/来访问它。
-> 就是这样! 就这样跑来找我!
它为您提供终端提示:
FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd vdocker') DO %i
docker run -it tensorflow/tensorflow:r0.9-devel
或者
FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd vdocker') DO %i
docker run -it b.gcr.io/tensorflow/tensorflow:latest-devel
您应该拥有“vdocker”或将 vdocker 更改为“default”。
出于某种原因,我遇到了一个额外的问题,我需要使用--ip
标志来克服所提供的示例之外的问题:
nvidia-docker run --rm \
-p 8888:8888 -p 6006:6006 \
-v `pwd`:/root \
-it tensorflow/tensorflow:latest-devel-gpu-py3 sh -c "jupyter notebook --ip 0.0.0.0 ."
然后我可以从我的机器上通过http://localhost:8888访问。 在某些方面,这是有道理的; 在容器内,您绑定到0.0.0.0
代表所有可用地址。 但是我是否需要这样做似乎各不相同(例如,我已经开始使用jupyter/scipy-notebook
而不必这样做)。
无论如何,上述命令对我有用,对其他人可能有用。
作为官方 TensorFlow 镜像的替代方案,您还可以使用ML Workspace Docker 镜像。 ML Workspace 是一种开源 Web IDE,它将 Jupyter、VS Code、TensorFlow 和许多其他工具和库结合到一个方便的 Docker 映像中。 部署单个工作区实例非常简单:
docker run -p 8080:8080 mltooling/ml-workspace:latest
所有工具都可以从同一个端口访问并集成到 Jupyter UI 中。 您可以在此处找到文档。
上面的许多答案确实很有帮助并且有效,但是如果您只想在主机上使用docker 来构建开发环境 (毕竟您正在使用jupyter ...),则上述解决方案或多或少会比您预期的痛苦。
如果您正在使用端口映射: docker run -p 8888:8888 -p 6006:6006 ...
,则每次必须手动手动映射端口。 如果您忘记公开端口,则必须放弃当前容器,并使用-p xxxx:xxxx
重新创建一个新容器。
Moverover,我是一个会同时通过jupyter Lab(在不同容器中)打开多个项目的人。 手动进行端口映射确实令人沮丧。
当您运行jupyter lab(比jupyter笔记本更好的替代品)时,您可能必须在容器中键入jupyter lab --ip=0.0.0.0 --port=8888
(如果您使用bash运行容器),最终发现您无法由于某些权限问题,将Jupyter Lab主题更改为暗模式。 (灯光模式会使我盲目XD)
使用--network="host"
在docker run
如果将主机网络模式用于容器,则该容器的网络堆栈不会与Docker主机隔离(该容器共享主机的网络名称空间),并且该容器不会分配自己的IP地址。 例如,如果您运行一个绑定到端口80的容器,并且使用主机网络,则该容器的应用程序在主机IP地址上的端口80上可用。
参考: https : //docs.docker.com/network/host/
(在运行它之前,请在'\\'
之后删除所有空格和注释)
docker run -it -u $(id -u):$(id -g) \ # use same user as your host instead of using root user
--rm \
--network="host" \ # with this line, you don't have to map ports manually anymore
tensorflow/tensorflow:latest-gpu-py3-jupyter \
bash
在容器中时,无需指定ip / port即可启动jupyter Labs:
jupyter lab
在本节中,我将分享一个详细的示例,该示例超出了此问题的要求,但我认为您可能会发现它会有所帮助。
文件 :
文件夹结构:
.
├── Dockerfile
├── requirement.txt
└── run.sh
Dockerfile:
FROM tensorflow/tensorflow:latest-gpu-py3-jupyter AS pre
WORKDIR /repo
RUN apt-get -qqy update && apt-get install -qqy \
curl \
npm \
nodejs
FROM pre AS dev
COPY ./* /repo/
RUN mkdir /.jupyter # make a directory for jupyter lab settings
RUN pip install --upgrade pip && pip install -r requirement.txt
RUN jupyter labextension install @jupyterlab/toc # install table of content for juptyer lab
RUN chmod -R 777 /.local /.jupyter # authenticate these 2 folders for current users
required.txt
pandas
scipy
scikit-learn
matplotlib
seaborn
kaggle
jupyterlab
run.sh:
docker run -it -u $(id -u):$(id -g) \
--rm \
--network="host" \
-v /$(pwd):/repo \
-w /repo \
--name $(basename $("pwd"))\
$(basename $("pwd")):latest \
bash
步:
构建docker映像并使用当前文件夹的名称对其进行标记:
docker build -t $(basename $("pwd")) .
运行docker容器:
bash run.sh
在容器中运行jupyter实验室:
jupyter lab
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.