GPUWorks 搭建实录:把 AtomGit 的昇腾910B 变成常驻的 OpenAI 接口
一台腾讯云轻量服务器做控制面,一台 AtomGit 的昇腾 NoteBook 做算力节点,43MB 的单二进制 GPUWorks 把它们捏成一个私有推理平台。全文命令来自本次实录,性能数据均为实测。
GPUWorks GitHub 开源代码仓库地址:https://github.com/flitai-io/gpuworks
一、我面对的受限场景
先说说我手里的条件,可能和不少个人开发者差不多:
- 笔记本没有独显,本地连 1.5B 模型都跑不利索;
- 几台腾讯云轻量服务器,有公网 IP,但没有 GPU;
- 在 AtomGit 开了一台 NoteBook 资源实例,1 张华为昇腾 910B4(32GB HBM),宿主机 192 核 1509GiB 内存。这台机器没有公网入站能力,外面连不进去。
我的目标很直接:把这张卡用起来,做成一个对外提供 OpenAI 兼容接口的推理服务,模型、令牌、用量数据都放在自己手里。
要是手工来,得先在服务器上装 K8s,再装 Docker、Ascend Device Plugin、vllm-ascend,光环境就能折腾一晚上。这次我用了 ZStack 的 GPUWorks,一个轻量的私有化推理平台,节点管理、模型仓库、部署调度、监控计量都做好了。

二、GPUWorks 的思路:一个二进制加一条反向连接
先看产品本身的结构。GPUWorks 整个平台就两个程序:Server 和 Agent。控制面(Server)负责节点管理、模型仓库、部署调度、监控计量、令牌签发,对业务侧统一暴露 OpenAI 兼容接口;计算节点(Agent)负责加速卡识别、容器运行时管理和指标日志采集;节点上真正跑推理的是平台自带的用户态运行时(udocker),不依赖 Docker,也不用 K8s,容器以非特权用户态跑起来,root 都不是必须的。官方资料里有架构图,我按自己的理解重画了一张:

落到我这次的环境,就是上面这套架构的最小配置:控制面装在有公网 IP 的腾讯云轻量服务器上,计算节点是那台 AtomGit 的昇腾 NoteBook。这里有个对受限环境最友好的设计:Agent 主动外连——节点主动去连控制面,控制面不需要反向访问节点。NoteBook 连不进来没关系,主动出去总可以:

模型方面,平台内置 390 个模型模板、1230 个部署档位,覆盖 Chat、Embedding、Rerank、语音、图像、视频;推理引擎有 vLLM、SGLang,昇腾场景走 vllm-ascend。官方资料还列了几项这次没实测到的能力——公有云、私有云算力统一接入,KV cache 卸载、PD 分离等推理优化,dGPU 按显存配额共享整卡——平台的目标是从小机一路扩到千节点规模。这篇实录只押一张 910B,这些先记下不展开。下面按实际操作顺序过一遍。
三、第一步:装控制面(腾讯云轻量服务器)
我用的腾讯云轻量服务器是 Ubuntu 22.04,安装包提前做了 SHA256 校验。控制面安装就四条命令:
scp gpuworks-31178e80-linux-amd64.tar.gz root@<服务器IP>:/root/
tar -xzf gpuworks-31178e80-linux-amd64.tar.gz
cd gpuworks-31178e80-linux-amd64
sudo ./gpuworks install

安装过程一路回车:安装目录默认 /opt/gpuworks/server,服务交给 systemd 托管。十几秒装完,直接打印出访问地址和管理员账号:

然后在腾讯云防火墙里放行 TCP 8800,备注写成 GPUWORKS,方便以后认:

浏览器打开 http://<服务器IP>:8800,用安装时给出的账号登录,控制台就绪:

四、第二步:接入昇腾节点(Agent 主动外连)
控制台"计算节点 → 添加节点"里有两个关键选择:目标机器是否支持 SSH(选不支持 SSH),连接方向(选 Agent 发起连接)。选完之后控制面只生成一条安装命令,剩下全靠节点主动外连。NoteBook 这种只能出网、不能被连的环境,正好合适:

在 NoteBook 的 Terminal 里解压 arm64 安装包,执行平台生成的一键命令。命令自带专属 Token,一个 Token 只接一个节点:

几秒后节点上线:1×910B4,ascend 驱动 25.5.1,宿主机 192 核 1509GiB,状态在线:

