如何使用Docker在Ubuntu Linux上设置具有多个GPU的Tensorflow

366 阅读5分钟

在本教程中,我将设置最新版本的Tensorflow,目前是2.9,在SabrePC 慷慨提供的工作站上支持GPU,有4个RTX 3080。

对于那些好奇的人,这里有一个关于这个工作站的片段。

设置Tensorflow通常需要大量的艰苦工作,因为你需要将NVIDIA CUDA驱动程序、cuDNN、Python版本和Tensorflow的组合完美地结合起来。

你可能会想偏离其中一个版本,例如CUDA,但你将为这个错误付出沉重的代价。也许不是今天,但在未来,你会在Tensorflow中得到一些非常随机的错误,这将浪费你几个小时的调试时间。

然后你会想起,你认为使用CUDA 11.3而不是11.2是可以的。或者你觉得自己比较幸运,你尝试了一个更晚的CUDA版本。越新越好,对吗?

用Docker设置Tensorflow

我曾经经历过一次Tensorflow的整个手动设置,不是为Linux而是为Windows。如果你对所需的努力程度感到好奇,我建议你阅读那篇文章,以了解所需的努力程度。

如何为Windows 10安装带有CUDA 11.2和CuDNN 8.1的Tensorflow 2.5。

通过Docker,在Linux环境下设置支持GPU的Tensorflow是非常容易的。此外,它还有一个额外的优势,即你可以快速地从一个版本的Tensorflow切换到另一个版本,一举两得。

前提条件

你需要做的第一件事是确保你的Linux发行版安装了最新的Nvidia驱动程序。

安装Docker

要安装Docker,请按照这里Ubuntu Linux说明进行。

安装Nvidia Docker

你需要安装Nvidia Docker,也被称为NVIDA容器工具包,以使Docker能够利用你的Nvidia GPU。

安装说明可以在这里找到

选择什么样的Tensorflow docker镜像

Tensorflow有不止一个docker镜像可供选择。这真的取决于你在寻找什么。

如果你要求Tensorflow有GPU支持,那么你应该挑选一个Tensorflow图像,标签的一部分是-gpu,如果你想有一个Jupyter笔记本,那么你还应该寻找一个标签名中有-Jupiter的图像。
因此,例如,如果我想要一个支持GPU和Jupyter笔记本的Tensorflow镜像,那么用docker就可以做到。

docker run -it -p 8888:8888 -v my_tf_notebooks:/tf/my_tf_notebooks tensorflow/tensorflow:latest-gpu-jupyter
[I 16:31:45.875 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
jupyter_http_over_ws extension initialized. Listening on /http_over_websocket
[I 16:31:45.969 NotebookApp] Serving notebooks from local directory: /tf
[I 16:31:45.969 NotebookApp] Jupyter Notebook 6.4.11 is running at:
[I 16:31:45.969 NotebookApp] http://1ed623a5c161:8888/?token=2d3293719cd7f1f430fe00e0cc05bc0609d255ffcd495f9c
[I 16:31:45.969 NotebookApp]  or http://127.0.0.1:8888/?token=2d3293719cd7f1f430fe00e0cc05bc0609d255ffcd495f9c
[I 16:31:45.969 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 16:31:45.970 NotebookApp]

To access the notebook, open this file in a browser:
        file:////.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://1ed623a5c161:8888/?token=2d3293719cd7f1f430fe00e0cc05bc0609d255ffcd495f9c
     or http://127.0.0.1:8888/?token=2d3293719cd7f1f430fe00e0cc05bc0609d255ffcd495f9c
  • -在你的电脑中的一个文件夹映射到docker容器中的一个文件夹。你很可能需要这样做,因为你不想在任何其他目录下保存任何python代码,因为一旦docker容器退出,这些代码就会丢失。
  • -p 将工作站中的8888端口映射到docker容器中运行的8888端口。需要这个选项,以便你可以通过本地网址访问Jupyter Notebooks。

检查Tensorflow是否能够访问GPU

为了快速检查Tensorflow是否能够检测到我们的GPU,让我们创建一个Python 3 Jupyter笔记本,并在第一个单元中运行以下内容。

import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
[PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU'),PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'),PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'),PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU')]

它看起来不错。Tensorflow能够检测到我们的GPU!

扩展Tensorflow的Docker镜像

但如果你想安装你的特定项目可能需要的其他工具呢?

在这种情况下,你应该通过创建你自己的Docker文件来扩展默认的Tensorflow镜像,内容如下。

FROM tensorflow/tensorflow:latest-gpu-jupyter

RUN pip install jupyterlab

你可以通过以下方式在本地构建它。

docker build -t codemental/tensorflow .
Sending build context to Docker daemon  2.048kBStep 1/2 : FROM tensorflow/tensorflow:latest-gpu-jupyter ---> 7053c34a3929Step 2/2 : RUN pip install jupyterlab ---> Running in 1265f6c35854Collecting jupyterlab  Downloading jupyterlab-3.4.2-py3-none-any.whl (8.8 MB)..Successfully installed anyio-3.6.1 babel-2.10.1 json5-0.9.8 jupyter-server-1.17.0 jupyterlab-3.4.2 jupyterlab-server-2.14.0 nbclassic-0.3.7 nbformat-5.4.0 notebook-shim-0.1.0 pytz-2022.1 sniffio-1.2.0 websocket-client-1.3.2

而要运行它,我们可以这样做。

docker run -it -p 8888:8888 -v my_tf_notebooks:/tf/my_tf_notebooks codemental/tensorflow

在上面的例子中,我们总是采取最新版本的Tensorflow,这是在一夜之间建立的。

如果你正在做一个真正的项目,这是一个坏主意,因为你将与Tensorflow的一个不断变化的版本一起工作。因此,我们应该通过搜索正确的标签来挑选一个稳定版本的Tensorflow。

截至今天,Tensorflow的最新版本是2.9版,这意味着我们可以将Dockerfile改为。

FROM tensorflow/tensorflow:2.9.0-gpu-jupyter
RUN pip install jupyterlab

指定一个标签的好处是,它意味着升级Tensorflow是在我们的控制之下。

作为本教程的总结,有了Docker,设置支持GPU的Tensorflow非常容易,你可能会想,为什么会有人愿意手工安装所有的Tensorflow包呢?