已合并
feat(skills): add infernex-deploy agent skill (v1.0.0 - v1.4.0) #245
feat(skills): add infernex-deploy agent skill (v1.0.0 - v1.4.0) #245
已合并
xinhongchen创建于 9月10日
xinhongchen成员
9月10日

一、关联 Issue

RFC:https://gitcode.com/openFuyao/InferNex/issues/153

Issue #153 承载 RFC 层面的动机与目标;本 PR 描述承载具体实现的能力说明与演进记录。后续基于本 skill 的能力增强,请在对应 PR 中更新本文档(见文末「演进记录」)。

二、概述

实现 RFC #153 提议的 InferNex 一键部署 Agent Skill(infernex-deploy,v1.4.0),面向昇腾 NPU Kubernetes 环境。用户在 Agent 会话里用自然语言即可完成 InferNex 的部署、升级、验证与卸载,无需记忆 Helm values 细节。全流程以确认门状态机推进,意图、渲染、预检判定、报告全部结构化:

自然语言说需求 → 填 intent.yaml → C1 配置确认 → C2 预检深度选择
→ render_values.py 确定性渲染(含自检)→ preflight_run.py 预检(38 项清单数据化)
→ C3 报告确认 → helm 安装/升级 → 等待就绪(checkpoint 可续跑)→ 网关推理验证 → C4 交付

范围:InferNex 主 Chart 的全生命周期管理。不含 InferNex-Bridge / LLMISVC(后续版本扩展)。

试用版声明:本版本将部署流程、确定性渲染、预检执行、模型档案的框架一次性定型。框架与预检链路已经活集群验证;完整部署链路(新框架 C1→C4 实机回归)、多 Agent 运行时适配、非 Qwen3-8B 模型的实机部署仍在验证与演进中,欢迎社区试用并反馈问题(反馈将按轮次合入,见「演进记录」)。

三、支持的能力

3.1 部署配置项(均可自然语言指定)

能力 说明
指定模型 任意 HuggingFace 模型;短名/别名经 models/ 档案命中(如 qwen3-8b、glm-5.2、deepseek-v4);未命中点选确认完整 ID,并可沉淀为新档案(新增一个 YAML,零改动现有文件)
模型规格档案 models/{aggregated,pd}/ 内置 7 个规格(Qwen3-8B、Qwen3-Coder-30B、GLM-5.1-w4a8、GLM-5.2-w8a8/w4a8c8、Minimax-m2.7、DeepSeek-V4-Flash),源自 examples/ 参考规格:拓扑并行度、量化参数、env、资源需求、权重路径
部署形态 PD 分离(Chart 默认 2p2d)或聚合(aggregated)模式切换,含配套的服务命名与 RSG 重写(由 render_values.py 确定性整包生成,禁止手改)
拓扑与并行度 卡数 → TP / PP / DP / replicas 自动映射;模型档案可携带推荐拓扑(含 PD 非对称,如 GLM-5.1 prefill tp=8 / decode tp=2);用户显式点名拓扑优先
Chart 版本 默认 OCI 最新(0.0.0-latest,浮动 tag 每次部署拉取最新,离线回退缓存并告警);可指定版本号(INFERNEX_CHART_VERSION)或本地 Chart 目录(INFERNEX_CHART_DIR)
部署参数 namespace、release 名、Gateway NodePort(默认 30088)
增强组件开关 eagle-eye、pd-orchestrator 等按需启用(含互斥校验)
推理参数 maxModelLen 等已知键 + 原始 extraArgs 追加,经渲染器规范下发

3.2 生命周期操作

