Skip to content

对Linux(Ubuntu22.04)部署GPU半虚拟化的分布式部署方法 #67

@Micro-ATP

Description

@Micro-ATP

为什么好好的自动化流程放着不用呢,因为我感觉自动化流程有的时候有点bug,而且中间假如一个模块失败了重试有点麻烦。
另外就是如果你有几张一样的卡,你手动部署可以一次部署好几张卡。

以下内容是我根据项目源码拷打了一顿Opus4.5得出的部署文档,各位同仁可以参考,已经亲测可用。

另外从源码编译项目发现作者加入了磁盘管理的功能,狠狠期待一波。

关于软件识别

手动部署后ExHyperV 能识别。软件是通过 Hyper-V 的 PowerShell 命令 Get-VMGpuPartitionAdapter 来检测的。


完整手动执行指南

第一部分:宿主机(Windows)操作

步骤 1:配置虚拟机参数

打开 PowerShell(管理员),执行:

# 替换 '你的虚拟机名称' 为实际名称
$VMName = '你的虚拟机名称'

# 配置内存映射
Set-VM -GuestControlledCacheTypes $true -VMName $VMName
Set-VM -HighMemoryMappedIoSpace 64GB -VMName $VMName
Set-VM -LowMemoryMappedIoSpace 1GB -VMName $VMName

步骤 2:获取可用的 GPU 路径

# Windows 11 / Server 2022+
Get-VMHostPartitionableGpu | Select-Object Name

# Windows 10 / Server 2019
# Get-VMPartitionableGpu | Select-Object Name

输出类似:

\\?\PCI#VEN_10DE&DEV_2684&SUBSYS_...

步骤 3:添加 GPU 分区

# Windows 11(指定GPU路径)
Add-VMGpuPartitionAdapter -VMName $VMName -InstancePath '上一步获取的GPU路径'

# Windows 10(不需要指定路径)
# Add-VMGpuPartitionAdapter -VMName $VMName

步骤 4:启动虚拟机

Start-VM -Name $VMName

第二部分:Linux 虚拟机操作

通过 SSH 连接到虚拟机。

步骤 1:安装基础依赖

sudo apt update
sudo apt install -y git curl dkms build-essential linux-headers-$(uname -r)

步骤 2:创建工作目录

mkdir -p ~/gpu-pv && cd ~/gpu-pv

步骤 3:下载并编译 dxgkrnl 模块

# 下载脚本
wget --no-check-certificate -O install_dxgkrnl.sh https://raw.githubusercontent.com/Justsenger/ExHyperV/main/src/Linux/script/install_dxgkrnl.sh
chmod +x install_dxgkrnl.sh

# 执行(忽略最后的检查错误)
sudo ./install_dxgkrnl.sh

⚠️ 如果脚本输出 STATUS: REBOOT_REQUIRED,需要重启后再次运行此脚本。

⚠️ 如果最后报错但日志显示 Installing to /lib/modules/...,说明实际成功了,继续下一步。

步骤 4:验证模块安装

# 检查模块文件
ls -la /lib/modules/$(uname -r)/updates/dkms/dxgkrnl.ko

# 加载模块
sudo modprobe dxgkrnl

# 验证
lsmod | grep dxgkrnl
ls -la /dev/dxg

步骤 5:从宿主机复制驱动文件

在 Windows 宿主机上,找到 GPU 驱动目录:

C:\Windows\System32\DriverStore\FileRepository\nv_dispsi.inf_amd64_xxxxxxxx\

方法 A:使用 SCP 命令(在 Windows PowerShell 中执行)

# 找到驱动目录
$DriverPath = Get-ChildItem "C:\Windows\System32\DriverStore\FileRepository" -Filter "nv_dispsi.inf_amd64_*" | Select-Object -First 1 -ExpandProperty FullName

# 复制到虚拟机(替换 用户名@IP)
scp -r $DriverPath 用户名@虚拟机IP:~/gpu-pv/drivers/

方法 B:使用 WinSCP 等图形化工具复制

步骤 6:复制核心库文件

如果宿主机安装了 WSL,从 C:\Windows\System32\lxss\lib\ 复制所有文件到虚拟机的 ~/gpu-pv/lib/

如果没有 WSL,在虚拟机中下载:

mkdir -p ~/gpu-pv/lib && cd ~/gpu-pv/lib

wget --no-check-certificate https://raw.githubusercontent.com/Justsenger/ExHyperV/main/src/Linux/lib/libd3d12.so
wget --no-check-certificate https://raw.githubusercontent.com/Justsenger/ExHyperV/main/src/Linux/lib/libd3d12core.so
wget --no-check-certificate https://raw.githubusercontent.com/Justsenger/ExHyperV/main/src/Linux/lib/libdxcore.so

步骤 7:部署驱动和库文件

# 创建系统目录
sudo mkdir -p /usr/lib/wsl/drivers /usr/lib/wsl/lib

# 复制驱动
sudo cp -r ~/gpu-pv/drivers/* /usr/lib/wsl/drivers/

# 复制库文件
sudo cp -a ~/gpu-pv/lib/* /usr/lib/wsl/lib/

# 创建符号链接
sudo ln -sf /usr/lib/wsl/lib/libd3d12core.so /usr/lib/wsl/lib/libD3D12Core.so

# 设置权限
sudo chmod -R 0555 /usr/lib/wsl
sudo chown -R root:root /usr/lib/wsl

# 配置动态库路径
echo "/usr/lib/wsl/lib" | sudo tee /etc/ld.so.conf.d/ld.wsl.conf
sudo ldconfig

步骤 8:配置内核模块自动加载

# vgem 模块
echo "vgem" | sudo tee /etc/modules-load.d/vgem.conf
sudo modprobe vgem

# dxgkrnl 延迟加载(避免启动冲突)
echo "blacklist dxgkrnl" | sudo tee /etc/modprobe.d/blacklist-dxgkrnl.conf

# 创建延迟加载脚本
sudo tee /usr/local/bin/load_dxg_driver.sh > /dev/null << 'EOF'
#!/bin/bash
modprobe dxgkrnl
if [ -e /dev/dxg ]; then
    chmod 666 /dev/dxg
fi
EOF
sudo chmod +x /usr/local/bin/load_dxg_driver.sh

# 创建 systemd 服务
sudo tee /etc/systemd/system/load-dxg-late.service > /dev/null << 'EOF'
[Unit]
Description=Late load dxgkrnl
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/load_dxg_driver.sh

[Install]
WantedBy=multi-user.target
EOF

# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable load-dxg-late.service

# 更新 initramfs
sudo update-initramfs -u

步骤 9:重启

sudo reboot

第三部分:验证

重启后 SSH 连接,执行:

# 检查模块
lsmod | grep dxgkrnl

# 检查设备
ls -la /dev/dxg

# 检查驱动目录
ls -la /usr/lib/wsl/drivers/ | head -20
ls -la /usr/lib/wsl/lib/

# 测试 nvidia-smi(如果有)
nvidia-smi

# 测试 PyTorch CUDA
python3 << 'EOF'
import torch
print(f"CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"Device name: {torch.cuda.get_device_name(0)}")
    print(f"Device count: {torch.cuda.device_count()}")
EOF

总结

步骤 位置 说明
1-4 Windows 配置 Hyper-V GPU 分区
5-9 Linux 安装 dxgkrnl + 部署驱动
10 Linux 验证

完成后,ExHyperV 工具会自动识别到你已经为该虚拟机分配了 GPU 分区。

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions