Skip to content
目录

设备、dtype 与量化选择

1. dtype 与文件名后缀

utils/dtypes.js 将逻辑 dtype 映射到 ONNX 文件名后缀,例如:

  • fp32 → 无后缀(model.onnx);
  • q8_quantizedmodel_quantized.onnx);
  • q4_q4
  • fp16_fp16
35:64:packages/transformers/src/utils/dtypes.js
export const DATA_TYPES = Object.freeze({
    auto: 'auto',
    fp32: 'fp32',
    fp16: 'fp16',
    q8: 'q8',
    ...
    q4: 'q4',
    ...
});
...
export const DEFAULT_DTYPE_SUFFIX_MAPPING = Object.freeze({
    [DATA_TYPES.fp32]: '',
    [DATA_TYPES.fp16]: '_fp16',
    ...
    [DATA_TYPES.q8]: '_quantized',
    [DATA_TYPES.q4]: '_q4',

依据:Hub 上同一架构常 多份 ONNX,用后缀约定实现 单一 API 切换精度/量化

2. 设备默认 dtype:wasmq8

DEFAULT_DEVICE_DTYPE_MAPPINGwasm 默认 q8,其余未指定时多为 fp32。这与 WASM 算力与内存 相匹配:量化显著减小模型体积与内存带宽。

3. selectDtype:auto、按文件覆盖、回退

  • 支持 字符串按 onnx 文件名映射的对象(多 session 模型常用);
  • auto 时读 config 里的 transformers.js_config.dtype 等;
  • 找不到键时回退 设备默认 并可 warn 提示。

4. WebGPU fp16 能力探测

使用 navigator.gpu.requestAdapter() 检查 shader-f16 feature;不支持则 直接抛错(与半精度内核相关)。代码中引用 ORT PR 讨论,表明这是 随 ORT/WebGPU 演进 的区域。

14:32:packages/transformers/src/utils/dtypes.js
export const isWebGpuFp16Supported = (function () {
    ...
    return async function () {
        if (cachedResult === undefined) {
            ...
                try {
                    const adapter = await navigator.gpu.requestAdapter();
                    cachedResult = adapter.features.has('shader-f16');

5. session.js 中的设备与 KV cache dtype

getSession 内:

  • selectDevice 解析 options.deviceconfig['transformers.js_config']
  • kv_cache_dtype 可设为 float32 / float16(多量化权重仍用 fp16/fp32 存 KV 是常见策略);
  • WebNN 若未配置 free_dimension_overrideswarn(动态 shape 支持不完善时性能差)。

6. WebGPU:preferredOutputLocation

当启用 cache 配置且设备为 webgpu 时,对 present.* 输出设置 gpu-buffer,减少 GPU↔CPU 往返,利于自回归生成。

122:135:packages/transformers/src/models/session.js
if (cache_config && selectedDevice === 'webgpu' && kv_cache_dtype_config !== false) {
        const shapes = getCacheShapes(options.config, {
            prefix: 'present',
            session_name,
        });
        if (Object.keys(shapes).length > 0 && !isONNXProxy()) {
            const preferredOutputLocation = {};
            for (const key in shapes) {
                preferredOutputLocation[key] = 'gpu-buffer';
            }
            session_options.preferredOutputLocation = preferredOutputLocation;
        }
    }

7. 优化手段(可落地)

目标手段
减小下载体积dtype: 'q4' / q8,或 Hub 上选已量化模型
提升 WASM 速度减小 batch/序列长度;避免不必要 fp32
提升 GPU 推理device: 'webgpu' + 合适 fp16/q4f16(视模型与浏览器)
大模型 >2GBuse_external_data_format + 分片(model-loader/hub 常量限制 chunk 数)

下一篇:PreTrainedModel、生成与 KV Cache

MIT License.