能力 说明
部署 预检报告经 C3 确认后 helm 安装,等待就绪(含 LWS 副本数门禁)并经网关验证推理可用
升级 对已有实例做版本升级或配置变更,C1 附变更 diff,升级后自动重新验证推理可用
卸载 U1 门三档点选——仅 helm uninstall(轻量)/ 全部清理(含 PVC、orphan LWS、附属 CR)/ 取消;不误删集群共用组件;卡 Terminating 有 force-delete 排障指引
续跑 模型加载常需 10–30 分钟,等待阶段中断后说「继续等待 infernex」即从 checkpoint 恢复,不重装
深度预检(可选) 默认执行软件预检(S-01~S-22,数据化判定);C2 门主动询问是否运行硬件检查(约 3–5 分钟),连通性逐卡 ping 默认关闭、可再开(需节点 SSH 凭据,不回显)

四、支持的 Agent 运行时

skill 内置结构化点选交互规范(配置确认、卸载范围、敏感信息采集等场景强制使用):

Agent 运行时 点选工具 验证状态
Cursor AskQuestion ✅ 可用)
ZCode AskUserQuestion ✅ 可用
其他运行时(Claude Code / OpenCode / Codex 等) 运行时自带的结构化提问工具 理论支持,待验证

所有部署逻辑均通过 kubectl / helm / skill 自带脚本执行,不要求工作区有 InferNex 源码。

五、已验证的场景

项目 状态
Qwen3-8B,PD 分离 / 聚合(老版本 skill) ✅ 昇腾 NPU 集群实机端到端验证(源 PR 迭代 + 试用实战)
预检链路(确定性渲染 + 执行器 38 项 + npu-exporter 容量) ✅ 活集群验证:判定与集群真实状态一致(含 metrics-server 缺失、Istio 冲突等真实失败被正确拦截)
完整部署链路(新框架 C1→C4,含 render_values/models/gates) ⏳ 试用中:单轮实战跑通过,系统性回归待补
其他模型(GLM-5.1/5.2、Minimax-m2.7、Qwen3-Coder-30B、DeepSeek-V4-Flash) ⏳ profile 源自 examples/ 参考规格,未经本 skill 实机验证

更多模型规格与运行时的实机验证将持续补充,欢迎社区反馈。

六、端到端流程

6.1 准备依赖(scripts/bootstrap.sh)

  • 默认从 OCI 拉取 Chart:oci://cr.openfuyao.cn/charts/infernex @ 0.0.0-latest;浮动 tag 每次拉取最新(避免缓存漂移装旧镜像),固定版本号命中缓存直接用;远端不可达回退本地缓存并醒目告警
  • checker 仅在 C2 门选择运行后 --with-checker 拉取(static.openfuyao.cn,按架构自适应);旧缓存二进制缺新参数时可 --refresh-checker 刷新
  • 不要求用户工作区有 InferNex 源码

6.2 采集与确认(C1 / C2 门)

  • 节点 IP 用 kubectl get nodes -o wide + templates/nodes.yaml.tpl,默认不 SSH
  • 意图填 templates/intent.yaml.tpl(槽位与默认值见 references/intent_schema.md,null=未提及走默认,禁止臆测)
  • C1 配置确认门:render_values.py 先渲染 values(内嵌自检 + 派生项回填),按固定模板渲染确认表(含服务名/预期 LWS/RSG 指向等派生项),选项逐字固定(确认,进入预检 / 修改配置 / 取消)
  • C2 预检深度门:硬件检查(约 3–5 分钟)→ 连通性检查(耗时大幅增加,需 SSH 凭据)递进询问,默认均推荐跳过;回答回写 intent.yaml(单一事实源,落盘可审计)

6.3 预检(未通过不得安装)

  • 执行器 scripts/preflight_run.py 按 references/checks.yaml(v2,判定命令与触发条件全部数据化)逐项执行:软件检查 S-01~S-22(集群环境 / 安装冲突 / Chart 渲染 / values 校验)+ 硬件检查(checker 结果映射,H/K/B 为其输出契约)
  • 报告固定渲染为 preflight-report.json + .md:软件 / 硬件(checker)两节,逐项列出(通过项不折叠),中文检查项名称 + 版本/实测值(如 K8s v1.34.3、metrics-server v0.9.0、每节点 NPU 卡数、容量需求/可用),不展示内部编号;硬性失败附白名单修复提示
  • NPU 容量(S-18)默认经 npu-exporter metrics 计算(npu-operator 前置组件),不依赖 checker;checker 已跑时以其 H-04 为准
  • C3 报告确认门:有硬性失败时不出现「开始部署」选项;修复走 C3r 白名单勾选后重检

6.4 安装 / 升级

  • helm dependency build && helm upgrade --install
  • 禁用 --wait:RSG 证书 Job 为 post-install hook,与 helm --wait 死锁;就绪由 6.5 轮询保证
  • Helm 返回后立即发 interim 进度(不需用户回复)

6.5 等待就绪(可续跑)

  • wait_inference.py 轮询:阶段 A 资源出现 → 阶段 B 推理就绪;就绪 = /v1/models 200 且全部 LWS readyReplicas == 期望副本数(首启常 10–30 分钟,预算 90 分钟)
  • 每轮写 checkpoint(wait-state.json / endpoint.json,含 LWS 副本进度供交付回填);中断后可从 checkpoint 续跑,禁止重装
  • 禁止固定 sleep 当门禁、禁止 kubectl logs -f(用 --tail=100)

6.6 推理验证与交付(C4)

  • 完成条件:经网关 POST /v1/chat/completions → 200(Pod Running / /v1/models 通都不算完成)
  • C4 固定表格交付:模型(实测)、部署形态、Release@namespace(Chart 版本)、Endpoint、推理验证、资源落位(LWS/Pod/NPU 卡)、增强组件与硬件检查状态、耗时、产物路径;失败有 C4b 固定处置选项(重试/继续等待/修改配置/取消)

6.7 卸载(独立路径,跳过部署预检)

固定三项点选,避免误删共用组件:

  1. 仅 helm uninstall(轻量):只删主 release
  2. 全部清理:主 release → RSG 扩容 orphan LWS 与残留 CR → PVC → Chart 附属 ns(eagle-eye / nats / scaling-system,先查后删)→ 残留 cluster-scoped 资源(按 release 注解过滤,不盲删);istio sidecar 等 finalizer 卡 Terminating 有 force-delete 指引
  3. 取消

均不删除 LWS Operator、npu-operator、metrics-server 等集群共用组件。

七、安全与交互约束(用户可感知的行为)

  1. 确认门必经:C1 配置确认 → C2 预检深度 → C3 报告确认,问题与选项措辞逐字固定;预检报告未经确认不部署(硬性失败时部署选项不出现)
  2. 预检硬性问题未解决不安装;自动修复仅限白名单且须用户同意
  3. 破坏性操作(改集群资源、卸载)必须用户点选确认
  4. 默认不 SSH 到节点(仅连通性检查或节点修复按需采集,且不回显明文)
  5. 确定性渲染:模式/拓扑/模型/命名/RSG 字段的 patch 只能由 render_values.py 从 intent 生成,禁止手改;同一 intent 渲染结果 byte-identical
  6. 「推理通了才算成功」:必须经网关 POST /v1/chat/completions 返回 200 才交付 Endpoint

八、演进记录

本 skill 后续每次能力增强,请在对应 PR 中于下表追加一行,并同步更新 SKILL.md 的 metadata.version。

