【亿点笔记】Proxmox VE(PVE) 下直通GPU给LXC 进行CUDA coding
节操仙人
2021年09月14日 22:15

前言

这篇笔记写给自己以及那些准备入坑,或者掉入坑里的人。

硬件配置

CPU:E5-2680V1 ES *2     

主板: 华硕Z9PA-D8 (并且配置了PIKE卡,ASBM6远程管理模块)

内存:DDR3-1600Mhz 32G RECC*4 Total 128G

显卡准确来说是计算卡:Tesla K80

磁盘阵列卡:芯片为LSI2108的IBM5015,商家说不能刷直通。实际能不能刷没试过。

硬盘:2T 7200RPM SAS硬盘*6    3T 7200RPM SAS硬盘*4  Toal 24TB容量

在远古时代这是一台价值四五万的服务器,确信脸。


坑一:K80 有两个核心,每个核心14G显存,这对主板有严格要求,即使主板Bios里有Above 4G decoding也不一定能支持,我用华硕B85M-Gamer这块板子试过了,插上去之后,在Win10下的资源管理器里会显示PCIE资源不足,没法顺利安装驱动。K80挑板子,朋友们买计算卡一定要查清楚计算卡与主板兼容的问题。

坑二:K80散热是被动散热,需要自行加装风扇,我这里的办法是用尼龙轧带把两个8CM暴力扇捆到计算卡两个核心位置上吹风,再反向捆绑一个9CM的猫扇(家里面有什么用什么了,8CM的普通扇也行)在中间位置抽风,防止中间位置积热。这样改造就相当于是一个3.5槽位计算卡了,如果机箱内还有其他PCIE设备要注意位置是否能装得下的问题。

坑三:如果你恰巧用的是华硕Z9PA,或者说是C602芯片组的主板,你现在点亮了,但是在直通到虚拟机上要么发生蓝屏死机【虚拟机宿主机设置问题】,要么只能直通一个核心的话【虚拟机设置或者是主板PCIE资源不够的问题】,那可以尝试一下PVE下的LXC。

LXC是什么和详细的优点略过。不过可以理解为比虚拟机还要高效率的存在,类似于Docker容器的存在【也不知道这样表述正不正确】

再次,如果很不幸,你买了一张K80,用的是Z9PA-D8这样勉强能够K80正常使用的主板,你有开各种虚拟机做服务器的需求,而且你同时还需要再一台机器里面使用CUDA,简单的来说你在Build一个AIO(ALL IN ONE)服务器的话,那么接下来的内容就是我这十天不吃不喝不睡捣鼓成功的结果。


正文

为了让PVE的GPU直通到LXC,我重装了两次PVE。其中一次还格式化错硬盘,4T的学习资料 全没了。

PVE7系统安装部分略。

全新的PVE7,目前的内核是5.11.4。顺便说一下,众所周知PVE是基于Debian的,而PVE7是基于Debian11 bullseye的。如果你在使用的是PVE6 buster,需要在操作上注意一些差别。

第一步修改订阅库也就是Repository。

PVE7:

代码块
JavaScript
自动换行
复制代码
vi /etc/apt/sources.list
#把所有代码删掉。然后复制粘贴下面的这一段。这里是PVE7专用的。PVE6的不要复制粘贴
deb http://deb.debian.org/debian bullseye main contrib non-free
deb-src http://deb.debian.org/debian bullseye main contrib non-free

deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
deb-src http://deb.debian.org/debian-security/ bullseye-security main contrib non-free

deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free

#bullseye backport
deb http://deb.debian.org/debian bullseye-backports main contrib non-free
deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free
复制成功

PVE6

代码块
JavaScript
自动换行
复制代码
vi /etc/apt/sources.list
#把原来的代码全部删掉然后复制以下内容,这个是PVE6专用的,PVE7的可以看下一步
deb http://deb.debian.org/debian buster main contrib non-free
deb-src http://deb.debian.org/debian buster main contrib non-free

deb http://deb.debian.org/debian-security/ buster-security main contrib non-free
deb-src http://deb.debian.org/debian-security/ buster-security main contrib non-free

deb http://deb.debian.org/debian buster-updates main contrib non-free
deb-src http://deb.debian.org/debian buster-updates main contrib non-free
#backport
deb http://deb.debian.org/debian buster-backports main contrib non-free
deb-src http://deb.debian.org/debian buster-backports main contrib non-free
复制成功

然后更新库。

代码块
JavaScript
自动换行
复制代码
apt-get update -y
apt-get full-upgrade -y
复制成功

然后安装header

首先,通过uname -a 查询自己的内核。

