天天看点

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

作者:略懂的大龙猫

首先我不推荐Tesla P4这张显卡,既无主动散热、也无视频输出接口、性价比又低(连矿渣40HX都不如)。显卡算上散热花了400元(显卡360+支架30+风扇17),之所以买这张卡是因为我个人喜欢Tesla P4(功耗低、外观小巧,是我眼里颜值最高的显卡),半买半收藏,顺便给All-In-One主机折腾vGPU显卡虚拟化。

本文介绍的是PVE环境下Tesla P4显卡虚拟化设置,由于Tesla P4是专业卡本身支持vGPU,非专业卡的N卡则需要vGPU Unlock才能虚拟化,不在本文介绍范围内:

1、准备工作:PVE设置

PVE开启iommu(实现PCIE直通):

vim /etc/default/grub           
#修改如下设置
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
#intel cpu 改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
#amd cpu改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"           

更新grub:

update-grub           

加载vfio模块

echo vfio >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules           

更新内核参数

update-initramfs -k all -u           

屏蔽开源显卡驱动,避免开机时显卡被系统加载

#AMD显卡
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf 
#NVIDIA显卡
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf 
#INTEL核显
echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist snd_hda_codec_hdmi" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf           

更新内核并重启

update-initramfs -k all -u           

准备工作完毕!

2、PVE安装显卡host驱动

将显卡装上后就可以安装驱动了。计算卡驱动官网下载需要注册账户比较麻烦,可以网上找别人打包好的驱动。vGPU驱动分host(服务端)、client(客户端)两种驱动。PVE上需要安装host驱动。首先安装显卡驱动依赖环境:

apt install build-essential dkms mdevctl pve-headers-$(uname -r)           

通过ssh上传驱动到PVE并安装,如之前安装了显卡驱动需要先卸载:

#如果之前安装了显卡驱动需要先卸载
apt-get remove --purge nvidia-*
#进入驱动所在目录,开始安装驱动
chmod +x NVIDIA-Linux-x86_64-535.54.06-vgpu-kvm.run
./NVIDIA-Linux-x86_64-535.54.06-vgpu-kvm.run --dkms
#重启pve
reboot           
上手Tesla P4,All-In-One玩vGPU显卡虚拟化
上手Tesla P4,All-In-One玩vGPU显卡虚拟化

这样PVE已经安装好了驱动,接下来给虚拟机安装驱动前,先搭建好vGPU的授权服务。

3.搭建授权服务

vGPU客户端需要授权才可以正常使用驱动。个人去买商业授权有点不划算,所以用民间的授权大法:通过docker搭建授权服务。

找一台Linux设备,安装好docker环境,记下设备的局域网IP地址,开始搭建docker,下面2种方式任选其一:

3.1 makedie/fastapi-dls 镜像

makedie/fastapi-dls 是基于collinwebdesigns/fastapi-dls原版镜像修改的方案,不需要自己搭建openssl,所以操作比较简单。

一条命令就可以搭建好容器,注意修改实际的局域网IP:

docker run -d -e DLS_URL=192.168.31.20 -e DLS_PORT=1020 -p 1020:443  makedie/fastapi-dls            

3.2 collinwebdesigns/fastapi-dls 镜像(原版)

collinwebdesigns/fastapi-dls 是原版镜像需要自己搭建openssl证书,所以服务器上不仅要安装docker还要安装好openssl

apt install openssl           

服务器上创建证书:

WORKING_DIR=/opt/docker/fastapi-dls/cert
mkdir -p $WORKING_DIR
cd $WORKING_DIR
# create instance private and public key for singing JWT's
openssl genrsa -out $WORKING_DIR/instance.private.pem 2048 
openssl rsa -in $WORKING_DIR/instance.private.pem -outform PEM -pubout -out $WORKING_DIR/instance.public.pem
# create ssl certificate for integrated webserver (uvicorn) - because clients rely on ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout  $WORKING_DIR/webserver.key -out $WORKING_DIR/webserver.crt           

运行docker fastapi-dls服务:

docker run -e DLS_URL=192.168.31.128 -e DLS_PORT=1020 -p 1020:443 -v $WORKING_DIR:/app/cert collinwebdesigns/fastapi-dls:latest           

访问 https://192.168.31.20:1020 查看授权服务是否正常运行:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

4.虚拟机安装vGPU驱动及授权

首先在PVE上给虚拟机添加PCI设备,选择对应的显卡:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

由于我要对显卡做划分,所以在MDev类型要选一下,我只打算划分2块,所以选的GRID P4-4Q(nvidia-65):

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

接下来在虚拟机上安装vGPU驱动及授权,将驱动发送到虚拟机上(根据不同系统可以采用smb共享或者ssh远程的方法操作)。就像正常在电脑上安装驱动即可。

