如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
将任意 NVIDIA GPU 转变为本地 AI 平台。 在浏览器内完成推理与微调。单命令即可完成安装。新增节点后,节点间可自动相互发现。
ainode.dev · 文档 · 快速上手 · 界面截图 · 已测试模型 · 功能兼容状态
AINode 是面向 NVIDIA GB10(DGX Spark、华硕 GX10)及所有搭载 NVIDIA GPU 的设备的自托管 AI 一体机。仅需一条命令即可在每台主机上完成编排器容器与 systemd 单元的安装,该编排器可为您提供以下能力:
/v1/chat/completions、/v1/completions、/v1/embeddings)与 Anthropic Messages API(接口路径为 /v1/messages),两类接口均可通过模型 ID 在整个集群内实现路由分发/v1/decide):输入带类型约束的问题,直接输出经过校准的概率结果,单次请求即可完成全部计算编排器镜像基于 python:3.12-slim 构建,打包后总大小约 364 MB。镜像内未预置 vLLM 和 CUDA 组件:引擎以独立容器运行,因此模型对应的引擎版本由模型本身定义,与 AINode 安装版本无关。无需配置主机 Python 虚拟环境,无需从源码编译 vLLM,不存在脆弱的运行时链路依赖。
curl -fsSL https://ainode.dev/install | bash
名为 "MASTER" 的头节点负责运行 API 服务与集群编排。其余从属节点以无头引擎容器模式运行,执行头节点分配的计算秩任务。实例卡片标识 DISTRIBUTED · TP=2,表示当前模型已跨两张 GPU 完成分片加载。
功能完整的对话界面,支持流式 Token 输出、提示词历史记录、代码高亮、单请求指标统计(首 Token 延迟 TTFT、每秒生成 Token 数、总 Token 数),可对接集群内任意已加载的模型,支持单卡运行或跨卡分片模式。
实时开发者控制台:可查看各节点上已加载的模型列表、所有兼容 OpenAI/LM Studio/Anthropic 规范的接口端点、附带状态码与延迟信息的单请求日志,提供模型卸载按钮和可直接复制的 cURL 代码片段。
浏览热门 HuggingFace 模型,系统会根据集群聚合显存自动计算并展示 AVAILABLE(已可用)/ FITS GPU(显存适配)标签。支持将下载任务加入队列,文件存入 NFS 共享缓存后所有节点均可直接加载。
提供三种快速启动路径:LoRA(轻量方案,适合绝大多数用户)、QLoRA(4 比特基础模式,适配超大模型)、全量微调(需单节点大显存支持)。所有训练任务均在节点本机 GPU 上执行,可跟踪活跃与已完成任务数、GPU 运行时长,还可直接跳转至数据集管理页面。
内置指令微调(Alpaca)、对话微调(ShareGPT)、分类头训练的开箱即用方案,每个模板均附带验证通过的数据集规范,数分钟内即可启动训练任务。
可自定义节点角色(auto / master / worker),设置共享 cluster_id 确保仅匹配标识的节点可相互发现,还可查看实时成员列表,包含每个节点的角色、地址与最后活跃时间。
curl -fsSL https://ainode.dev/install | bash
该单行安装脚本会执行以下操作:
# 解析 GHCR 上最高版本的数字标签(永远不会使用浮动的 :latest 标签)
docker pull ghcr.io/getainode/ainode:
# 将镜像标识固化到 ~/.ainode/image.env,同时安装可动态替换的 systemd 单元
systemctl enable --now ainode.service
该 systemd 单元会从 ~/.ainode/image.env 读取固化后的镜像路径(通过 EnvironmentFile 配置,Restart=always 自动重启),因此服务可在主机断电重启后自动恢复,并自动加载之前已启动的单机模式模型与堆叠模型。分布式头节点不会自动重启:该模式需要对等节点参与,您可通过浏览器手动重新拉起。
安装器还会提前拉取后续运行所需的 vLLM 引擎镜像(下载体积约 8.5 GB,磁盘占用约 22 GB),避免首次启动时等待下载。设置环境变量 AINODE_NVIDIA_IMAGE=skip 即可跳过该预拉取步骤。
3. 打开浏览器访问 http://<你的节点IP>:3000 进入 Web UI,从目录中选择一个模型。点击模型卡片后选择 Launch,即可开始对话。系统无引导向导:安装器会自动写入配置项 onboarded: true 并将默认启动模型置为空,因此节点启动后不会自动加载任何模型,等待用户手动选择。
4. 新增节点:在当前节点执行 ainode cluster token 生成加入令牌,将输出的 ainode join 命令在新主机上执行即可。该命令会自动写入集群 ID、共享密钥与主节点地址,无需手动编辑 config.json 完成集群配置。
升级操作可执行 ainode update,脚本会自动解析并拉取最新版本,随后重启系统服务。指定版本号即可固化升级到特定版本,例如 ainode update 0.5.24。请以安装 AINode 的原用户身份执行升级操作,并在执行前阅读 AINode 升级指南,不建议直接使用 sudo 运行命令。
希望手动拉取镜像? AINode 仅官方发布到 GHCR 镜像仓库:
docker pull ghcr.io/getainode/ainode:latest # 拉取最新正式版本
# 或者固化特定版本,安装器默认采用该方式拉取镜像。所有版本标签可在
# https://github.com/getainode/ainode/releases 页面查看
docker pull ghcr.io/getainode/ainode:X.Y.Z
AINode 未在 Docker Hub 搭建官方镜像。Docker Hub 上存在的 argentaios/ainode 仓库版本停留在 2026 年 4 月的 0.4.7 版本,该版本不包含当前版本的引擎后端、模型目录、堆叠加载、基准测试与 embedding 能力,请勿拉取使用。
适用于单张显存无法容纳的大模型场景,例如前沿 MoE 模型跨两台 DGX Spark 完成分片加载。浏览器可视化配置路径为官方支持的标准操作流程:
/24 子网,或接入专用交换机端口。详见网络要求:该配置至关重要。AINODE_PEERS="10.0.0.2" curl -fsSL https://ainode.dev/install | bash -s -- --job master
--job master 参数为必填项。若缺少该参数,对等节点列表仅用于执行 ssh-copy-id 操作,节点将以独立单机模式安装。
3. 将对等节点加入集群:在主控节点上生成接入令牌,在对等节点上执行一键安装并加入集群命令:
ainode cluster token # 在主控节点上执行,将输出下一行所需的令牌内容
AINODE_JOIN="10.0.0.1:3000: <生成的令牌内容>" curl -fsSL https://ainode.dev/install | bash
该操作会在对等节点中写入主控节点的 cluster_id、cluster_secret、服务发现端口和主控节点地址,将其配置为 distributed_mode: "member" 模式,且不会修改其他配置项。若两个节点完全独立安装,会各自生成独有的 cluster_secret,彼此之间无法发现。因此要么使用上述加入流程,要么在安装对等节点时设置 AINODE_CLUSTER_SECRET 为主控节点的对应值。仅指定 --job worker 但未执行加入操作的对等节点不属于任何集群。
4. 验证免密 SSH 连通性:确认主控节点的安装用户可免密登录所有对等节点。主控节点通过 SSH 启动对等节点上的引擎容器,若出现密码输入提示将导致启动失败。
5. 打开主控节点 UI:界面中应显示两个节点的信息及聚合后的总内存(例如 "2 nodes · 244 GB · 2 GPUs")。每个节点会自动检测并上报自身的 GPU 数量,多 GPU 服务器的所有显卡都会纳入总计数中。
6. 启动分布式实例:在启动实例面板中选择目标模型,勾选需跨节点调度的设备后提交启动。系统会发送一条 POST /api/sharding/launch 请求,携带所选节点 ID;当前运行操作的节点始终作为主控节点,其余节点作为对等节点,全部通过专属高速网络的 IP 地址进行通信。若对等节点未配置已知的高速网络 IP,启动请求会被直接拒绝,不会尝试通过管理局域网发起部署。实例状态将显示为 DISTRIBUTED · TP=2。
多节点启动流程会在每个节点上运行一个引擎容器:主控节点上启动 rank 0 实例,各对等节点上以 --headless 模式启动对应 rank 的实例,全部通过 vLLM 原生的多节点执行器,基于 --master-addr 和 --master-port 完成集群组网。官方模型库中的所有多节点模型均固定采用该组网架构,所有经过验证的生产启动也都使用该方案,因为除了 vLLM 本身之外无需引擎镜像预装任何额外依赖。另一种手动接入方式是在 config.json 中设置 distributed_mode: "head" 并显式指定 peer_ips,随后重启服务,无人值守的节点推荐使用该配置方式。
当前仅支持张量并行。启动请求的请求体中即使带有 strategy 字段,只要节点数量大于 1,系统就会默认使用张量并行策略,不存在流水线并行能力。
AINode 可在浏览器内、利用你本地的 GPU 将全精度模型压缩为 4 位精度,全程无需调用任何外部服务。进入 Training → Quantize a Model 页面即可开始操作:
Qwen/Qwen3.5-4B),也可选择已安装在本地的模型。awq_marlin 后端验证)或 NVFP4(适配 Blackwell 架构的原生 4 位浮点格式)。HuggingFaceH4/ultrachat_200k 数据集。量化目标节点必须处于空闲状态:量化操作需要占用全部统一内存,因此 AINode 会在已有模型加载时拒绝启动量化任务(你可先卸载运行中的模型,或设置 force=true 参数强制启动)。量化完成后的模型将出现在 Installed(已安装模型) 列表中,命名格式为 <原始模型名>-<量化方案名>,可直接投入服务使用。
[!IMPORTANT] 节点必须提前准备好作业镜像。量化、训练和适配器合并操作都会在独立的 GPU 容器中运行,该镜像大小约为 22 GB,系统不会自动隐式拉取。节点将按以下优先级顺序解析镜像路径:先读取显式配置的
AINODE_QUANT_IMAGE/AINODE_TRAIN_IMAGE,其次使用ghcr.io/getainode/ainode-train:<版本号>,最后尝试本地构建的ainode-quant:0.17.0-t5镜像。若节点上不存在上述任意一种镜像,作业会在启动前直接被拒绝并同时列出三个候选镜像地址,避免出现运行时日志中才抛出dockerexit 125 错误的情况。关于如何构建或指定该镜像,可参考训练章节下的作业镜像说明。
AWQ 是 GB10 架构下经过充分验证的成熟量化方案。NVFP4 量化是较新的技术路线,多模态模型(例如 Qwen3.5)的 NVFP4 量化目前属于实验性功能,尚未完成完整验证,当前 Qwen3.5 系列模型优先推荐使用 AWQ 量化方案。
Hugging Face Token 说明(读权限 vs 写权限):AINode 会将凭证存储在本地密钥库中(路径为 ~/.ainode/secrets.json,文件权限为 0600,静态存储时已做混淆处理),包含两个 Hugging Face 专属字段:读权限 Token(用于下载需要申请权限的受限模型)和 写权限 Token(用于将模型推送至 Hub,只读 Token 会在 GB 级大文件传输前直接被拦截拒绝)。你可以在 Config → Secrets 页面中配置这两个 Token(每个 Token 旁都配有 Test 按钮,可检测当前 Token 拥有的权限范围),也可通过 ainode config --hf-token hf_xxx 命令单独设置读权限 Token。
进入 Training → New Run 页面,选择基础模型和数据集后提交即可启动微调任务。所有微调任务都在独立的 GPU 容器中运行(编排器镜像本身未预装 torch 环境),每个节点同一时间仅运行一个作业,队列机制会在当前作业结束后自动拉起下一个排队任务。
作业镜像要求:微调、量化和适配器合并操作都需要训练专用镜像。节点将按以下优先级顺序解析镜像路径,若节点上不存在任意一种候选镜像,作业会在启动前直接被拒绝并列出全部三个地址(旧版本会在运行时抛出 docker exit 125 错误):
AINODE_TRAIN_IMAGE / AINODE_QUANT_IMAGE,用于覆盖默认镜像地址。ghcr.io/getainode/ainode-train:<版本号>。ainode-quant:0.17.0-t5。官方发布镜像由 .github/workflows/publish-train-image.yml 工作流自动构建,构建基于自托管 Spark 运行器上的 scripts/Dockerfile.quant 完成,镜像大小约为 22 GB。系统不会自动隐式拉取或构建该镜像,常规版本发布流程也不会重新构建该镜像。你可以通过推送格式为 train-v<版本号> 的 Git 标签触发构建(版本号必须与 pyproject.toml 中定义的版本号完全匹配,引擎会按该版本号查找对应镜像),也可以手动触发工作流:
gh workflow run publish-train-image.yml -f push=true -f version=0.5.27
同一次构建可以通过工作流的 alias_versions 参数关联多个版本号(为同一镜像摘要追加额外标签,无需重复上传文件),从而为多个发布版本提供服务。如果节点上已经存在对应镜像,可直接指定已有镜像地址:
sudo systemctl set-environment AINODE_TRAIN_IMAGE=ghcr.io/getainode/ainode-train:0.5.27
数据集格式:支持读取存放在 ~/.ainode/datasets/ 路径下的 .jsonl 文件,也支持直接加载 Hugging Face 公开数据集 ID。数据集中的行可采用以下任意一种格式:
| 数据结构 | 训练处理逻辑 |
|---|---|
{"text": "..."} | 直接将该字段的文本作为训练内容 |
{"instruction": "...", "output": "..."} | 按 Alpaca 格式拼接为提示词+回复对 |
{"prompt": "...", "completion": "..."} | 将两个字段内容直接拼接处理 |
{"conversations": [{"from": "human", "value": "..."}, ...]} | 调用模型自身的对话模板完成格式化渲染 |
最后一种格式是 AutoData 所采用的写入格式,也是 sharegpt-chat 模板所声明支持的格式:role/content 对话轮次与 messages 字段的工作方式完全一致。系统会对整段渲染后的对话执行监督训练(暂未实现仅对助手回复部分进行掩码的功能,因此本特性不提供该保证),填充位永远不会被设为标签。
运行记录重启后依然保留。每次状态转换时,任务都会在自身的任务目录中写入一个 status.json 文件。服务启动时会从 ~/.ainode/training/jobs/ 重建注册表,因此重启前的任务对应的运行记录表、统计卡片、日志、产物下载、合并与恢复功能都可以正常使用。有两点值得注意的特性:
restored,附带说明该情况的 note 字段,并且不会显示运行时长,因为该数据从未被记录。恢复训练。POST /api/training/jobs/{id}/resume 接口(或任务页面上的对应按钮)会从最新检查点启动一个全新任务:新任务拥有独立的输出目录,源任务的目录会以只读方式挂载到容器内的 /src 路径,同时检查点路径也会同步重写以匹配挂载规则。恢复训练流程绝对不会向被恢复的原有运行记录写入任何数据。
| 功能 | 状态 |
|---|---|
| 一键安装 | ✅ |
| 轻量编排器镜像,引擎以独立容器形式为每个模型提供服务 | ✅ 自 v0.5.0 起 |
| 自动检测 GPU 与内存 | ✅ |
| 浏览器端聊天界面 | ✅ |
| OpenAI 兼容 API | ✅ |
Embeddings 端点 (/v1/embeddings),路由至集群内的池化引擎 | ✅ 自 v0.5.25 起 |
| 实时更新的 HF 模型目录(含热门榜单)+ 下载管理器 | ✅ |
| 跨集群 NFS 共享模型存储 | ✅ |
| 多节点自动发现(UDP 广播) | ✅ |
| 跨节点分布式张量并行推理 | ✅(v0.5.x 版本支持 TP=2,0.4.x 版本将于 2026 年 6 月支持 TP=4) |
| 集群拓扑界面(成员、总显存占用、实例标签) | ✅ |
| 浏览器端微调(支持 LoRA / QLoRA / 全参数训练,单节点) | ✅ |
| 通过 API 获取并下载训练产物 | ✅ |
| 将 LoRA 适配器合并至基础模型 | ✅ |
断点续训(使用独立输出目录;源任务目录以只读方式挂载于 /src) | ✅ 自 v0.5.28 起 |
训练作业可在服务重启后保留(每个任务对应独立 status.json 文件,可从磁盘重建注册表) | ✅ 自 v0.5.28 起 |
训练镜像已发布至 GHCR(镜像名 ainode-train:),附带预置的预检查流程 | ✅ 自 v0.5.28 起 |
支持 Chat / ShareGPT / AutoData 格式 conversations 数据集训练(兼容对应模型原生聊天模板) | ✅ 自 v0.5.28 起 |
| 评估循环(支持可配置的训练/验证集划分) | ✅ |
| W&B 日志集成 | ✅ |
| 自定义训练模板持久化 | ✅ |
Prometheus 指标端点 (/metrics) | ✅ |
| `ainode role master | worker |
| Worker 节点启动时无需预加载模型 | ✅ |
| 启动后立即可用的 Web 门户 | ✅ |
从 Master 界面执行集群全量更新(⬆ Update all 按钮) | ✅ |
| 拓扑加载动画 + 节点逐个淡入展示效果 | ✅ |
GB10 (sm_12.1) 架构下的 AWQ 模型支持,已修复 awq_marlin 内核问题 | ✅ |
| 浏览器端量化(AWQ W4A16 / NVFP4),量化完成后可直接提供服务或推送至 Hugging Face | ✅ 自 v0.4.44 起 |
| 将量化/微调后的模型推送至 Hugging Face(需提供写入令牌) | ✅ |
| 密钥存储(HF 读取权限 + HF 写入权限 + NGC + W&B + OpenAI),值已脱敏且支持可用性测试 | ✅ |
联邦主路由器:通过 /v1/* 端点根据模型名称在集群内完成请求路由 | ✅ |
| 在 Master 界面上从任意节点加载/卸载任意模型 | ✅ |
| 模型堆叠:单节点可同时运行 N 个并发模型,配置持久化并在节点重启后自动恢复运行状态 | ✅ |
从本地磁盘权重文件提供服务(路径:~/.ainode/models/) | ✅ |
| GB10 架构下默认启用 fp8 KV 缓存(提升长上下文可用空间) | ✅ |
单次加载参数覆盖(served_model_name / max_model_len / kv_cache_dtype / quantization / trust_remote_code),配置在重启后保持生效 | ✅ 自 v0.5.0 起 |
指定目标节点加载模型(POST /api/cluster/load {node_id}) | ✅ 自 v0.5.1 起 |
堆叠加载准入防护:要求显式指定 gpu_memory_utilization 参数,若预测总占用率超过 0.9 则拒绝加载(返回 409 状态码) | ✅ 自 v0.5.1 起 |
VLM(视觉)模型支持:GB10 架构下自动跳过 fp8 KV 缓存,支持通过加载参数覆盖设置 kv_cache_dtype=auto | ✅ 自 v0.5.1 起 |
| LoRA / QLoRA 训练及适配器合并操作均在独立启动的 GPU 容器中运行(轻量编排器未预装 torch) | ✅ 自 v0.5.0 起 |
部署流水线:发布标签、自托管 Spark 运行器上的 CI 流程、GHCR 推送,随后通过 ainode update 或集群全量更新完成版本切换(执行真实镜像拉取与替换) | ✅ 自 v0.5.0 起 |
| 支持可取消、绑定提交版本、并行的模型下载 | ✅ 自 v0.5.2 起 |
从磁盘删除已下载模型(delete-repo,释放磁盘空间,单位 GB) | ✅ |
| AutoData:Δ 过滤合成数据生成(v2.2 验证集精度提升目标) | ✅ 自 v0.5.0 起 |
ainode doctor:节点状态检查,每项问题对应单行修复方案,支持 --json、--peer、--fix 参数 | ✅ 自 v0.5.27 起 |
| 面板可使用的 API 密钥认证(统一封装,密钥存储在浏览器端以启用认证功能) | ✅ 自 v0.5.27 起 |
使用 trust_remote_code 需要提供已授权的 API 密钥,或由目录内的配方显式声明该权限 | ✅ 自 v0.5.27 起 |
| 显示 AINode 主目录与模型目录的磁盘可用/总容量,剩余空间低于 15% 时触发预警 | ✅ 自 v0.5.27 起 |
通过集群端点暴露 /v1/responses、/tokenize、/detokenize、/v1/rerank、/v1/score 接口 | ✅ 自 v0.5.27 起 |
将转发请求绑定至指定实例(通过 X-AINode-Node / X-AINode-Port 指定),响应中返回 X-AINode-Served-By 头标识实际处理节点 | ✅ 自 v0.5.28 起 |
由 cluster_secret 生成 HMAC 签名 UDP 发现密钥,支持无需重启完成密钥轮换 | ✅ 自 v0.5.28 起 |
传输报文携带 ainode_version 字段,出现集群版本分裂时显示对应提示横幅,/api/version/check 接口返回 cluster_split 字段标识 | ✅ 自 v0.5.28 起 |
ainode update 会验证节点是否成功运行新版本,若版本升级失败则返回非零退出码 | ✅ 自 v0.5.28 起 |
ainode prune-images 命令以及更新后自动镜像清理功能,保留 N 个可回滚的旧版本镜像 | ✅ 自 v0.5.28 起 |
多 GPU 节点会在广播宣告中上报其 GPU 总数(gpu_count 字段),将所有 GPU 资源纳入集群统计 | ✅ 自 v0.5.28 起 |
一键集群接入(支持 ainode cluster token、ainode join、AINODE_JOIN 三种方式) | ✅ 自 v0.5.29 起 |
全新安装时自动生成 cluster_secret,默认情况下节点发现流程不处于未认证状态 | ✅ 自 v0.5.29 起 |
GET /api/cluster/endpoint 与 endpoint_hint 接口返回集群内所有节点地址,无需认证,保证客户端在 Master 节点故障后仍能正常接入 | ✅ 自 v0.5.29 起 |
| 分布式 Head 节点启动时会接管当前正在运行的引擎,若拓扑异常则记录降级状态并标注异常对等节点 | ✅ 自 v0.5.29 起 |
节点本地指标存储:保留 48 小时原始数据、30 天粒度为 1 分钟的聚合数据,可通过 GET /api/metrics/history 接口查询 | ✅ 自 v0.5.29 起 |
/metrics 接口支持正常采集(v0.4 版本前返回 500 错误问题已修复),返回数据包含 node / node_id 标签与经过验证的采集配置 | ✅ 自 v0.5.29 起 |
独立端口启用 TLS(ainode tls enable,默认端口 3443),支持自签名证书或 tailscale cert 签发证书,原 HTTP 端口服务不受影响 | ✅ 自 v0.5.29 起 |
/v1 接口下的单客户端请求速率与并发数限制(通过 rate_limit 块配置,触发限制时返回 429 状态码并标注超限规则) | ✅ 自 v0.5.29 起 |
通过集群端点提供语音转文字服务(端点:/v1/audio/transcriptions、/v1/audio/translations) | ✅ 自 v0.5.29 起 |
全新安装时自动生成 API 密钥并默认启用认证(可通过设置 AINODE_AUTH=off 关闭),在已有配置的安装场景下不会修改原有认证设置 | ✅ 自 v0.5.30 起 |
集群启用认证后:所有节点间调用都会携带由 HMAC-SHA256(cluster_secret, "ainode-fleet-key-v1") 生成的凭证,被调用方识别为合法集群内部调用 | ✅ 自 v0.5.30 起 |
提供 ainode auth key create --name/list/revoke 密钥管理命令,修改 auth.json 配置后无需重启即可在运行中的节点上立即生效 | ✅ 自 v0.5.30 起 |
GET /api/config 接口会脱敏隐藏 hf_token 字段,auth.json 和 config.json 文件权限设置为 0600 | ✅ 自 v0.5.30 起 |
ainode tls enable --tailscale 可为当前节点的 MagicDNS 名称申请有效证书,通过 ainode-tls-renew.timer 在证书到期前 14 天自动完成续期 | ✅ 自 v0.5.30 起 |
当节点启用 TLS 服务后,/api/cluster/endpoint 和 endpoint_hint 会返回 tls、tls_port 字段以及对应的 https 地址 | ✅ 自 v0.5.30 起 |
节点重启或版本升级后,会自动接管当前所有正在提供服务的引擎(主实例、Head 实例、堆叠实例),无需重新加载,/api/status 接口返回 engine_adopted 字段标识该状态 | ✅ 自 v0.5.30 起 |
| 下载模型时若磁盘空间不足,返回 507 状态码,标注所需空间、当前可用空间以及检测的目标路径 | ✅ 自 v0.5.30 起 |
新增指标视图面板,支持 1 小时至 7 小时的六维度图表展示,可通过集群端点调用 GET /api/metrics/history?node= 查询任意节点的历史指标 | ✅ 自 v0.5.30 起 |
已完成 openai/whisper-large-v3-turbo 验证,附带语音基准测试记录(词错误率、延迟、实时因子) | ✅ 自 v0.5.30 起 |
qwen3.8-flash-next-nvfp4-v100:通过目录支持在 4 张 Tesla V100 显卡上运行 Qwen3.8-Flash-Next 模型并启用 TP=4 并行策略 | ✅ v0.5(开发中) |
AINode 基于 DGX Spark 生态中的优秀开源成果构建。https://github.com/eugr/spark-vllm-docker 及其打了补丁的 NCCL(dgxspark-3node-ring 分支)是 AINode 多节点能力的起点:0.4.x 版本直接运行了 eugr 的 launch-cluster.sh 脚本与对应基础镜像,项目中用到的各类标识与拓扑经验也全部来源于该仓库。
当前运行的版本已有诸多改进,此处有必要明确说明:AINode 0.5.x 会自行启动引擎,每个实例从模型配方指定的镜像单独拉起一个 vLLM 容器,多节点运行依赖 vLLM 原生多节点执行器实现,而非 Ray。从 eugr 的代码库构建而来的 ainode-base 镜像已不再作为正式发布产品的依赖组件。即便如此,我们对该项目的借鉴事实确凿,且 eugr 的项目仍是 Spark 硬件上原生部署 vLLM 集群的首选参考资源。
在此特别感谢 eugr 及所有让多节点 Spark 部署方案落地的贡献者。
下表中每一项对应的模型,均已通过 AINode 在我方自有硬件上完成部署与性能实测。每一次运行的完整 JSON 记录保存在 bench/results/ 目录下,整个表格由 scripts/render-bench-table.py 脚本从这些记录自动生成,完全避免了人工编写的说明与实际数据出现偏差的问题。如果某个模型在该目录下没有对应记录,说明我们尚未对其完成实测,我们宁愿如实标注,也不会发布未经核验的性能数值。
| 模型 | 总参数量 / 激活参数量 | 量化方式 | 部署节点配置 | 单流生成速度 (tok/s) | 16 流生成速度 (tok/s) | 评测结果 | 测试日期 | 运行记录 |
|---|---|---|---|---|---|---|---|---|
| Qwen3.8-Flash-Next | 125B / 6B 激活 | NVFP4(混合精度,PLE 层使用 FP8) | castor 节点,4× Tesla PG500-216,TP=4 | 49.6 | 104.2 | 未运行评测 | 2026-09-20 | https://github.com/getainode/ainode/blob/main/bench/results/20260920-***-qwen3_8-flash-next-nvfp4-v100-ainode-0_5_29-castor-tp-4-four-v100-32-gb-onecat-vllm-1_5_0-mm-mtp-4-via-the-fleet-endpoint.json |
| Qwen3.6 35B-A3B | 35B / 3B 激活 | NVFP4 | pollux 节点,1× Tesla PG500-216,TP=1 | 97.4 | 343.9 | 未运行评测 | 2026-09-19 | https://github.com/getainode/ainode/blob/main/bench/results/20260919-040456-qwen3_6-35b-a3b-nvfp4-pollux-v100-solo-onecat-src-full.json |
| Spark-X2.5 4B | 4B 全密集 | BF16 | Spark-4-GX10 节点,1× GB10,TP=1(堆叠部署) | 18.9 | 283.8 | 未运行评测 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-***-spark-x2_5-4b-spark-4-stacked-beside-nemotron-bf16.json |
| Qwen3.8-Flash-Next (NVFP4) | 125B / 6B 激活 | NVFP4(混合精度,PLE 层使用 FP8) | Spark-2-DGX 节点,2× GB10,TP=2 | 26.2 | 207.6 | 未运行评测 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-204216-qwen3_8-flash-next-nvfp4-tp2-mp-nightly.json |
| DeepSeek V4 Flash (DSpark, FP8) | 284B / 13B 激活 | FP8(专家层使用 FP4) | Spark-2-DGX 节点,2× GB10,TP=2 | 34.5 | 94.0 | 未运行评测 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-033415-deepseek-v4-flash-dspark-fp8-tp2-mp.json |
| Nemotron 3.5 Lightning 30B-A3B | 30B / 3B 激活 | NVFP4 | Spark-4-GX10 节点,1× GB10,TP=1(堆叠部署) | 52.6 | 未实测 | 未运行评测 | 2026-09-13 | https://github.com/getainode/ainode/blob/main/bench/results/20260913-***-nvidia-nemotron-3_5-lightning-30b-a3b-nvfp4-smoke.json |
| Ornith 1.5 35B-A3B | 35B / 3B 激活 | NVFP4 | Spark-1-DGX 节点,1× GB10,TP=1(堆叠部署) | 40.0 | 269.2 | 19/19 | 2026-09-13 | https://github.com/getainode/ainode/blob/main/bench/results/20260913-***-ornith-1_5-35b-a3b-nvfp4-text-only-mtp.json |
| Qwen3.8 27B | 27B 全密集 | NVFP4 | Spark-3-DGX 节点,1× GB10,TP=1 | 19.0 | 147.0 | 23/23 | 2026-08-15 | https://github.com/getainode/ainode/blob/main/bench/results/20260815-000000-qwen3_8-27b-nvfp4-mtp-vision.json |
| Nemotron 3.5 Lightning 30B-A3B | 30B / 3B 激活 | NVFP4 | Spark-4-GX10 节点,1× GB10,TP=1 | 104.5 | 504.3 | 19/19 | 2026-08-13 | https://github.com/getainode/ainode/blob/main/bench/results/20260813-000000-nvidia-nemotron-30b-a3b-nvfp4-dspark-recipe.json |
| Qwen3 235B-A22B | 235B / 22B 激活 | NVFP4 | Spark-1~4 集群,4× GB10,TP=4 | 16.5 | 未实测 | 未运行评测 | 2026-06-17 | https://github.com/getainode/ainode/blob/main/bench/results/20260617-000000-qwen3-235b-a22b-nvfp4-tp4-frontier-moe.json |
以下记录的是上述模型由专属编码代理驱动的实测结果。表格中每一项代表单个模型在对应测试框架(aider、dsh、claude 等)上的运行结果,由与上表完全相同的基准测试记录通过 scripts/render-bench-table.py 脚本自动生成,同样不会出现描述与实测数据不一致的问题。表中展示的是每一组「模型-测试框架」配对的最新运行结果,如果某次运行的标识标注了 not measured,表格中就会直接显示该字符串,而非填充无效数值。
基准测试镜像信息:
镜像名称:ghcr.io/getainode/ainode
参考标签:latest
以下是各模型与测试框架的基准测试明细:
| 模型 | 测试框架(Harness) | pass@1 | pass@2 | 平均耗时(秒) | 部署节点与配置 | 测试日期 | 运行结果 |
|---|---|---|---|---|---|---|---|
| DeepSeek V4 Flash | aider aider 0.86.2 | 9/10 | 10/10 | 47.3 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-deepseek-v4-flash-dspark-four-harnesses-10-exercism-harness.json |
| DeepSeek V4 Flash | dsh 0.1.5-rc.1 | 10/10 | 10/10 | 16.4 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-deepseek-v4-flash-dspark-four-harnesses-10-exercism-harness.json |
| DeepSeek V4 Flash | opencode 1.18.31 | 10/10 | 10/10 | 23.4 | Spark-2-DGX, TP=2 | 2026-09-17 | https://github.com/getainode/ainode/blob/main/bench/results/20260917-***-deepseek-v4-flash-dspark-deepseek-v4-flash-tp-2-opencode-after-the-pwd-fix-10-exercism-tasks-harness.json |
| DeepSeek V4 Flash | pi 0.73.1 | 9/10 | 10/10 | 13.8 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-deepseek-v4-flash-dspark-four-harnesses-10-exercism-harness.json |
| Nemotron 3.5 Lightning 30B-A3B | aider aider 0.86.2 | 8/10 | 10/10 | 389.5 | Spark-4-GX10, TP=1 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-042104-nvidia-nemotron-3_5-lightning-30b-a3b-nvfp4-spark-4-solo-thinking-default-harness.json |
| Nemotron 3.5 Lightning 30B-A3B | claude 2.1.274 (Claude Code) | 8/10 | 9/10 | 239.5 | Spark-4-GX10, TP=1 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-042104-nvidia-nemotron-3_5-lightning-30b-a3b-nvfp4-spark-4-solo-thinking-default-harness.json |
| Nemotron 3.5 Lightning 30B-A3B | dsh 0.1.5-rc.1 | 7/10 | 10/10 | 108.9 | Spark-4-GX10, TP=1 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-053315-nvidia-nemotron-3_5-lightning-30b-a3b-nvfp4-spark-4-solo-thinking-default-dsh-rerun-after-pytest-preflight-harness.json |
| Nemotron 3.5 Lightning 30B-A3B | pi 0.73.1 | 7/10 | 10/10 | 119.2 | Spark-4-GX10, TP=1 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-042104-nvidia-nemotron-3_5-lightning-30b-a3b-nvfp4-spark-4-solo-thinking-default-harness.json |
| Ornith 1.5 35B-A3B | aider | 9/10 | 10/10 | 116.3 | Spark-1-DGX, TP=1 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-ornith-1_5-35b-a3b-nvfp4-ornith-1_5-35b-a3b-on-spark-1-three-harnesses-10-exercism-tasks-harness.json |
| Ornith 1.5 35B-A3B | claude 2.1.272 (Claude Code) | 8/10 | 10/10 | 50.8 | Spark-1-DGX, TP=1 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-ornith-1_5-35b-a3b-nvfp4-ornith-1_5-on-spark-1-claude-code-harness-10-exercism-tasks-harness.json |
| Ornith 1.5 35B-A3B | dsh 0.1.5-rc.1 | 7/10 | 9/10 | 51.2 | Spark-1-DGX, TP=1 | 2026-09-17 | https://github.com/getainode/ainode/blob/main/bench/results/20260917-022907-ornith-1_5-35b-a3b-nvfp4-ornith-1_5-on-spark-1-thinking-off-by-default-dsh-10-exercism-tasks-harness.json |
| Ornith 1.5 35B-A3B | pi 0.73.1 | 5/10 | 10/10 | 43.2 | Spark-1-DGX, TP=1 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-ornith-1_5-35b-a3b-nvfp4-ornith-1_5-35b-a3b-on-spark-1-three-harnesses-10-exercism-tasks-harness.json |
| Qwen3.8 27B | aider aider 0.86.2 | 7/10 | 9/10 | 455.6 | Spark-1-DGX, TP=1 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-qwen3_8-27b-nvfp4-three-harnesses-10-exercism-harness.json |
| Qwen3.8 27B | dsh 0.1.5-rc.1 | 10/10 | 10/10 | 269.9 | Spark-1-DGX, TP=1 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-qwen3_8-27b-nvfp4-three-harnesses-10-exercism-harness.json |
| Qwen3.8 27B | pi 0.73.1 | 9/10 | 10/10 | 205.6 | Spark-1-DGX, TP=1 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-***-qwen3_8-27b-nvfp4-three-harnesses-10-exercism-harness.json |
| Qwen3.8-Flash-Next | aider | 9/10 | 10/10 | 319.8 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-201023-qwen3_8-flash-next-nvfp4-qwen3_8-flash-next-tp-2-spark-2-spark-3-four-harnesses-10-exercism-tasks-harness.json |
| Qwen3.8-Flash-Next | claude 2.1.272 (Claude Code) | 8/10 | 10/10 | 46.1 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-205159-qwen3_8-flash-next-nvfp4-flash-next-tp-2-claude-code-harness-effort-medium-10-exercism-tasks-harness.json |
| Qwen3.8-Flash-Next | dsh 0.1.5-rc.1 | 10/10 | 10/10 | 96.2 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-201023-qwen3_8-flash-next-nvfp4-qwen3_8-flash-next-tp-2-spark-2-spark-3-four-harnesses-10-exercism-tasks-harness.json |
| Qwen3.8-Flash-Next | pi | 10/10 | 10/10 | 139.6 | Spark-1-DGX, TP=2 | 2026-09-16 | https://github.com/getainode/ainode/blob/main/bench/results/20260916-201023-qwen3_8-flash-next-nvfp4-qwen3_8-flash-next-tp-2-spark-2-spark-3-four-harnesses-10-exercism-tasks-harness.json |
| Spark-X2.5 4B | aider aider 0.86.2 | 3/10 | 6/10 | 923.4 | Spark-4-GX10, TP=1 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-***-spark-x2_5-4b-spark-4-stacked-beside-nemotron-first-run-harness.json |
| Spark-X2.5 4B | claude 2.1.274 (Claude Code) | 4/10 | 7/10 | 636.7 | Spark-4-GX10, TP=1 | 2026-09-18 | https://github.com/getainode/ainode/blob/main/bench/results/20260918-***-spark-x2_5-4b-spark-4-stacked-beside-nemotron-first-run-harness.json |
| Spa |
[!NOTE] 原始输入文档末尾内容不完整,基准测试表格在最后一条“Spark-X2.5 4B”条目后被截断。
来自真实用户的反馈,见证轩辕镜像的优质服务