然后,apt-cache search pve-header 查询跟自己内核版本一样的header

注意这里说的是pve-header 而不是linux-header

然后 ##apt install pve-headers-5.11.22-4-pve##这个是我的,PVE7下的具体你们要把 install 后面的内容换成你们的版本号。

接下来安装dkms,这个包太重要了,不然安装nvidia驱动总是报错。

代码块
JavaScript
自动换行
复制代码
apt-get update -y
apt-get install dkms -y
复制成功

然后再确认一下,计算卡插上了,并且能准确显示。

代码块
JavaScript
自动换行
复制代码
lspci | grep -i nvidia
lspci -vvv |grep -i -A 20 nvidia
复制成功

这里输出的结果应该是这样的:

代码块
JavaScript
自动换行
复制代码
##第一条命令输出结果应该是这样的
08:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
09:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
##第二条命令输出结果应该是这样的:
root@pve:~# lspci -vvv |grep -i -A 20 nvidia
pcilib: sysfs_read_vpd: read failed: Input/output error
08:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
	Subsystem: NVIDIA Corporation GK210GL [Tesla K80]
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 107
	NUMA node: 0
	Region 0: Memory at f4000000 (32-bit, non-prefetchable) [size=16M]
	Region 1: Memory at 383800000000 (64-bit, prefetchable) [size=16G]
	Region 3: Memory at 383c00000000 (64-bit, prefetchable) [size=32M]
	Capabilities: [60] Power Management version 3
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
		Address: 00000000fee00a78  Data: 0000
	Capabilities: [78] Express (v2) Endpoint, MSI 00
		DevCap:	MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 <64us
			ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit 25.000W
		DevCtl:	CorrErr- NonFatalErr- FatalErr- UnsupReq-
			RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 256 bytes, MaxReadReq 512 bytes
		DevSta:	CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
--
	Kernel driver in use: nvidia
	Kernel modules: nvidia

09:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
	Subsystem: NVIDIA Corporation GK210GL [Tesla K80]
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 108
	NUMA node: 0
	Region 0: Memory at f3000000 (32-bit, non-prefetchable) [size=16M]
	Region 1: Memory at 383000000000 (64-bit, prefetchable) [size=16G]
	Region 3: Memory at 383400000000 (64-bit, prefetchable) [size=32M]
	Capabilities: [60] Power Management version 3
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
		Address: 00000000fee00a98  Data: 0000
	Capabilities: [78] Express (v2) Endpoint, MSI 00
		DevCap:	MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 <64us
			ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit 25.000W
		DevCtl:	CorrErr- NonFatalErr- FatalErr- UnsupReq-
			RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop-
pcilib: 			MaxPayload 256 bytes, MaxReadReq 512 bytes
sysfs_read_vpd: read failed: Input/output error		DevSta:	CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-

--
	Kernel driver in use: nvidia
	Kernel modules: nvidia

复制成功

Kernel driver还不是Nvidia没有关系因为现在还没有安装Nvidia的驱动,需要注意的是这个部分

代码块
JavaScript
自动换行
复制代码
Region 0: Memory at f8000000 (32-bit, non-prefetchable)
Region 1: Memory at d8000000 (64-bit, prefetchable)
Region 3: Memory at d4000000 (64-bit, prefetchable)
复制成功

出现上面这个情况说明能用。(不一定一摸一样,就看内存是不是都分配到了地址。)

出现下面的情况说明不能正常使用:

代码块
JavaScript
自动换行
复制代码
Region 0: Memory at c1000000 (32-bit, non-prefetchable)
Region 1: Memory at (64-bit, prefetchable)
Region 3: Memory at (64-bit, prefetchable)
复制成功

此方法出处: https://forums.developer.nvidia.com/t/driver-installing-problem-for-nvidia-tesla-k80-under-linux/39124/11

然后安装显卡驱动

PVE7

代码块
JavaScript
自动换行
复制代码
apt-get update
apt-get install -t bullseye-backports nvidia-driver nvidia-smi
复制成功

PVE6

代码块
JavaScript
自动换行
复制代码
apt-get update
apt-get install -t buster-backports nvidia-driver nvidia-smi
复制成功

安装完成之后去添加模块

代码块
JavaScript
自动换行
复制代码
vi /etc/modules-load.d/nvidia.conf
#然后确保nvidia.conf里面有这些内容
nvidia-drm
nvidia
nvidia_uvm
复制成功

然后再看同样目录里面其他.conf有没有把nvidia兼容驱动(主要是nouveau,nvidiafb这两个)屏蔽掉。比如说 nvidia-blacklist.conf 都看一个遍,如果有就不要重复添加,如果没有那就手动屏蔽。可以再回到nvidia.conf里面添加下面两行代码:

代码块
JavaScript
自动换行
复制代码
blacklist nouveau
blacklist nvidiafb
复制成功

然后更新模块

代码块
JavaScript
自动换行
复制代码
update-initramfs -u -k all
复制成功

然后新建规则文件

代码块
JavaScript
自动换行
复制代码
vi /etc/udev/rules.d/70-nvidia.rules
#在这个文件内添加以下代码
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
复制成功

然后重启PVE

然后验证一下驱动装好没有。

代码块
JavaScript
自动换行
复制代码
ls -al /dev/nvidia*
ls -al /dev/dri/* 
nvidia-smi
复制成功

这三条命令输出的结果应该分别是这样的:

代码块
Python
自动换行
复制代码
#第一条命令输出结果,留意一下195,234,还有第二条命令226 所对应的硬件、模块跟你的是不是一样的,如果不一样记一下,后面要用到。同时也别忘了看权限是否相同,这也很重要。
root@pve:~# ls -al /dev/nvidia*
crw-rw-rw- 1 root root 195,   0 Sep 13 22:40 /dev/nvidia0
crw-rw-rw- 1 root root 195,   1 Sep 13 22:40 /dev/nvidia1
crw-rw-rw- 1 root root 195, 255 Sep 13 22:40 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Sep 13 22:40 /dev/nvidia-modeset
crw-rw-rw- 1 root root 234,   0 Sep 13 22:40 /dev/nvidia-uvm
crw-rw-rw- 1 root root 234,   1 Sep 13 22:40 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
total 0
drw-rw-rw-  2 root root     80 Sep 13 22:40 .
drwxr-xr-x 23 root root   5420 Sep 14 13:09 ..
cr--------  1 root root 240, 1 Sep 13 22:40 nvidia-cap1
cr--r--r--  1 root root 240, 2 Sep 13 22:40 nvidia-cap2
#第二条命令输出结果:
ls -al /dev/dri/*
root@pve:~# ls -al /dev/dri/* 
crw-rw---- 1 root video  226,   0 Sep 13 22:40 /dev/dri/card0
crw-rw---- 1 root video  226,   1 Sep 13 22:40 /dev/dri/card1
crw-rw---- 1 root video  226,   2 Sep 13 22:40 /dev/dri/card2
crw-rw---- 1 root render 226, 128 Sep 13 22:40 /dev/dri/renderD128
crw-rw---- 1 root render 226, 129 Sep 13 22:40 /dev/dri/renderD129

/dev/dri/by-path:
total 0
drwxr-xr-x 2 root root 140 Sep 13 22:40 .
drwxr-xr-x 3 root root 160 Sep 13 22:40 ..
lrwxrwxrwx 1 root root   8 Sep 13 22:40 pci-0000:08:00.0-card -> ../card0
lrwxrwxrwx 1 root root  13 Sep 13 22:40 pci-0000:08:00.0-render -> ../renderD128
lrwxrwxrwx 1 root root   8 Sep 13 22:40 pci-0000:09:00.0-card -> ../card1
lrwxrwxrwx 1 root root  13 Sep 13 22:40 pci-0000:09:00.0-render -> ../renderD129
lrwxrwxrwx 1 root root   8 Sep 13 22:40 pci-0000:11:00.0-card -> ../card2

###第三条命令输出结果
root@pve:~# nvidia-smi
Tue Sep 14 20:18:17 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K80           On   | 00000000:08:00.0 Off |                    0 |
| N/A   40C    P8    26W / 149W |      0MiB / 11441MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla K80           On   | 00000000:09:00.0 Off |                    0 |
| N/A   39C    P8    30W / 149W |      0MiB / 11441MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
WARNING: infoROM is corrupted at gpu 0000:08:00.0
WARNING: infoROM is corrupted at gpu 0000:09:00.0

#至于为什么会出现infoROM is corrupted at gpu 0000:08:00.0我也不知道,知道的人跟我说一下
复制成功

新建一个LXC,我Ubuntu不知道为什么没有成功可能是我某个地方操作不对,有兴趣的也可以去试一下,理论上像CentOS Ubuntu 这类Linux系统应该都没有问题的。这里我用Debian10作为演示(其实是为了避免更多的坑)

从PVE 的WebUI上直接下载Debian的模板。然后应用到实例上。6C,8G, 1T,非特权+嵌套+键盘。

进入LXC系统后

代码块
Python
自动换行
复制代码
apt-get update 
apt-get full-upgrade
复制成功

然后通过run file来安装nvidia驱动,驱动的版本要跟宿主机一摸一样。

通过在宿主机上输入nvidia-smi得知目前的驱动版本是460.91.03。

然后通过wget 获取驱动,没有wget 那就apt-get install wget -y 获取一个。

代码块
Python
自动换行
复制代码
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/460.91.03/NVIDIA-Linux-x86_64-460.91.03.run
复制成功

上述的那个网站你想要安装其他版本的只要改版本号就行了。

然后进行无核心安装

代码块
Python
自动换行
复制代码
chmod +x NVIDIA-Linux-x86_64-460.91.03.run
sudo ./NVIDIA-Linux-x86_64-460.91.03.run --no-kernel-module
复制成功

驱动安装完毕之后关闭LXC,回到宿主机,编辑LXC配置文件,进行显卡直通。

代码块
Python
自动换行
复制代码
/etc/pve/lxc/XXX.conf 其中XXX是你VID我这里是105因此
vi /etc/pve/lxc/105.conf 
复制成功

代码块
Python
自动换行
复制代码
##将以下代码添加到文件的末尾,注意那三个数字是不是跟你之前看的一样,不一样需要修改。
lxc.cgroup.devices.allow: c 195:* rwm
lxc.cgroup.devices.allow: c 234:* rwm
lxc.cgroup.devices.allow: c 226:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia1 dev/nvidia1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
复制成功

保存退出。

然后开启LXC。

输入以下命令

代码块
Python
自动换行
复制代码
ls -al /dev/nvidia* 
ls -al /dev/dri/*
nvidia-smi
复制成功

返回值分别为:

代码块
Python
自动换行
复制代码
#第一个命令返回值:
crw-rw-rw- 1 nobody nogroup 195, 254 Sep 13 14:40 /dev/nvidia-modeset
crw-rw-rw- 1 nobody nogroup 234,   0 Sep 13 14:40 /dev/nvidia-uvm
crw-rw-rw- 1 nobody nogroup 234,   1 Sep 13 14:40 /dev/nvidia-uvm-tools
crw-rw-rw- 1 nobody nogroup 195,   0 Sep 13 14:40 /dev/nvidia0
crw-rw-rw- 1 nobody nogroup 195,   1 Sep 13 14:40 /dev/nvidia1
crw-rw-rw- 1 nobody nogroup 195, 255 Sep 13 14:40 /dev/nvidiactl
#第二个命令返回值
root@CUDA:~# ls -al /dev/dri/*
crw-rw---- 1 nobody nogroup 226,   0 Sep 13 14:40 /dev/dri/card0
crw-rw---- 1 nobody nogroup 226,   1 Sep 13 14:40 /dev/dri/card1
crw-rw---- 1 nobody nogroup 226,   2 Sep 13 14:40 /dev/dri/card2
crw-rw---- 1 nobody nogroup 226, 128 Sep 13 14:40 /dev/dri/renderD128
crw-rw---- 1 nobody nogroup 226, 129 Sep 13 14:40 /dev/dri/renderD129

/dev/dri/by-path:
total 0
drwxr-xr-x 2 nobody nogroup 140 Sep 13 14:40 .
drwxr-xr-x 3 nobody nogroup 160 Sep 13 14:40 ..
lrwxrwxrwx 1 nobody nogroup   8 Sep 13 14:40 pci-0000:08:00.0-card -> ../card0
lrwxrwxrwx 1 nobody nogroup  13 Sep 13 14:40 pci-0000:08:00.0-render -> ../renderD128
lrwxrwxrwx 1 nobody nogroup   8 Sep 13 14:40 pci-0000:09:00.0-card -> ../card1
lrwxrwxrwx 1 nobody nogroup  13 Sep 13 14:40 pci-0000:09:00.0-render -> ../renderD129
lrwxrwxrwx 1 nobody nogroup   8 Sep 13 14:40 pci-0000:11:00.0-card -> ../card2
第三个命令返回值:
oot@CUDA:~# nvidia-smi
Tue Sep 14 12:58:17 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 00000000:08:00.0 Off |                    0 |
| N/A   40C    P8    27W / 149W |      0MiB / 11441MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla K80           Off  | 00000000:09:00.0 Off |                    0 |
| N/A   39C    P8    30W / 149W |      0MiB / 11441MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
WARNING: infoROM is corrupted at gpu 0000:08:00.0
WARNING: infoROM is corrupted at gpu 0000:09:00.0
复制成功

则说明成功,如果nvidia-smi 返回值错误,那多半是LXC没有安装好驱动(可能是依赖包没有装好,可能是还有别的我忘了说。),这里的驱动是要去核心。

通常一般的教程就到这里,完全没有讲怎么搭建CUDA环境。

有两种方法,

第一种最简单的是安装anaconda-navigator,然后再conda install cuda-toolkit,然后再配置一下环境变量就行了。

第二种是下载cuda-toolkit run file 然后手动安装,至于为什么不apt-get install cuda-toolkit。我是怕会自动安装上驱动,然后版本不对,导致直通失败。不过在Debian下 使用apt hold nvidia-driver 应该就能锁定显卡驱动的版本号。

第一种

代码块
Python
自动换行
复制代码
##Anaconda-navigator的网址
https://docs.anaconda.com/anaconda/install/linux/
复制成功

Debian:

CentOS:

代码块
Python
自动换行
复制代码
yum install libXcomposite libXcursor libXi libXtst libXrandr alsa-lib mesa-libEGL libXdamage mesa-libGL libXScrnSaver
复制成功

然后通过conda install 来安装cuda-toolkit

代码块
Python
自动换行
复制代码
conda install -c anaconda cudatoolkit
复制成功

环境变量的话看一下输入命令nvcc有没有反应,如果说bash command not found那就是没有配置环境变量,如果说nvcc fatal,那说明配置好了。

防止我自己也忘记怎么配置环境变量我也Mark一下:

代码块
Python
自动换行
复制代码
vi ~/.bashrc
##将一下内容添加到文件末尾
export LD_LIBRARY_PATH=/usr/local/cuda/lib

   export PATH=$PATH:/usr/local/cuda/bin
复制成功

如果CUDA文件夹有版本号那就改成有版本号,没有就不用改,不确定就直接 ls /usr/local 看下cuda带不带版本号的。

第二种

从nvidia官网获取run file,不管是通过迅雷下载然后再通过winscp传到LXC上,还是直接wget

(这里推荐用迅雷下载好,然后再传到LXC上这样方法,这样做会更加稳定,稳就是快。)

我选择了一个版本跟我显卡驱动匹配的CUDA toolkit进行安装。

传上LXC之后

代码块
Python
自动换行
复制代码
apt-get update -y
apt-get install gcc -y
sudo apt-get install g++ freeglut3-dev build-essential libx11-dev \
    libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev freeimage-devel
chmod +x cuda_11.2.2_460.32.03_linux.run
bash cuda_11.2.2_460.32.03_linux.run
复制成功

不安装CUDA driver

然后

代码块
Python
自动换行
复制代码
ls /usr/local/cuda-11.2
复制成功

也可能是

代码块
Python
自动换行
复制代码
ls /usr/local/cuda
复制成功

记不太清楚了,ls出来有文件 有bin 有nvcc那说明成功安装了,然后再nvcc一下如果报nvcc fatal那说明环境变量已经弄好了,否则就需要去再弄一下环境变量。方法前面有提到。

还可以去试一试samples里面的文件跑一个benchmark

代码块
Python
自动换行
复制代码
cuda-install-samples-11.2.sh ~

cd ~/NVIDIA_CUDA-11.2_Samples/5_Simulations/nbody

sudo apt-get install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev libglfw3-dev libgles2-mesa-dev

GLPATH=/usr/lib make

./nbody numdevices=2 -benchmark
复制成功

结果CUDA算力只有3.7 hhhhhhhhhhhhhhhhhhhh

不过到这一步已经表明K80能在Z9PA-D8平台上,同时与一张PCIEX1 的千兆网卡,两张磁盘阵列卡(Pike现在跑的是X4通道,M5105跑的是X8通道,不过好像资源有点不够用了2333333)兼容使用。使用K80的话不建议搭配C602或者X79平台使用。C612或者X99应该能够更加合适。

如果按照上述的操作估计也就一两个小时就能弄好了吧,如果能成功复刻,那这篇笔记的目的就达到了。

参考资料: https://passbe.com/2020/02/19/gpu-nvidia-passthrough-on-proxmox-lxc-container/ https://medium.com/@MARatsimbazafy/journey-to-deep-learning-nvidia-gpu-passthrough-to-lxc-container-97d0bc474957 https://docs.anaconda.com/anaconda/install/linux/ https://wiki.debian.org/SourcesList ##################################################### 就是这个网站,看点一:解释了为什么K80不是每一张主板都能用,原理在里面写清楚了。看点二:Nvidia的staff跟提问者的对话,也相当有意思。 https://forums.developer.nvidia.com/t/driver-installing-problem-for-nvidia-tesla-k80-under-linux/39124/11 #################################################### https://www.how2shout.com/linux/how-to-install-and-use-backports-in-debian-11-bullseye/ https://docs.nvidia.com/cuda/archive/11.2.0/ https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html 以上硬件由Ms.Schedar特别赞助