ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Intel B60 GPU服务器Ubuntu 22.04环境搭建与驱动配置全指南

Intel B60 GPU服务器Ubuntu 22.04环境搭建与驱动配置全指南

Intel B60 GPU服务器的Ubuntu 22.04环境搭建,这件事看起来简单,实际坑不少。最近帮人装了一批这样配置的服务器,从系统安装、BIOS设置到驱动和容器环境,整个过程捋下来,我觉得值得把每个步骤和踩过的坑都写清楚。这套环境主要用来跑AI推理、视频编解码和HPC计算任务,如果你是做运维、平台开发或者算法工程的,照着这份流程走,能省下不少排查时间。如果你是想快速把单机跑起来做推理验证,还是打算把它接进Kubernetes集群做弹性资源池,这篇文章覆盖了从物理机到AI框架的完整链路。

1. 项目背景与硬件确认

1.1 首先确认硬件状态

拿到服务器第一件事不是装系统,而是确认硬件状态。B60这类Intel数据中心GPU,在普通家用主板上可能无法被正确识别,因为大部分消费级主板默认没有开启Resizable BAR相关的PCIe配置。先通过BIOS界面或者带外管理口进入主板设置,确认PCIe设备列表里能看到这张卡。

如果是全新的服务器,开机后先去BIOS找有没有"Above 4G Decoding"(也叫大于4G地址空间解码)选项。这个选项非常关键,它让系统能够为GPU分配64位PCIe地址空间。没有开启的情况下,虽然系统也能识别设备,但显存映射不完整,性能会大打折扣,尤其跑大模型推理的时候直接会出现内存分配失败。

实际验证方法:装好系统后,执行lspci,看输出中是否能找到包含B60设备ID的记录。如果这里是空的,先别急着装驱动,回头检查卡是否插稳、供电是否到位、主板PCIe插槽是否运行在x16模式。

还有一个细节容易被忽略:检查供电线。B60这类加速卡通常需要一个8pin或者CPU 8pin供电,只靠PCIe插槽供电带不动满载状态。插好之后,在BIOS的硬件监控界面里确认GPU的供电电压是否正常,如果出现0V或者明显偏低,大概率是供电线没插到位。

1.2 系统版本与软件基线确认

Ubuntu 22.04是我推荐的基线,原因是Intel官方驱动和oneAPI工具链对22.04 LTS的支持最完整。20.04虽然也能装,但有些较新的固件管理工具依赖的glibc版本会卡住;24.04倒是很新,但部分Intel GPU驱动包还没有正式发布到APT源,只能从源码构建,划不来。锁定22.04,内核保持默认5.15 LTS即可,如果你的平台自带内核版本是6.x,也没关系,Intel的i915驱动已经进到了主线内核,不需要额外编译内核模块。

还有个常见的误解是,Intel GPU驱动需要像传统独立显卡那样安装一个巨大的.run安装包。实际上,Intel数据中心GPU的软件栈是"内核态i915驱动 + 用户态计算运行时"两层。内核态i915驱动已经随Ubuntu内核编译好了,我们要做的只是安装用户态的计算运行时、Level Zero接口和OpenCL ICD,这部分后面会详细写。

在做系统安装之前,另一项容易被忽略的准备是:下载最新BIOS和GPU固件包。有些服务器出厂固件版本偏低,在旧固件上直接装驱动会随机出现设备消失或者计算超时,先升级固件再往下走能省很多事。固件更新的操作放在驱动安装之后会一起说明,但准备工作最好提前做,因为部分固件更新工具需要依赖目标系统环境,纯离线环境不方便操作。

2. Ubuntu 22.04系统安装与基础配置

2.1 安装系统的关键选择

安装Ubuntu 22.04 Server版,Method记得选"Install Ubuntu Server",不要用Desktop版,服务器上不需要桌面环境,省掉一套X Server和Wayland的干扰。分区方案上,如果机器带有SSD,建议/分区直接做在SSD上,/data或/workspace单独挂载到大容量HDD或NVMe盘,因为后续要装大量模型权重文件和容器镜像缓存,放在系统盘很容易爆。