版本 PR 主要变更
v1.0.0 本 PR 首版基线:部署 / 升级 / 卸载 / 续跑全流程,自 openfuyao-powers#35 迁移定版
v1.1.0 本 PR 确认门状态机(gates.md,措辞逐字固定)+ intent.yaml 结构化确认 + checks.yaml 检查清单数据化
v1.2.0 本 PR render_values.py 确定性渲染(模式整包/命名/RSG/拓扑推导 + 内嵌自检 + golden UT)
v1.3.0 本 PR models/ 模型档案(alias 命中 → canonical id + 模型级 overlay;5 个 profile)
v1.4.0 本 PR preflight_run.py 执行器(检查项的触发条件与判定全部数据化、由脚本执行,AI 只读结果;报告固定模板)、两组检查 ID(S-xx 软件 / H·K·B checker 契约)、npu-exporter 容量、models 按形态分目录并新增 DeepSeek-V4-Flash / GLM-5.2-w4a8c8,反馈轮修复(Chart 浮动拉新、LWS 副本门禁、S-06 命名空间兼容、报告用户化等);后续社区会持续演进
likedislike
Pull Request已成功合入, 合并人@openFuyao-bot
(感谢 xinhongchen 的贡献)
Xxinhongchen成员
9月10日 添加了label:sig/sig-ai-inference
Xxinhongchen成员
9月10日 关联了issue:【需求】/【Requirement】PD-Orchestrator的命名空间创建希望变为自动创建
openFuyao-bot
openFuyao-bot成员
9月10日 评论:

欢迎来到 openFuyao 社区

Hey @xinhongchen , 感谢你对社区的贡献.

机器人使用手册

有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。您可以自助配置此仓库的 PR 合并规则,更多详情,请参阅此处。

联系指引

有疑问可以联系 SIG: sig-ai-inference ,
维护者是: @foxbit, @regandy ,
审核者是: @ShiroChen, @piamposer-li, @qinwenzh .

likedislike
openFuyao-botopenFuyao-bot成员
9月10日 添加了label:openFuyao-cla/yes
openFuyao-botopenFuyao-bot成员
9月10日 添加了label:ci-running
此处折叠了218条消息 查看更多
openFuyao-bot
openFuyao-bot成员10 天前进行代码检视1
skills/infernex-deploy/scripts/preflight_run.py
@@ -0,0 +234,13 @@
234+ ap.add_argument("--skill-dir", type=Path, default=Path(__file__).resolve().parent.parent)
235+ ap.add_argument("--values", type=Path, default=None)
236+ ap.add_argument("--chart-dir", type=Path, default=None)
237+ ap.add_argument("--chart-oci", default="oci://cr.openfuyao.cn/charts/infernex")
238+ ap.add_argument("--chart-version", default="0.0.0-latest")
239+ ap.add_argument("--checker-result", type=Path, default=None)
240+ args = ap.parse_args()
241+ 
242+ checks_path = args.checks or (args.skill_dir / "references" / "checks.yaml")
243+ spec = load_yaml(checks_path)
244+ if int(spec.get("version", 1)) < 2:
245+ die("checks.yaml 须为 v2(结构化 when + judge)")
246+ ctx = Context(args)
247+ 
openFuyao-bot
openFuyao-bot10 天前评论:

此条代码评论区间+234至+247

[重要] Context.eval_condition 对未知条件静默返回 None,导致含未知 when 条件的检查项被跳过,违反 checks.yaml 注释中"未知条件 → 报错,禁止静默通过"的契约。

修复建议:在函数末尾添加 raise ValueError(f"未知 when 条件: {cond!r}"),并在 run_check 调用处捕获异常、以 status=skip + evidence 含错误信息的方式记录。

likedislike
zhengqinwenZZZ
zhengqinwenZZZ成员
10 天前 评论:

/lgtm
/approve
/squash

likedislike
openFuyao-botopenFuyao-bot成员
10 天前 添加了label:lgtmapproved
openFuyao-bot
openFuyao-bot成员
10 天前 评论:

  • 标签 lgtm, approved 已被添加. 这意味着 qinwenzh 已经检查过代码了. 👋
Tips
  • 如果PR还没有被合入, 请评论 /check-pr 进行检查. 😄
likedislike
openFuyao-botopenFuyao-bot成员
10 天前 合入了pull request,合并节点 SHA:dcdcfb84556b1deb5efd37e6f1c21c6f66c6c5f9