上手Tesla P4,All-In-One玩vGPU显卡虚拟化
上手Tesla P4,All-In-One玩vGPU显卡虚拟化

安装好驱动后,获取vGPU授权:

Windows管理员权限运行 PowerShell 执行如下命令,注意修改认证服务器地址(同上面docker容器服务的地址):

# 下载授权文件
curl.exe --insecure -L -X GET https://192.168.31.20:1020/-/client-token -o "C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_$($(Get-Date).tostring('dd-MM-yy-hh-mm-ss')).tok"
# 重启英伟达服务
Restart-Service NVDisplay.ContainerLocalSystem
# 查看授权状态
nvidia-smi.exe -q | Select-String License           

Linux root 权限执行如下命令:

# 下载授权文件
curl --insecure -L -X GET https://192.168.31.20:1020/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok
# 重启英伟达服务
service nvidia-gridd restart
# 查看授权状态
nvidia-smi -q | grep License            

在Windows上安装好驱动后,在任务管理器里已经可以正常识别到显卡了,由于我把显卡做了划分,所以这里显示的显存为4G。

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

为了更好调用显卡可以通过moonlight+sunshine对虚拟机进行串流。

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

hanbrake可以正常调用到NVENC进行解码、可以正常安装CUDA、除了没有物理视频输出功能和一般显卡相同。

上手Tesla P4,All-In-One玩vGPU显卡虚拟化
上手Tesla P4,All-In-One玩vGPU显卡虚拟化

这张卡虽然功耗低,但是必须改造散热。散热改造很简单,买一个塑料支架+一个小涡轮风扇(我买的涡轮扇只有4800rpm,所以比较静音)。由于卖家没有送螺丝,所以我选择用屏幕胶固定风扇(还挺牢固的)。Tesla因为功耗较低,用这种散热方式勉强能用,像P40这种TDP 200W以上的显卡就需要更暴力的方案了:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

一些网友为了追求风道密闭,会在显卡和风扇接口上缠胶布。我觉得有点影响显卡颜值,所以没有再缠胶布了。看看改装后的效果:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

正面颜值高点,背面颜值就没那么高了,尤其是卖家还发了个灰色支架,很难给好评呀。涡轮风扇也可以风口向后安装,但是我觉得这样安装更美观一点:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

看看显卡上机后的效果:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

由于显卡风扇接主板风扇接口,记得在BIOS里把风扇转速调到满速。我这个涡轮扇转速不算高,所以即使满速声音也很小。但散热能力也很拉胯:空载45℃、满载90℃还会降频,但勉强能用吧:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

接下来的性能测试基于PVE安装的Windows系统。由于不是原生系统,所以可能会有一定的性能损耗:

Tesla P4支持视频编码和解码,所以可以通过sunshine+moonlight远程串流,我通过串流直接跑的Timespy:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

显卡分数仅4000分,这比Tesla P4的常规跑分低不少(常规跑分约在4600-5000分左右),要不是看在视频编码器的面子上,这简直比80块的P106还不如。但是接下来的测试证明Tesla P4视频转码也挺拉胯的:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化
上手Tesla P4,All-In-One玩vGPU显卡虚拟化

我用Tesla P4和2060S分辨对同一个视频进行编码测试,Tesla P4 采用的是NVENC第六代编码器,2060S则是第七代。Tesla P4有2个转码芯片,而2060S只有1个。但是Tesla P4速度仅280帧(单路,50%负载),也就是说双路满载转码也仅560帧。而2060S单路有700帧:

上手Tesla P4,All-In-One玩vGPU显卡虚拟化
上手Tesla P4,All-In-One玩vGPU显卡虚拟化

用串流玩玩网游问题不大。考虑到带宽和综合性能我把moonlight的帧率限制在了60帧,所以LOL中显示的是60帧。

上手Tesla P4,All-In-One玩vGPU显卡虚拟化

综合来看Tesla P4这张显卡性价比很低,性能仅1060水平,且视频转码性能也并不算强。AI和游戏方面和矿渣P106不分伯仲,性价比更是被完全秒杀。此外Tesla P4还得改装散热,相比同价位的40HX也逊色非常多,所以不推荐大家购买。

最后补上因为内核升级掉驱动的解决方案。首先在升级内核前要安装对应的pve-headers,如果安装后还是掉驱动,那么就降级回之前的内核:

#查看当前内核
uname -a
#查看已安装内核
dpkg --get-selections |grep kernel
#切换到旧版本内核
proxmox-boot-tool kernel pin 5.13.19-6-pve
proxmox-boot-tool refresh
#重启
reboot           

应该写的很全面了!