硬盘分区建议给boot分区留至少1GB,Ubuntu的加密LVM和全盘加密选项我在这类GPU服务器上不推荐开启,一是性能损耗,二是排查故障时还要输入密钥解锁磁盘,在机房环境下非常痛苦。除非有强制安全要求,否则用普通的ext4分区即可。

系统装完第一件事,更新所有包,把系统补丁打齐,然后安装基础工具链。别小看这一步,很多驱动安装失败案例最后查出来是系统有旧的依赖版本冲突,先全面apt upgrade再装GPU驱动。我习惯装完系统先执行两轮apt update && apt upgrade,确认没有残留的待更新包,然后顺手装掉wget gpg curl build-essential这类常用工具,后面配置软件源都会用到。

2.2 内核参数与IOMMU配置

B60这类GPU要做虚拟化直通或者跑容器,强烈建议开启IOMMU。编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX,在里面加上intel_iommu=on iommu=pt。对于纯计算型单机场景,iommu=pt参数能减少IOMMU翻译的开销,同时保留直通模式的能力。

修改完grub后执行update-grub,然后重启。重启后用dmesg | grep -i -e DMAR -e IOMMU检查,确认IOMMU已经生效。这里有个我在实际环境里踩过的坑:每次改完grub一定要确认机器能正常起来再离场,否则远程重启后如果参数写错了,整个节点起不来的情况是会发生的。如果实在没法进系统,就在GRUB引导界面按e编辑启动项,把有问题的参数临时去掉,进系统再修grub配置。

另一个和系统基础配置相关的点是S0ix空闲状态。在部分Intel平台上,如果系统默认开启了S0ix,GPU在空闲时可能会被系统发送到低功耗状态,导致你跑第一次程序时初始化时间特别长,甚至出现设备初始化超时。遇到这种情况,可以在grub参数里尝试加intel_idle.max_cstate=1来临时关闭深度的系统空闲状态,实测能解决不少莫名其妙的初始化问题。当然这不是长期最优解,后续可以结合系统的电源管理策略调整。

3. Intel B60 GPU驱动安装与固件更新

3.1 配置Intel官方APT源

驱动安装流程的第一步是把官方APT源加进来。需要确认两件事:一是证书和密钥要导入系统;二是source list里同时包含主仓库和带GPU驱动的子仓库。以Ubuntu 22.04为例,完整流程是:

wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | gpg --dearmor -o /usr/share/keyrings/intel-graphics.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy client" | tee /etc/apt/sources.list.d/intel-gpu-jammy.list echo "deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy server" | tee -a /etc/apt/sources.list.d/intel-gpu-jammy.list apt update

这里写了client和server两个仓库。有些人只加了client就够用,但在数据中心GPU上,服务端的metrics库和固件管理组件是放在server仓库里的,建议两个都加,不至于后面缺包时到处找。

安装核心驱动包的命令:

apt install intel-opencl-icd intel-level-zero-gpu intel-igsc intel-fw intel-metrics-discovery intel-metrics-library intel-xpu-smi

intel-opencl-icd负责提供OpenCL的接口实现,intel-level-zero-gpu是Level Zero运行时的GPU部分,intel-igsc是用来更新GPU固件的工具,intel-fw是固件包本体。装完这些后,可以通过dpkg -L分别查看各包的安装路径,确认没有遗漏。

安装完成后需要把当前用户加入必要的权限组。Intel GPU的render节点通常是/dev/dri/renderD128,默认只有video和render组可以访问。建议执行:

usermod -aG video,render $USER

加完组一定要重新登录,否则权限不会立刻生效。我第一次就是加完组没重新登录,结果clinfo一直报权限失败,折腾了半小时。

3.2 固件更新与必要重启

B60系列对GPU固件的敏感度比上一代更高。安装intel-fw包后,强烈建议立刻执行固件更新:

sudo igsc update

更新前先用igsc firmware-show查看当前固件版本,确认和官方发布版本之间的差异。如果提示需要更新,就执行更新命令,更新过程中不允许断电,更不允许同时运行GPU计算负载。