这里说一个我原本最担心的点。NoteBook 里没有 Docker,没有 containerd,连 /dev/fuse 都没有,按老思路根本跑不了容器化推理。结果 GPUWorks 不依赖这些,自带的用户态运行时直接把镜像解包、挂载、拉起 vLLM 进程,全程普通用户权限。没有 Docker 这件事,从头到尾没构成障碍,这也是我愿意把它推荐给受限环境的原因。
五、第三步:注册模型(ModelScope 一分钟搞定)
"模型 → 注册模型"支持四种来源:Hugging Face、ModelScope、HTTP 目录、计算节点本地路径——前两个是模型站,后两个适合内网和离线场景:

国内网络环境我选了 ModelScope,填入仓库名 Qwen/Qwen2.5-1.5B-Instruct:

确认后平台自动从源下载并登记,1.5B 模型共 2.9GiB:

六、第四步:部署前先"配置评估",再一键部署
模型注册好就能部署了。“部署 → 快捷部署"页第一屏是基础配置:模型选刚注册的 Qwen/Qwen2.5-1.5B-Instruct,目标芯片选"昇腾”,部署名称和对外模型名平台按模型名预填好了,健康检查默认开启(阈值 60 秒),分词接口我也保持勾选——后面查 token 用量会用到:

往下是节点和镜像。拓扑留"单机",调度方式选"自动选择",平台按显存需求和拓扑自动匹配,直接框定了那台 910B4 节点;镜像一栏自动填了 cann9.1-910b-vllm0.27.1rc1-r2。获取方式那行还标出了镜像会从哪里拉:quay.io、华为云 SWR、docker.io 三处按节点探测速度决定来源,模型权重则直接标了"已有":

再往下是资源和功能开关。副本数 1,张量并行 TP、流水线并行 PP 留默认——单卡跑 1.5B 用不上并行;显存使用率默认 0.90,也就是单卡显存上限的九成;"可休眠"开关也在这屏,第八节会用到。并行策略、KV Offload、功能区的工具调用解析器、前缀缓存这些,默认值都合理,我基本没动:

最后一屏是运行环境:环境变量、Docker 参数、共享内存(默认 16 GiB)、启动超时(默认 1800 秒,大模型首次启动要编译内核、加载权重,不够可以在这里放宽)。这次部署这些都不用改;再往下还有个"高级性能调优"折叠区,我同样没碰:

整套表单填下来,右侧的配置评估面板一直实时跟着变。这台 910B4 的 32GB HBM,评估结果是最低启动要求 7.7 GiB/卡,估算最大并发 24,KV pool 约 21.1 GiB(约 78.8 万 tokens),显存分成权重、引擎预留、KV pool 三块。面板里那句"28.8 / 28.8 GiB(利用率 100%)"容易让人多看一眼,其实它是计划口径:0.90 档下 28.8 GiB 的可用预算被三块用途全数排满,不代表卡被占满,实际占用多少部署完就见分晓。这些数字按实测校准口径给出,不是理论值拍出来的:

提交前还有个细节值得说:页面底部直接给出"启动配置预览",就是最终会在容器里执行的 vllm serve 命令,served-model-name、显存利用率 0.9 都和表单选项一一对应,一切透明。确认无误,点部署:

实例依次经过下载镜像、解包镜像层、启动容器、等待引擎就绪几个阶段。从零到引擎就绪(含首次拉取约 20GB 的运行镜像)用了 4 分 9 秒,实例状态"运行中 · 正常",实际显存 23.9 / 28.8 GiB(83%),KV pool 实测 23.5 GiB / 878,976 tokens,和部署前评估基本对得上。评估不是摆设:

小贴士:如果算力环境的存储配额偏紧(比如 50G 级的 NoteBook),首次拉大镜像前可以先清一下 /opt/gpuworks/udocker 下的 layers、tarcache、containers 缓存目录,免得空间不够下载失败。
节点上用 npu-smi info 交叉验证:HBM 已用 30676 / 32768 MB,进程列表里是 vLLM 引擎,占 27827MB。平台报的数和卡报的数一致:

七、第五步:试验场对话加外部 API 调用
平台自带"试验场",不用写代码就能和刚部署的模型对话,每次回答都带实测指标。日常问答:首 Token 延迟 138ms,生成速度 83.5 tok/s,Prefill 239.1 tok/s:

换成长输出场景,让它写一段快速排序:首 Token 延迟 128ms,生成速度 78.4 tok/s,Prefill 提到 641.6 tok/s。1.5B 模型在 910B4 上就是这个水平:首 Token 百毫秒级,稳定 80 tok/s 上下,日常问答和 Agent 工具调用够用:

当然,真正的目标是把它当 OpenAI 接口用。在"API 令牌"页创建推理服务令牌,页面下方连调用示例都给好了,curl 地址、Bearer 头、请求体照抄就能用:

然后在我自己的 Windows 笔记本上直接请求腾讯云的公网 IP,请求经控制面转到昇腾节点,模型答的是"华为昇腾910是基于ARM架构的高性能计算芯片……":

响应里的实测指标:首 Token 延迟 39.72ms,生成速度 76.2 tok/s,平均帧间延迟 11.86ms,服务指纹 vllm-0.27.1。接口是标准的 OpenAI 格式(/v1/chat/completions),也就是说现有的 OpenAI SDK、Dify、LobeChat、沉浸式翻译这类工具,改个 base_url 和 key 就能接。
这里记一个 Windows 用户的真实踩坑:
- PowerShell 里 curl 是 Invoke-WebRequest 的别名,-H 传参直接报错,要用 curl.exe;
- 长 JSON 粘进终端会被折行截断,-d 参数吞不全。先把请求体写成 body.json,再 curl.exe -d “@body.json”,一次成功。
顺带一提,部署列表里点开这个部署,有实例级的实时指标:请求并发、Token 吞吐、实例 GPU cache 压力曲线,排障和看负载都不用登上节点:

八、第六步:休眠,把显存还给平台
推理服务最占的就是显存。GPUWorks 支持给部署勾选"可休眠(空闲释放显存)":

空闲时在部署列表点"休眠(内存/L1)",实例释放显存,状态即时更新:

npu-smi info 前后对比:HBM 占用从 30676MB 掉到 2904MB,vLLM 进程从进程表里消失,约 27GB 显存还给了整机,其他部署随时可用。按界面标注,L1 休眠的预期唤醒是 0.2 秒左右,下次请求进来几乎无感。一张卡要跑多个服务、错峰使用的话,这个机制比每个服务都常驻显存友好得多。官方口径里,休眠态显存占用在 0.75–4GiB 之间,视模型和配置而定:

九、顺带看一眼平台底座
跑通主流程后,我又翻了翻平台的日常运营面。控制台首页的概览把节点、GPU、部署、推理用量收在一屏,GPU 容量分布直接标到型号和温度:

监控中心是集群、服务、实例三级视图,TTFT p95、TPOT p95、错误率、排队深度都是现成的指标卡,服务列表里每个部署的健康、副本、KV Cache 使用一目了然:

用量分析按 Token 用量、服务质量、GPU 利用、卡时四个维度统计,粒度可以按小时、按天切,连缓存命中和未命中都拆开统计,报表能导出 CSV:

GPU 设备页管到每一张卡:健康状态、分配状态、利用率、显存、温度都在列表里;日志中心可以按实例、级别和关键字检索推理日志,Traceback、out of memory 这些高频错误还做了快捷筛选。要跟老板或者客户交代"卡花在哪了",这些都是刚需:


镜像管理页能看到完整的引擎镜像矩阵:CUDA、CANN(昇腾)、Metal、DTK、HGGC 等框架,14 个系列 29 个镜像,vLLM、SGLang、callable 各有分布。这次我只深度实测了昇腾 910B 这一条线,但同一套控制面管不同芯片的设计意图看得出来:

十、总结:这套流程适合谁
回顾整个流程,我对 GPUWorks 的体感是三条:
- 部署门槛低。控制面一个 43MB 二进制加 systemd,计算节点一条主动外连命令,不需要 Docker、K8s,也不需要 root。从拿到空服务器到跑起第一个模型,全程不到半小时,大半时间在等镜像下载。
- 先评估、后部署。部署前就告诉你显存怎么分、最低启动要求多少、能扛多大并发,部署完的实测值和评估对得上。只有一张卡、要精打细算的人会喜欢这一点。
- 休眠机制很实用。空闲时显存整块释放,本例从 30.7GB 降到 2.9GB,唤醒按标注是亚秒级,一张卡可以错峰伺候多个服务。
适合的人群:手里有闲置或租用的国产卡、无 root 的受限环境、边缘算力盒子,想把它们统一变成 OpenAI 兼容 API 的个人开发者和中小团队。GPUWorks 将于 2026 年 11 月正式开源,可以自己拉个环境,照着本文走一遍。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)