Files
calculet-npu-research-archive/reports/Calculet-NPU-推理引擎接口与NPU特性矩阵-20260802.md
T

254 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Calculet NPU 推理引擎接口与 NPU 特性矩阵
日期:2026-08-02
核对对象:Runtime PDF、CalRT 0.7.6 头文件、`libcalrt-linux-x86_64.so.0.7.6` 动态符号、生产 llama.cpp `fd9bd632`
实施下钻:真实 C++ 签名、对象生命周期、0-29 错误码、调用前后置条件、reset/取消边界和三层服务 API 见《Calculet NPU Runtime API 精确契约与错误恢复手册》。本文矩阵负责“有没有/用没用”,手册负责“如何正确调用”。
## 1. 阅读方法
列定义:
- “PDF”表示开发文档中是否出现及其签名口径。
- “SDK”表示 0.7.6 已归档头文件中的真实声明。
- “符号”表示 0.7.6 动态库是否导出可链接符号;inline 方法记为“不适用”。
- “生产”表示当前 llama.cpp 整图路径是否调用。
- “测试”区分已在样机首轮验证、仅静态核对、尚未隔离测试。
- “状态”采用 C0 当前确认、C1 SDK 有但未接入、C2 可工程实现、C3 依赖厂商、C4 不支持/不应开放。
暴露面分为三层:
| 平面 | 面向对象 | 原则 |
| --- | --- | --- |
| 推理面 | 普通服务请求 | 只暴露模型、请求、流式结果、取消和有限状态 |
| 观测面 | 运维/性能工程 | 只读、鉴权、限频、可审计;不泄露任意地址 |
| 特权控制面 | 设备管理员/厂商调试 | reset、寄存器、任意内存、配置卸载;与业务 API 隔离 |
## 2. PDF 与 0.7.6 的版本差异
| 能力 | PDF 口径 | SDK 0.7.6 / 动态符号 | 结论 |
| --- | --- | --- | --- |
| 创建 calbin | 第 7 页示例 `CreateParser`,第 15 页参考 `CreateCalbin` | `Calbin::CreateCalbin(path)`,有符号 | PDF 内部版本漂移,以 0.7.6 头文件为准 |
| 枚举模型 | `GetAllModels()` 返回 vector | 返回 `std::vector<CalbinModel>*`,有符号 | 调用方必须处理指针和生命周期 |
| 按名称模型 | `GetModelInfo(name)` | `GetModelByName(string_view)`,有符号 | PDF 名称已变化 |
| 提交推理 | PDF 写作返回 `void` | C++ `infer()` 返回 `CalrtError_e`,有符号 | 必须检查返回码 |
| tensor 地址重定位 | `RelocateTensorAddress` | 头文件无声明,动态库无符号 | C4,不得调用或承诺 |
| 设备内存分配 | PDF `AllocDevMem` | 同名接口无头文件、无动态符号 | C4;底层另有 `CreateBuf`,但不是等价公共契约 |
| parallel/fixed task | PDF 未充分说明 | `EnableParallelMode``infer_with_fixed_task_type` 均存在符号 | C1,需要隔离验证 |
| golden/trace/KV 高级功能 | PDF 不完整 | SDK 与符号提供多项能力 | C1,先构建测试再产品化 |
不能根据 PDF 编译示例猜测兼容性。构建时必须锁定 0.7.6 头文件和 SONAME,并在启动时核对 Runtime/driver/firmware/calbin 版本。
## 3. C API 完整矩阵
### 3.1 Calbin、设备和配置
| C API | PDF | SDK 0.7.6 | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `create_calbin(cal_calbin*, path)` | 有 | 有 | 有 | C++ 等价路径 | C++ 路径已测;C 包装未测 | C1 | 内部模型管理,不直接给请求方 |
| `get_models_number(calbin)` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 观测面可返回净化后的模型数 |
| `get_all_models(n,names,calbin)` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 观测面;隐藏路径和内部子图名需权衡 |
| `print_calbin(calbin)` | 有 | 有 | 有 | 无 | 未测 | C1 | 仅调试日志,不做公网 API |
| `create_device(device*)` | 有 | 有 | 有 | C++ 等价路径 | C++ 已测 | C1 | 进程启动内部调用 |
| `create_device_by_type(device*,type)` | 有 | 有,PCIe/USB/EMU | 有 | C++ 使用 PCIe | PCIe 已测 | C1 | 类型由配置白名单控制 |
| `configure_device(device,calbin)` | 有 | 有 | 有 | C++ 等价路径 | 已测 | C1 | 模型控制面,串行化且鉴权 |
| `reset_device_configuration(device)` | 有 | 有 | 有 | 无 | 未测 | C4 | 特权控制面,维护窗口使用 |
| `reset_device(device)` | 有 | 有 | 有 | 无 | 未测 | C4 | 特权控制面;会影响所有请求 |
### 3.2 Buffer、tensor 和 CSR
| C API | PDF | SDK | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `create_input_buffer(...,model_name)` | 有 | 有 | 有 | C++ 等价路径 | C++ 已测 | C1 | adapter 内部 |
| `create_output_buffer(...,model_name)` | 有 | 有 | 有 | C++ 等价路径 | C++ 已测 | C1 | adapter 内部 |
| `get_input_tensor_num` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 启动校验/观测面 |
| `get_output_tensor_num` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 启动校验/观测面 |
| `get_input_tensor_by_name` | 有 | 有 | 有 | C++ 等价路径 | C++ 已测 | C1 | adapter 内部,严格名称 |
| `get_output_tensor_by_name` | 有 | 有 | 有 | C++ 等价路径 | C++ 已测 | C1 | adapter 内部 |
| `set_csr_by_name` | 有 | 有,返回 void | 有 | C++ 等价路径 | C++ 已测 | C1 | adapter 内部;建议 C++ 路径检查错误 |
| `get_csr_value_by_name` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 诊断和测试 |
| `get_tensor_info` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 启动 manifest 校验 |
| `cal_copy_mem(host,tensor,size,direction)` | 有 | 有 | 有 | 无 | 未测 | C1 | 内部低级 API;校验方向与长度 |
| `copy_mem_to_device_by_tensor_name` | 有 | 有 | 有 | C++ MapBuf/slice | 等价能力已测 | C1 | 推荐内部安全封装 |
| `copy_mem_to_host_by_tensor_name` | 有 | 有 | 有 | C++ MapBuf/slice | 等价能力已测 | C1 | 推荐内部安全封装 |
### 3.3 推理与资源释放
| C API | PDF | SDK | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `block_infer_model` | 有 | 有,返回 void | 有 | 无 | 未测 | C1 | 仅兼容层;产品内部优先 C++ 错误码 |
| `non_block_infer_model` | 有 | 有,返回 void | 有 | 无 | 未测 | C1 | 需要 buffer 所有权和 completion 管理 |
| `wait_infer_done` | 有 | 有,返回错误码 | 有 | 无 | 未测 | C1 | completion worker 内部 |
| `release_device` | 有 | 有 | 有 | RAII 等价 | 进程退出路径部分覆盖 | C1 | 生命周期管理内部 |
| `release_calbin` | 有 | 有 | 有 | RAII 等价 | 已覆盖 | C1 | 生命周期管理内部 |
| `release_input_buffer` | 有 | 有 | 有 | RAII 等价 | 已覆盖 | C1 | 生命周期管理内部 |
| `release_output_buffer` | 有 | 有 | 有 | RAII 等价 | 已覆盖 | C1 | 生命周期管理内部 |
| `release_tensor_info` | 有 | 有,C++ 引用参数 | 有 | 无 | 未测 | C1 | 只在 C 包装兼容层使用 |
C API 的 blocking/nonblocking 提交均为 `void`,提交阶段无法直接返回详细错误;这也是生产适配层优先使用 C++ `infer()` 的理由。
## 4. C++ Calbin 和部署矩阵
| C++ API | PDF | SDK | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Calbin::CreateCalbin(path)` | 名称不同 | 有 | 有 | 有 | 已测 | C0 | 模型管理内部;路径不可由普通用户任意传入 |
| `GetCalbinBrief()` | 有 | 有 | 有 | 无 | 静态核对 | C1 | 观测面输出白名单字段 |
| `GetModelByName(name)` | 名称不同 | 有 | 有 | 有 | 已测 | C0 | 改为 manifest 精确匹配 |
| `GetAllModels()` | 返回类型不同 | 有 | 有 | 有 | 已测 | C0 | 仅启动校验,避免运行时 substring |
| `GetModelByType(type)` | 文档不完整 | 有 | 有 | 无 | 静态核对 | C1 | 启动发现;仍需唯一性检查 |
| `GetPairedElf(model,chipMask)` | 不完整 | 有 | 有 | configure 内部 | 静态核对 | C1 | 不对业务面暴露 |
| `GetGlobalMemInfo()` | 不完整 | 有 | 有 | configure 内部 | 静态核对 | C1 | 观测/静态检查 |
| `GetLLMInfo()` | 不完整 | 有 | 有 | KV 初始化使用 | 已覆盖 | C0 | 只读能力摘要可暴露 |
| `Report()` | 有 | 有 | 有 | 无 | 未测 | C1 | 诊断日志 |
| `GetStackLoc()` | 不完整 | 有 | 有 | 无 | 静态核对 | C1 | 内部调试 |
| `Version()` | 不完整 | inline | 不适用 | 无 | 静态核对 | C1 | 健康/版本端点 |
| `GetModelWorloadByName()` | 不完整 | 有 | 有 | 无 | 未测 | C1 | 拼写/单位需厂商确认后再观测 |
| `GetGoldenInputByModelName()` | 不完整 | 有 | 有 | 无 | 未测 | C1 | 测试工具,不进业务面 |
| `GetGoldenOutputByModelName()` | 不完整 | 有 | 有 | 无 | 未测 | C1 | 测试工具,不进业务面 |
| `GetRootPath()` | 不完整 | inline | 不适用 | 无 | 静态核对 | C4 | 路径信息不对外 |
| `configure(vdev,calbin,dumpIni)` | 有 | 有两种重载 | 有 | 有,默认不 dump | 已测 | C0 | 模型控制面;配置期间拒绝新请求 |
| `findModel(list,name)` | 有 | 有 | 有 | 辅助路径/自有查找并存 | 已覆盖 | C0 | 统一为 exact match |
| `RelocateTensorAddress(...)` | PDF 有 | 无 | 无 | 无 | 已确认缺失 | C4 | 0.7.6 不支持 |
| `AllocDevMem(...)` | PDF 有 | 无同名 API | 无 | 无 | 已确认缺失 | C4 | 不承诺;底层分配器不是替代公共 API |
## 5. C++ buffer、tensor 与推理矩阵
| C++ API/能力 | PDF | SDK | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `createInputBuf(model)` | 有 | 有 | 有 | 每次 infer 创建 | 已测 | C0 | 建立池化,禁止跨 in-flight job 复用 |
| `createOutputBuf(model)` | 有 | 有 | 有 | 每次 infer 创建 | 已测 | C0 | 建立池化和 completion 生命周期 |
| `CalrtTensor::MapBuf/UnMapBuf` | 有 | 有 | 有 | MapBuf 已用 | 已测 | C0 | adapter 内部;RAII 封装 |
| `CalrtTensor::SliceTensor/UndoSlice` | 有 | 有 | 有 | prefill 输入/输出使用 | 已测 | C0 | 校验 offset/size 并每次恢复 |
| `CalrtTensor::Fill/CheckTensor` | 有 | 有 | 部分模板/符号 | 少量辅助路径 | 部分覆盖 | C1 | 单测/安全填充 |
| `InputBuf::GetTensorByName` | 有 | 有 | 有 | 有 | 已测 | C0 | manifest 驱动 |
| `InputBuf::SliceTensorByName` | 有 | 有 | 有 | 主要用 tensor slice | 静态核对 | C1 | 两套 slice 接口统一封装 |
| `InputBuf::ResetTensorByName/ResetAllTensors` | 不完整 | 有 | 有 | 无 | 未测 | C1 | buffer pool 归还时调用 |
| `ModelHyperParameters::SetCsrByName` | 有 | 有,返回错误码 | 有 | 有但忽略返回码 | 正常路径已测 | C0,有缺陷 | 每次提交检查返回码 |
| `GetCsrValueByName` | 有 | 有 | 有 | 无 | 未测 | C1 | 测试断言 |
| `InputBuf::GetInputTransferTime` | 不完整 | 有 | 有 | adapter/服务有自有计时 | 部分覆盖 | C0 | 观测面聚合,不按请求泄露内部地址 |
| `OutputBuf::SliceTensorByName` | 有 | 有 | 有 | tensor slice 等价路径 | 已测 | C0 | 输出长度严格校验 |
| `OutputBuf::Reset/ResetAllTensors` | 不完整 | 有 | 有 | 无 | 未测 | C1 | pool 复用前必测 |
| `OutputBuf::GetStatus` | 不完整 | 有五态 | 有 | 无 | 未测 | C1 | completion/metricsCCU exception 单独计数 |
| `OutputBuf::Wait()` | 有 | 有,返回错误码 | 有 | `infer()` 后立即调用,忽略返回码 | 正常路径已测 | C0,有缺陷 | completion worker 必须检查错误 |
| `GetWaitTime/GetOutputTransferTime` | 不完整 | 有 | 有 | 服务有相关指标 | 部分覆盖 | C0 | 观测面直方图 |
| `infer(vdev,model,in,out)` | PDF 返回 void | 有,返回错误码 | 有 | 有但忽略返回码 | 正常路径已测 | C0,有缺陷 | 检查 submit 错误;本身非阻塞 |
| `infer_with_fixed_task_type(...,PING/PONG)` | 未充分说明 | 有两种重载 | 有 | 无 | 未测 | C1 | 仅实验开关;验证后由调度器控制 |
`infer()` 后立即 `Wait()` 是当前并发瓶颈之一。只删除 `Wait()` 会造成 backing vectors 和 KV 状态被并发覆盖;必须先完成 buffer/job/KV 所有权改造。
## 6. VirtualDevice 与设备能力矩阵
| API | PDF | SDK | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `CreateVDevice()` / `(type)` | 有 | 有 | 有 | `PCIE` | 已测 | C0 | 进程级单例 |
| `GetDevice()` | 不完整 | inline | 不适用 | 读寄存器/配置使用 | 已覆盖 | C0 | 不跨业务边界返回裸指针 |
| `GetDeviceInfo(idx)` | 不完整 | 有但 idx 未用于多设备 | inline | 无 | 未测 | C1 | 只读健康信息;不要推断多卡 |
| `SubmitJob(...,forceEngineMode)` | 不完整 | 有 | 有 | `infer` 间接提交 | 默认模式已覆盖 | C0/C1 | 默认 C0;强制 ping/pong 为 C1 |
| `EnableParallelMode(bool)` | 不完整 | 有 | 有 | 无 | 未测 | C1 | 灰度实验,需证明调度和 buffer 安全 |
| `EnableTraceDevice(bool)` | 不完整 | inline | 不适用 | 无 | 未测 | C1 | 观测面受控开关,限制磁盘/性能影响 |
| `Status()` | 有 | 有 | 有 | 启动使用 | 已测 | C0 | 健康端点映射成稳定状态 |
| `ReportDeviceInfo()` | 有 | 有 | 有 | 无 | 未测 | C1 | 诊断日志 |
| `Shutdown()/Release()` | 有 | 有 | 有 | RAII/信号路径 | 部分覆盖 | C1 | 有界 drain 后执行 |
| `ReadMem/WriteMem(...,chipId)` | 不完整 | 有 | 有 | 启动读固定寄存器 | 只读固定地址已覆盖 | C4 | 任意访问仅特权控制面;白名单诊断可 C1 |
| `ResetCCU()` | 不完整 | 有 | 有 | 无 | 未测 | C4 | 特权恢复,影响在途任务 |
| `ResetConfiguration()` | 有 | 有 | 有 | 无 | 未测 | C4 | 模型控制面维护操作 |
| `Reset()` | 有 | 有 | 有 | 无 | 未测 | C4 | 设备管理员;完整审计 |
| `Type()` | 不完整 | 有 | 有 | 无 | 未测 | C1 | 健康/版本信息 |
0.7.6 头文件明确写着“temporary only support one physical device”,内部也是单个 `shared_ptr<CalrtDevice>`。因此它只证明一个物理设备内可指定 chip ID,不证明多个物理板可被一个 VirtualDevice 调度。多板为 C4/C3 厂商演进项。
## 7. 底层 CalrtDevice 矩阵
这些接口比 VirtualDevice 更接近驱动,只应出现在 Runtime、厂商调试器或严格封装的设备管理进程中。
| 能力组 | SDK 示例 | 符号 | 当前使用/测试 | 状态 | 建议 |
| --- | --- | --- | --- | --- | --- |
| 创建/发现 | `CreateDevice/CreatePCIeDevice/CreateEmuDevice/RefreshDevice` | 有 | VirtualDevice 间接使用 | C1 | Runtime 内部 |
| 内存保留 | `RegisterDram/RegisterSramBuf/RegisterSyncUnit` | 有/虚函数 | configure 内部 | C0 内部 | 不开放 |
| 配置模型 | `Configure``SetConfigModel``GetCurrentCalbinOnDevice` | 有 | configure 使用 | C0/C1 | 模型控制面封装 |
| 配置 dump | `DumpDeviceConfigureMetaData`、section dump | 有/模板 | 未测 | C1 | 观测面,净化路径/地址 |
| DMA | `WriteToDevice/ReadFromDevice` | 虚函数 | Runtime buffer 间接使用 | C0 内部 | 不开放任意地址 |
| 寄存器 | `WriteReg/ReadReg` | 虚函数 | 固定只读寄存器路径 | C4 | 特权控制面,写操作默认禁用 |
| 动态分配 | `CreateBuf/CreateSramBuf/ApplySyncUnit` | 虚函数 | configure/Runtime 内部 | C1 内部 | 不是 PDF `AllocDevMem` 的兼容承诺 |
| 释放/清空 | `Free*``ClearAllDevMem/ClearDynamicMem` | 虚函数 | 无直接产品调用 | C4 | 特权、维护窗口、全审计 |
| 复位 | `Reset/ResetCCU` | 有/虚函数 | 未测 | C4 | 故障恢复状态机调用 |
| 固件/信息 | `GetFirmwareInfo/GetDevInfo/GetReservedMem` | 有/虚函数 | 部分启动检查 | C1 | 只读观测面 |
| 电源 | `SetPowerMode` | 虚函数 | 未测 | C1/C4 | 管理策略控制,不开放给请求方 |
| 内存用量 | `GetMemoryUsage` | 虚函数 | 未接入 | C1 | Prometheus 指标,先核对单位 |
| 队列计数 | `GetNumPendingJob/GetNumFinishedJob/GetNumLeftJob` | 有 | 未接入 | C1 | 高价值观测指标 |
| trace | `EnableTraceDevice`、trace data | 有 | 未接入 | C1 | 性能实验开关,不能永久全量开启 |
## 8. KV Manager 特性矩阵
| API/能力 | PDF | SDK 0.7.6 | 符号 | 生产 | 测试 | 状态 | 暴露建议 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `KvManager(vdev,calbin)` | 不完整 | 有 | 有 | 有 | 已测 | C0 | adapter 内部 |
| `canAllocate(seq_num)` | 不完整 | 有 | 有 | 无 | 未测 | C1 | admission control,优先接入 |
| `Allocate(seq_info)` | 不完整 | 有 | 有 | Apply 间接/当前路径不清晰 | 部分覆盖 | C1 | 显式资源状态机 |
| `Apply(seq_info)` | 不完整 | 有 | 有 | 有,外层无限重试 | 正常路径已测 | C0,有缺陷 | 改成有界等待和 backpressure |
| `Free(seq_id)` | 不完整 | 有 | 有 | 有 | 已覆盖 | C0 | 请求结束可靠执行 |
| `RemoveTokensAtEnd` | 不完整 | 有 | 有 | 有 | 部分覆盖 | C0 | context rollback;补边界测试 |
| `isExist/GetSeqLen` | 不完整 | 有 | 有 | 部分使用 | 部分覆盖 | C1 | KV 诊断和断言 |
| `canShift/DoShift` | 不完整 | 有 | 有 | adapter 的 shift 能力不完整 | 未充分测试 | C1/C2 | 补齐 llama KV 语义后再开放 |
| `Clear()` | 不完整 | 有 | 有 | 有 | 部分覆盖 | C0 | 模型/设备故障恢复的一部分 |
| `seqPosMin/seqPosMax` | 不完整 | 有 | 有 | adapter 多个状态函数为空 | 未测 | C2 | 补齐后供 scheduler 使用 |
| batch KV layout | 不完整 | `KvBatchMode ONLY_VALID/ALL/AUTO` | 相关符号有 | 当前 batch 1 | 未测 | C1 + C3 calbin | 需要 batch calbin 和一致调度 |
| S8 V-cache | 不完整 | `KvDataType BF16/S8` | 相关符号有 | 当前 BF16 | 未测 | C1 + C3 | 需新产物、精度和容量 A/B |
当前 llama KV adapter 的 copy/keep/add/div/state 等多项函数为空或不完整。SDK 存在 KV shift 不等于 llama.cpp 的 context shift、sequence copy 和共享 prompt 已经产品可用。
## 9. 类型、版本、调试与错误契约
| API/类型 | SDK 0.7.6 | 符号/生产 | 状态 | 建议 |
| --- | --- | --- | --- | --- |
| `calrt_version()` | 返回 `const char *` | 有符号;生产启动时读取 | C0 | 健康端点返回规范化版本,保留原始字符串到日志 |
| `PrimitiveTypeBitSize(type)` | dtype 位宽查询 | 有符号;生产切片计算使用 | C0 | shape/dtype/byte-size manifest 校验 |
| `PrimitiveType` | U1/PRED/U8/S8/FP8/U16/S16/BF16/U32/S32/F32/U4/S4/F35/F16/F64/C64/C128 等枚举 | 类型定义;出现枚举不等于 kernel 支持 | C1/C3 | 以具体 calbin/op 支持矩阵为准;头文件明确 U64/TF32 不支持 |
| `CalbinTensorInfo_s` | name、shape、dtype、ping/pong 地址、size | parser/buffer 内部使用 | C0/C1 | 启动时只读校验;地址不对外 |
| `CalbinSection_s` | section type/place/path/offset/address/size/chip mask/tensors | configure 内部使用 | C1 | 静态分析和受控 config dump;净化路径/地址 |
| `CalbinLLM_s` | max batch、max sequence、KV spec | 生产读取 max sequence/KV | C0 | 作为服务能力真实来源并与 manifest 交叉验证 |
| `CalbinModel` | configured、acc type、chip mode、type/arch/name、sections、target chips | parser/configure 使用 | C0/C1 | 精确模型选择和能力摘要;不允许调用方篡改 |
| `TaskType_e` | PING/PONG/UNDEFINED | fixed-task API 使用 | C1 | 仅 executor 内部;普通请求不选择 engine bank |
| `ChipArch_e` | SINGLE/MULTIPLE/UNDEFINED | task metadata | C1/C3 | 只是任务枚举,不证明任意单/多芯粒图可运行 |
| `SetFullDebug/isFullDebug` | 全局 debug 开关 | 均有符号;生产未启用 | C1/C4 | 只在隔离诊断开启;评估性能、日志和敏感数据影响 |
| `CalrtError_e` | 0-29,含 memory/config/device/version/file/timeout/busy/crash/dtype/shape/direction | 多数 C++ API 返回 | C1/C2 | 映射为请求/模型/设备三级错误;保留原始 code,不以字符串猜测 |
错误码中 `IncompatibleDriver``RequireNewerRT``InvalidCalbin` 应在 load/configure 阶段阻断;`DeviceBusy` 可有界重试;`Timeout``DeviceUnavailable``DeviceCrash` 进入 drain/recovery。当前 adapter 将捕获的异常折叠为 `-2`,同时没有检查 CSR、submit 和 Wait 的直接返回码;需要保留原始 CalRT code 才能做可靠恢复。
## 10. 已确认但尚未产品化的高价值特性
按建议优先级:
| 优先级 | 特性 | 状态 | 前置条件 | 产品收益 |
| --- | --- | --- | --- | --- |
| P0 | job pending/finished/left 计数 | C1 | 核对线程安全和单位 | 发现排队与 Runtime 饱和 |
| P0 | output 五态和 CCU exception | C1 | completion worker | 正确异步与故障分类 |
| P0 | `canAllocate` + backpressure | C1/C2 | KV 状态机重构 | 消除无限忙等 |
| P1 | ping/pong 双缓冲 | C1/C2 | 独立 backing buffers | 覆盖 H2D/NPU/D2H,提升吞吐 |
| P1 | parallel mode | C1 | 厂商确认语义 + 压测 | 增加 in-flight job |
| P1 | trace/config dump | C1 | 数据格式和开销说明 | 找到长上下文和 D2D 瓶颈 |
| P1 | golden input/output | C1 | 产物包含有效 golden | 自动化 calbin 冒烟 |
| P2 | batch KV layout | C1/C3 | batch 4/8/16 calbin | continuous batching |
| P2 | S8 V-cache | C1/C3 | compiler/runtime/精度验证 | 减少长上下文容量和带宽 |
| P2 | 单芯粒小模型 | C3 | 单芯粒编译产物 | 多模型常驻和资源隔离 |
| P3 | NPU top-k/sampling | C3 | 新图/kernel/API | 避免全 vocab logits D2H |
| P3 | 多物理板调度 | C3/C4(0.7.6) | 新 Runtime/设备抽象 | 横向扩展 |
## 11. 对外 API 设计建议
### 推理面
可以开放:model alias、input、sampling 参数、stream、request ID、cancel、使用量和标准错误。context/batch 上限由服务公布并验证。不要开放 calbin 路径、子模型名、chip ID、设备地址、ping/pong 或 CSR 名称。
### 观测面
建议开放只读指标:Runtime/driver/firmware/calbin hash、健康状态、队列深度、in-flight、KV slots、TTFT/TPOT、H2D/infer/D2H/sampling 分层直方图、CCU exception、reset 次数、温度/功耗/内存。地址、token、prompt、内部路径默认脱敏。
### 特权控制面
模型 load/unload、trace 开关、configuration reset、CCU/device reset、电源模式只允许管理员身份、互斥锁、drain、超时、审计和回滚。任意寄存器/内存读写不应做成常规 HTTP/RPC 能力;若厂商调试必须使用,采用地址白名单、只读优先和物理维护窗口。
## 12. 最终判断
0.7.6 已经提供非阻塞提交、ping/pong、parallel mode、队列状态、KV 管理、trace 和 per-chip 诊断的基础,但当前生产只使用了其中的同步整图子集。最现实的演进顺序是先修 buffer/KV/错误生命周期并接入观测,再验证 in-flight=2,随后通过厂商 batch calbin 实现 continuous batching。多板、expert parallel、NPU sampling 和新模型编译都不能仅凭现有 Runtime 头文件落地,属于 C3;多物理设备在 0.7.6 本身明确不支持。