实验室GPU服务器须知

近期需要对实验室的GPU服务器进行管理和配置,经过选择之后初步决定了使用方案。

方案概述

虚拟化技术

首先,对于共用GPU服务器,多人使用很容易造成依赖环境的混乱,并且其他资源的使用也会相互干扰,于是势必要采用虚拟化技术进行隔离。

我首先想到的是kvm,但是kvm对于这个场景下的使用有些过于专业,并且整个安装过程比较复杂,于是就第一个排除了。

然后就想到了Docker,虽然说Docker的使用哲学更加倾向于每个容器运行一个服务,这里的场景更倾向于虚拟机。但是Docker的安装简单,易于管理使用,再加上nvidia对于nvidia-docker技术的支持,现在Docker使用GPU已经非常成熟了。今年夏季我发现nvidia-docker项目还之有几十star,文档甚至还只开了个头,现在已经十分成熟了,不得不感叹Docker的发展之快。于是最终,我决定使用Docker。

基于nividia-docker,你可以方便的构建自己的Docker镜像,不过早就有前辈帮忙配置好相关的镜像了,只需要拉取即可使用。我使用的是ufoym/deepo来构建用户服务,基本Deep Learning所需的软件和环境都已经安装好了,开箱即用,详细的环境说明可以参考GitHub项目https://github.com/ufoym/deepo 。

这里对镜像的贡献者致谢。

内网穿透

GPU服务器的使用如果局限于实验室内部网络,那么肯定是极为不方便的,于是服务器上使用了frp进行内网穿透。frp的官方指南坦言frp还处于测试开发阶段,不建议用于生产环境,但是9K的star和我自身使用过程来看,frp无疑是十分优秀的,所以我也大胆的使用在了服务器的配置中。具体原理我就不再赘述了,详情参见GitHub项目页面https://github.com/fatedier/frp

同样对frp的开发者致谢。

整体概述

以上是主要使用的技术,整个系统的具体工作原理如下:

使用者会被告知用户名和密码,实际上这是Docker中的用户。

当使用者ssh连接时,需要连接运行着frp server的具有公网ip的另一台服务器,然后frp会将其连接请求转发到GPU服务器上,然后直接进入ssh,这样就做到了用户之间的隔离,而不实际接触服务器系统本身。

使用者须知

经过申请之后,你会获得用户名,初始密码以及相应的端口,默认的用户密码和root密码都是你的用户名,登录之后你可以自己修改。只需通过ssh或者putty以及类似工具即可使用属于你的GPU资源。

比如,如果通过终端的ssh工具,只需:

ssh username@serverip -p port

请注意,必须使用属于你自己的端口访问,如果想知道其中的原理,请详细阅读方案概述和其中提供的链接。

值得注意的是,整个“系统”都是属于你的私人空间,完全可以随意使用,其中,/data和/config目录挂在到了主机上,可以将数据存放在里面,当然,服务器是一直运行的,所以也不必担心数据的丢失。这只是一种数据持久化的方式。

开启用户的时候每个Docker都为其挂载了全部8块显卡,所以没有限制每个用户的计算资源。CUDA的使用方法这里就不再赘述了,这超出了讨论范围。

但是,请勿随意分享,也请勿用作除深度学习计算之外的任务。具体的规章细则我一人无权制定,但是可以肯定的是,用作其他Web和ftp是不合适也是不符合Docker哲学的。

管理者须知

概述

有使用者就势必有管理者,但是目前来看,开发一套自动化的管理系统是不切实际也是不需要的,所以还需要管理者在后台手动创建容器以及配置好远程访问的ssh。这里或许能够通过定制镜像解决,但是时间匆忙,我也没有进一步尝试。下面会详细记录创建用户过程,请理解命令使用,切勿照抄照搬。

管理员登录

所有的管理员通过6000端口登录主机。

创建用户

管理者需要知晓使用者希望的用户名。

新建容器

首先我们需要新建Docker,这里使用默认镜像。其中username代表用户的用户名,-p 50000:22是指将Docker的22端口映射到主机的50000端口。端口是从50000向后映射,随着用户增加递增的。类似的,-v是将Docker内的目录映射到主机,所有用户的目录保存在/home/docker_data/下。因为一开始就把所有的硬盘资源全部挂载到了home,所以只好暂时先把数据存放在这里。

nvidia-docker run -it -p 50000:22 -v /home/docker_data/username/data:/data -v /home/docker_data/username/config:/config ufoym/deepo bash

进入容器配置

首先镜像本身是没有安装openssh的,所以需要手动安装以下,然后添加用户。

passwd     #设定root密码与用户名相同
apt-get update   
apt-get install sudo openssh-server -y  #安装必要的软件
service ssh start
adduser username   #创建用户
usermod -aG sudo username    #更改用户类型为sudo

修改frp配置文件

按照格式修改端口映射,具体不再赘述,请参看frp的GitHub说明页面https://github.com/fatedier/frp ,端口同样是顺延。

结语

以上就是整体的结构,如果有任何好的建议欢迎联系我,邮箱i@ranpox.com,关于资源的申请,请联系服务器的管理者mhzhou,