.. _bhyve_amd_gpu_passthru:
===================================
在bhyve中实现AMD GPU passthrough
===================================
和 :ref:`bhyve_intel_gpu_passthru` 类似,尝试 :ref:`amd_radeon_instinct_mi50` 设置 bhyve 的PCIe passthru,思路相同:
- 通过bhyve passthru将host主机的 :ref:`amd_radeon_instinct_mi50` 直通给ubuntu虚拟机,采用之前已经部署好的 ``idev`` 虚拟机
安装 :ref:`vm-bhyve`
======================
.. note::
使用 :ref:`vm-bhyve` 作为管理器来完成部署
- 安装 ``vm-bhyve``
.. literalinclude:: ../vm-bhyve/install_vm-bhyve
:caption: 安装 ``vm-bhyve``
- 创建 ``vm-bhyve`` 使用的存储:
.. literalinclude:: ../vm-bhyve/zfs
:caption: 创建虚拟机存储数据集
- 在 ``/etc/rc.conf`` 中设置虚拟化支持:
.. literalinclude:: ../vm-bhyve/rc.conf
:caption: 配置 ``/etc/rc.conf`` 支持虚拟化
- 在 ``/boot/loader.conf`` 添加:
.. literalinclude:: ../vm-bhyve/loader.conf
:caption: ``/boot/loader.conf``
- 初始化:
.. literalinclude:: ../vm-bhyve/init
:caption: 初始化
PCI passthru
===============
- 检查 PCI 设备:
.. literalinclude:: ../vm-bhyve/vm_passthru
:caption: 检查可以passthrough的设备
- 输出显示:
.. literalinclude:: bhyve_amd_gpu_passthru/vm_passthru_output
:caption: 输出显示 ``Radeon Instinct MI50 32GB``
- 配置 ``/boot/loader.conf`` 屏蔽掉需要passthru的Radeon Instinct MI50 32GB ``4/0/0`` :
.. literalinclude:: bhyve_amd_gpu_passthru/loader.conf
:caption: 屏蔽掉 Radeon Instinct MI50 32GB ``4/0/0``
配置
=======
- 配置模版配置 ``/zdata/vms/.templates/x-vm.conf`` (如果已经安装好 idev ,则直接修改虚拟机配置 ``/zdata/vms/idev/idev.conf`` )
.. literalinclude:: bhyve_amd_gpu_passthru/x-vm.conf
:caption: 模版配置 ``/zdata/vms/.templates/x-vm.conf``
- 创建虚拟机 ``idev`` :
.. literalinclude:: bhyve_intel_gpu_passthru/create_vm
:caption: 创建虚拟机 ``idev``
- 安装ubuntu:
.. literalinclude:: bhyve_intel_gpu_passthru/vm_install
:caption: 安装虚拟机
.. note::
由于我在 :ref:`bhyve_intel_gpu_passthru` 已经安装部署好 ``idev`` ,所以我这里实践是采用修改虚拟机配置 ``/zdata/vms/idev/idev.conf``
看起来非常顺利启动了虚拟机
- 登陆虚拟机 ``idev`` 检查虚拟机内部 ``lspci`` 输出:
.. literalinclude:: bhyve_amd_gpu_passthru/lspci
:caption: 虚拟机内部 ``lspci`` 检查输出可以看到AMD ``Radeon Instinct MI50 32GB``
至此 :strike:`bhyve passthru AMD显卡的操作完成` 看起来完成,但实际上后续针对 :ref:`amd_gpu` 安装 :ref:`rocm` 驱动以及如何使用 :ref:`ollama` 来完成推理遇到了挫折: **AMDGPU无法初始化**
安装 ``ROCm``
==================
我最初以为 :ref:`bhyve` 对AMD GPU支持会比NVIIA好,所以看到上配置passthru丝滑完成,以为没有什么困难了。
安装步骤采用了 :ref:`rocm_quickstart` 官方仓库安装,过程丝滑,没有任何报错。但是重启系统执行 ``rocm-smi`` 命令检查却给了我当头一棒: 无法识别
异常排查
============
.. warning::
目前我没有解决 :ref:`amd_radeon_instinct_mi50` 的 :ref:`bhyve_pci_passthru` 问题: 我感觉类似 :ref:`bhyve_nvidia_gpu_passthru` 存在兼容支持问题。
由于需要尽快构建 :ref:`machine_learning` 环境,我暂时放弃并改为直接在 :ref:`ubuntu_linux` 物理主机上先 :ref:`rocm_quickstart` ,验证无误后再迁移到 :ref:`ovmf_gpu_nvme` (并分别尝试 Ubuntu 环境和 :ref:`lfs` 环境)。最后再返回 FreeBSD 环境构建。
虽然看上去成功安装了 ``ROCm`` 和 ``AMDGPU driver`` ,但是我发现 ``rocm-smi`` 输出显示没有可用的AMD GPU:
.. literalinclude:: ../../../../machine_learning/hardware/amd_gpu/rocm/rocm_quickstart/rocm-smi_no_gpu
:caption: ``rocm-smi`` 显示没有可用AMD GPU
- 检查 ``dmesg | grep amdgpu`` 发现初始化异常,通过完整的 ``dmesg`` 显示,似乎 ``atom_bios`` (看起来是bhyve模拟的bios存在问题不能支持 ``amdgpu`` )
.. literalinclude:: ../../../../machine_learning/hardware/amd_gpu/rocm/rocm_quickstart/dmesg_amdgpu_error
:caption: 检查系统日志发现AMD GPU初始化失败
:emphasize-lines: 35,36
看起来驱动初始化异常,可能原因(可能性从高到低):
- :ref:`bhyve_amd_gpu_passthru` 对这款 :ref:`amd_radeon_instinct_mi50` 驱动对虚拟化支持存在问题
- 可能需要裸物理主机安装一个Ubuntu来对比验证
- 可能需要再部署一个 :ref:`lfs` 来对比Linux环境 :ref:`iommu` :ref:`ovmf_gpu_nvme`
- AMDGPU driver可能需要降级到低版本来支持旧GPU
- :ref:`amd_radeon_instinct_mi50` 硬件问题
我看到Reddit上的一个帖子 `Mi50 32gb (Working config, weirdness and performance) `_ 可以正常使用ROCm和AMDGPU驱动(非虚拟机)
- **这个方法已经验证没有解决我的问题** PROXMOX论坛帖子 `AMD GPU firmware/bios missing? amdgpu fatal error `_ 提出了通过安装 ``firmware-amd-graphics`` 来解决。不过这个firmware是私有软件,我直接在Ubuntu中执行 ``apt install firmware-amd-graphics`` 显示不存在(PROXMOX提供的虚拟机可能已经内置提供了软件仓库)
上述帖子提供了手工下载Firmware的方法: 在 `debian firmware-nonfree `_ 提供下载:
.. literalinclude:: ../../../../machine_learning/hardware/amd_gpu/rocm/rocm_quickstart/firmware-amd-graphics
:caption: 手工安装 firmware-amd-graphics
.. warning::
我发现上述手工安装的 firmware 实际上在之前安装 amdgpu driver 已经安装在 ``/lib/firmware/amdgpu`` 目录下了
但是比较奇怪,在 ``/lib/firmware/amdgpu`` 目录下似乎是 ``.zst`` 后缀的压缩文件,例如 ``yellow_carp_vcn.bin.zst`` ; 而 ``firmware-amd-graphics/usr/lib/firmware/amdgpu/`` 目录下是解压缩的文件,例如 ``yellow_carp_vcn.bin``
我尝试了上述方法,没有解决问题,报错依旧