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

22 KiB
Raw Permalink Blame History

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 未充分说明 EnableParallelModeinfer_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 内部 不开放
配置模型 ConfigureSetConfigModelGetCurrentCalbinOnDevice 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,不以字符串猜测

错误码中 IncompatibleDriverRequireNewerRTInvalidCalbin 应在 load/configure 阶段阻断;DeviceBusy 可有界重试;TimeoutDeviceUnavailableDeviceCrash 进入 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 本身明确不支持。