跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠

GPU技术交流论坛

administrators

私有

帖子


  • 使用DG1显卡在裸机Linux上打造高性能NAS服务器:完全解码指南
    F fushinn

    前言

    Intel DG1 显卡凭借其优秀的解码性能和低功耗,成为打造高性能NAS服务器的理想选择。然而,在Linux系统上驱动DG1显卡并实现最佳性能并非易事。本文档旨在分享DG1显卡在裸机Linux系统上的驱动经验,并提供详细的配置指南,帮助用户打造高性能NAS服务器。

    最终方案是Fedora41 +内核6.12.11 + i915

    至于为什么用Fedora,相对Arch稳定且新,占用也小,pve直通的话得更换第三方内核,esxi貌似只能发挥dg1一半的性能,飞牛的话用的魔改驱动(不是说不好,只不过为了考虑以后更新方便,主线驱动更方便更新,DG1 hang的问题6.13内核中已经包含了补丁,Fedora虽然没有Arch那么激进但是过不了多久也会更新6.13内核,这也是一个原因),Ubuntu夹带私货一生黑,对,说的就是你,snap狗皮膏药。Debian内核有点老了但是听说最新的Debian也有反向修复的i915驱动,可以自行尝试

    测试环境

    硬件: 12100F+H610+Intel DG1 显卡
    操作系统: Ubuntu、Fedora、Arch Linux
    内核版本: 6.8、6.12、6.12.11
    驱动类型: Xe 内核驱动、intel-i915-dkms,主线i915
    应用软件: Jellyfin
    测试方法: 裸机安装、虚拟机直通(ESXi、PVE)
    测试结果

    虚拟机直通:

    ESXi: DG1直通给Windows,可正常输出显示信号和解码,但性能减半。

    PVE: 加载皮蛋熊修改后的内核,直通DG1给飞牛OS,飞牛OS加载皮蛋熊的i915驱动,可正常解码,AI相册可正常调用显卡,但系统资源占用显示异常。

    裸机Ubuntu24.04 Server LTS(内核6.8 + Xe):

    使用Xe内核驱动,添加i915.force_probe=!4908 xe.force_probe=4908内核参数,使用nyanmisaka/jellyfin,无需替换iHD驱动,可正常解码,DP信号输出正常,但无法使用intel_gpu_top,据称6.8内核Xe驱动存在OpenCL bug。

    裸机Ubuntu24.04 Server LTS(内核6.8 + i915-dkms):

    使用官方反向移植的intel-i915-dkms驱动,需替换iHD驱动,可正常解码,但不输出显示信号(内核屏蔽)。

    Fedora 41/Arch Linux(内核6.12):

    使用Xe内核,可正常输出显示,但无法正常解码,出现卡屏和花屏现象。

    Fedora 41(内核6.12.11):

    根据@NyanMisaka在jellyfin论坛的帖子,Jellyfin 10.10.5官方已支持DG1,但需满足以下条件:

    内核版本:6.1.124+/6.6.70+/6.12.9+/6.13+(Xe内核需要6.9/6.10/6.13+)

    内核启动参数:根据实际情况添加i915/xe.force_probe=4908或i915/xe.force_probe=4905

    实测添加i915.force_probe=4908可正常显示输出和解码播放,且占用率显示正常

    教程部分

    安装Fedora41 Server版本
    使用sudo dnf update更新系统(默认的内核是6.11),并重启
    修改/etc/default/grub的GRUB_CMDLINE_LINUX部分,类似GRUB_CMDLINE_LINUX=“rhgb quiet selinux=0 i915.force_probe=4908”
    使用sudo grub2-mkconfig -o /boot/grub2/grub.cfg,更新grub配置,并重启
    输入sudo lspci -vvn | grep “i915”,如果出现Kernel driver in use: i915则驱动初步成功
    使用nyanmisaka/jellyfin最新镜像启动服务器,并且开启硬解,播放测试视频,观察帧率等是否正常
    输入sudo dmesg -w,并且开启硬解,播放视频,查看内核有无报错
    输入sudo dnf install intel-gpu-tools,安装工具包,播放视频时,输入intel_gpu_top查看显卡占用
    05a702be-d3ad-4167-af7a-48736224e86c-image.png
    41680d3a-98b0-42d4-800c-d49ccab15be0-image.png
    b2cf6c7f-ba33-424a-98f6-acb4cc78badb-image.png
    dcc693d6-aaa5-43d3-b3fb-bdcfaa98bb0b-image.png
    常用调优建议

    使用ufw替代系统默认的防火墙(更简单,而且不会和docker冲突)
    使用sudo turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,查看cpu功耗等信息
    如果遇到btrfs报错,可尝试sudo dnf install btrfs-progs udisks2-btrfs
    免责声明

    本文档仅供参考,不构成任何形式的保证。用户在使用DG1显卡和Linux系统时,应自行承担相关风险。

    感谢

    感谢@NyanMisaka @皮蛋熊笨熊,分享的宝贵经验,为本文档的编写提供了重要参考。

    感谢https://icarusradio.github.io/guides/ubuntu-dg1-jellyfin.html
    提供的经验

    技术调优探讨

  • MSI-Z690-A主板上在Linux或PVE上的温控传感器驱动教程
    F fushinn

    使用DKMS模块

    https://github.com/Fred78290/nct6687d
    

    安装命令

    git clone https://github.com/Fred78290/nct6687d
    cd nct6687d
    make dkms/install
    

    查看温度

    这里有些传感器(比如DRAM)还是有点问题。忽视就好

    apt install lm-sensors
    
    sensors
    

    35cdf4ec-752a-4390-8e1c-ab9ce94f39d9-image.png

    硬件知识分享

  • 英特尔12-14代大小核在Proxmox上的最优调度策略探究
    F fushinn

    先说结论

    12-14代大小核CPU在最新的PVE环境下基本不需要做任何更改。不需要绑定aff核心亲和度。这样会适得其反。大小核在Linux上(测试宿主机内核为pve的6.8和6.14两个版本)会自动调度,优先使用P Core,然后使用E Core,最后使用HT Core(超线程)。由于AFF实际上是破坏了这种调度策略。实际上的效果甚至不如自动调度。另外在使用VGPU的情况可能会遇到单核跑分下降很多的情况如下图。不知道是由于什么引起的。
    总结就是,除了LXC之外。放开手让Linux内核自动分配吧

    LXC测试结果

    LXC会自动随机分配核心。这里需要手动调整核心绑定。这是和虚拟机调度不同的地方。也需要避免跨核心的情况。参考添加参数:

    lxc.cgroup2.cpuset.cpus: 14-15
    

    1fb00697-7de4-43a7-9278-d16a8ca377de-image.png
    调整之后:
    330ee024-d5d0-4043-86c6-299b3f3f5fb2-image.png

    虚拟机测试结果

    测试环境

    • i5-14400 6P4E
    • MSi Z690-A
    • Nvidia Tesla T10

    系统环境

    • 物理Windows11
    • 虚拟机Windows 10 - VGPU - 8 VCore
      23bf67d7-c983-4fed-b935-b568e172c8ad-image.png
    • 虚拟机Windows10 - IGPU
      ef346a2e-8509-42e4-be87-ebb427dd91e8-image.png

    测试结果

    • 虚拟机Windows10 - IGPU - 4 VCore
      ef561e0e-3a2e-408b-b5ef-980464ddfef7-image.png
    • 虚拟机Windows10 - VGPU - 8 VCore
      fbd8439e-831c-4636-a12b-3d40b087b370-image.png
    • 虚拟机Windows10 - VGPU - 8 VCore (AFF绑定大核心偶尔出现的情况)
      a0cfb57b-7f64-4b0d-89f7-72aa59c78294-image.png
    技术调优探讨

  • 为Linux RDP添加核显加速简明指南
    F fushinn

    xrdp_vaapi 项目 - 带硬件加速的远程桌面服务

    项目描述

    本项目自动构建支持Intel VA-API硬件加速的xrdp远程桌面服务器,并为Debian/Ubuntu系统配置可用的虚拟机环境。

    虽然主要设计用于配合libvirt/qemu虚拟机和i915-sriov-dkms驱动使用,但也适用于其他场景。

    30adb9d4-b0c7-4a2e-b905-dcaee41cafe3-image.png

    系统源配置要求

    Debian/Ubuntu用户必须确保/etc/apt/sources.list包含完整源配置:

    Debian系统源

    deb https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
    deb-src https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
    deb https://deb.debian.org/debian trixie main contrib non-free non-free-firmware
    deb-src https://deb.debian.org/debian trixie main contrib non-free non-free-firmware
    

    Ubuntu系统源

    deb http://de.archive.ubuntu.com/ubuntu noble main restricted universe multiverse
    deb-src http://de.archive.ubuntu.com/ubuntu noble main restricted universe multiverse
    

    使用指南

    基础使用

    1. 克隆项目仓库:
    git clone https://github.com/tabletseeker/xrdp_vaapi -b master
    
    1. 进入项目目录:
    cd xrdp_vaapi
    
    1. 执行安装脚本:
    bash xrdp_vaapi.sh
    

    参数与环境变量说明

    xrdp_vaapi.sh 脚本参数

    参数/变量 说明 默认值/可选值
    DRIVER_NAME LIBVA_DRIVER_NAME环境变量 默认: iHD
    BUILD_DIR 构建源代码目录 默认: 当前目录($PWD)
    –sriov 或 -s 编译安装i915_sriov_dkms驱动 默认: false (不安装)

    buildyami.sh 脚本参数

    参数 说明 默认值/可选值
    –prefix 安装目录 默认: /usr/local
    –disable-x11 禁用X11支持编译 默认: 启用
    –latest 自动获取最新版本 默认: 使用预设版本

    注意:若不使用--latest参数,将使用xrdp_vaapi/yami/omatic/buildyami.sh文件中243-247行指定的固定版本号。

    运维部署交流

  • Linux i915 SR-IOV 驱动-英特尔核心显卡vGPU教程
    F fushinn

    Linux i915 驱动 (dkms 模块) 支持 SR-IOV 功能 (适用于 Linux 6.8-6.15(-rc5))

    警告

    此软件包是高度实验性的,仅建议清楚了解操作风险的用户使用。

    您需要同时在宿主机和客户机中安装此 dkms 模块!

    已测试的内核版本:6.12.10-zen1/6.11.9-arch1/6.10.9-arch1/6.9.10-arch1/6.8.9-arch1 (基于 ArchLinux)

    必需的内核参数

    intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe
    

    除 intel_iommu=on 外,其他三个参数可以通过 modprobe 方式应用,将以下内容添加到 /etc/modprobe.d/i915-sriov-dkms.conf:

    blacklist xe
    options i915 enable_guc=3
    options i915 max_vfs=7
    

    创建虚拟功能(VF)

    echo 1 > /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs
    

    在 Intel UHD Graphics 上最多可创建 7 个 VF

    Arch Linux 安装步骤 (测试内核 6.12.6-zen1)

    Arch Linux 用户可通过 AUR 获取:i915-sriov-dkms

    也可从发布页面下载软件包,使用 pacman -U 安装。

    PVE 宿主机安装步骤 (测试内核 6.8)

    1. 安装构建工具:apt install build-* dkms
    2. 安装指定版本的内核和头文件:apt install proxmox-headers-6.8 proxmox-kernel-6.8 (适用于未签名内核)
    3. 从发布页面下载 deb 包
      wget -O /tmp/i915-sriov-dkms_2025.05.18_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2025.05.18/i915-sriov-dkms_2025.05.18_amd64.deb"
      
    4. 使用 dpkg 安装 deb 包:dpkg -i /tmp/i915-sriov-dkms_2025.05.18_amd64.deb
    5. 安装完成后,需要调整内核命令行参数:编辑 nano /etc/default/grub,将 GRUB_CMDLINE_LINUX_DEFAULT 修改为 intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe,如果已有其他参数则追加
    6. 执行 update-grub 和 update-initramfs -u 更新 grub 和 initramfs
    7. 可选:通过 proxmox-boot-tool 固定内核版本并更新启动配置
    8. 要启用 VF,必须设置 sysfs 属性。安装 sysfsutils 后执行 echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf,假设您的 iGPU 位于 00:02 总线。如果不是,请使用 lspci | grep VGA 查找 iGPU 所在的 PCIe 总线
    9. 重启系统
    10. 系统重新启动后,您应该能在 02:00.1 - 02:00.7 下看到 VF 数量(假设 iGPU 位于 00:02 总线)
    11. 您可以将 VF 直通给 LXC 或 VM。但切勿将 PF (02:00.0) 直通给 VM,否则会导致所有其他 VF 崩溃

    Linux 客户机安装步骤 (测试 Ubuntu 24.04/内核 6.8)

    需要在 Linux 客户机中运行相同的驱动程序

    1. 安装构建工具

      apt install build-* dkms linux-headers-$(uname -r) linux-modules-extra-$(uname -r)
      
    2. 下载并安装 .deb 包

      wget -O /tmp/i915-sriov-dkms_2025.05.18_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2025.05.18/i915-sriov-dkms_2025.05.18_amd64.deb"
      dpkg -i /tmp/i915-sriov-dkms_2025.05.18_amd64.deb
      
    3. 更新内核参数
      编辑 nano /etc/default/grub,将 GRUB_CMDLINE_LINUX_DEFAULT 修改为 i915.enable_guc=3 module_blacklist=xe,如果已有其他参数则追加

      示例:

      GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on i915.enable_guc=3 module_blacklist=xe"
      
    4. 完成后,更新 grub 和 initramfs 并重启

      update-grub
      update-initramfs -u
      
    5. 虚拟机重新启动后,执行 dmesg | grep i915 查看内核是否识别到 VF。也可以通过 lspci -nnk 检查 xe 是否被正确屏蔽,确认 VF 使用的驱动程序

    6. 可选:安装 vainfo (apt install vainfo),执行 vainfo 查看 VAAPI 是否识别到 iGPU

    7. 如需 OpenCL 支持:

      apt install intel-opencl-icd
      apt install clinfo
      clinfo
      

    Windows 客户机 (测试环境:Proxmox 8.3 + Windows 11 24H2 + Intel 驱动 32.0.101.6460/32.0.101.6259)

    感谢 resiliencer 在 #225 中的贡献

    以下步骤可确保所有驱动版本的兼容性。理论上您可以安装任何版本而不会遇到烦人的 Code 43 错误

    提取显卡 EFI 固件

    1. 下载 UEFITools (Windows 使用 UEFITool_NE_A68_win64,也提供 Linux 和 Mac 版本)
    2. 下载主板 BIOS (我认为任何适用于 Alder/Raptop Lake 桌面平台的 BIOS 都可以)
    3. 解压 BIOS
    4. 使用 UEFITools (管理员身份运行) 加载 BIOS (通常是 .cap 文件)
    5. 选择 Action - Search 或使用快捷键 ctrl+F 搜索十六进制字符串 49006e00740065006c00280052002900200047004f0050002000440072006900760065007200
    6. 双击搜索结果,BIOS 中匹配项会高亮显示
    7. 右键点击高亮结果选择 Extract body...
    8. 保存文件,文件名和扩展名无关紧要。我使用 intelgopdriver_desktop 会保存为 intelgopdriver_desktop.bin
    9. 您可以校验文件哈希:
      1. Windows 终端命令:Get-FileHash -Path "path-to-rom" -Algorithm SHA256
      2. 适用于 UHD730 和 UHD770 桌面版:131c32cadb6716dba59d13891bb70213c6ee931dd1e8b1a5593dee6f3a4c2cbd
      3. 适用于 ADL-N:FA12486D93BEE383AD4D3719015EFAD09FC03352382F17C63DF10B626755954B
    10. 需要将此文件复制到 Proxmox 主机的 /usr/share/kvm 目录。我通过 NAS 上传后使用 wget 下载

    Windows 虚拟机创建

    1. 设置机器时,将 CPU 类型设为 host
    2. 提示:在首次设置界面按 Shift+F10 输入 OOBE\BYPASSNRO 可跳过 Microsoft 账户设置。虚拟机会重启,您可以选择"我没有 Internet 连接"选项来设置本地账户。或者,您也可以从 Windows VM 中移除网络设备
    3. 设置完成进入桌面后,启用远程桌面并确保本地账户用户有访问权限。此时可以关闭虚拟机
    4. 虚拟机关机后,编辑配置文件:
    # 直通 02.1 VF,指定 romfile。ROM 路径是相对的
    hostpci0: 0000:00:02.1,pcie=1,romfile=Intelgopdriver_desktop.efi,x-vga=1
    
    1. 在 Hardware 选项卡中,将 Display 设为 none
    2. 启动虚拟机。您将无法通过控制台访问,唯一方式是远程桌面。连接后从 Intel 下载显卡驱动,任何版本都应正常工作
    3. 安装过程中,当实际安装显卡驱动时可能会出现黑屏。此黑屏将持续到重启虚拟机。建议等待几分钟让其完成操作。您可以通过观察 Proxmox 中的 VM CPU 使用率来判断进度
    4. 重启后再次通过 RDP 连接。检查设备管理器确认结果。您应该看到 Intel 显卡已安装并正常工作

    CleanShot 2025-01-27 at 12 26 28

    另见:https://github.com/strongtz/i915-sriov-dkms/issues/8#issuecomment-1567465036

    手动安装步骤

    1. 安装构建工具:apt install build-essential dkms git / pacman -S base-devel dkms git
    2. 安装指定版本的内核和头文件:apt install linux-headers-$(uname -r) / pacman -S linux-headers
    3. 克隆仓库:git clone https://github.com/strongtz/i915-sriov-dkms.git
    4. 将模块添加到 DKMS:dkms add ./i915-sriov-dkms
    5. 使用 DKMS 安装模块:dkms install i915-sriov-dkms/2025.05.18
    6. 完成后,需要调整内核命令行参数:编辑 nano /etc/default/grub,将 GRUB_CMDLINE_LINUX_DEFAULT 修改为 intel_iommu=on i915.enable_guc=3 i915.max_vfs=7,如果已有其他参数则追加
    7. 执行 update-grub 和 update-initramfs -u / Arch Linux 使用 grub-mkconfig -o /boot/grub/grub.cfg 和 mkinitcpio -P
    8. 可选:使用 sysfsutils 在启动时设置 VF 数量。安装 sysfsutils 后执行 echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf,假设您的 iGPU 位于 00:02 总线。如果不是,请使用 lspci | grep VGA 查找 iGPU 所在的 PCIe 总线
    9. 重启系统

    卸载

    dpkg

    使用 dpkg -P i915-sriov-dkms 移除软件包

    pacman

    使用 pacman -R i915-sriov-dkms 移除软件包

    手动

    使用 dkms remove i915-sriov-dkms/2025.05.18 移除 dkms 模块

    致谢

    • @strongtz 创建初始 dkms 模块
    • @zhtengw 基于 linux-intel-lts (v5.15, v6.1) 重构,支持 v6.1~v6.4,参与 15+ 问题
    • @bbaa-bbaa 基于 mainline-tracking linux/v6.12 分支重构,支持 v6.8~v6.13,参与 10+ 问题
    • @pasbec 对仓库进行重大重构,支持 (v6.2, v6.5, v6.8),参与 20+ 问题
    • @shenwii 支持 (v6.7, v6.9)
    • @MotherOfTheGracchi 支持 v6.5.3
    • @michael-pptf 多次更新 README.md,参与 20+ 问题
    运维部署交流

  • Sglang简明部署教程-Qwen3
    F fushinn

    前提条件

    1. 请确保你已经安装好Nvidia驱动
    2. 是Linux服务器
    3. 安装好了Docker
    4. Debian12系统
    5. 良好的国际化网络环境

    参考:

    Nvidia vGPU 18.0以上 GRID或CloudGame驱动Patch许可教程
    Tesla T10 PVE 服务器配置指南

    安装NVIDIA 容器运行时

    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
        sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    
    sudo apt-get update
    
    export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
      sudo apt-get install -y \
          nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
    
    sudo nvidia-ctk runtime configure --runtime=docker
    
    sudo systemctl restart docker
    

    配置docker compose(需要自行配置相关内容)

    services:
      sglang:
        image: lmsysorg/sglang:latest
        container_name: sglang
        volumes:
          #- /home/fushinn/sglang/cache/huggingface:/root/.cache/huggingface
          # If you use modelscope, you need mount this directory
          - ${HOME}/.cache/modelscope:/root/.cache/modelscope
          - ./jinja:/root/jinja
        restart: always
        network_mode: host # required by RDMA
        privileged: true # required by RDMA
        # Or you can only publish port 30000
        # ports:
        #   - 30000:30000
        environment:
          HF_TOKEN: "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"
          # if you use modelscope to download model, you need set this environment
          SGLANG_USE_MODELSCOPE: true
        entrypoint: python3 -m sglang.launch_server
        command: --model-path Qwen/Qwen3-4B
          --host 127.0.0.1
          --port 30000
          --tool-call-parser qwen25
          --reasoning-parser qwen3
          #--chat-template /root/jinja/qwen3_nonthinking.jinja
        ulimits:
          memlock: -1
          stack: 67108864
        ipc: host
        healthcheck:
          test: ["CMD-SHELL", "curl -f http://localhost:30000/health || exit 1"]
        deploy:
          resources:
            reservations:
              devices:
                - driver: nvidia
                  device_ids: ["0"]
                  capabilities: [gpu]
    

    配置jinja(可选内容)

    {%- if tools %}
        {{- '<|im_start|>system\n' }}
        {%- if messages[0].role == 'system' %}
            {{- messages[0].content + '\n\n' }}
        {%- endif %}
        {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
        {%- for tool in tools %}
            {{- "\n" }}
            {{- tool | tojson }}
        {%- endfor %}
        {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
    {%- else %}
        {%- if messages[0].role == 'system' %}
            {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }}
        {%- endif %}
    {%- endif %}
    {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
    {%- for message in messages[::-1] %}
        {%- set index = (messages|length - 1) - loop.index0 %}
        {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}
            {%- set ns.multi_step_tool = false %}
            {%- set ns.last_query_index = index %}
        {%- endif %}
    {%- endfor %}
    {%- for message in messages %}
        {%- if message.content is string %}
            {%- set content = message.content %}
        {%- else %}
            {%- set content = '' %}
        {%- endif %}
        {%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
            {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
        {%- elif message.role == "assistant" %}
            {%- set reasoning_content = '' %}
            {%- if message.reasoning_content is string %}
                {%- set reasoning_content = message.reasoning_content %}
            {%- else %}
                {%- if '</think>' in content %}
                    {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
                    {%- set content = content.split('</think>')[-1].lstrip('\n') %}
                {%- endif %}
            {%- endif %}
            {%- if loop.index0 > ns.last_query_index %}
                {%- if loop.last or (not loop.last and reasoning_content) %}
                    {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
                {%- else %}
                    {{- '<|im_start|>' + message.role + '\n' + content }}
                {%- endif %}
            {%- else %}
                {{- '<|im_start|>' + message.role + '\n' + content }}
            {%- endif %}
            {%- if message.tool_calls %}
                {%- for tool_call in message.tool_calls %}
                    {%- if (loop.first and content) or (not loop.first) %}
                        {{- '\n' }}
                    {%- endif %}
                    {%- if tool_call.function %}
                        {%- set tool_call = tool_call.function %}
                    {%- endif %}
                    {{- '<tool_call>\n{"name": "' }}
                    {{- tool_call.name }}
                    {{- '", "arguments": ' }}
                    {%- if tool_call.arguments is string %}
                        {{- tool_call.arguments }}
                    {%- else %}
                        {{- tool_call.arguments | tojson }}
                    {%- endif %}
                    {{- '}\n</tool_call>' }}
                {%- endfor %}
            {%- endif %}
            {{- '<|im_end|>\n' }}
        {%- elif message.role == "tool" %}
            {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
                {{- '<|im_start|>user' }}
            {%- endif %}
            {{- '\n<tool_response>\n' }}
            {{- content }}
            {{- '\n</tool_response>' }}
            {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
                {{- '<|im_end|>\n' }}
            {%- endif %}
        {%- endif %}
    {%- endfor %}
    {%- if add_generation_prompt %}
        {{- '<|im_start|>assistant\n<think>\n\n</think>\n\n' }}
    {%- endif %}
    

    启动Compose

    docker compose up -d
    

    测试

    curl http://127.0.0.1:30000/v1
    
    运维部署交流

  • GPU 风扇智能控制程序-Rust
    F fushinn

    GPU 风扇智能控制程序-Rust

    这是一个用于 NVIDIA T10 GPU 的智能风扇控制程序,可以根据 GPU 温度自动调节风扇转速。

    特性

    • 全线性温控算法
    • 低温静音运行(25℃以下 30%转速)
    • 高温全速保护(60℃以上 100%转速)
    • 优化的整数计算,资源占用极低
    • 支持 systemd 服务自动启动
    • 详细的日志记录和异常处理
    • 优雅的程序退出恢复默认设置

    使用方法

    直接运行

    • 其实直接从releases里面下载编译好的二进制就可以运行了
    gpu-fan-controller /sys/class/hwmon/hwmonX/pwmX
    

    参数说明:

    • pwm_path: 风扇 PWM 控制文件路径(必需)

    Systemd 服务安装(Linux)

    1. 复制程序到指定位置:
    sudo mkdir -p /opt/gpu-fan-control
    sudo cp gpu-fan-controller /opt/gpu-fan-control/
    
    1. 创建服务文件(需要自行配置ExecStart)
    [Unit]
    Description=GPU Fan Control Service
    After=network-online.target
    Wants=network-online.target
    Requires=network-online.target
    
    [Service]
    Type=simple
    User=root
    ExecStart=gpu-fan-controller /sys/class/hwmon/hwmonX/pwmX
    Restart=always
    RestartSec=3
    StandardOutput=append:/var/log/gpu-fan.log
    StandardError=append:/var/log/gpu-fan.log
    
    [Install]
    WantedBy=multi-user.target
    

    写入到

    /etc/systemd/system/gpu-fan-control.service
    
    1. 启用并启动服务:
    sudo systemctl daemon-reload
    sudo systemctl enable gpu-fan-control
    sudo systemctl start gpu-fan-control
    

    配置说明

    • MIN_TEMP = 25 # 最低温度阈值
    • MAX_TEMP = 60 # 最高温度阈值
    • MIN_SPEED = 77 # 最低转速(30%)
    • MAX_SPEED = 255 # 最高转速(100%)

    日志

    • 控制台输出: 彩色实时日志
    • 文件日志: gpu_fan.log
      • 自动轮转(超过 10MB)
      • 保留一周日志

    故障排除

    1. 找不到 PWM 控制文件

      • 检查文件路径是否正确
      • 确认用户权限
    2. 无法读取 GPU 温度

      • 检查 NVIDIA 驱动是否正确安装
      • 确认 NVML 库可用
    运维部署交流

  • Tesla T10 PVE 服务器配置指南
    F fushinn

    Tesla T10 PVE 服务器配置指南

    1. 配置 APT 源

    cat >/etc/apt/sources.list<<EOF
    deb http://mirrors.ustc.edu.cn/debian/ bookworm main non-free-firmware
    deb-src http://mirrors.ustc.edu.cn/debian/ bookworm main non-free-firmware
    deb https://mirrors.ustc.edu.cn/debian-security bookworm-security main contrib
    deb http://mirrors.ustc.edu.cn/debian/ bookworm-updates main non-free-firmware
    deb-src http://mirrors.ustc.edu.cn/debian/ bookworm-updates main non-free-firmware
    deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm pve-no-subscription
    EOF
    
    # 备份原有源文件
    mv /etc/apt/sources.list.d/ceph.list /etc/apt/sources.list.d/ceph.list.bak
    mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
    

    2. 安装系统依赖

    apt-get install -y git build-essential dkms mdevctl
    apt install pve-headers-6.8.12-8-pve
    

    3. 网卡配置

    将网卡 MAC 地址绑定到固定接口名称:

    # 替换 xxx 为实际的 MAC 地址
    echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xxx", NAME="eth0"' | tee /etc/udev/rules.d/71-net-name-by-mac.rules
    echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xxx", NAME="eth1"' | tee /etc/udev/rules.d/72-net-name-by-mac.rules
    
    # 编辑网络配置文件
    vim /etc/network/interfaces
    

    4. 存储配置(可选)

    将 LVM 转换为目录存储:

    lvremove pve/data
    lvextend -l +100%FREE -r pve/root
    pvesm remove local-lvm
    mkdir /local-vm
    pvesm add dir local-vm --content images,iso,vztmpl,backup,rootdir,snippets -preallocation off --path /local-vm
    

    5. 内核管理(可选)

    # 安装指定版本内核
    apt-get update && apt-get install proxmox-kernel-6.8.12-8-pve
    proxmox-boot-tool kernel list
    proxmox-boot-tool kernel pin 6.8.12-8-pve
    proxmox-boot-tool refresh
    

    6. NVIDIA 驱动安装

    bash NVIDIA-Linux-x86_64-550.144.02-vgpu-kvm-custom.run -m kernel
    

    7. IOMMU 配置

    # 启用 IOMMU
    if [ `grep -c "intel_iommu=on" /etc/default/grub` -ne '1' ];then
      sed -i 's/quiet/quiet intel_iommu=on/' /etc/default/grub
      update-grub
    fi
    
    # 启用 vfio 并禁用 nouveau
    echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules
    echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
    update-initramfs -u -k all
    rmmod nouveau
    

    8. vGPU 解锁配置

    # 克隆必要的仓库
    git clone https://gitlab.com/polloloco/vgpu-proxmox.git
    cd /opt
    git clone https://github.com/mbilker/vgpu_unlock-rs.git
    
    # 安装 Rust 环境
    curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal
    source $HOME/.cargo/env
    
    # 编译 vGPU 解锁工具
    cd vgpu_unlock-rs/
    cargo build --release
    
    # 配置系统服务
    mkdir /etc/vgpu_unlock
    touch /etc/vgpu_unlock/profile_override.toml
    mkdir /etc/systemd/system/{nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d}
    echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf
    echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf
    

    9. vGPU 配置文件

    cat >/etc/vgpu_unlock/profile_override.toml<<EOF
    [profile.nvidia-256] #1G
    num_displays = 1
    display_width = 1920
    display_height = 1080
    max_pixels = 2073600
    frl_enabled = 0
    
    [profile.nvidia-257] #2G
    num_displays = 1
    display_width = 1920
    display_height = 1080
    max_pixels = 2073600
    frl_enabled = 0
    
    [profile.nvidia-258] #3G
    num_displays = 1
    display_width = 1920
    display_height = 1080
    max_pixels = 2073600
    frl_enabled = 0
    
    [profile.nvidia-259] #4G
    num_displays = 1
    display_width = 1920
    display_height = 1080
    max_pixels = 2073600
    frl_enabled = 0
    
    [profile.nvidia-261] #8G
    num_displays = 1
    display_width = 1920
    display_height = 1080
    max_pixels = 2073600
    frl_enabled = 0
    
    [profile.nvidia-262] #16G
    num_displays = 1
    display_width = 1920
    display_height = 1080
    max_pixels = 2073600
    framebuffer = 0x3BC000000
    framebuffer_reservation = 0x44000000
    frl_enabled = 0
    EOF
    

    其他工具

    风扇控制

    • T10 风扇控制工具: https://github.com/Xingsandesu/t10-fan-control
    • T10 风扇控制工具-Rust: [https://github.com/Xingsandesu/gpu-fan-controller)

    作者致谢

    • Nanyo
    • Fushinn
    • https://github.com/Xingsandesu/
    运维部署交流

  • Nvidia vGPU 18.0以上 GRID或CloudGame驱动Patch许可教程
    F fushinn

    本方法适用于在消费级显卡上开启 vGPU 功能,或使用特定的云游戏 (Cloud Gaming) 驱动。请确保安装好了Host驱动

    重要工具和资源

    相关驱动下载地址:

    https://alist.homelabproject.cc/foxipan/vGPU
    

    vGPU 解锁工具 (vgpu_unlock-rs):

    https://github.com/mbilker/vgpu_unlock-rs
    

    DLS补丁工具

    https://git.collinwebdesigns.de/vgpu/gridd-unlock-patcher
    

    DLS在线补丁工具

    https://patch.jintongshu.com/
    

    FastAPI-DLS

    https://git.collinwebdesigns.de/oscar.krause/fastapi-dls
    

    1. 安装FastAPI-DLS

    在 Docker 主机上运行以下命令

    WORKING_DIR=/opt/docker/fastapi-dls/cert
    mkdir -p $WORKING_DIR
    cd $WORKING_DIR
    # 为内置的 Web 服务器(uvicorn)创建 SSL 证书 —— 因为客户端依赖 SSL
    openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout  $WORKING_DIR/webserver.key -out $WORKING_DIR/webserver.crt
    

    启动容器
    要测试是否配置正确,可以通过以下命令启动容器:

    docker volume create dls-db
    docker run -e DLS_URL=`hostname -i` -e DLS_PORT=443 -p 443:443 -v $WORKING_DIR:/app/cert -v dls-db:/app/database collinwebdesigns/fastapi-dls:latest
    

    Docker-Compose / 部署堆栈

    请根据需要调整以下 REQUIRED(必填)变量

    version: '3.9'
    
    x-dls-variables: &dls-variables
      TZ: Europe/Berlin # 必填,请正确设置 fastapi-dls 和客户端的时区 !!!
      DLS_URL: localhost # 必填,修改为你的 IP 或主机名
      DLS_PORT: 443
      LEASE_EXPIRE_DAYS: 90  # 最大 90 天
      DATABASE: sqlite:////app/database/db.sqlite
      DEBUG: false
    
    services:
      dls:
        image: collinwebdesigns/fastapi-dls:latest
        restart: always
        environment:
          <<: *dls-variables
        ports:
          - "443:443"
        volumes:
          - /opt/docker/fastapi-dls/cert:/app/cert
          - dls-db:/app/database
        logging:  # 可选,适合不需要日志的用户
          driver: "json-file"
          options:
            max-file: 5
            max-size: 10m
                
    volumes:
      dls-db:
    

    NVIDIA 客户机驱动安装

    驱动链接

    https://alist.homelabproject.cc/foxipan/vGPU
    
    https://cloud.google.com/compute/docs/gpus/grid-drivers-table?hl=zh-cn
    

    Windows

    点击exe安装即可

    Linux

    前提条件
    • 实例运行的是支持 NVIDIA 驱动的操作系统(如 Debian、Ubuntu、CentOS 等)
    • 已连接到实例的 SSH 终端
    1. 确认 GPU 类型

    在 SSH 终端执行:

    lspci | grep -i nvidia
    

    如果返回 NVIDIA 设备信息,表示实例已识别 GPU。

    2. 更新操作系统

    执行系统更新,确保依赖库最新:

    sudo apt-get update
    sudo apt-get upgrade -y
    

    注:针对不同系统,更新命令可能不同。

    3. 安装 NVIDIA 驱动

    使用安装脚本

    curl -O https://storage.googleapis.com/nvidia-drivers-us-public/GRID/vGPU18.1/NVIDIA-Linux-x86_64-570.133.20-grid.run
    
    sh NVIDIA-Linux-x86_64-570.133.20-grid.run
    

    4. 重启实例

    安装完成后,重启实例使驱动生效:

    sudo reboot
    

    5. 验证驱动安装

    重启后,登录实例,执行:

    nvidia-smi
    

    如果显示 GPU 信息和驱动版本,说明安装成功。


    驱动DLS补丁

    补丁程序支持Windows和Linux虚拟机:
    对于Windows虚拟机,GRID守护进程是Display.Driver/nvxdapix.dll
    对于Linux虚拟机,执行which nvidia-gridd以查找您的GRID守护进程。它可能位于/bin/

    Linux

    查找gridd

    which nvidia-gridd
    

    下载根证书

    下载FastAPI-DLS根CA从

    https://<your-dls-url>/-/config/root-certificate
    

    Patch nvidia-gridd和CA

    浏览器打开

    https://patch.jintongshu.com/
    

    输入密码

    sonvidiafucku
    
    1. 复制你的CA证书和上传你下载的文件
    2. 点击Patch
    3. 下载好Patch后的文件替换掉原有的文件

    windows

    1. 下载windows-replace-nvxdapix.ps1

    打补丁

    1. 在 Windows 上查找 nvxdapix.dll 文件路径

    在 PowerShell(以管理员身份运行) 中执行以下命令:

    Get-ChildItem -Path "C:\Windows\System32\DriverStore\FileRepository" -Recurse -Filter "nvxdapix.dll" -ErrorAction SilentlyContinue | Select-Object -First 1
    

    📌 该命令将搜索并返回第一个找到的 nvxdapix.dll 文件路径。

    Patch nvidia-gridd和CA

    浏览器打开

    https://patch.jintongshu.com/
    

    输入密码

    sonvidiafucku
    
    1. 复制你的CA证书和上传你下载的文件
    2. 点击Patch
    3. 下载好Patch后的文件替换掉原有的文件

    4. 将补丁后的 nvxdapix.dll 文件复制回 Windows 电脑的桌面

    5. 在 Windows 上运行补丁应用脚本

    以 管理员身份 打开 PowerShell,执行以下命令:

    powershell.exe -executionpolicy bypass -file "$HOME\Desktop\windows-replace-nvxdapix.ps1"
    

    ⚠️ 确保 gridd-apply-patch.ps1 脚本文件已存在于桌面。

    激活

    1. 下载 client-token 并放入 /etc/nvidia/ClientConfigToken 目录:

    你可以使用 curl 命令:

    curl --insecure -L -X GET https://<dls-主机名或IP地址>/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok
    

    或者使用 wget 命令:

    wget --no-check-certificate -O /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok https://<dls-主机名或IP地址>/-/client-token
    

    ⚠️ 请将 <dls-主机名或IP地址> 替换为你自己的 DLS 服务器地址。

    2. 重启 nvidia-gridd 服务:

    service nvidia-gridd restart
    

    3. 检查授权状态:

    nvidia-smi -q | grep "License"
    

    输出应类似于:

    vGPU Software Licensed Product
        License Status                    : Licensed (Expiry: YYYY-M-DD hh:mm:ss GMT)
    

    🎉 完成!

    Windows 上的操作步骤(下载授权令牌)

    ⚠️ 使用 PowerShell(以管理员身份运行)

    1. 下载 client-token 并保存到以下目录:

    C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken
    

    执行以下 PowerShell 命令:

    curl.exe --insecure -L -X GET https://<dls-主机名或IP地址>/-/client-token -o "C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_$($(Get-Date).tostring('dd-MM-yy-hh-mm-ss')).tok"
    

    🔧 请将 <dls-主机名或IP地址> 替换为你实际使用的 DLS 服务器地址。

    2. 重启 NvContainerLocalSystem 服务:

    Restart-Service NVDisplay.ContainerLocalSystem
    

    3. 检查授权状态:

    & 'nvidia-smi' -q | Select-String "License"
    

    输出应类似如下内容:

    vGPU Software Licensed Product
        License Status                    : Licensed (Expiry: YYYY-M-DD hh:mm:ss GMT)
    

    ✅ 完成!

    5444660DD0FFE24C2F769EB76D893F47.png

    运维部署交流

成员列表

F fushinn
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组