这个是在之前导师的实验室积累的一些东西,使用场景的话,是适用于2-8人左右的小团队吧,当时有两台机器,一台是放在学校机房的服务器,CPU没注意是什么,印象中是64G内存,4块P20,貌似24G显存?;另一台机器则放在办公室,主要配置的话,一颗AMD Ryzen 2700X,64G内存,再附加两块1080ti 11G,经费肯定是还做不到一人分一块GPU,部分模型的大小也不需要完全独占一块GPU。但是构建一个小型团队使用的AI Lab服务器是没问题了。
当时搭建的AI Lab服务器的主要架构如下
系统方面选择了Ubuntu 18.04 LTS,简单方便,毕竟是做AI不是做OS,没有任何必要引入其他方面复杂的操作。然后在这之上则是系统层面的GPU驱动,当时对应的版本为396.26,目前已经有400版本号的驱动了。接下来就是与docker对接的nvidia的runc,由这个runc去给docker内的GPU提供支持。随后当时则是使用了支持多用户的JupyterHub,当然也可以通过分配多个账号解决,这一部分和之后的部分解决方案就很多了。
安装系统
说实话这一部分应该是很简单的,从https://www.ubuntu.com/download/desktop下载LTS版的ubuntu,然后在macOS/Linux下直接dd写入到U盘,或者windows上用Rufus写入。
写好系统安装镜像之后,用U启动安装即可,但是偶尔会有UEFI启动的问题,导致grub2安装失败,一般来说检查主板UEFI里的启动设置尽可能都是UEFI或者为UEFI First,然后关闭CSM。其次的话,可以在给硬盘分区的时候可以手动创建一个挂载点是/boot的分区,大小200M左右FAT32格式,设置ESP(EFI system partation) flag即可。
安装GPU驱动
安装GPU驱动的方法也很多,我只说我最常用的方法,直接去NVIDIA官网下载所需版本的CUDAToolkit的runfile(lcoal),那里面是包含了显卡驱动的,使用起来会比较方便。
从runfile安装GPU驱动的时候,会需要编译内核模块,因此需要预先apt安装一些东西。顺便可能需要先去UEFI关闭Secure Boot,因为自己编译的内核模块似乎会导致untrusted,从而无法启动。
# Update system sudo apt-get update sudo apt-get upgrade -y # Compile chains and essential tools sudo apt-get install -y gcc g++ build-essential \ openssh-server ssh \ python3 python3-dev \ apt-transport-https \ ca-certificates \ curl git \ software-properties-common \ zlib1g-dev bash-completion vim
由于CUDAToolkit的runfile(lcoal)是在shell脚本里内嵌了一个压缩包,所以执行的时候会先解压(没有提示),等个5-30秒(看硬盘写入速度),然后直接Ctrl+C跳过more的一堆说明,accept条款,然后输入y选择安装驱动、OpenGL库,CUDAToolkit等,第一次可能会要求重启(因为会自动去屏蔽系统原本的驱动),然后重启了再来第二次安装即可。在新版的cuda的runfile里,nvidia貌似忘了一件事
# 下面这句在提示需要重启来继续安装之后执行
sudo update-initramfs -u
成功安装完之后,需要将CUDA的库的地址加入到LD_LIBRARY_PATH里,比如CUDA 10.0的话,默认是在/usr/local/cuda-10.0/lib64,那么就编辑一下/etc/ld.so.conf,在最底下增加一行新的
/usr/local/cuda-10.0/lib64
随后sudo ldconfig一下,让系统更新一下默认搜索动态链接库可能的加载路径。
cuDNN的安装也很简单,下载好cuDNN的包之后,解压了里面会有一个名为cuda的目录,在terminal中进入到这个cuda目录之后,把cuDNN的头文件和动态链接库复制到CUDA的安装路径即可,下面是CUDA 10.0的例子,其他CUDA版本自己确认一下路径。
sudo cp -P include/cudnn.h /usr/local/cuda-10.0/include sudo cp -P lib64/libcudnn* /usr/local/cuda-10.0/lib64 sudo chmod a+r /usr/local/cuda-10.0/lib64/libcudnn*
安装Docker与nvidia runc
这里就都很简单了,先来说Docker,直接按Docker官方给的安装方法一步到位。
# Docker curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" sudo apt-get update sudo apt-get install -y docker-ce
然后安装上nvidia runc即可~
# NVIDIA-Docker curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \ sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-container-runtime nvidia-docker2 sudo pkill -SIGHUP dockerd
为了方便,可以让docker默认使用nvidia的runc来启动运行container,修改一下/etc/docker/daemon.json即可,大概就会变成下面这样(高亮部分为增加的内容)
{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia" }
余下的部分
在我当时的配置中,是使用了JupyterHub来做多用户,在jupyterhub/jupyterhub-deploy-docker在上面魔改了一些配置,包括base image也从notebook改成了nvidia的镜像。
git clone https://github.com/jupyterhub/jupyterhub-deploy-docker.git
由于这里的需求各不相同,于是就不细写了,整体思路就是在docker里做出一个多用户环境,然后就正常使用即可。