LLMDeployASCEND · DEPLOYMENT NOTESView on GitHub ↗
DOCUMENTATION / 昇腾部署实践

换机核对单

目标机器重新确认

连接客户端

默认服务只监听目标机 loopback。操作者可在自己的电脑建立 SSH 转发:

ssh -N -L 19001:127.0.0.1:8900 USER@HOST

模型 ID:ds-v4.1-flash-1017;直连隧道的 API base:http://127.0.0.1:19001/v1。已有独立网关时继续使用原认证管理方式,双机入口见会话路由;认证配置留在本机。

dsh 中只需保留这些模型能力字段;提供方类型为 openai-completions,认证在本机既有配置中单独管理,不要把完整 profile 复制到仓库:

{
  "id": "ds-v4.1-flash-1017",
  "contextWindow": 1048576,
  "maxTokens": 32768,
  "input": ["text", "image"]
}

总窗口为 1,048,576 tokens,含输入和输出;输出请求 32,768 时,输入预算最多为 1,015,808。maxTokens 是客户端请求上限,不是本仓声称每个场景都完成了 32K 输出验证。主备窗口一致并各自验证通过后,才能把网关公共窗口及各后端容量一起更新为 1M。

DeepInfer 的 DSH 上下文预算补丁

client-patches/deepinfer-budget 针对 DSH 0.2.1-rc.2 的固定源码 SHA,在客户端 OpenAI payload 完成序列化后检查预算。窗口仍为 1,048,576,默认输出仍为 32,768;额外预留 16,384,因此完整输入达到 999,424 时进入压缩。输出只扣一次,输入计入系统提示、工具定义、消息模板和特殊 token。原有字符估算仍用于较早的 step 压力检查,不能替代最终请求检查。

计数器使用锁定的 deepseek-recipe 0.2.0 和匹配的 V4.1 tokenizer,复用服务端的 developer/system、输出字段归一化及原生模板编码;文字请求使用实际 token 数。图片按同版本服务端预处理器每图最多 1,024 token 预留,属于保守上界,不宣称是图片实际计数。计数失败明确终止发送,不退回字符估算,不截断消息,也不降低输出上限。

用 cargo build --release --locked --manifest-path client-patches/deepinfer-budget/counter/Cargo.toml 构建计数器;二进制、tokenizer、生成模块、manifest、真实请求收据和本机配置只放在忽略的 local/。在支持读取打包 runtime 的 Electron Node 环境调用 prepare.cjs RUNTIME_NODE_MODULES OUTPUT_DIR COUNTER_EXE TOKENIZER_JSON,生成目录必须是新的。生成器核验原始 SHA,生成模块在加载时再次核验;保留上游 MIT 许可,禁止直接改写签名的 app.asar。

生成的 adapter 对 deepinfer 和 local950dt 两个 provider 都执行相同的预算检查,其他 provider 的请求行为不改变。激活时禁用原 llm-pi-ai,将其完整 config(包括其他 provider 的原配置及凭据引用)交给唯一一个生成的 adapter 实例。不得让原版与 sidecar 并存:每个实例都会声明完整 provider catalog,目录重名会让后加载的实例在注册 adapter 前失败。禁用原 compaction-basic,插入生成的 compaction 模块,并分别为 deepinfer/deepseek-v4.1-flash-1017、local950dt/ds-v4.1-flash-1017 配置 headroomTokens: 16384、maxTokens: 32768、maxOverflowRetries: 1。普通请求和摘要请求均保留 1M 总窗口、32K 输出,不能只为其中一个别名设置策略,让另一别名回退到 64K 摘要输出。DSH patch 的 name 是身份断言,不能直接用它替换已有模块,必须使用 disable/insert。配置备份保留在原 profile 旁,先核对并发改动再写入,禁止复制或覆盖 session 文件。

明确的上下文 400 和发送前预算不足均使用既有的 CONTEXT_WINDOW_EXCEEDED 压缩路径;两个 provider 均最多恢复一次,只在持久 surface 有替换后重建请求。摘要选择历史的前半段,并沿既有工具调用/结果配对边界调整,避免摘要调用重复整份超限输入。摘要或重建请求仍超限则明确失败,原始 append-only 历史保留;没有可压缩完整区间时也不静默删消息。

