用途:把训练好的神经网络模型交付到手机和浏览器端,覆盖从评测、导出、量化、转换、真机测速到按需下载分发的完整链路。
主要能力与流程:
- 先建评测:准备真值、单一标量指标(如 F-measure、accuracy)和可对任意模型变体运行的脚本,保留 5–10 个留出样本作冒烟集;后续是否量化、用 fp16 还是蒸馏都由该脚本结果决定。
- 导出 ONNX:用 torch.onnx.export 按固定形状导出,每个 batch size 单独导出一次,并与原模型比对最大绝对差和评测分数;onnxruntime CPU 作为可移植基线,可跑 web(onnxruntime-web WASM)、Android(ORT mobile)和桌面。
- int8 量化:用 onnxruntime.quantization 或 ct.optimize.coreml.linear_quantize_weights 做仅权重量化,资料称通常几乎无损(20M 参数 transformer 上 F 0.872→0.871、Core ML 0.864→0.863,体积约小 4 倍),但仍需重跑评测。
- Apple 端:用 coremltools 转原生 Core ML,不要用 ORT 的 Core ML execution provider。转换 transformer 类模型常因 Python int 形状运算失败,可行修法包括:用显式 permute/reshape 替换 einops 层、把形状烘焙为常量(预热 eager 时在模块属性上捕获 tuple(int(s) for s in x.shape))、从权重推导维度(如 linear.out_features);每次替换后都要断言最大绝对差约为 0。定位失败算子应做图普查(dump ts.inlined_graph,按 scope 和 kind 过滤 aten::Int、aten::size、prim::NumToTensor),而非只读代码。
- 真机基准:用模型原生窗口尺寸和确定性非零输入,在目标设备上比较 cpuOnly、GPU、ANE 等计算单元;资料举例某旋转注意力 transformer 在 iPhone CPU 上比 ANE 快 2 倍,ANE 首次加载有 43 秒一次性编译开销。开发机数据不可迁移。
- 分发:以按需下载而非打包进应用,采用 FaceModelStore 式存储:下载 → MLModel.compileModel → 存入 Application Support(排除备份)→ 加载验证后才算安装完成。.mlpackage 是目录,需按文件托管在同一 base URL 下(Manifest.json、Data/com.apple.CoreML/model.mlmodel、Data/com.apple.CoreML/weights/weight.bin)并用测试固定该列表。可留调试 HTTP 端点,在真机上用一次 curl 测 N 次预测耗时。
注意事项:ONNX 追踪会固化 batch size 且静默出错(batch 1 追踪的模型接受 (4,N,D) 会返回形状像答案的错误结果);coremltools 与 torch 版本需严格配对(如 torch 2.7.x + coremltools 9.0),torchaudio 需与 torch 次版本一致;Info.plist 中未替换的 $(MODEL_URL) 能通过 URL 解析但运行时会失败,应拒绝含 $( 的值;设备端批处理收益有限(实测 0.91–1.01x),基准测试应轮内交错变体;fp16 可能在 int8 成功处失败,不必强求。不要用 ORT Core ML EP(实测比 ORT CPU 慢 11 倍且有内存泄漏,重复运行涨到 41 GB),也不要一上来就做蒸馏。
限制:资料未提供具体安装命令、许可、收费与支持平台版本等细节。