前段时间进了一台四路Titan_x的工作站,这么好的丹炉好想要霸占它鸭,显然这是不存在的= - \ ,所以本着共产主义精神,要把它配成一台服务器,让大家能够共享强大的计算资源(づ。◕‿‿◕。)づ,当然还要互不干扰;不过作为这方面的小白,一脸蒙蔽呀。
所以这是一条弱鸡摸索之路,只是勉强满足了一下需求,仅供参考。
好像Docker才是目前实现GPU服务器的主流技术?(也有说LXC比Docker好的,Docker更适合部署,可能本小白对LXC食用方法还没那么深入= - =)为啥不用Docker实现呢,因为之前没找到详细的别人实现的贴子呀o(▼皿▼メ;)o,对没做好paper review就开始瞎j8搞,然后搞完发现别人有个更好的说的就是我这种。
写这篇帖子的时候才发现有用Docker实现GPU服务器的帖子,给大家开个传送门,可以去参考这位大佬的博客了。(仔细看了一眼大佬的发帖时间,emmmmmmmm我搞完才发的贴子啊。。。难怪没搜到(没错我就是一个重度拖延症患者o( ̄ヘ ̄o#))),之后有空也打算照着下面这个帖子重新搞一下,毕竟我没实现图形界面的说。。。好像写到这里就可以结束了呢。。。○| ̄|_
https://blog.csdn.net/qq_36396104/article/details/88769461
作为一只有尊严的弱鸡,还是要把该写的写完。。。
作为一个多人公用的GPU服务器,主要有以下几个需求:
首先LXC是啥?LXC全称为Linux Container即Linux的容器,是一种内核虚拟化的技术,是一种轻量级的虚拟化技术。可以理解为与C++中的namespaces相似;看到虚拟化第一个想到虚拟机,直接用虚拟机不就好了= - =,然而趟过坑的选手表示,虚拟机真的不好用鸭,传统的虚拟机主要存在的致命问题是:
LXC被称为linux的容器,那么宿主机必然需要一个linux系统,我用的是ubuntu的16.04作为宿主机的系统,这里和windows没有半毛钱关系,充满了对windows的歧视。
sudo apt install zfs
sudo apt -t -xenial-backports install lxd
sudo apt install bridge-utils
除此之外还需要安装一下显卡驱动,因为需要把nvidia-uvm挂载到容器上去(如果不挂载nvidia-uvm会导致在容器中使用nvidia-smi查看gpu是可以获得gpu信息的,但是调用pytorch中的torch.cuda.is_available()返回的是Fasle)
如果不用zfs来管理物理存储空间的话,可以跳过这部分
先要创建一个 storage pool
sudo zpool create PoolName device_path
其中PoolName
是storage pool的名称 device_path是storage pool所使用的挂载在系统下的硬盘路径
之后在这个storage pool上创建一个dataset的存储空间
sudo zfs create PoolName/SpaceName
其中SpaceName
就是dataset的名称
然后为新建立的dataset开启deduplication和compression就是去重和压缩空间
sudo zfs set dedup=on PoolName/SpaceName
sudo zfs set compression=lz4 PoolName/SpaceName
以下摘自大佬博客上的示例:
sudo zpool create yagami /dev/sda
sudo zfs create yagami/data
sudo zfs set dedup=on yagami/data
sudo zfs set compression=lz4 yagami/data
lxd的配置就非常的简单了直接运行
sudo lxd init
然后如果是想用zfs作为存储后端就选zfs,然后用前面的路径之前如果没有创建好像也可以在这步中创建;
如果想要自己配置配置网桥的话在选创建网桥的时候选否,否则选是就可以了
可以直接运行以下代码来新建容器
lxc launch ubuntu:xenial ContainerName
其中ContainerName
是新建容器的名称ubuntu:xenial
是镜像名
如果网速不行的选手可以使用清华的镜像
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:bias0rfootprint ContainerName
通过下面指令让容器可以使用所有显卡的资源
lxc config device add ContainerName gpu gpu
或者通过下面的指令让容器可以使用指定的显卡资源
lxc config device add ContainerName gpu0 gpu id=0
在宿主机与容器之间建立共享文件夹
lxc config set ContainerName security.privileged true
lxc config device add ContainerName ShareName disk source=SourcePath path=ContainerPath
其中ShareName为共享文件夹名称,SourcePath
为宿主机共享文件夹路径,ContainerPath
为容器的共享文件夹路径
挂载nvidia-uvm是为了使容器中安装的框架能够正常使用显卡,如宿主机/dev/下没有nvidia-uvm,可以简单的使用cuda_sample的程序调出来指令如下,该方法缺陷是每次宿主机重启后都需要运行一遍调出nvidia-uvm。
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
./deviceQuery
据说下面这个指令可以一劳永逸挂载nvidia-uvm
/sbin/modprobe nvidia-uvm
D=`grep nvidia-uvm /proc/devices | awk ‘{print $1}’`
Mknod –m 666 /dev/nvidia-uvm c $D 0
随后挂载nvidia-uvm
lxc config device add ContainerName nvidia-uvm unix-char path=/dev/nvidia-uvm
要通过其他设备远程访问容器又不登录到宿主机上,需要将宿主机上的端口进行转发,如ssh登录的时候用的是22端口,就需要将宿主机上某个空闲端口转发到容器对应ip的22端口号上。
端口转发需要进入root权限每次宿主机重启后都需要重新进行一次端口转发的设置,所幸容器在新建后其ip是固定的,容器的ip可以通过lxc list
查看
sudo su
iptables –t nat –A PREROUTING –d Hostip –p tcp –dport Hostport –j DNAT –to Containerip:22
其中Hostip
为宿主机的ip,Hostport
为宿主机的端口号,Containerip
为容器的ip
宿主机上可以开启或关闭容器
lxc start ContainerName
lxc stop ContainerName
也可以直接访问容器内部
lxc exec ContainerName bash
宿主机上虽然装过了这些,但是容器内部是没有的,就是还要再装一遍= - =,但是装显卡驱动的时候需要带上--no-kernel-module
的参数
如果需要ssh访问需要进行ssh配置
sudo apt-get install sshd
或
sudo apt-get install openssh-server
如果是root用户下配置容器的话,需要设置一下密码和修改ssh的配置文件
passwd
vim /etc/ssh/sshd_config
修改sshd_config中#PermitRootLogin prohibit-password
修改为PermitRootLogin yes
(允许远程root账户登陆)#PasswordAuthentication yes
的屏蔽去除开启密码登陆,随后service ssh restart
重启ssh
其他类似cuda
、anaconda
、cudnn
、pytorch之类的就自行配置了没啥差别的
这些配置完就算可以实现基本的功能了,可以通过ssh从其他电脑进行访问了
ssh –p port username@Hostip
使用ssh然后输密码就可以了,Hostip
是宿主机的ip,port
为宿主机上设置的转发的端口
可以通过scp拷贝数据
#从服务器上拷贝文件夹
scp –P port –r username@hostip:dirpath localdirpath
#从服务器上拷贝文件
scp –P port username@hostip:filepath localfilepath
#从本地上传文件夹
scp –P port –r localdirpath username@hostip:dirpath
#从本地上传文件
scp –P port localfilepath username@hostip:filepath
-P
要大写
运行程序通过screen
开辟出一个terminal来运行代码,要不然在你断开连接的时候代码也终止执行了= - =是不是很坑爹
服务器配置:
【1】https://blog.csdn.net/wangke0809/article/details/80235989
【2】https://abcdabcd987.com/setup-shared-gpu-server-for-labs/
【3】https://blog.yangl1996.com/post/gpu-passthrough-for-lxc/
【4】https://yq.aliyun.com/articles/578196
LXD文档:
【5】https://linux.cn/article-7618-1.html
nvidia显卡驱动安装:
【6】https://blog.csdn.net/tianrolin/article/details/52830422
pytorch验证gpu可用:
【7】https://blog.csdn.net/qq_38410428/article/details/82965499
端口映射:
【8】https://blog.csdn.net/xin_yu_xin/article/details/46416101
GPU显存释放:
【9】https://blog.csdn.net/u011321962/article/details/79820782
ssh配置
【10】https://blog.csdn.net/qq_38778137/article/details/83548108
LXCweb管理界面
【11】https://www.cnblogs.com/along21/p/9184293.html
剩下的主要问题就是没有图形界面,emmmmmmm反正目前能炼丹了,等有空再折腾,以及管理容器等,就酱,欢迎讨论以及指正。拖了半年多才来水帖简直了(●─●)