验证运行 python -m unittest discover -s tests -v;设置 DEEPINFER_COUNTER 和 DEEPINFER_TOKENIZER 后,Node 预算测试还会运行真实原生计数。tests/admission.test.mjs 再通过 DEEPINFER_RUNTIME_MODULES、DEEPINFER_PATCHED_DIR 加载实际 adapter,分别验证两个 provider 的完整请求:超限前不发送、安全边界和边界下一 token,输出始终 32K。tests/recovery.test.mjs 另外通过 DEEPINFER_SDK_CLIENT、DEEPINFER_TEST_ROOT 指定独立环境,用实际 SDK profile 加本地 HTTP fixture 验证两个 provider 的明确 400、仅一次恢复、失败后停止及工具配对。tests/composition.test.mjs 通过完整 Cordis profile 验证原实例禁用、单 sidecar 同时路由两个目标及非目标 provider;仅测试一个独立 adapter 不足以证明桌面配置可用。这些测试不代替真实 DeepInfer 请求验收。激活后须核对桌面实际 loader 只启用一个生成的 adapter、模型目录可见及两个目标 provider 的真实请求;不能仅凭磁盘存在生成文件或隔离 SDK 通过宣称补丁已在桌面生效。恢复原生模块或修改 provider 策略后,原补丁验收结论即失效。

维护责任归本配方维护者;DSH 升级必须重新生成和验收。当上游覆盖最终 payload 计数与受限恢复后,先验收上游替代,再删除 profile 里的 sidecar 行和本补丁,恢复原模块。回退只撤销本次 profile diff,不整份覆盖随后发生的用户配置变动,不修改服务端、认证或会话历史。

多 DP 下,重复前缀应路由到同一个 DP。功能 smoke 使用 loopback 后端的 X-data-parallel-rank: 0;实际多用户入口需要既有网关的稳定会话路由。不要用轮流分配请求的入口验证缓存复用。

--enable-prompt-tokens-details 让 API 用量携带缓存 token 数。dsh 底部是整会话累计且整数取整;旧请求缺失的用量不补记。应查看最新回答下的「用量」,不要把老会话累计 0% 直接判为缓存关闭。

功能验收和回退

  1. /health、/v1/models 返回正确模型与总窗口;检查日志无 worker 初始化失败。
  2. 运行 scripts/smoke.py 检查文本、SSE DONE 和缓存用量。该脚本只使用合成提示词,不记录时间或速率。
  3. 图片数量上限为每请求含历史 640 张,图片、文本和输出合计须符合 1M 上下文,入口请求体限制独立生效。先前 512K 实例已用逐图编号的合成图验证 640 图、四轮历史累计和同一/多个 DP 的 4 请求并发;641 图及超上下文请求明确拒绝。1M 实例完成 16 图回归,未实测 640 图与接近 1M 文本的组合上限。未逐图编号时观察到指定序号定位错误,因此大量图片应在每张图前标注 Image N:;这些功能检查不代表任意图片的定位或识别质量保证。新机仍须重新验证图像内容、换图、重复图和历史图片。
  4. 验证客户端文本、图片和工具调用;确认最终用量能显示缓存读取。源码或模型版本变化后还要重新做长上下文/输出边界检查。
  5. 新机 /metrics 可经同一 SSH 隧道访问,例如 http://127.0.0.1:19001/metrics;检查实际8个DP的状态。各DP首次处理请求后才可能出现完整统计。
  6. 保留旧容器和原配置,明确识别新旧实例再切换入口。若启用了空闲恢复,先停止其 timer/service,升级或回退完成后重新绑定目标并清空计时状态再启用。失败时仅停止本次新容器并恢复原入口;回退动作由操作者按目标机器归属执行,本仓脚本不自动停止其它服务。

这份核对单不等同于新机器已经验收。机器、镜像、CANN、模型 revision 或补丁任一变化,都需保存新的功能验收结论。

本文源于仓库文档 · 查看 Markdown 源文件
仅分享已使用经验;新环境与新工件需重新验证。敏感信息不提供。