我正在自学什么是 docker 以及如何使用它。我对 docker 很陌生,所以希望在这里学习一些基础知识。
我在我的计算机上安装了 nvidia-docker (按照安装指南)和 tensorflow/tensorflow:nightly-gpu-py3 (nightly-gpu,启动 GPU (CUDA) 容器)。
- Docker:NVIDIA Docker 2.0.3,版本:17.12.1-ce
- 主机操作系统:Ubuntu 16.04 桌面
- 主机拱门:amd64
我的问题
cifar10_multi_gpu_train (用tensorflow用 python 编写)和简单的 monte-carlo 模拟(用纯 cuda 编写)都无法运行(致命错误:没有 curand.h),而fdm(用纯 cuda 编写)或简单的矩阵乘法(用 python 编写)使用 tensorflow)在容器中工作(tensorflow/tensorflow:nightly-gpu-py3)。
仅使用 CPU 的代码(如a3c)在 tensorflow 上运行良好。
一些使用 GPU 的代码会返回错误消息。(代码使用时<curand.h>
)
细节
在容器 (tensorflow/tensorflow:nightly-gpu-py3) 中,当我运行 monte-carlo 模拟时,出现以下错误:
fatal error: curand.h: No such file or directory
locate curand.h
什么都不返回,但是当我尝试时locate curand
,我得到:
/usr/local/cuda-9.0/targets/x86_64-linux/lib/libcurand.so.9.0
/usr/local/cuda-9.0/targets/x86_64-linux/lib/libcurand.so.9.0.176
/usr/share/doc/cuda-curand-9-0
/usr/share/doc/cuda-curand-9-0/changelog.Debian.gz
/usr/share/doc/cuda-curand-9-0/copyright
/var/lib/dpkg/info/cuda-curand-9-0.list
/var/lib/dpkg/info/cuda-curand-9-0.md5sums
/var/lib/dpkg/info/cuda-curand-9-0.postinst
/var/lib/dpkg/info/cuda-curand-9-0.postrm
/var/lib/dpkg/info/cuda-curand-9-0.shlibs
和locate cudnn.h
:
/usr/local/lib/python3.5/dist-packages/tensorflow/include/tensorflow/core/util/use_cudnn.h
为locate cuda.h
:
/usr/include/linux/cuda.h
/usr/local/cuda-9.0/targets/x86_64-linux/include/cuda.h
/usr/local/cuda-9.0/targets/x86_64-linux/include/dynlink_cuda.h
/usr/local/cuda-9.0/targets/x86_64-linux/include/dynlink_cuda_cuda.h
/usr/local/lib/python3.5/dist-packages/tensorflow/include/tensorflow/core/platform/cuda.h
/usr/local/lib/python3.5/dist-packages/tensorflow/include/tensorflow/core/platform/stream_executor_no_cuda.h
nvcc --version
返回:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
在主机(容器外)中,当我尝试时nvidia-docker run nvidia/cuda nvidia-smi
,我得到
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.30 Driver Version: 390.30 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:03:00.0 On | N/A |
| 0% 48C P8 22W / 250W | 301MiB / 11177MiB | 1% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 108... Off | 00000000:81:00.0 Off | N/A |
| 0% 51C P8 22W / 250W | 2MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
我做了什么
重新安装 nvidia-docker、nightly-gpu-py3 和
#include <curand.h>
--> 失败在 nightly-gpu-py3 容器中,重新安装 cuda/cuda 工具并
#include <curand.h>
--> 失败尝试在其他不使用 docker 的机器上运行所有代码,并且已经安装了 cuda/tensorflow-gpu。他们工作正常。
我想我完全误解了 nvidia-docker 的概念以及图像/容器的作用。
问题
- 安装 nvidia-docker 后,我可以使用
nvidia-docker run <myImage>
. docker image不是意味着它可以保存依赖项(PATH,包,...)来运行某个代码(在我的例子中,使用的代码<curand.h>
)?(和容器做实际工作?) - tensorflow/tensorflow:nightly-gpu-py3 图像是否有 CUDA Toolkit/cuDNN?nightly-gpu-py3 中的no 是否
<curand.h>
意味着我不正确地安装/下载了 nvidia-docker/nightly-gpu-py3? - 在容器内安装 CUDA Toolkit 或重新安装 cuda (nightly-gpu-py3) 失败了(我按照这里的流程进行操作)。有什么方法可以
<curand.h>
在容器内使用(nightly-gpu-py3)? sudo nvidia-docker run -it --rm -p 8888:8888 -p 6006:6006 <image> /bin/bash
是我用给定图像启动新容器的命令。会不会是个问题?