随着docker的不断升级,对GPU的支持也越来越友好,尤其是docker19.03之后,不再需要安装nvidia-docker了。只安装NVIDIA-CONTAINER-RUNTIME就可以使用了,并且支持docker-compose。
本文记录和梳理一下想要在docker中使用GPU,都需要做些什么。
1. 下载GPU的驱动
在NVIDIA驱动程序页面下载对应的驱动。
2. 安装NVIDIA-CONTAINER-RUNTIME
在https://nvidia.github.io/nvidia-container-runtime/查看支持的操作系统和版本,并根据对应选项,添加源,因为我是centos7.6,所以添加方式为:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo
在参考https://github.com/NVIDIA/nvidia-container-runtime后,得知直接安装即可
sudo yum install nvidia-container-runtime
3.直接使用
此时就准备好了GPU环境,在docker19下就能直接使用了,安装docker19可以参考的我的另一篇文章Centos安装docker 19
。
docker run -it --rm --gpus all centos nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.40 Driver Version: 430.40 CUDA Version: N/A |
|-------------------------------+----------------------+----------------------+
| 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:4F:00.0 Off | N/A |
| 20% 23C P8 8W / 250W | 4426MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 108... Off | 00000000:50:00.0 Off | N/A |
| 20% 21C P8 8W / 250W | 8896MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 GeForce GTX 108... Off | 00000000:51:00.0 Off | N/A |
| 26% 23C P8 8W / 250W | 6637MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 GeForce GTX 108... Off | 00000000:52:00.0 Off | N/A |
| 20% 21C P8 8W / 250W | 6725MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 4 GeForce GTX 108... Off | 00000000:DB:00.0 Off | N/A |
| 20% 23C P8 8W / 250W | 4482MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 5 GeForce GTX 108... Off | 00000000:DC:00.0 Off | N/A |
| 20% 26C P8 8W / 250W | 4492MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 6 GeForce GTX 108... Off | 00000000:DD:00.0 Off | N/A |
| 20% 23C P8 8W / 250W | 8802MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 7 GeForce GTX 108... Off | 00000000:DE:00.0 Off | N/A |
| 20% 22C P8 8W / 250W | 2247MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
以上就完成了GPU的准备,可以使用了。(如果指定某一张卡可以使用选项:--gpus "device=0"
)
追更:使用时候发现无法使用GPU,观察docker内部和外部的区别发现CUDA Version: N/A
查阅一些资料后推测是因为外部有cuda的driver接口,docker中没有,所以自己包装了带cuda的Java镜像(注意cuda版本)。
Dockerfile如下:
FROM nvidia/cuda:10.1-base
MAINTAINER scsyn
COPY ./jre1.8.0_271 /jre
ENV JRE_HOME=/jre
ENV CLASSPATH=$JRE_HOME/lib/rt.jar:$JRE_HOME/lib/ext
ENV PATH=$PATH:$JRE_HOME/bin
使用docker build -t nvidia-java:1.0.0 .
打包镜像。
之后再使用的话在此基础上进行封装就可以了,比如:
FROM nvidia-java:1.0.0
MAINTAINER scsyn
COPY ./en2zh /pn
ENV LD_LIBRARY_PATH=/pn/lib
WORKDIR "/pn/bin"
ENTRYPOINT ["java","-jar","localdeployment-pn-0.0.1-SNAPSHOT.jar"]