Open herosea opened 4 years ago
先说下原来集群的版本和硬件
镜像中 jupyterhub==1.0.0 notebook=6.0.0 jupyterlab=1.2.1 宿主机 k8s v1.7.12 docker 1.12.6 gpu Tesla P40
以前使用tensorflow1.1 来做神经网络的模型训练,nvidia 和 cuda 是通过目录挂载的形式加载到容器里面。这次要用tensorflow2.1.0来训练模型,故而有了升级操作。
要升级的组件如下
宿主机 docker 1.12.6 => 19.03.12 nvidia driver =>418.152.00
因为较新的 docker 才支持 gpu插件
较新的nvidia driver 才支持 cuda 10.1
k8s不需要特别处理
有一种方案是升级k8s版本,实现gpu调度。 但是会涉及到一系列升级和修改,比较麻烦,我们用的是另外一个方案。
在这个方案中,docker默认启用gpu,k8s不需要知道使用了gpu。
我们在k8s中已经对gpu单独分组了,由用户来选择使用gpu,而k8s像调度cpu机器一样调度gpu机器。
大部分文章提到了安装 nvidia-container-toolkit,然后使用 --gpus all 来启用gpu。这种方式显式加一个参数,需要k8s调度支持,比较麻烦。
后来找到了nvidia-container-runtime,这是个更底层的docker插件,安装完成后,在 /etc/docker/daemon.json 添加
"runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia"
然后
sudo systemctl daemon-reload sudo systemctl restart docker
使用如下命令测试是否成功。其中环境变量是启用gpus必要的条件
docker run --rm --env NVIDIA_DRIVER_CAPABILITIES="compute,utility" --env NVIDIA_VISIBLE_DEVICES=all busybox:latest mount | egrep 'nvidia|cuda'
支持的环境变量参考 https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/10.1/ubuntu18.04-x86_64/base/Dockerfile
这里有相关原理的分析 https://cloud.tencent.com/developer/article/1496697
镜像需要添加 cuda 包。
tensorflow 和 cuda包版本的推荐匹配参见
https://www.tensorflow.org/install/source#linux
具体docker编写参考 https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/ubuntu18.04/10.1/base/Dockerfile
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/dockerfiles/dockerfiles/gpu-jupyter.Dockerfile
注意nvidia的镜像的继承关系,需要合并多个docker的内容。 另外主要ubunutu的版本,我就踩了版本的坑,如果16.04 用了 18.04的源,不会报错,但是安装会卡住。
宿主机
镜像中
Jupyter Docker Stacks
jupyterhub的tensorflow在k8s上使用gpu
基础升级 docker 和 nvidia驱动
先说下原来集群的版本和硬件
以前使用tensorflow1.1 来做神经网络的模型训练,nvidia 和 cuda 是通过目录挂载的形式加载到容器里面。这次要用tensorflow2.1.0来训练模型,故而有了升级操作。
要升级的组件如下
因为较新的 docker 才支持 gpu插件
较新的nvidia driver 才支持 cuda 10.1
k8s处理
k8s不需要特别处理
有一种方案是升级k8s版本,实现gpu调度。 但是会涉及到一系列升级和修改,比较麻烦,我们用的是另外一个方案。
在这个方案中,docker默认启用gpu,k8s不需要知道使用了gpu。
我们在k8s中已经对gpu单独分组了,由用户来选择使用gpu,而k8s像调度cpu机器一样调度gpu机器。
docker默认启用gpu
大部分文章提到了安装 nvidia-container-toolkit,然后使用 --gpus all 来启用gpu。这种方式显式加一个参数,需要k8s调度支持,比较麻烦。
后来找到了nvidia-container-runtime,这是个更底层的docker插件,安装完成后,在 /etc/docker/daemon.json 添加
然后
使用如下命令测试是否成功。其中环境变量是启用gpus必要的条件
支持的环境变量参考 https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/10.1/ubuntu18.04-x86_64/base/Dockerfile
这里有相关原理的分析 https://cloud.tencent.com/developer/article/1496697
镜像添加gpu支持
镜像需要添加 cuda 包。
tensorflow 和 cuda包版本的推荐匹配参见
https://www.tensorflow.org/install/source#linux
具体docker编写参考 https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/ubuntu18.04/10.1/base/Dockerfile
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/dockerfiles/dockerfiles/gpu-jupyter.Dockerfile
注意nvidia的镜像的继承关系,需要合并多个docker的内容。 另外主要ubunutu的版本,我就踩了版本的坑,如果16.04 用了 18.04的源,不会报错,但是安装会卡住。
总结
宿主机
镜像中