性能优化与工程最佳实践
1. 加载阶段
- 并行加载:
pipeline()已对 tokenizer、processor、modelPromise.all;模型内部多 session 在constructSessions里并行Promise.all(见models/session.js)。 - 只拉必要文件:依赖
get_pipeline_files+ 多模态 text-only 过滤,减少无效下载。 - 缓存:浏览器
Cache API/ 自定义env.customCache/ NodeFileCache;注意 iframe 与隐私模式下 Cache 可能不可用。
2. 推理阶段
- WebGPU / WebNN:在支持的浏览器与模型上通常优于纯 WASM;需实测 fp16 / q4f16 是否可用。
- KV cache:生成任务关注
past_key_values/present;WebGPU 下preferredOutputLocation: gpu-buffer可降低拷贝。 - 全局推理串行:
backends/onnx.js的webInferenceChain避免Session already started,但会限制并发;高吞吐场景考虑 Worker 分区 或 多页面实例。
3. 资源与内存
- 量化:
dtype: 'q4'、q8降低内存与带宽;注意精度损失。 - dispose:长会话应用对
DynamicCache与Model.dispose()显式释放,尤其 WebGPU。 - 外部数据分片:超大模型用 external data;注意
MAX_EXTERNAL_DATA_CHUNKS上限与加载时间。
4. 工程与部署
- 静态资源:WASM 路径
env.backends.onnx.wasm.wasmPaths可指向自有 CDN,减少 jsdelivr 依赖。 - 安全:浏览器不使用 HF Token;私有模型用 后端签名 URL 或 打包进应用资产。
- 版本锁定:生产锁定
@huggingface/transformers与 模型 revision,避免main漂移。
5. 调试
env.logLevel控制日志;ORT 日志经getOnnxLogSeverityLevel映射,避免刷屏。- WebNN 动态 shape:若未配置
free_dimension_overrides,库会 warning(见session.js)。