手里几台带 GPU 的服务器用不起来,是件挺让人头疼的事。AI 组的同事天天喊要卡,可显卡买回来之后利用率长期在 20% 上下打转,训练脚本一跑就是好几个小时,轮到推理任务又没人用。我那时候被折腾得没脾气,后来盯上了 VMware BitFusion 这套 GPU 池化方案。它能在不拆物理机、不改业务代码的前提下,把分散在 ESXi 主机上的 GPU 资源集中成“资源池”,谁要用谁去池子里取,用完自动释放。这篇文章是“初探”的第一篇,只聊环境搭建,把我们从零到能跑通bitfusion list这个过程的坑和心得都摊开讲。
如果你也在做 AI 基础设施,或者手里有虚拟化平台想塞进 GPU 算力,这篇应该能帮你少走不少弯路。我不会抄文档,就把实际操作时那些版本对了、网络通了、驱动装上之后才跑得起来的关键点讲清楚。基础概念我会用大白话带一下,老手可以直接跳到第 3 节看搭建步骤。
1. BitFusion 到底解决什么问题
1.1 GPU 资源用不起来的老大难
传统 GPU 服务器用法很简单:显卡插在谁的主板上,谁就能用。这在单机场景下没问题,但放到虚拟化环境里就很尴尬。虚拟机要 GPU 算力,通常只有两条路:一是整个显卡直通给某台虚拟机,独占所有显存和算力;二是走 vGPU 切分,把一张卡切成几份,每份给一台虚拟机。独占浪费钱,切分又太刚性——切出来的份额是死的,业务高峰低谷没法互相调剂。
BitFusion 的思路不太一样。它把 GPU 从“物理资源”变成“池化资源”。物理显卡还是插在 ESXi 主机上,但通过 Bitfusion Server 把算力和显存抽象成可以按需分配的额度。客户端机器不装 GPU 也能跑 CUDA 程序,运行的时候通过网络把计算请求转发给远端真正的 GPU。对跑程序的容器来说,就像本机插了一张卡,nvidia-smi看到的设备是真的,但物理硬件在别处。
1.2 它和直通、vGPU 有什么本质区别
直通是把整卡绑死给一台虚拟机,vGPU 是把卡切开固定分配。BitFusion 则是在两者之上加了一层“逻辑调度”。比如池子里有 4 张 A 卡,每个卡有 32GB 显存,你可以给某个训练任务分配 16GB 显存加部分算力,任务结束就回收,下一任务接着用。这种粒度比整卡直通细,又比 vGPU 静态切分灵活。
还有个容易被忽略的点:BitFusion 能跨主机池化。一台 ESXi 上的 GPU 不够用了,池子里其他主机的卡可以顶上。客户端不用关心自己的请求被调度到了哪台物理机,只要池子里有资源就行。这对搞 K8s 或是多租户 AI 平台的同学来说,意味着“GPU 资源清单”从“哪台机器有几张卡”这种物理台账,变成了“池子里还剩多少可用算力”这种逻辑信息。
1.3 这个东西适合谁用
我自己总结下来,两类场景收益最大。一类是公司里有多台 GPU 服务器但利用率参差不齐,有的项目疯狂抢卡,有的项目长期闲置;另一类是虚拟化平台已经跑了很多虚拟机,但个别 VM 偶尔需要 GPU 加速,又不想为这“偶尔一次”单独买物理卡。BitFusion 可以在不改业务代码的程度上满足这种需求,因为 CUDA 层面的接口被透明接管了。
不过它也不是万能药。如果只有一台孤零零的 GPU 服务器,那直接用直通更省事,没必要引入额外组件。如果你的业务对 GPU 延迟极其敏感、每次推理都压着微秒级算,走网络转发的那一跳延迟可能让你难受。先把适用边界搞清楚,后面搭建才不会有“我是不是做错了”的困惑。
2. 环境规划与前置准备
2.1 版本矩阵对不上号是最容易翻车的地方
搭建 BitFusion 环境,第一道坎不是命令,是版本排列组合。我刚开始就吃了这个亏:整套环境都装完了,客户端list命令一执行就报协议版本不兼容。排查半天才发现是 vCenter 插件和 Bitfusion Server 的版本差了一个小版本,接口对不上。
我把我这套可用组合列一下供参考:vCenter 用 7.0 Update 2 及以上,ESXi 也用 7.0 Update 2 及以上版本。Bitfusion 插件版本和 Bitfusion Server Appliance 版本必须严格一致,客户端版本可以略低一点,但最好也保持一致,省得后面测试的时候出现“明明资源有,但客户端就是连不上”这种诡异问题。
提示:如果你所在环境里还有其他虚拟化组件,比如 vSAN 或 NSX,建议先查一下官方互操作性列表。我遇到过一次 vSAN 集群和 Bitfusion 的存储策略冲突,虽然不致命,但多花了一下午排查,没必要。
2.2 硬件层面的硬性要求
先说 GPU。Bitfusion Server 对物理 GPU 有要求,NVIDIA 的卡基本都能用,但驱动必须装在 ESXi 主机上,让显卡以直通模式或者 vGPU 模式呈现给 Bitfusion Server 虚拟机。我个人推荐直通模式,配置简单直白,出问题好排查。vGPU 模式虽然能让一张卡服务更多虚拟机,但叠加 Bitfusion 之后再叠加 vGPU 切分,排障链路太长,不适合第一次上手。
内存方面别抠门。Bitfusion Server 虚拟机本身不直接跑大模型推理,它只做资源调度和显存映射,但因为有页表缓存和内存映射表的开销,8GB 内存起步,16GB 更稳。我见过有人在 4GB 内存的 Server 上硬跑,结果同时挂两个客户端,Server 直接把 CPU 打满,然后整池子的任务全部超时。
网络这里重点说两句。BitFusion 的 GPU 调用走网络,客户端和 Server 之间要传输 CUDA 调用和显存数据。千兆网络理论够,实际用起来明显卡顿,训练类任务会拖慢好几个数量级。有条件直接上万兆,至少也要 10GbE 或者 25GbE。没有万兆网络,别对 BitFusion 的推理延迟抱太大期望,物理规律绕不过去。
2.3 许可和账号准备
BitFusion 的 license 是和 vCenter 绑定的,需要一个有效的 vSphere Enterprise Plus 许可或者单独的 Bitfusion 许可文件。安装插件的时候会让填 license 文件路径,我当时图省事没导入,结果插件界面能看到,但创建池子的时候一直报授权不足。所以第一件事就是先准备好 license,别等界面都点开了再回头找。
账号权限也得提前划好。安装插件需要 vCenter 管理员权限,部署 Server 需要能在目标 ESXi 主机上创建虚拟机的权限,客户端接入需要知道 Server 的 IP 和认证方式。BitFusion 客户端默认用的是基于用户名的认证,Server 上要提前加好用户并分配额度,不然客户端连上了也申请不到 GPU 资源。
最后说一个经常被忽略的东西:NTP 时间同步。BitFusion 的客户端和 Server 之间通信带时间戳校验,如果两边时间差超过一定范围,握手会直接失败。我遇到过两次,一次是客户端跑在笔记本上没开时间同步,一次是 Server 虚拟机忘了配 NTP,报错信息还特别隐晦,只说“connection failed”。所以环境规划阶段就把 NTP 配好,能省不少事。
3. 服务器端搭建全流程
3.1 安装 vCenter 里的 BitFusion 插件
整个过程的第一步是在 vCenter 上注册 Bitfusion 插件。简单说就是把下载到的插件包通过 vCenter 的“更新”或“插件管理”入口导入进去。不同版本入口名字可能不一样,但逻辑相同:上传插件 zip 包,填 vCenter 地址,等它部署完成。
我建议用 vCenter 自带的插件管理功能来装,不要手工往目录里拷文件。手工拷容易漏文件,而且版本控制会乱。插件装好之后,vSphere Client 界面的左侧导航栏或者“主机和集群”里会多出 Bitfusion 相关的菜单项,如果没看到,多半是插件服务没起来,去 vCenter 的“服务”里把 Bitfusion 相关服务状态确认一下。
注意:插件安装和 Server 部署是两个动作,别混在一起。插件只是让 vCenter 具备管理 Bitfusion 资源的能力,真正提供服务的是后面部署的 Server 虚拟机。
3.2 部署 Bitfusion Server 虚拟机
Bitfusion Server 是以 OVA 模板形式提供的。在 vSphere Client 里找到 OVA 文件,用“部署 OVF 模板”向导导入。这一步和部署普通虚拟机差不多,但有几个坑需要注意。
存储位置别选共享存储太满的数据存储,Server 虚拟机会有一些小的状态写入需求,存储满了会导致调度服务直接挂掉。网络这里必须选对端口组,Server 虚拟机的 IP 要能和客户端互通,而且最好用静态 IP。我当初图省事用了 DHCP,后来重启了 Client 或者 Server,IP 变了,客户端配置里面的 Server 地址就失效了,排查半天才想起来是地址变了。
部署完成后,虚拟机的配置不用太豪华。CPU 4 核左右、内存 8GB 起步,硬盘默认给的 30GB 够用。如果后续想把 Bitfusion 临时缓存放大,可以再加一块数据盘。启动虚拟机后,需要通过控制台访问它的管理界面做初始化,设置管理员密码、时区、NTP 服务器地址这些基础参数。
初始化完成之后,虚拟机会给你一个管理 IP,用浏览器访问这个 IP 的管理界面,能看到 Bitfusion Server 的状态面板。在这个面板里核对一下版本号和 vCenter 插件版本是不是一致,不一致就先升级一方的版本再继续,别抱着“先跑起来后面再说”的心态,后面报错更难查。
3.3 ESXi 主机 GPU 配置与识别
Server 虚拟机起来之后,最核心的一步是把物理 GPU 挂给它。我先在 ESXi 主机上通过直通设置把网卡和显卡都设为直通模式,然后关机状态编辑 Server 虚拟机的设置,添加 PCI 设备,选择那张 NVIDIA 显卡。
这里有个经验:添加完 PCI 设备后,启动虚拟机前一定要去 BIOS 级别确认直通已经生效。不同 ESXi 版本对直通卡的呈现方式有点不一样,有的在虚拟机设置里能看到“NVIDIA”字样,有的只看得到 PCI 地址。如果虚拟机启动后依然看不到/dev/nvidia0这种设备节点,或者lspci没有输出 GPU 信息,说明直通没成功,重启主机之后再看。
还有个常被忽略的点:物理显卡直通后,ESXi 主机上的vmkernel就不能再使用这张卡了。如果这台主机上有其他虚拟机也依赖同一张卡输出显示,那它们会受影响。我在实验室里无所谓,但如果你们的生产环境里有 VM 用显卡做虚拟显示,就要提前协调好。
GPU 识别成功后,在 Bitfusion Server 虚拟机里跑一次nvidia-smi,能看到显卡型号和显存大小,说明物理链路已经通了。注意nvidia-smi显示的 GPU 是在 Server 虚拟机内部看到的,这是正常的。Bitfusion 池化后,客户端看到的会是虚拟出来的“GPU 设备”,而不是物理卡的型号。
3.4 初始化资源池与用户权限
Server 虚拟机起来、GPU 识别正常,接下来就是在 vCenter 的 Bitfusion 管理界面里创建资源池了。说白了就是把哪些 ESXi 主机上的哪些 GPU 纳入池子统一管理。
创建池子的时候会让你填 GPU 设备的维度,比如每张卡分配给几个实例、每个实例占多少显存。我建议第一次实验先不要切太细,一个池子对应一张物理卡,然后给单个任务分配 16GB 显存,这样更容易验证链路是否通畅。等后面熟悉了,再去调整切分比例。
用户权限管理这块,Bitfusion 支持从 vCenter 同步用户,也支持在 Server 本地建用户。我推荐用本地用户做初期测试,命令简单、依赖少。在 Server 管理界面里添加一个测试用户,给一个默认的显存配额,比如 8GB。这个额度就是客户端申请 GPU 时的上限,给太小了后面跑模型容易直接 OOM。
配置完可以在管理界面看到池子里 GPU 的总计、已分配、剩余情况。我当时截了个图对比客户端看到的列表,发现两边显示一致,就说明服务端配置基本到位了。
4. 客户端安装与配置
4.1 客户端安装的必要条件
客户端要访问 BitFusion 池子,并不需要本机插 GPU,但需要装 Bitfusion Client 软件包。这个包在 Bitfusion Server 的下载页面或者 vCenter 的 Bitfusion 插件界面里能找到。支持的系统主要是 Ubuntu 和 CentOS 系,Windows 不原生支持,想用的话得绕道 Linux 容器。
安装过程很简单:解压 tar 包,执行里面的 install 脚本。脚本会检查内核模块、安装命令行工具、配置服务自启动。装完之后执行bitfusion version,能输出版本号就说明客户端壳子装好了。
这里有个关键环境:CUDA 驱动不需要装,但 CUDA toolkit 还是需要的。因为 BitFusion 接管的是 CUDA 运行时层面的调用,上层业务代码还是需要本地有 CUDA 相关的库来编译和加载。我当时图省事全都不装,结果客户端程序编译的时候直接找不到cuda_runtime.h,白瞎了一个小时。
4.2 配置 Server 地址与认证信息
客户端装好后,第一件事是配置 Server 地址。这个配置在/etc/bitfusion/bitfusion-client.conf文件里,内容大致是server = 10.0.0.20:5544这种格式。如果有多个 Server,可以写多行,客户端会自动负载均衡或者按顺序连接。
然后是认证。BitFusion 客户端连接 Server 需要用户名和密码,这个密码是 Server 上创建用户时设置的。初次配置可以用bitfusion auth add --server <ip> --username <user>命令把凭据保存起来,输入密码后会自动写入密钥文件。
提示:密钥文件权限要注意,默认是 600 权限,如果权限不对,客户端连接时会直接拒绝读取凭据。我当时不小心
chmod 777了这个文件,结果所有连接动作都报“permission denied”,一度以为 Server 挂了。
配置完成后,执行bitfusion list --show-all看看能不能拿到池子信息。如果能列出 GPU 的型号、显存大小和状态,说明客户端和服务端的通信链路已经通了。我第一次看到列表刷出来的时候挺兴奋的,说明环境搭建这一步算基本走通了。
4.3 用一条命令验证整条链路
环境通没通,最终要看能不能真的跑 CUDA 程序。BitFusion 的用法是在正常命令前加bitfusion run,后面跟上--server <ip> --gpu-count 1这种参数。比如:
bitfusion run --server 10.0.0.20 --gpu-count 1 -- nvidia-smi这条命令会把nvidia-smi的调用转发到远端的 GPU 上。如果输出显示的是远端卡的信息,那链路就是通的。
更魔幻一点的验证是用 Python 调 PyTorch:
bitfusion run --server 10.0.0.20 --gpu-count 1 -- python -c "import torch; print(torch.cuda.is_available())"正常输出是True,这表示 PyTorch 能通过 BitFusion 看到虚拟 CUDA 设备。这一步通过后,环境搭建就算真正完成,后面可以拿真实的模型脚本做迁移测试了。
有个容易踩的坑:--gpu-count不能超过池子里单个虚拟 GPU 实例的显存配额。如果你在 Server 端配的是 16GB 一个实例,那客户端请求 2 个 GPU 就意味着要 32GB 显存,池子里没有这么多就会申请失败。我第一次跑的时候忽略了这点,报错还特别隐晦,老让我去看网络配置,后来才发现是资源申请超了。
5. 踩坑排查与常见问题实录
5.1 三张毛病表对照自查
搭建过程中遇到的坑,我整理成三张自查表,按层归类,排查的时候从下往上筛,效率高很多。
第一张表是关于网络与连通性的:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 客户端连接 Server 超时 | Server IP 配置错误或网络隔离 | 先pingServer IP,再telnet <ip> 5544测试服务端口 |
| 连接成功但列表为空 | 池子里没有可分配的 GPU 实例 | 登录 Server 管理界面,检查池子状态和 GPU 是否识别 |
| 命令执行缓慢 | 节点间走千兆网络 | 确认客户机和 Server 在同一个二层网络或低延迟链路中 |
第二张表是关于 GPU 与驱动的:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
Server 虚拟机nvidia-smi无输出 | 直通未生效或驱动未装 | 检查虚拟机 PCI 设备列表,确认驱动安装日志无报错 |
| 池子状态显示 GPU 异常 | ESXi 主机重启后直通配置丢失 | 到 ESXi 主机硬件配置里再次确认直通状态并重新添加设备 |
| nvidia-smi 显示的卡和物理卡不一致 | 多个直通卡被认成同一设备 | 用lspci核对 PCI 地址与物理插槽的对应关系 |
第三张表是关于认证与权限的:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 报 authentication failed | Server 上用户不存在或密码错 | 到 Server 管理界面重置用户密码,确认客户端用户名一致 |
| 查询列表提示 no permission | 用户没有关联到资源池 | 在 Server 管理界面给用户绑定池子并分配配额 |
| 配额不足申请失败 | 用户额度小于客户端请求显存 | 调大用户配额,或者减少--gpu-count请求数量 |
5.2 一个真实的排查案例:莫名连接失败
说一个我印象很深的案例。环境全都搭好了,头一天还能正常跑通,第二天一上班发现所有客户端都连不上 Server。ping通了,端口也通,日志里没有任何错误。最后发现是 Server 虚拟机的时钟漂了,NTP 服务没起来,客户端和 Server 的时间差超过了安全范围,直接拒绝握手。
这个案例提醒我一件事:BitFusion 环境里的时间同步不是“锦上添花”,而是“底层要求”。现在我在部署 Server 虚拟机时,初始化环境就强制配置 NTP,并且在 ESXi 层面也统一时间源,避免因为宿主机时间不准导致虚拟机和外部时间不对称。
另一个我记得挺牢的小问题:升级 vCenter 或 ESXi 后,Bitfusion 插件可能失效。一旦 vCenter 侧升级了,插件也要跟着升,不然管理界面里 Bitfusion 菜单会消失,或者点了没反应。我在实验室里经历过一次,升级 vCenter 后整个 Bitfusion 菜单消失,当时以为环境被销毁了,查了一圈才发现是插件版本不匹配。
5.3 绕开这些坑的独家技巧
排查顺序这事值得单独说,因为很多人习惯先从报错信息下手,但在 BitFusion 这种多层架构里,报错信息往往只是“结果”,不是“原因”。我自己的排查顺序是:网络层(ping/telnet)→ 服务层(服务状态/版本匹配)→ 资源层(GPU 识别/池子状态)→ 认证层(用户名/配额)→ 应用层(CUDA 库/业务代码)。每一层确认无误再往上走,能少走很多弯路。
还有个小技巧:实验阶段给 Server 虚拟机做快照。每次调整完配置、验证通过之后拍一张快照,后面无论是升级还是误操作,回滚都很快。尤其是刚接触的时候,一天改十几次配置,出问题直接恢复快照,比自己一点一点排查快得多。
日志位置也要有数。Server 管理界面能导出的日志包括调度服务的运行记录,客户端的日志则在/var/log/bitfusion目录下。遇到连接问题先看客户端日志,里面会把握手失败的原因写得相对清楚。比看 Server 日志效率高。
6. 环境搭完之后的一些体会
环境跑通之后,我心里其实挺感慨的。原来觉得 GPU 池化是个很玄的东西,真搭一遍才发现,只要版本对上、网络通、直通卡认出来,后面的池化调度反而是最顺滑的环节。集群里那几张闲置卡的利用率,经过这轮搭建明显上了一个台阶,后续再跑模型也不用天天去问“这张卡是谁在用”了。
如果试着给准备上手的朋友一个建议,那就是:第一次做,环境越简单越好。一台 vCenter,一台 ESXi,一张 GPU,一台 Server 虚拟机,一台客户端机器,跑通之后再往上加。别一上来就搞多集群、多主机、多 GPU 的复杂拓扑,任何一个环节出问题,排查的复杂度都会指数级上升。我一开始就是贪多,三台主机同时配,结果出问题时候根本分不清是哪个节点的配置不对。
再分享一个后来觉得特别有用的做法:把所有版本、IP、账号密码、GPU PCI 地址都记录在一个文档里,每次变更都同步更新。听起来像土办法,但就是因为 BitFusion 涉及的组件太多,一个源头的错位会引发一连串莫名其妙的报错,有份记录能省下大把时间来排查“到底是谁变了”。
下一篇等我实际跑几个训练和推理任务之后,再写写 BitFusion 的算力分配、显存配额和性能损耗这些更贴近业务的东西。环境搭建到这里,算是有个能继续往下折腾的地基了。