实验室服务器多人共用账号,搭建多人共用的GPU服务器

背景

目前实验室GPU使用状况是:大部分同窗的配有单台1080/TITAN Xp。后来购入了两台4卡的机器,老师的意思是但愿能够做为服务器使用,可以多人同时使用,互不影响。因而便开始了本次折腾,记录采坑经历。html

经过本文,多卡读者能够实现分配每块GPU给特定同窗使用,也能够多人共用多块GPU。单卡读者能够实现多人共用一块GPU。linux

需求

说需求以前先来列一下机器配置:web

CPU: i7-6850K CPU

内存:DDR4 2400Hz 32G *4

存储:512G SSD *1 + 4TB 机械 *3

显卡:TITAN Xp *4ubuntu

需求很明显:像使用一台带有GPU的本身的机器同样使用服务器。后端

具体来讲要知足:浏览器

不一样用户之间不能相互影响且能够同时使用

用户要能方便地访问本身的“机器”

用户有全部权限

用户不被容许直接操做宿主机

灵活配置GPU,能够每一分一块GPU,只有一我的用的时候能够用四块。

上网方便,使用本身的校园网账号上网,可使用IPV6

调研

首先能够确定,Ubuntu多用户下可能存在误删其余同窗文件,所需软件版本不兼容,GPU使用须要代码中指定等问题。bash

通过多方调研对比,在此省略xx字,最终选择使用LXD来搭建容器,实现上述需求。服务器

我主要看好LXD:网络

相比LXC更简单,功能更强大

相比部署应用用的Docker更时候作操做使用的容器

相比KVM更轻便

支持GPU等设备Passthrough

调研过程当中看到的资料足够知足我实现上述需求

支持RESTful API

因此总体思路是经过LXD容器实现多用户共用GPU服务器。svg

主要参考文献见文章最后一章节。

安装

安装过程主要安装了

- ZFS 用于管理物理磁盘,支持LXD高级功能

- LXD 实现虚拟容器

- bridge-utils 用于搭建网桥

sudo apt install zfs

sudo apt -t xenial-backports install lxd

sudo apt install bridge-utils

配置

配置LXD

sudo lxd init,按照提示,这里我选择将第一块1TB的机械硬盘经过ZFS做为容器的存储后端。当提示是否建立bridge时,选择否。lxd init建立的bridge每一个容器经过宿主机用NAT上网,我更但愿每一个人分配一个IP,经过本身的校园网上网。若是不须要,请选择是并忽略下一个章节。

配置网桥

修改/etc/network/interfaces,内容以下:

auto lo

iface lo inet loopback

auto br0

iface br0 inet dhcp

bridge_ports enp14s0

iface enp14s0 inet manual

其中enp14s0可经过ifconfig查看网卡信息获得。

配置LXDlxc network attach-profile br0 default eth0。配置完成后须要重启下机器。

新建容器

若是你网速能够:lxc launch ubuntu:xenial yourContainerName能够试试直接下载,100M多点。

若是有网速不行建议添加清华大学的镜像,而且IPV6正好免校园网流量:

lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public

lxc image list tuna-images:

以后使用lxc launch tuna-images:biasOrfootprint yourContainerName新建容器。

安装驱动

lxc exec yourContainerName bash可进入容器bash,在容器中显卡驱动不须要安装内核文件,只须要sudo sh /NVIDIA-Linux-x86_64-xxx.xx.run --no-kernel-module进行安装。

配置显卡

为容器添加全部GPU: lxc config device add yourContainerName gpu gpu。

添加指定GPU: lxc config device add yourContainerName gpu0 gpu id=0

共享目录

lxc config set yourContainerName security.privileged true

lxc config device add privilegedContainerName shareName disk source=path1 path=path2

path1为宿主机路径,path2为容器内路径。

nvidia-uvm

兴冲冲的装好环境,发现TensorFlow没法使用显卡,缘由是宿主机没有/dev/nvidia-uvm设备,须要经过如下命令挂载设备:

/sbin/modprobe nvidia-uvm

D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`

mknod -m 666 /dev/nvidia-uvm c $D 0

挂载设备到容器:

lxc config device add yourContainerName nvidia-uvm unix-char path=/dev/nvidia-uvm

桌面环境

考虑到须要桌面环境的同窗,咱们经过VNC访问桌面环境。首先尝试的配置Ubuntu自带桌面,屡次尝试失败,后来选择使用gnome桌面。

# 可选 --no-install-recommends 安装没必要要组建

apt install ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal vnc4server -y

在~/.vnc/xstartup文件中加入:

gnome-panel &

gnome-settings-daemon &

metacity &

nautilus &

而后便可使用vnc4server,VNC具体使用再也不赘述。

CUDA与cuDNN

CUDA与cuDNN安装本质上来说只是解压文件(头文件,动态库等),因此我把不一样版本的CUDA与cuDNN安装到了公共磁盘上,这个公共磁盘经过配置文件默认挂载到全部容器,其余同窗在使用时按需添加环境变量和动态库路径便可。

其余

我总体的解决方案是把配置好的容器作成镜像,后续建立从这个镜像建立。这个镜像配置了SSH,VNC,普通用户等。

第二块硬盘经过ZFS管理zpool create A-pool /dev/sdb。经过配置文件挂载到容器。CUDA和cuDNN安装在这里。后续拷贝大型数据集也能够直接经过物理机拷贝。

上网处理能够经过VNC打开浏览器上网外,用上了以前写的一个Python登陆校园网的库,能够经过脚本登陆网络。

GPU默认经过配置文件挂载到容器。LXD相关操做见参考中的[3],用到了编辑配置文件,快照,镜像等相关操做,本文没有细说。

写份使用说明,并告知用户必定要修改默认SSH和VNC密码。

由于有RESTful API,因此能够作个WEB管理系统,后来发现了lxdui还挺好用:

实验室服务器多人共用账号,搭建多人共用的GPU服务器_第1张图片

因为加载镜像拖慢速度,对代码简单进行了修改备用。后续准备基于lxdui增长权限控制等功能,每一个用户能够方便的对本身的容器进行控制,快照等。

总结

本次折腾完美解决了需求,每一个人经过SSH + VNC使用彻底属于本身的机器,做为宿主机的管理员,我深知责任重大,更应该严守宿主机密码,经常以删除容器来威胁舍友,耐心帮助同窗。

此外,有RESTful API还能作不少好玩的事情。

参考

你可能感兴趣的:(实验室服务器多人共用账号)