1. 项目背景与整体思路
1.1 Intel B60 GPU在服务器里的角色
说实话,拿到这块Intel B60 GPU的时候,我第一反应不是性能和参数,而是"这玩意儿到底该怎么驱动起来"。
这几年做AI推理和媒体处理的服务器越来越多,大家习惯性想到的是N卡,但Intel的数据中心GPU在特定场景里其实非常能打。B60是Intel Data Center GPU产品线里的重要成员,基于Xe-HPG架构,主打的是AI推理、云游戏、虚拟桌面和AV1视频转码这类高吞吐、低延迟的负载。它不靠CUDA生态吃饭,靠的是SYCL、Level Zero、OpenVINO以及Intel Extension for PyTorch这一套开放工具链,实际跑起来在FP16/BF16推理任务上的能效比相当不错,而且显存带宽足够,价格也比同级别的很多加速卡友好很多。
这次我要做的事情,是把这套GPU完整地融入一台普通服务器,跑起来、验证好、能进容器。整个过程涉及硬件检查、BIOS设置、Ubuntu系统的安装配置、Intel GPU驱动的部署、AI推理开发栈的搭建,再到Docker容器化运行,是一条完整的链路。
这篇文章就是这次全程的记录。如果你正准备在Ubuntu 22.04上启用Intel B60 GPU,可以直接按这个步骤走;如果你已经装到一半卡住了,可以直接翻到后面的"常见问题排查"章节找答案。
1.2 为什么选Ubuntu 22.04
操作系统选型其实没有太多悬念。
Intel官方对Ubuntu LTS版本的支持是最上心的,Ubuntu 22.04的内核版本默认是5.15(也可以升到HWE 5.19),对Intel GPU的i915内核模块以及后续的xe驱动支持都很完善。更重要的是,Intel的GPU用户态运行时、oneAPI工具链、OpenVINO和IPEX这些开发组件,几乎都是优先为Ubuntu LTS发布预编译好的安装包。你要是拿一个比较新的滚动发行版,反而容易踩到内核版本和用户态驱动不匹配的坑。
另外,Ubuntu 22.04的Python版本是3.10,PyTorch、OpenVINO这些框架对它的兼容性经过了充分验证。长期维护到2027年,安全更新也不愁。
在我实际装的过程中,虽然中间也遇到了一些小麻烦,但整体上比在别的发行版上要顺得多。如果你对系统没有特殊要求,直接用Ubuntu 22.04 Server或者Desktop版都行,我这边用的是22.04.3的Server版,后面所有步骤都是基于这个版本来的。
1.3 整体搭建路线图
整个环境的搭建我分成了六个阶段,每一步之间有明确的依赖关系:
- 硬件检查与BIOS设置:确认供电、插槽、固件版本,打开Resizable BAR、SR-IOV、VT-d等关键选项。
- Ubuntu 22.04安装与基础配置:包括分区、系统更新、SSH、基础依赖包。
- Intel GPU驱动安装:内核驱动、用户态Compute Runtime、Level Zero、OpenCL运行时、xpu-smi监控工具。
- AI推理开发栈搭建:oneAPI基础包、Intel Extension for PyTorch、OpenVINO。
- Docker容器化部署:设备挂载、容器内驱动安装、SR-IOV虚拟化。
- 性能验证与问题排查:用实际模型验证推理延迟、吞吐,记录常见坑点。
这样安排的好处是每一层都可以独立验证,出现问题时能快速定位是系统层、驱动层还是应用层的问题,而不是最后全部挤在一起无从下手。
2. 硬件检查与BIOS设置关键点
2.1 上电之前的硬件检查
这块最容易被人跳过,但我强烈建议至少在第一次上电前花十分钟检查一遍物理环境。
首先确认供电。Intel B60 GPU的功耗并不是那种动辄几百瓦的怪兽,整卡峰值功耗比同定位的很多产品要克制,但它依然对供电稳定性有要求。我打开服务器机箱后,先确认了PCIe插槽的供电能力,同时检查了GPU卡的供电接口是否插紧。部分厂商的服务器扩展箱或者转接板需要额外连接电源线,如果不插,卡通电后驱动会加载失败,或者设备直接不识别。
其次是物理安装。B60的外形是标准双槽PCIe卡(部分OEM版本是OAM模组形态,但大多数服务器里就是PCIe卡),安装时要注意卡有没有完全插入插槽,尾部挡板有没有固定在机箱上。我遇到过因为卡没插到位导致系统启动后PCIe链路速率掉到Gen2甚至Gen1的情况,性能直接砍半。
最后是散热风道。Intel的数据中心GPU虽然功耗不算极端,但服务器内部如果风道不通畅,长时间跑推理任务VRM温度很容易冲到100度以上。我这次把卡放在CPU下风向的位置,确保机箱前置风扇能够直接吹过散热器。
硬件这关过了,后面才能省心。
2.2 BIOS里必须打开的三项设置
BIOS设置是Intel B60 GPU能不能被Linux正确识别和发挥性能的关键,我在这里踩过一次坑,印象非常深。
第一项,Resizable BAR / Above 4G Decoding。这一项必须要开。GPU的显存空间较大,如果BIOS里关闭了Above 4G Decoding,系统在PCIe地址映射时无法把完整显存空间暴露给CPU,最终结果就是设备能被识别,但lspci显示出来的显存大小异常,驱动初始化失败或者只能看到部分资源。在BIOS菜单里搜"Above 4G"或者"Resizable BAR",找到后设为Enabled。
第二项,SR-IOV。如果你打算把这块GPU切片给多个虚拟机使用,或者想用容器进行更细粒度的资源隔离,那SR-IOV是必须提前打开的。B60支持SR-IOV虚拟化,可以在一个物理设备上生成多个虚拟功能(VF),每个VF可以独立分配给不同的虚拟机或容器。这个BIOS选项通常在PCIe配置菜单里,叫SR-IOV Support,设为Enabled即可。如果短期不做虚拟化,也可以先不开,但我的建议是现在就打开,省得后面改配置重启服务器。
第三项,VT-d / IOMMU。这个选项在Intel平台上叫VT-d,在AMD平台上叫IOMMU。它的作用是为设备直通和DMA重映射提供硬件支持。你要做GPU直通或者跑虚拟化,这一项必须开。就算你现在不需要,开上也不会有什么副作用。
顺带说一下,不同的OEM服务器BIOS菜单结构差异很大,有的叫"PCIe Config",有的叫"Advanced"里面嵌套了好几层。我的经验是搜关键词比翻菜单快得多,在BIOS搜索栏里直接搜"BAR"、"SR-IOV"、"VT-d",基本都能定位。
2.3 固件版本同步更新
这个点很容易被忽略,但确实能影响稳定性。
服务器的BMC(带外管理固件)、BIOS以及PCIe Switch固件版本,会影响GPU的PCIe链路训练和电源管理策略。尤其是当你从OEM渠道购买的服务器,出厂固件可能比较老,和B60的固件配合会出现偶尔掉卡、链路降速的问题。
我在搭建时遇到的第一个莫名其妙的现象是:系统启动后偶尔找不到GPU设备,重启一次又恢复正常。后来排查下来,发现是服务器BIOS版本太老,对PCIe Gen4链路的稳定性支持不够,升级BIOS之后问题消失。这里的经验是:上新硬件之前,先去OEM官网把BIOS和BMC固件更新到最新版,不要用出厂老版本硬扛。
GPU本身的固件如果需要更新,可以通过Intel官方的固件更新工具在Linux下完成。这个操作相对低频,但如果你要跑SR-IOV生产环境,还是建议检查一下固件版本,保持统一。
3. Ubuntu 22.04系统安装与基础配置
3.1 安装介质与磁盘规划
系统安装这里没有太多玄学,但有几个细节我觉得值得特别说一下。
我用的是Ubuntu 22.04.3 Server版镜像,U盘安装,过程中没有遇到和B60相关的安装卡顿。如果你的服务器没有板载显示输出,或者安装界面花屏,可以在GRUB启动时选择"Safe graphics"模式,也就是安全图形模式,它会用更保守的显示驱动跑安装界面。
磁盘分区我给的方案是:
- /boot/efi: 512MB,EFI系统分区
- /: 200GB,用于系统、驱动和开发工具链,ext4文件系统
- /opt: 剩余空间,用于存放模型文件、大文件缓存和Docker数据目录
为什么不把所有空间都丢给根分区?因为后续你可能要拉几GB到几十GB的模型文件、数据集,单独划一个Data分区,系统重装时数据不会被误删,备份和迁移都方便。这是我在实际项目中吃了亏之后养成的习惯。
3.2 系统更新与基础依赖
系统装好后,第一步是让整个系统处于最新状态:
sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential dkms git wget curl gawk \ linux-headers-$(uname -r) sysfsutilsbuild-essential和dkms是编译内核模块时需要的;linux-headers是为了后续某些情况需要重新编译i915模块时使用的。虽然Intel的驱动通常提供预编译包,但准备齐全总比临时缺东少西好。
sysfsutils这个包很多人不会主动装,但它后面在调整SR-IOV或者查看PCIe参数时很实用。
3.3 交换分区与系统参数
因为有可能会把大模型直接加载到内存里测试,我额外创建了一个32GB的swapfile,防止在内存不足时进程直接被OOM Killer干掉。
sudo fallocate -l 32G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab这个操作的风险很低,收益却很明显。训练或者推理过程中偶尔内存高水位,swap一挡,服务还能撑住,不至于直接崩溃。
另外顺手做了两件事:设置时区为UTC+8,配置SSH密钥登录关闭密码登录。远控服务器没有SSH我会很没安全感。
4. Intel GPU驱动与工具链安装
4.1 先搞懂驱动栈的组成
Intel GPU驱动在Linux下不是一个包能搞定的,它是"内核态驱动+用户态运行时"的栈结构。你可以把内核驱动理解成水管,用户态运行时理解成水龙头:水管负责把水送到家里,水龙头负责让你正常接到水,两者缺一不可。
具体到B60,需要的东西有这么几层:
- 内核驱动:i915(老一些但稳定)或者xe(较新的实验驱动)。Ubuntu 22.04默认用的是i915,通常情况下够用。
- Intel Graphics Compute Runtime:这是SYCL/DPC++程序运行时的核心,OpenCL、Level Zero都依赖它。
- Intel Level Zero Loader:提供Level Zero API的加载层,是oneAPI工具链访问GPU的主要通道。
- OpenCL ICD运行时:运行OpenCL程序时需要。
- 监控工具:xpu-smi(类似NVIDIA的nvidia-smi)和intel-gpu-top。
我的建议是,第一次安装全部按照官方仓库的推荐版本装,不要混合不同来源的包。版本不匹配的问题比想象中更容易出现,而且报错信息往往不够直观。
4.2 一步步安装驱动
首先,需要把Intel的GPU驱动仓库添加到系统的软件源里。这一步在Intel官网有明确的说明,核心动作是导入GPG密钥并添加对应的apt仓库,然后更新软件源。
# 导入GPG密钥并添加仓库后 sudo apt update sudo apt install -y intel-opencl-icd intel-level-zero-gpu \ intel-gpu-tools xpu-smi这里解释一下这几个包分别干什么:
- intel-opencl-icd:OpenCL运行时,很多推理框架在GPU优化时调用它。
- intel-level-zero-gpu:Level Zero GPU驱动,oneAPI和sycl-ls识别设备的核心组件。
- intel-gpu-tools:提供intel_gpu_top这类性能监控工具。
- xpu-smi:Intel的GPU管理命令行工具,监控温度、频率、显存占用、设备健康状况。
在部分仓库源里,Compute Runtime的包名可能是intel-graphics-compute-runtime,具体以你添加的仓库为准。安装完以后,可以用dpkg -l | grep intel确认一下所有相关包都在。
4.3 验证驱动是否正常加载
这一步是整个搭建过程中最让人安心的时刻。
先跑一个命令看设备是否被系统识别:
lspci -nnk | grep -i -E "vga|display|3d"正常输出会包含Intel的显示控制器,以及下面跟着的内核驱动模块,类似Kernel driver in use: i915。如果这里显示"Kernel driver in use: xx"或者干脆是空的,说明驱动没有被正确绑定。
再看设备节点:
ls -l /dev/dri/正常情况下能看到card0和renderD128两个设备节点。如果这两个都没有,大概率是内核模块没有加载,执行一下modprobe i915看看报错信息。
sudo modprobe i915然后把当前用户加入video组,否则后面在用户态跑程序时可能没有权限访问GPU:
sudo usermod -aG video $USER最后用xpu-smi验证设备的完整信息:
xpu-smi info我那次实际执行的结果是,设备列表里直接出现了当前这台B60,UUID、温度、频率、内存状态全都正常显示,那一刻的踏实感很难形容。装到这里,GPU最核心的驱动阶段就算完成了。
5. AI推理开发栈搭建与性能验证
5.1 oneAPI基础工具包
有了底层驱动,接下来要装的是Intel的AI开发工具链。
oneAPI是Intel统一编程模型,它不要求你只能写某个框架,而是提供一个基于SYCL的异构编程平台。对大多数使用PyTorch或者OpenVINO的人来说,不需要自己写SYCL代码,但是装好oneAPI的基础组件能让后续的IPEX和OpenVINO跑得更顺畅。
安装方式可以直接用Intel oneAPI Base Toolkit的安装脚本,也可以走apt装在线仓库的组件。如果只需要GPU运行时,安装intel-pti、intel-dpcn和多节点相关组件就够了。为了验证安装结果,装完后运行:
sycl-ls这个命令会列出所有对SYCL可见的设备。正确情况下输出里应该能看到类似Intel Data Center GPU Flex B60的设备,平台类型是Level Zero。
如果sycl-ls的结果为空,别着急,优先检查Level Zero Loader和Compute Runtime的版本匹配情况,然后再检查/dev/dri/renderD128的权限。
5.2 Intel Extension for PyTorch(IPEX)
PyTorch是目前AI推理和微调中使用率最高的框架,Intel B60不直接支持CUDA,所以要用Intel Extension for PyTorch(IPEX)来让PyTorch把B60当后端设备使用。
安装前先确认一下Python版本和PyTorch版本。官方对IPEX和PyTorch有明确的版本矩阵,最好严格按照对应版本安装,混装很容易出现torch.xpu不存在这种诡异问题。
我的安装命令大致是:
pip install torch intel-extension-for-pytorch具体版本号以官方文档为准,装好之后一定用一段代码验证设备可见性:
import torch import intel_extension_for_pytorch as ipex print("GPU count:", torch.xpu.device_count()) print("GPU name:", torch.xpu.get_device_name(0))你应该能看到GPU数量为1,名字是Intel Data Center GPU Flex B60。
再跑一个简单的矩阵乘法来做基础性能验证:
a = torch.randn(4096, 4096).xpu() b = torch.randn(4096, 4096).xpu() c = torch.matmul(a, b) torch.xpu.synchronize() print(c.device, c.shape)这个操作虽然简单,但能排除很多框架层面或者运行时层面的隐性故障。如果连这个都能跑通,说明PyTorch对GPU的访问链路是完整的。我在实际测试中发现,默认场景下4096矩阵乘法的吞吐表现已经接近这块卡的正常水平,如果性能明显偏低,检查BIOS里的Resizable BAR是否真的生效。
5.3 OpenVINO与模型推理验证
除了PyTorch,另一个绕不开的组件是OpenVINO。它对Intel GPU的适配深度比通用的PyTorch更彻底,推理优化空间更大,部署也更省心。
安装:
pip install openvino openvino-dev然后用benchmark_app直接测一个模型的推理性能:
benchmark_app -m model.xml -d GPUOpenVINO会把计算图进行前端优化、图转换,然后在GPU上通过Level Zero或者OpenCL执行。实测下来,B60在OpenVINO上的表现很稳,FP16模型推理吞吐比FP32高了不少,这也是这块卡的主要使用姿势。
我的建议是:如果做在线推理服务,模型先用OpenVINO做一次IR转换,再部署到GPU上,整体延迟和吞吐都会比直接跑原始框架好一个档次。后面做容器化部署时,也可以直接把OpenVINO作为推理引擎,省时省力。
5.4 多卡协同与显存监控
如果你的服务器里插了多张B60,还可以做简单的负载均衡分配。通过xpu-smi能看到每张卡各自的利用率、温度、显存占用,代码层面可以用环境变量或者任务队列把不同的推理请求分发到不同设备上。
显存规划这个点容易被忽视。虽然B60的显存对绝大多数推理模型够用,但如果在跑大Batch或者长序列模型,显存占用会突然飙升。我习惯在加载模型前先清掉缓存,用xpu-smi盯几轮请求后再放心交付。
6. Docker容器化与虚拟化部署
6.1 容器里跑GPU需要挂载什么
进容器之前我们得明确一点:GPU不能直接被容器共享,容器要访问GPU,需要宿主机把GPU设备节点暴露给容器。
Intel GPU在Linux下的设备节点是/dev/dri/card0和/dev/dri/renderD128,Docker启动时需要挂载整个/dev/dri目录,并让容器进程有访问权限。
最稳妥的启动命令:
docker run -it --rm \ --device /dev/dri \ --group-add video \ ubuntu:22.04 bash--device /dev/dri把GPU设备节点映射进容器,--group-add video把容器的附加组设置为宿主机上的video组。这样容器内的进程才有权限打开GPU设备文件。
如果你已经安装好了Intel的容器镜像或者自带runtime的镜像,启动逻辑是一样的。不推荐直接加--privileged,虽然省事,但这等于把主机的所有设备权限都交给了容器,安全风险太大。
6.2 容器内runtime的安装方式
最基础的方式是,在容器里也安装一遍Intel的GPU驱动仓库和Compute Runtime。这会导致镜像体积变大,但灵活度更高,任何基于Ubuntu的镜像都能用。
更专业的做法是使用已经集成好Intel GPU runtime的公共镜像。比如OpenVINO的Model Server镜像,它里面已经包含了完整的OpenVINO推理环境和Intel GPU运行时。搭建推理服务时,直接用那个镜像会节省大把时间。
我个人的经验是:
- 如果只是做开发调试,用基础镜像+自己装runtime的方式,还原度高,排障容易。
- 如果做生产推理服务,用官方集成推理框架的镜像,省心,少踩依赖坑。
容器的网络连接和共享内存大小也值得留意。推理服务并发高或者模型大时,可能会用到共享内存,Docker默认的/dev/shm只有64MB,这是很多容器内卡死问题的根源。建议启动时加上:
--shm-size=8g6.3 SR-IOV虚拟化与设备直通
关于虚拟化,如果你只想把整块GPU给一台虚拟机专用,用PCIe直通(VFIO passthrough)就够了。做法是让宿主机在启动时把B60从i915驱动中解绑,然后绑定到vfio-pci驱动,再把PCIe设备以直通方式分配给虚拟机。
如果你想一个物理GPU给多台虚拟机用,就要靠SR-IOV。B60支持SR-IOV,在BIOS开启SR-IOV后,可以在宿主机上把设备的VF数量写出来:
echo 4 > /sys/bus/pci/devices/0000:xx:00.0/sriov_numvfs执行后运行lspci,应该能看到该PCIe设备下多了几个Virtual Function设备节点。每个VF可以当独立设备直通给不同虚拟机。
这里有一个很重要的注意事项:SR-IOV要正常工作,内核驱动支持、BIOS设置、VF数量和宿主机的内存管理都要配套。不是所有Linux内核默认都开启了Intel GPU的SR-IOV支持,部分发行版需要额外加载或者重新编译模块。我的建议是,在正式生产环境里,优先考虑整卡直通,等把SR-IOV的稳定性吃透了再上切片方案,避免周期性掉卡影响业务。
7. 常见问题排查与避坑实录
7.1 高频问题速查表
搭建过程中我遇到的问题不少,很多都是典型的"第一次接触Intel数据中心GPU的人都会遇到"的问题。下面这个表算是速查手册,可以对照处理:
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| lspci看不到GPU设备 | 卡没插到位、供电没接、BIOS里PCIe槽被禁用 | 重新插拔,检查供电线,进入BIOS确认PCIe槽状态 |
| lspci能看到设备但驱动显示空白 | 内核模块未加载或固件缺失 | 执行modprobe i915,检查/usr/lib/firmware下是否有对应固件 |
| 显存大小不对,只有128MB | BIOS里没有开启Above 4G Decoding | 进入BIOS,开启Above 4G / Resizable BAR |
| /dev/dri目录不存在 | i915模块未加载,或内核太老 | 执行dmesg查看错误,确认内核版本和固件 |
| sycl-ls输出为空 | 用户态运行时未装好 | 重新安装intel-level-zero-gpu和compute-runtime,确认版本匹配 |
| 程序运行报Permission denied | 当前用户不在video组 | 执行sudo usermod -aG video $USER后重新登录 |
| 容器内看不到设备 | 设备节点没挂载进容器 | 加上--device /dev/dri和--group-add video |
| Docker内程序报共享内存不足 | /dev/shm太小 | 加上--shm-size=8g |
| 推理性能明显偏低 | PCIe链路速率降级 | lspci -vvv查LnkSta速率,检查插槽是否x16 |
7.2 我踩过的三个具体坑
第一个坑是Above 4G Decoding没开,导致显存只显示128MB。当时装完驱动后跑xpu-smi,设备信息出来了,但我总觉得显存大小不对。用lspci -v查看后发现内存区域被裁掉了一大块,重启进BIOS开了Above 4G Decoding后才恢复正常。这是最典型的一个坑,只要你用的是Intel数据中心GPU,第一次装这块卡时一定要先确认这项设置。
第二个坑是只装了内核驱动,没装用户态compute runtime。那次我执行lspci能看到设备,/dev/dri设备节点也在,但sycl-ls就是找不到GPU。绕了很久才发现是intel-level-zero-gpu装失败,但当时没有明确报错,apt显示安装成功后来发现是仓库没有刷新索引导致的。重新apt update之后装上runtime,一切正常。
第三个坑是容器里忘了带video组权限。Docker容器内可以看到/dev/dri/renderD128,但一访问就报"Permission denied"。排查命令很简单,在容器里执行id确认附加组里有没有video(gid通常是44),没有就在启动时加--group-add video。这个坑对新手迷惑性很强,因为设备节点明明就在那里,但你就是没权限打开。
7.3 稳定性验证和保养经验
环境搭建完不代表结束,真正的考验是连续跑一段时间后的稳定性。
我的做法是:连续跑一个多小时的模型推理负载,同时用xpu-smi每30秒记录一次温度、频率、显存占用,看是否有异常掉速或者掉卡。正常情况下温度会稳定在一个合理的区间,频率不会长时间锁定在低档。如果发现频率经常掉到最低档,先看是不是温度过高,再看是不是供电不足。
另外intel_gpu_top是一个非常好用的实时监控命令,效果类似Linux的top,不过看的是GPU负载。在服务器上操作时按q退出,不会留下额外进程。
还有一点是驱动的定期更新。Intel的GPU驱动和运行时更新频率不低,建议每隔两三个月查看一下官方仓库有没有新版本。尤其是当你遇到莫名其妙的问题时,先去升级驱动和运行时,大概率能解决掉一批积压的问题。
最后再提一个非常容易被遗漏的细节:如果服务器里有多个PCIe插槽,一定要确认B60插在了CPU直出的x16物理插槽上,而不是经过芯片组转接的x4槽。我有一次图方便把卡插在第二个槽位上,结果PCIe链路速率只有Gen3 x4,推理延迟直接上升了将近20%,同一个模型从x16槽位搬到原来的插槽后,性能才恢复正常。插槽选好了,GPU的性能才不会被白白浪费。
这台服务器搭起来之后,我现在已经把它稳定运行在几个独立的虚拟机里,日常的AI推理和视频转码任务都跑得很稳。回顾整个搭建过程,我最深的体会是:环境搭建这件事一定要当成可重复的工程来做,所有的关键命令、BIOS选项、固件版本都应该记录成文档,甚至写成脚本。因为过了几个月之后,你真的会忘记当初是怎么把那个目录权限搞定的。
如果你现在也正拿着这块Intel B60 GPU准备开始搭建环境,我建议你按顺序一步一步来,不要急着跳步。BIOS里那两个选项是最关键的,后面所有的软件安装都建立在硬件能被正常识别的基础上。装完驱动之后,跑一遍sycl-ls确认设备可见,再往下走就不会有太大的坑。后面如果遇到我没提到的问题,大概率出在内核参数、固件版本兼容性或者设备权限上,按着问题排查表逐项对就行。Intel这套工具链现在对一个Linux老手来说,已经没有太多神秘感了,前半程的小折腾换来的是一台调度灵活、能耗表现优秀的推理服务器,值。