基于LXC的GPU服务器搭建

前言

前段时间进了一台四路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是啥?LXC全称为Linux Container即Linux的容器,是一种内核虚拟化的技术,是一种轻量级的虚拟化技术。可以理解为与C++中的namespaces相似;看到虚拟化第一个想到虚拟机,直接用虚拟机不就好了= - =,然而趟过坑的选手表示,虚拟机真的不好用鸭,传统的虚拟机主要存在的致命问题是:

  • 显卡直通上支持并不是很好,配置过程中会有各种奇奇怪怪的问题;
  • 显卡直通的坑趟完之后会发现,尼玛鸭这个虚拟机就霸占着这个显卡啦,那还搞啥服务器显卡拆下来一人拿一个回去好了(╯‵□′)╯︵┴─┴
    LXC没有上述的问题,配置灵活,对显卡支持好,效率高看着很棒的样子。

LXC的宿主机配置

LXC被称为linux的容器,那么宿主机必然需要一个linux系统,我用的是ubuntu的16.04作为宿主机的系统,这里和windows没有半毛钱关系,充满了对windows的歧视。

安装

sudo apt install zfs
sudo apt -t -xenial-backports install lxd
sudo apt install bridge-utils
  • 第一行安装的ZFS是一个用于管理物理硬盘,支持一些LXD的高级功能,可以去冗余存储的功能,但不是必选项;
  • 第二行是安装LXD就是基于LXC的虚拟容器
  • 第三行是用于搭建网桥的(虽然装了但是我后来没用,主要是可以实现不通过宿主机实现上网,如果有需要的话可以参考这篇博客实现一下https://blog.csdn.net/wangke0809/article/details/80235989,关于网桥这块后面就跳过了)

除此之外还需要安装一下显卡驱动,因为需要把nvidia-uvm挂载到容器上去(如果不挂载nvidia-uvm会导致在容器中使用nvidia-smi查看gpu是可以获得gpu信息的,但是调用pytorch中的torch.cuda.is_available()返回的是Fasle)

基础配置

配置ZFS

如果不用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

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

挂载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访问需要进行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

个人配置

其他类似cudaanacondacudnnpytorch之类的就自行配置了没啥差别的

使用

这些配置完就算可以实现基本的功能了,可以通过ssh从其他电脑进行访问了

ssh连接

ssh –p port username@Hostip

使用ssh然后输密码就可以了,Hostip是宿主机的ip,port为宿主机上设置的转发的端口

scp文件传输

可以通过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反正目前能炼丹了,等有空再折腾,以及管理容器等,就酱,欢迎讨论以及指正。拖了半年多才来水帖简直了(●─●)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值