说明
- 理论上适用于其他云平台的
GPU计算型实例
或者自建GPU计算服务器
- 阿里云实例类型
GPU计算型 gn5
- GPU型号
Nvidia Tesla P100
- 操作系统
CentOS-7.7-1908 64位
- Nvidia驱动版本
390.116
- CUDA Driver版本
9.1.85
- CUDA Runtime版本
9.0.176
- cuDNN版本
v7.6.0.64
- Nvidia GPU 兼容性的可以看这篇文章
- Docker版本
19.03.5
- GPU驱动、CUDA、cuDNN版本的选择,请自行根据项目要求进行调整!
手动安装
环境准备
禁用SELINUX
1 | sed -i 's,^SELINUX=.*,SELINUX=disabled,g' /etc/selinux/config |
禁用防火墙
1 | systemctl disable --now firewalld.service |
添加sysctl参数
fs参数
1 | cat > /etc/sysctl.d/99-fs.conf <<EOF |
vm参数
1 | cat > /etc/sysctl.d/99-vm.conf <<EOF |
net参数
1 | cat > /etc/sysctl.d/99-net.conf <<EOF |
修改limits参数
1 | cat > /etc/security/limits.d/99-centos.conf <<EOF |
修改journal设置
1 | sed -e 's,^#Compress=yes,Compress=yes,' \ |
修改history参数
1 | cat > /etc/profile.d/history.sh <<EOF |
更新软件
1 | yum update -y |
安装编译环境
1 | yum groups install -y base 'Development Tools' |
安装常用工具
1 | yum install -y nc \ |
检查GPU
查看PCI设备
1 | lspci | grep -i nvidia |
输出示例
1 | 00:08.0 3D controller: NVIDIA Corporation GP100GL [Tesla P100 PCIe 16GB] (rev a1) |
查看硬件信息
1 | lshw -numeric -C display |
输出示例
1 | *-display:0 |
禁用nouveau驱动
1 | echo "blacklist nouveau" > /etc/modprobe.d/blacklist-nouveau.conf |
重启
1 | reboot |
安装GPU驱动
访问Nvidia官网
下载驱动
网页下载
- 产品类型
Tesla
- 产品类型
P-Series
- 产品家族
Tesla P100
- 操作系统
Linux 64-bit RHEL7
- CUDA Toolkit
9.1
- 点击
搜索
,跳转到驱动程序下载
页面 - 点击
下载
,跳转到驱动下载
- 再次点击
下载
,保存驱动文件
命令行下载
1 | wget -t 10 --timeout=10 http://cn.download.nvidia.com/tesla/390.116/nvidia-diag-driver-local-repo-rhel7-390.116-1.0-1.x86_64.rpm |
安装驱动
1 | yum install nvidia-diag-driver-local-repo-rhel7-390.116-1.0-1.x86_64.rpm |
重启
1 | reboot |
检查驱动情况
检查是否加载开源驱动nouveau
这里不应该有结果输出!
1 | lsmod | grep nouveau |
检查驱动版本
1 | cat /proc/driver/nvidia/version |
输出示例
1 | NVRM version: NVIDIA UNIX x86_64 Kernel Module 390.116 Sun Jan 27 07:21:36 PST 2019 |
查看GPU Summary
1 | nvidia-smi |
输出示例
1 | +-----------------------------------------------------------------------------+ |
查看GPU详细信息
1 | nvidia-smi -i 0 -q |
输出示例
1 | ==============NVSMI LOG============== |
禁用本地YUM源
1 | yum-config-manager --disable nvidia-diag-driver-local-390.116 |
安装CUDA环境
添加CUDA源
1 | yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo |
修改CUDA源地址
1 | sed -e 's,developer.download.nvidia.cn/compute/cuda/repos/,mirrors.aliyun.com/nvidia-cuda,g' \ |
安装CUDA
1 | yum makecache |
设置环境变量
1 | echo 'export PATH=/usr/local/cuda/bin:$PATH' >> /etc/profile.d/cuda.sh |
测试CUDA
查看安装路径
1 | ls -ld /usr/local/cuda* |
输出示例
1 | lrwxrwxrwx 1 root root 8 Jan 1 11:08 /usr/local/cuda -> cuda-9.0 |
检查CUDA版本
1 | nvcc --version |
输出示例
1 | nvcc: NVIDIA (R) Cuda compiler driver |
运行Samples
以下两个测试结果都为Result=PASS
,则说明CUDA安装成功
deviceQuery
切换目录
1 | cd /usr/local/cuda/samples/1_Utilities/deviceQuery |
编译运行
1 | make && ./deviceQuery |
输出示例
1 | ./deviceQuery Starting... |
bandwidthTest
切换目录
1 | cd /usr/local/cuda/samples/1_Utilities/bandwidthTest |
编译运行
1 | make && ./bandwidthTest |
输出示例
1 | [CUDA Bandwidth Test] - Starting... |
禁用CUDA源
1 | yum-config-manager --disable cuda |
安装cuDNN
确定cuDNN下载地址
方法一
访问cuDNN Archive,登录之后下载
方法二
访问Nvidia托管在Gitlab的容器项目地址,根据自己操作系统的版本,找到对应的Dockerfile,提取cuDNN的下载地址
下载cuDNN
这里直接用CUDA-9.0能用到的、最新的
cuDNN 7.6.0.64
1 | wget -O - https://developer.download.nvidia.cn/compute/redist/cudnn/v7.6.0/cudnn-9.0-linux-x64-v7.6.0.64.tgz | tar xz |
阿里云服务器可以直接走阿里云内网下载
1 | baseurl=$(curl -sSL http://100.100.100.200/latest/meta-data/source-address | head -1) |
- cuda_big_version可以通过以下命令查询
1 | curl -sSL "$(curl -sSL http://100.100.100.200/latest/meta-data/source-address | head -1)/opsx/ecs/linux/binary/nvidia/cudnn" |
- cudnn_version以通过以下命令查询
1 | curl -sSL "$(curl -sSL http://100.100.100.200/latest/meta-data/source-address | head -1)/opsx/ecs/linux/binary/nvidia/cudnn/${cuda_big_version}" |
安装cuDNN
1 | cp cuda/include/cudnn.h /usr/local/cuda-9.0/include |
验证cuDNN
1 | git clone --depth=1 https://github.com/wilhelmguo/cudnn_samples_v7.git |
输出示例
1 | cudnnGetVersion() : 7600 , CUDNN_VERSION from cudnn.h : 7600 (7.6.0) |
设置GPU
手动设置
开启Persistence Mode
- 在Linux平台上,可以设置PersistenceMode让Nvidia GPU驱动在空闲的时候依然保持加载状态。
- 此功能可以加快频繁运行短任务,避免频繁加载驱动
- 会提高待机功耗
1 | nvidia-persistenced |
禁用受限模式
- 允许非管理员运行的CUDA程序调整频率
1 | nvidia-smi -acp 0 |
禁用GPU Boost
- GPU Boost功能可以让GPU根据
负载、散热、供电
动态超频运行 - GPU Boost功能需要管理员权限才能调用,这里把权限放开给非管理员程序使用
1 | nvidia-smi --auto-boost-permission=0 |
设置GPU运行频率
- 获取GPU支持的频率
- 设置GPU运行频率
-i
参数指定显卡ID
1 | CLOCK=$(nvidia-smi -i 0 --query-supported-clocks=mem,gr --format=csv,noheader| head -n1 | awk 'BEGIN { FS=" " } ; { print $1 "," $3 }') |
加载Nvidia模块
- 按需调整
- 这里可以独立于Linux发行版的方式创建Nvidia设备文件
create-nvidia-device-file
创建给定编号的Nvidia设备文件unified-memory
加载Nvidia Unified Memory
模块modeset
加载Nvidia内核模块并创建设备文件
1 | nvidia-modprobe --unified-memory --create-nvidia-device-file=0 --modeset |
开机自动设置
1 | cat >> /etc/rc.local <<EOF |
使用阿里云自动安装脚本
说明
- 阿里云在创建GPU计算型实例时,可以通过metadata的方式传入初始化脚本,实现自动安装Nvidia GPU驱动和CUDA
- 详细流程可以看阿里云的操作文档
运行脚本
- 驱动版本
390.116
- CUDA版本
9.0.176
- cuDNN版本
7.5.0
(阿里云没提供7.6.0.64
的版本,根据文档选择了最新的7.5.0
)
1 | DRIVER_VERSION="390.116" |
Nvidia-Docker
说明
- 安装
Docker-CE Stable
- 安装
Nvidia-Docker
安装docker
这里以docker-ce 最新版本为例
- 清理旧Docker包
1 | yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine |
- 安装Docker依赖包
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
- 添加Docker-CE源
1 | yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
- 安装Docker-CE
1 | yum install docker-ce -y |
- 配置Docker启动参数
1 | mkdir -p /etc/docker |
- 设置Docker命令补全
1 | cp /usr/share/bash-completion/completions/docker /etc/bash_completion.d/ |
- 禁用Docker-CE源
1 | yum-config-manager --disable docker-ce-stable |
- 启动Docker
1 | systemctl enable --now docker.service |
- 检查Docker信息
1 | docker info |
安装Nvidia-Docker
- 添加YUM源
1 | distribution=$(. /etc/os-release;echo $ID$VERSION_ID) |
- 安装NVIDIA Container Toolkit
1 | yum install -y nvidia-container-toolkit |
- 重启Docker
1 | systemctl restart docker.service |
测试容器调用GPU
1 | docker run -it --rm --gpus all nvidia/cuda:9.0-base nvidia-smi |
输出示例
1 | Unable to find image 'nvidia/cuda:9.0-base' locally |