固件更新完成后,重启系统,让驱动重新加载。随后再跑一遍lspci确认设备状态。如果输出里出现rev 00或者"broken"之类的状态,多半是固件和驱动版本不匹配,回头把intel-fw和intel-igsc以及内核也重新升级到一致版本。

我遇到过一台机器固件更新后lspci正常,但xpu-smi里显示设备"Unexpected",最后查出来是Secure Boot把驱动模块签名挡住了。解决方案是关闭Secure Boot,或者把Intel签名的驱动模块加载到受信任的EFI密钥里。对于内部机房环境,直接关掉Secure Boot是最省事的方式。

4. 开发运行环境与容器化部署

4.1 验证GPU计算栈

装好驱动后,第一步是验证设备能被用户态工具发现。安装intel-xpu-smi这个包后,直接执行:

xpu-smi stats

能看到GPU温度、利用率、显存使用、频率等关键信息,就证明整条软件链路已经打通了。接着安装clinfo验证OpenCL层:

apt install clinfo clinfo | grep -i "device name"

这一步会列出所有可用的OpenCL设备。注意如果没有配置source list里的server仓库,clinfo可能会因为缺少OpenCL ICD loader而报错,需要安装ocl-icd-libopencl1。

Level Zero是Intel生态里和OpenCL同等重要的接口。在AI框架中,PyTorch的XPU后端就是通过Level Zero驱动来访问GPU的。很多初学者只测了clinfo就去跑AI框架,结果一堆"Level Zero not found"的错误,就是因为Level Zero初始化没通过。验证Level Zero环境是否就绪,可以装好oneAPI环境后用对应的sample程序,或者直接查libze_loader.so是否存在,如果这个动态库都没有,那后面跑AI框架肯定出问题。

4.2 容器运行时与GPU对接

跑AI系统场景,容器是标配。在Ubuntu 22.04 + Intel GPU环境下,容器对接有两条路线:一条是用Intel device plugins配合Kubernetes,把GPU作为可调度资源暴露给集群;另一条是单机Docker场景,直接映射/dev/dri设备。

单机Docker场景的run命令最少是这样的:

docker run -it --rm \ --device /dev/dri/renderD128 \ -v /dev/dri:/dev/dri \ ubuntu:22.04 bash

注意容器里需要安装和宿主机一致的Intel用户态运行时版本,否则容器内程序调用GPU接口时会报版本不匹配。可以把宿主机的/usr/lib/x86_64-linux-gnu下的libze_intel_gpu.so等动态库挂载到容器里,或者直接用包含Intel GPU驱动的镜像作为基础镜像。我实际更推荐后一种方案,镜像构建时可重复,团队成员拉下来就能用,不会因为宿主机环境差异导致容器行为不一致。

Kubernetes场景相对复杂,使用Intel官方提供的设备插件机制,设备插件会监听GPU设备并上报资源数量。部署后Pod里通过resources.limits声明intel.com/gpu: 1即可获得对应的GPU设备。注意节点需要开启Node Feature Discovery,否则设备插件的标签收集不到。设备插件跑起来后,用kubectl describe node确认节点上报的GPU资源数是否符合预期,这一步是整个K8s接入成功与否的关键。

4.3 AI框架对接:以PyTorch为例

PyTorch + Intel GPU是目前最典型的接入路径。安装方式不需要自己编译,直接pip安装Intel扩展。官方给出的简化流程是:

pip install torch torchvision torchaudio intel-extension-for-pytorch

装完后,在代码中使用"xpu"作为设备名称,比如:

import torch import intel_extension_for_pytorch as ipex x = torch.randn(1024, 1024, device="xpu") y = torch.randn(1024, 1024, device="xpu") z = torch.matmul(x, y) z.cpu()

首次调用时,框架会自动初始化Level Zero运行时。如果初始化失败,常见的原因是/usr/lib/x86_64-linux-gnu/libze_loader.so找不到,或者环境变量ZE_AFFINITY_MASK设置得不合理。单卡场景下不用设置,多卡时才需要按卡号拆分。

