IMPORTANT
GPU 直通仍处于实验阶段。--gpu 标志、驱动捆绑包以及本页的设置步骤都可能发生变化。
本地 Docker Sandboxes 中的 GPU 直通让工作负载运行在物理 NVIDIA GPU 上。
Docker 沙箱中的 GPU 直通通过 VFIO 实现,这是一项 Linux 特性,可把 PCI 设备直接分配给虚拟机。GPU 绑定到 VFIO 而不是 宿主机驱动,沙箱内的工作负载自行驱动该硬件。
环境要求
基于 VFIO 的 GPU 直通仅支持配备 NVIDIA GPU 的 x86_64 Linux 宿主机(不支持 Arm), 并且要求这块 GPU 没有被其他任何东西占用:带 GPU 的无头宿主机,或一块额外的 GPU。
宿主机还需要在 BIOS 中开启 IOMMU,并加载 iommufd 和 vfio_pci 内核模块:
sudo modprobe -a iommufd vfio_pci要让沙箱驱动该 GPU,需要:
- 为 Docker Sandboxes 客户机内核构建的
nvidia和nvidia-uvm内核模块 - NVIDIA 用户态驱动库和固件
Docker Sandboxes 会在 /usr/libexec/nerdbox-nvidia-bundle.erofs 查找这些依赖, 它们被打包成 EROFS 镜像。该捆绑包不随 Docker Sandboxes 一起分发。要构建它, 请参阅构建捆绑包。
启用该功能
在你开启实验性功能和 GPU 功能标志之前,--gpu 标志是隐藏的:
sbx settings set platform.allowExperimentalFeatures true
sbx settings set feature.sandbox-gpu true构建捆绑包
每个 Docker Sandboxes 发布版本都会附带一个包含构建捆绑包所需全部组件的 zip 压缩包, 名为 nerdbox-nvidia-modules-x86_64.zip。该压缩包包含内核模块(nvidia.ko 和 nvidia-uvm.ko)、它们构建时所针对的驱动版本(VERSION),以及一个构建脚本。
构建脚本会运行一个 linux/amd64 容器,下载匹配的 NVIDIA 驱动、组装捆绑包,并把它 安装到 /usr/libexec/nerdbox-nvidia-bundle.erofs。写入该路径需要 root 权限,因此 下面命令中带有 sudo。
前置条件:
- 能访问
download.nvidia.com的网络 - Docker
下载并解压压缩包,然后在解压出的目录中运行脚本:
curl -fSLO https://github.com/docker/sbx-releases/releases/latest/download/nerdbox-nvidia-modules-x86_64.zip
unzip nerdbox-nvidia-modules-x86_64.zip -d nvidia-modules
cd nvidia-modules
sudo ./prepare-nvidia-bundle.sh如果脚本无法写入输出路径,它会把捆绑包留在当前目录,并打印完成该工作所需的 install 命令。
有两个环境变量可以覆盖脚本的默认行为:
| 变量 | 默认值 | 用途 |
|---|---|---|
OUTPUT | /usr/libexec/nerdbox-nvidia-bundle.erofs | 写入完成版捆绑包的位置。 |
ACCEPT_NVIDIA_LICENSE | 无 | 设为 1 可在非交互方式下接受 NVIDIA 许可证,适用于脚本或 CI。 |
例如,下面的命令把完成版捆绑包写入 /mnt/some-place/nerdbox-nvidia-bundle.erofs:
OUTPUT=/mnt/some-place/nerdbox-nvidia-bundle.erofs ./prepare-nvidia-bundle.sh安装捆绑包
如果你在运行 GPU 沙箱的 x86_64 Linux 宿主机上运行了脚本,并且没有覆盖 OUTPUT, 捆绑包就已经就位。如果你在别处构建,请把它生成的 nerdbox-nvidia-bundle.erofs 文件 复制到那台宿主机的 /usr/libexec 目录。
运行带 GPU 的沙箱
要运行带 GPU 直通的沙箱,传入 --gpu 标志:
sbx create --gpu claude .sbx run 命令接受同样的标志:
sbx run --gpu claude该标志在创建沙箱时生效。重新连接到已有沙箱时传入它不会产生任何效果。
IMPORTANT
每个 Docker Sandboxes 发布版本都使用特定的客户机内核。你的捆绑包中的 NVIDIA 内核模块必须与该内核匹配。升级 Docker Sandboxes 之后,请下载新发布版本的 nerdbox-nvidia-modules-x86_64.zip 压缩包,并再次运行脚本重新构建捆绑包。
故障排查
脚本报告 ... not found in the driver download
解压得到的驱动中缺少预期的库文件或固件文件。确认下载已经完成。如果你的驱动版本中 某个库的名称不同,请在脚本中调整 DRIVER_LIB_FAMILIES。
升级 Docker Sandboxes 后 GPU 工作负载失败
客户机内核或固定的驱动版本很可能发生了变化。下载新发布版本的压缩包,重新运行脚本, 并重新安装捆绑包。