如何在没有 root 权限的 Docker 容器中运行 TensorBoard?
Posted
技术标签:
【中文标题】如何在没有 root 权限的 Docker 容器中运行 TensorBoard?【英文标题】:How to run TensorBoard in Docker container without root privileges? 【发布时间】:2019-11-05 09:06:32 【问题描述】:我在 Docker 容器中运行 tensorflow-gpu。 目前,当我使用 root 权限访问正在运行的 Docker 容器时,我只能运行和访问 TensorBoard。我想在不使用 root 权限的情况下完成此操作。这如何实现?
这里有一些关于我在做什么和结果如何的信息:
我正在使用 TensorFlow 提供的 docker 容器使用以下命令运行 tensorflow-gpu。
$ docker run \
-u $(id -u username):$(id -g username) \
-it --rm --runtime=nvidia \
-v $(realpath ~/data/workspace/notebooks):/tf/notebooks \
-v $(realpath ~/data/workspace/):/tf/workspace \
-v $(realpath ~/data/images/):/tf/images \
-p 8888:8888 -p 6007-6015:6007-6015 tensorflow/tensorflow:2.0.0a0-gpu-py3-jupyter
在启动容器的命令行中,我为 TensorBoard 添加了额外的端口。
我在执行以下操作时完成了运行 TensorBoard。
-
容器正在运行(使用上述命令启动)
→ 每次尝试从正在运行的 Jupyter 笔记本中运行和访问 TensorBoard 都会失败
从 docker 主机 PC 我运行以下命令:
$ docker ps
获取容器名称
$ sudo docker exec -it <container name> bash
→ 我在有和没有sudo
的情况下都试过了,没有下面的命令将不起作用
tf-docker /tf > tensorboard --logdir <log directory> --port 6007
现在我可以通过localhost:6007
访问 TensorBoard
我是 Docker、TensorFlow 的新手,也是 Linux (Ubuntu) 的新手。 我想在不使用 root 权限的情况下完成我上面描述的事情。
有没有办法做到这一点? 最好/正确的方法是什么? 您的最佳实践建议是什么?编辑 2019-06-24: 我不知道为什么它首先没有锻炼,也许我使用了错误的端口。这是我到现在为止的成就。
我使用以下命令行启动容器,其中我将 TensorBoard 的端口更改为 6006$ docker run \
-u $(id -u username):$(id -g username) \
-it --rm --runtime=nvidia \
-v $(realpath ~/data/workspace/notebooks):/tf/notebooks \
-v $(realpath ~/data/workspace/):/tf/workspace \
-v $(realpath ~/data/images/):/tf/images \
-p 8888:8888 -p 6006:6006 tensorflow/tensorflow:2.0.0a0-gpu-py3-
jupyter
然后从命令行我在 docker 容器内启动一个 bash shell,而不使用 root 权限:$ docker exec -it <container name> bash
之后,我启动 TensorBoard 并使用网页浏览器输出中的链接:tf-docker /tf > tensorboard --logdir <log directory> --port 6007
除了之前的命令,我还可以从 Jupyter notebook 启动 Tensorboard。
%reload_ext tensorboard.notebook
%tensorboard --logdir=<log directory> --port=6006
2019-10-09 编辑: 由于将 TensorFlow 2.0.0 版本与 TensorBoard 2.0.0 一起使用,我必须启动 TensorBoard:
$ tensorboard --logdir=<log directory> --host 0.0.0.0 --port 6006
如果不显式添加主机选项,它将不起作用。
【问题讨论】:
你试过直接在 notebook 中运行 Tensorboard:github.com/tensorflow/tensorboard/blob/master/docs/r2/…? 是的,我有。但由于我在没有 root 权限的情况下启动容器,所以我无法工作。 是的,我有。但我用%tensorboard --logdir="./log" --port 6007
尝试了%load_ext tensorboard.notebook
(或%load_ext tensorboard.notebook
),但我收到一条错误消息。在容器中以 root 权限运行 bash,然后启动 tensorboard,如我之前的帖子中所述,我能够在 Jupyter 笔记本中显示 TensorBoard。在笔记本中,我使用了来自您的链接%load_ext tensorboard
的命令。感谢那。但是有没有办法不使用 root 权限在 Docker 容器中运行 bash?
不幸的是,我无法使用链接https://github.com/tensorflow/tensorboard/blob/master/docs/r2/... 中的命令成功重现。但是我在没有 root 权限的情况下完成了在 docker 容器中启动 bash。现在使用命令 tf-docker /tf > tensorboard --logdir <log directory> --port 6007
启动 TensorBoard 时,我可以使用地址 0.0.0.0:6007 从 Webbrower 与 TensorBoard 进行交互。
那么,如果不使用sudo
,是不是不能在容器中运行bash
,还是可以运行shell但不能运行TensorBoard?在任何一种情况下,你得到的错误是什么?我能想到的几件事:您必须将您的用户添加到docker
组(请参阅here)(不确定,因为您可以在没有sudo
的情况下执行docker run
?);对日志目录或tensorboard
命令的权限在容器内仅限根用户。
【参考方案1】:
我遵循的步骤,我可以使用 tensorboard 可视化结果:
创建容器时,打开/映射 tensorboard 的外部端口:在容器内,运行 tensorboard:> nvidia-docker run -d --name tkra_tensorb --ipc=host -it -p 8513:8090 > -p 3014:6006 -v /data:/data tkra_tb
> tensorboard --logdir /data/tkra/MyDatasets/resnet101/checkpoints/ > --host 0.0.0.0 --port 6006
在我的浏览器中打开张量板:
【讨论】:
以上是关于如何在没有 root 权限的 Docker 容器中运行 TensorBoard?的主要内容,如果未能解决你的问题,请参考以下文章