我建议首次跑AI用例之前,先做一次小规模的矩阵乘法,比如上面这个例子,确认xpu设备能够正常创建tensor并完成计算,再去跑完整的ResNet或大模型推理任务。这个渐进式验证的思路能帮你快速区分到底是框架配置问题还是驱动适配问题。跑完整任务时,如果遇到CPU和GPU之间数据拷贝缓慢的情况,可以检查是不是用了pin memory,配合xpu设备做异步数据传输,吞吐能提升不少。

5. 性能验证、监控与问题排查

5.1 用xpu-smi做日常监控

xpu-smi不仅是装完后的验证工具,也是日常监控的核心工具。常用命令包括:

  • xpu-smi stats:实时查看GPU利用率、温度、显存占用
  • xpu-smi dump -d 0:按设备导出详细状态
  • xpu-smi topology:查看卡间互联拓扑

在B60的多卡服务器上,卡间拓扑信息对并行训练和推理的卡间通信方案选择很重要。运行聚合通信任务前,先看一眼topology,确认卡间是否有直连链路,避免把需要频繁通信的任务分到了跨PCIe Switch的两张卡上,带宽会成为瓶颈。我习惯在做任何多卡性能测试之前,先把topology输出保存一份存档,后面如果性能异常就可以翻出来对比。

监控这块还有个小技巧:把xpu-smi stats接到定时任务或者监控系统里,持续采集GPU温度、功耗和利用率曲线。散热异常往往是机器出故障的第一个信号,尤其是数据中心里服务器密集堆叠的情况下,提前发现温度异常可以避免硬件损坏。

5.2 验证GPU性能的基准方法

环境搭建完成的最后一步,是跑一两个基准测试,作为后续版本升级和回归的参照基线。推荐两种:

第一种是计算场景测试,跑GEMM或者基于PyTorch的ResNet50推理,记录吞吐量。跑之前把CPU governor设为performance模式:

cpupower frequency-set -g performance

避免CPU频率波动干扰测试结果。GEMM的规模要选贴合实际业务的,别拿一个特别小规模的矩阵反复跑,那样测出来的数据没有参考价值。最好记录三次成绩取中位数,而不是取最大值,中位数更稳定客观。

第二种是显存带宽测试,这个更能反映GPU实际能力。B60的显存带宽在规格上有明确数据,实际测出的数值如果能达到理论值的80%以上,说明环境和散热都健康。如果明显偏低,优先看PCIe link status(lspci -vv),确认链路是否跑在预期速率上。PCIe降速在服务器上是常见的隐性故障,经常被忽略。

5.3 常见问题排查清单

这里把我实际遇到的高频问题整理成一个速查表:

现象可能原因处理方式
lspci找不到设备主板未开启Above 4G Decoding;PCIe插槽异常进BIOS开启Resizable BAR;换插槽重插
clinfo报权限错误用户不在video/render组usermod -aG video,render 后重新登录
xpu-smi显示Unexpected固件版本过低;Secure Boot拦截模块igsc update 后重启;关闭Secure Boot
PyTorch报Level Zero找不到缺少intel-level-zero-gpu包或libze_loader.so重装intel-level-zero-gpu,检查动态库路径
初始化耗时特别长S0ix深度空闲状态触发内核参数加intel_idle.max_cstate=1
多卡应用只看到一张卡环境变量ZE_AFFINITY_MASK配置错误按设备序号设置ZE_AFFINITY_MASK,如0,1,2,3

表格里的现象都是实际运维中常见的,处理方式我尽量给到了可以直接执行的操作。除了表格里的内容,还有一条血泪教训:任何时候做固件更新,不要在更新过程中人为中断,万一中断导致GPU变砖,虽然有救砖流程,但没必要把自己架在火上去烤。

最后再分享一点个人体会。Intel这条GPU的软件栈和传统GPU服务器很不一样,最大的区别在于主体驱动已经进了内核主线,所以环境搭建的关键不在编译内核模块,而在于把用户态计算运行时和固件版本对齐。我在连续装了几台机器后,总结出一个固定套路:先BIOS后系统,先固件后驱动,先验证后部署。任何一步不按顺序,后面都要花数倍时间排查。如果你正在配一台B60服务器,照着这个流程走,应该能少走不少弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进