基于Docker的GPU服务器桌面虚拟化
支持GPU深度学习,GPU加速的3D渲染服务;支持SSH远程连接,远程桌面连接;内置xfce4桌面系统,自带Chrome浏览器,几乎满足大部分开发需求。
容器的启动速度,虚拟机一样的使用体验。
1. 需求与调研
目前大多数搞深度学习的教研室,都会配有高性能GPU主机,这样的主机一般是公共共享的,需要进行管理,否则不同的人使用可能会产生冲突,其中最重要的就是 环境隔离 ,比如A同学需要tensorflow==2.0版本,B同学需要tensorflow==2.1版本,为了在同一台物理机器上实现不同环境,需要实现隔离功能。目前常见的方案有如下几种:
- 虚拟机
- LXC,Docker等容器技术
- conda虚拟环境
对于这三种方案,虚拟机方案是基于硬件的虚拟化,隔离最彻底,但是配置上比较复杂,启动速度慢,对GPU支持不友好,不适合学生党使用。容器技术是通过隔离(基于Namespace与Cgroup等技术)实现的虚拟化,这种虚拟化的核心思想是隔离,符合我们的最本质的需求,且Docker相关资源丰富。conda虚拟环境比较适合python环境的虚拟化,而且需要一定的学习成本。根据以上调研,最终采用Docker虚拟化方案。
目前docker对Nvidia GPU已经原生支持,只需要几行命令就可以配置好, 而且,Docker Hub上具有很多配置好的深度学习镜像,可以直接使用,但是Docker技术主要面向于后端,所以其不包括桌面的虚拟化,我们想要的是虚拟机一样的使用体验, 能不能在Docker中使用桌面(远程桌面)? 答案是可以的,目前Github上已经有解决方案,如:
- fcwu/docker-ubuntu-vnc-desktop :该方案采用VNC远程桌面方案,支持浏览器访问远程桌面。
目前这些方案有一个最大的问题,就是 不支持GPU硬件加速的3D渲染 ,这样就无法运行像Gazebo这样的3D软件,就算支持,也是基于软件模拟的OpenGL,占用大量的CPU。
在经过一系列调研后,发现了docker+nomachine(支持VirtualGL),完美的实现了上述需求。
VirtualGL是一个开源软件包,它使任何Unix或Linux远程显示软件都能够以完全3D硬件加速运行OpenGL应用程序,目前存在的VNC+VirtualGL虚拟远程桌面方案,但是其配置复杂,而nomachine远程桌面软件已经集成了VirtualGL,配置非常简单,使得我的需求得到满足。
2.方案实现
编写Dockerfile,制作了一个特殊的Docker镜像,以支持虚拟桌面系统。
采用基于 nividia/cudagl docker镜像作为基础镜像,然后安装xfce4,nomachine,chrome等软件,通过选择不同nividia/cudagl的版本,就可以满足不同的Cuda版本的需求。项目地址如下:
对于该镜像的使用,创建容器和常规容器并无区别,采用远程桌面和远程ssh连接容器,体验虚拟机一样的使用体验。
并由于容器化技术,不同容器,容器与宿主机之间可以很好的进行网络共享,文件共享。
3. 详细使用
首先安装Docker与GPU相关的依赖包
#安装docker
sudo curl -sSL https://get.docker.com | sh
#安装nvidia-container-runtime (需要科学上网)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime
- 注意宿主机器的Nvidia 驱动版本需要大于450
然后下载镜像(使用Docker Hub或者阿里仓库)
# 阿里仓库,国内访问速度快
docker pull registry.cn-shenzhen.aliyuncs.com/gezp/ubuntu-desktop:20.04-cu11.0
#重命名镜像
docker image tag registry.cn-shenzhen.aliyuncs.com/gezp/ubuntu-desktop:20.04-cu11.0 gezp/ubuntu-desktop:20.04-cu11.0
docker rmi registry.cn-shenzhen.aliyuncs.com/gezp/ubuntu-desktop:20.04-cu11.0
创建容器
#宿主机需要运行xhost允许所有用户访问X11服务(运行一次即可)
xhost +
#支持ssh和GUI
docker run -d --restart=on-failure \
--name my_workspace \
--cap-add=SYS_PTRACE \
--gpus all \
--shm-size=1024m \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-p 10022:22 \