核心架构与分层
1. 产品定位
Transformers.js 把 Python transformers 的使用体验(尤其是 pipeline)搬到 JavaScript,运行时 不依赖 PyTorch/TF,而是:
- 模型以 ONNX 形式分发(Hub 上常见
onnx/子目录); - 推理由 ONNX Runtime 执行,浏览器侧通过 WASM / WebGPU / WebNN 等 Execution Provider(EP)落地。
这样可以在 纯前端、Extension、Electron、Node 服务 等环境复用同一套 JS API,代价是 模型需预先转换 且受 ORT 算子与图优化约束。
2. 源码分层(从用户 API 到硬件)
由下往上可以理解为:
| 层次 | 职责 | 典型模块 |
|---|---|---|
| 环境探测与配置 | 识别 Node/Browser/Worker/Deno,配置 Hub 地址、缓存、WASM 路径、日志 | env.js、apis |
| 资源获取 | 本地路径 vs HF Hub URL、缓存读写、进度回调 | utils/hub.js、utils/cache.js |
| 模型文件解析 | 按 dtype 后缀选 *_quantized.onnx、external data 分片 | utils/model-loader.js、session.js |
| ONNX 会话 | 创建 InferenceSession、选择 EP、Web 端串行推理 | backends/onnx.js |
| 模型类 | from_pretrained、多 session 组装、forward/generate | models/modeling_utils.js、models/session_config.js |
| Pipeline | 任务默认模型、Tokenizer/Processor 与 Model 并行加载、后处理 | pipelines.js、pipelines/*.js |
| 统一导出 | 对外 API 边界 | transformers.js |
入口文件 transformers.js 明确声明:只导出该文件中的符号,便于控制公共 API 面积与 semver:
1:13:packages/transformers/src/transformers.js
/**
* @file Entry point for the Transformers.js library. Only the exports from this file
* are available to the end user, and are grouped as follows:
*
* 1. [Environment variables](./env)
* 2. [Pipelines](./pipelines)
* 3. [Models](./models)
* 4. [Tokenizers](./tokenizers)
* 5. [Processors](./processors)
* 6. [Configs](./configs)
*
* @module transformers
*/3. 与 Python 库「功能等价」的含义
- API 形状对齐:
pipeline(task)、AutoModel.from_pretrained等; - 实现路径不同:Python 多为 PyTorch 动态图;JS 侧是 静态 ONNX 图 + ORT;
- 创新点在于:把 tokenizer(
@huggingface/tokenizers)、图像/音频预处理、生成循环(logits 处理、停止条件) 全部用 JS 复刻,使 端到端任务可在浏览器完成。
4. Monorepo 与包边界
根目录 package.json 为 pnpm monorepo(private: true),核心 npm 包为 packages/transformers。分析推理链路时,应 以 packages/transformers/src 为准。
5. 小结
理解 Transformers.js,关键是 三条线:
- 数据平面:Hub → 缓存 → 带 dtype 后缀的 ONNX → optional external data;
- 计算平面:ORT 会话 + EP(wasm/webgpu/…)+ Web 端 全局推理链(见下一篇文档);
- 任务平面:
SUPPORTED_TASKS→ Pipeline 类 →PreTrainedModel子类与generate。
下一篇:Pipeline 与任务注册系统