1 Ubuntu20.04-live-server利用docker搭建GPU共享服务器
服务器基本配置:
- Ubuntu18.04
- 显卡4张 A100
- 硬盘大小4T
2 安装ubuntu20.04
一路安装即可
- 其中ubuntu20.04的服务器版本的安装界面,网络设置时
subnet
是指网络掩码,它的格式是:192.168.10.0/24
,并不是我们在通常设置的网络掩码格式。 name Server
是指DNS服务器- 分区问题:发现几张硬盘不能挂载同时挂载到
/home
下- 解决:需要用到ubuntu的
LVM
机制,先把几张硬盘给物理分区,再对这几个物理分区组成VG
,再把这个VG挂载到/home
- 解决:需要用到ubuntu的
- 同时跟着安装流程,安装上ssh服务。
3 ubuntu20.04的显卡驱动和cuda安装
3.1 通过ssh进入ubuntu服务器
主要是测试ubuntu服务器的ssh是否正常
此时用xshell工具进行ssh连接。
3.2 安装显卡驱动和cuda
因为安装cuda会自动安装驱动程序,所以直接安装cuda
- cuda各版本版本网址:cuda
- 此处因为用的都是服务器版本的ubuntu,所以不用卸载原有驱动和禁用nouveau
- 下载cuda
root@gpu-server:/home/gpu-server# wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
- 安装cuda
root@gpu-server:/home/gpu-server# sudo sh cuda_11.7.0_515.43.04_linux.run
Failed to verify gcc version. See log at /var/log/cuda-installer.log for details.
出现错误,查看下方日志文件
- 查看日志
root@gpu-server:/home/gpu-server# cat /var/log/cuda-installer.log
[INFO]: Driver not installed.
[INFO]: Checking compiler version...
[INFO]: gcc location:
[ERROR]: Missing gcc. gcc is required to continue.
发现是没有gcc
- 安装gcc等
root@gpu-server:/home/gpu-server# sudo apt-get install gcc
root@gpu-server:/home/gpu-server# sudo apt-get install ubuntu-make
root@gpu-server:/home/gpu-server# sudo apt-get install make
之后重写安装cuda即可,需要把安装界面的所有选择都勾选上!!!
3.3 安装docker
此处可以不用安装docker以及nvidia-docker来调用gpu,直接安装最新的docker19以上,已经封装好了,可以直接调用gpu。(其实还是要下一个工具包 nvidia-container-toolkit
)
最后这台服务器还是用的docker+nvidia-docker2的方式。所以本文还是讲解nvidia-docker2的方式。
- 下载安装docker(使用安装脚本进行安装)
- 参考:docker官方脚本安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 配置docker加速源(此步骤稍后操作,完成下一步后再进行此步骤!!!)
因为后面配置了nvidia-container-runtime之后,会覆盖掉此步骤的daemon.json.
源要去阿里镜像申请,下面贴上笔者之前在另外已经申请了的源
sudo vim /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"registry-mirrors":[
"https://mwm1snjq.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"data-root": "/home/docker",
"log-opts": { "max-size": "50m", "max-file": "1"}
}
- 配置
nvidia-container-runtime
参考:docker gpu 配置
1.先添加下载库
英伟达官方对于添加nvidia-docker库的指导
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
将nvidia-docker的官方库下载库添加到下载源中,其中每个系统版本有不同的下载源,所以需要设置一个关于系统版本号的环境变量distribution
2.安装nvidia-container-runtime:
sudo apt-get install -y nvidia-docker2
systemctl restart docker
安装上后,会重新写入daemon.json,写入的内容如下:
{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } }
所以上一步的操作,需要在这一步结束后就再操作。
3.将当前用户加入到用户组,免sudo方式执行docker命令
sudo gpasswd -a 用户名 docker
3.5 验证docker
通过以下命令来验证docker是否可以成功调用gpu
docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
- docker19 以上的版本都已经继承了–gpus参数,可以使用此参数表明可调用gpu,不用以nvidia-docker run xxxxxxxxxx的方式
- 若是指定卡就可以 --gpu = 1,2 表示指定两张卡。注:官方文档说的是索引号从0开始,但我经过我的尝试,我是从1开始
- 当我尝试调用gpu时,遇到的问题如下
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' nvidia-container-cli: initialization error: driver rpc error: timed out: unknown.
我尝试了各种方案,都无解。最后求助于nvidia-docker官方,在其github官方库上提交我的问题报告。提交问题的地址
最后指出,我的显卡资源没有打开Persistence Mode
,所以在调用gpu资源的时候,一直出现超时问题。
Persistence Mode
没有打开的情况下,我在本机上运行nvidia-smi,也会等待一会才有结果。
解决方案:
开启Persistence Mode
nvidia-smi -pm ENABLED
(需要root权限)
gpu-server@gpu-server:~$ sudo su
[sudo] password for gpu-server:
root@gpu-server:/home/gpu-server# nvidia-smi -pm ENABLED
Enabled persistence mode for GPU 00000000:01:00.0.
Enabled persistence mode for GPU 00000000:41:00.0.
Enabled persistence mode for GPU 00000000:81:00.0.
Enabled persistence mode for GPU 00000000:C1:00.0.
- 最后我的验证结果
3.6 配置docker容器,以便ssh访问docker容器
- 进入docker容器
docker exec -it 容器id /bin/bash
- 安装ssh
apt-get install openssh-server
- 允许root远程连接
vim /etc/ssh/sshd_config
设置PermitRootLogin yes
- 为root用户设置登录密码
passwd root
- 重启ssh服务
systemctl restart ssh
4 参考
使用docker搭建共享GPU
nvidia-container-runtime官方库
nvidia-docker2官方库
调用GPU创建容器超时问题报告
nvidia持久模式的中文翻译介绍
配置GPU运行环境(主要有如何开启GPU持久模式)