我是如何把大模型搬到Web推理的?
一、ONNX Runtime 概述
1.1 什么是 ONNX Runtime?
ONNX Runtime(ORT) 是由微软开发的开源推理引擎,专为优化和加速 Open Neural Network Exchange(ONNX) 格式模型的部署而设计。它支持跨平台运行,涵盖从云端服务器到边缘设备的全场景,已成为AI模型生产部署的核心工具之一。
1.2 ONNX 生态定位
-
模型标准化:ONNX 作为开放的模型交换格式,支持 PyTorch、TensorFlow、MXNet 等框架的模型导出。
-
ORT 核心价值:
- 提供统一的推理接口,消除框架碎片化
- 通过硬件加速和计算图优化实现 2-10 倍性能提升
- 支持服务端、移动端、Web 浏览器等多平台部署
二、核心特性与架构设计
2.1 性能优化技术
(1) 计算图优化
- 节点融合:将连续操作合并为单一内核(如 Conv + BatchNorm + ReLU)
- 常量折叠:预计算静态张量,减少运行时开销
- 内存复用:通过内存池管理减少动态分配
(2) 硬件加速支持
通过 Execution Providers(EP) 接入硬件加速后端:
EP 名称 | 适用场景 | 加速能力 |
---|---|---|
CUDA | NVIDIA GPU | 利用 cuDNN/cuBLAS 加速 |
TensorRT | NVIDIA GPU(极致优化) | 自动内核优化、FP16/INT8 量化 |
OpenVINO | Intel CPU/GPU | 集成 MKL-DNN、GPU 推理 |
CoreML | Apple 设备 | 原生支持 M1/M2 芯片 |
WebAssembly | 浏览器环境 | 跨浏览器轻量级推理 |
(3) 量化与压缩
- 动态量化:运行时自动转换 FP32 到 INT8
- 静态量化:预校准量化参数,精度损失可控
- 模型压缩:支持剪枝、蒸馏模型部署
python
# 启用 TensorRT 加速示例
import onnxruntime as ort
options = ort.SessionOptions()
providers = ['TensorrtExecutionProvider', 'CUDAExecutionProvider']
session = ort.InferenceSession("model.onnx", options, providers=providers)
2.2 跨平台架构
ORT 采用分层设计:
- 前端 API 层:提供 Python/C++/C#/Java 等接口
- 计算图优化层:IR 转换与静态优化
- 后端执行层:通过 EP 对接硬件加速库
- 内存管理层:跨设备内存分配与异步流水线
三、Web端推理
3.1 安装
onnxruntime-web
可以通过 npm 安装:
bash
npm install onnxruntime-web
或者通过 <script>
标签引入:
html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>
3.2基本使用
以下是在浏览器中运行一个 ONNX 模型的示例。
(1) 加载模型
确保您有一个经过训练的 ONNX 模型。例如,一个名为 model.onnx
的模型文件。
(2) 示例代码
以下是一个完整的示例,展示如何使用 onnxruntime-web
在浏览器中运行模型。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ONNX Runtime Web Example</title>
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>
</head>
<body>
<h1>ONNX Runtime Web Example</h1>
<p>Check the console for results.</p>
<script>
(async () => {
try {
// 加载 ONNX 模型
const session = await ort.InferenceSession.create('model.onnx');
// 创建输入数据,假设模型需要一个大小为 [1, 3, 224, 224] 的张量
const inputTensor = new ort.Tensor('float32', new Float32Array(1 * 3 * 224 * 224), [1, 3, 224, 224]);
// 运行推理
const feeds = { input: inputTensor };
const results = await session.run(feeds);
// 打印输出结果
console.log('Model output:', results);
} catch (err) {
console.error('Error running model:', err);
}
})();
</script>
</body>
</html>
3.3 runtime支持
-
WebAssembly (WASM) :
- 默认runtime,适用于大部分浏览器。
- 优点:跨平台,性能稳定,不依赖 GPU。
-
WebGL:
- 可选runtime,利用 GPU 进行推理加速。
- 优点:在支持 WebGL 的设备上显著提高推理性能。
(1) 如何切换runtime
javascript
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm'] // 或 'webgl'
});
3.4 优势
-
降低延迟:模型运行于本地浏览器,无需将数据发送到服务器,从而大幅减少网络延迟。
-
提升隐私:数据不会离开用户的设备,适用于对隐私敏感的应用场景(如医疗或金融领域)。
-
成本降低:无需部署后端推理服务器,减少服务器资源占用和维护成本。
-
兼容性强:支持大多数现代浏览器(如 Chrome、Firefox、Edge)和 Node.js 环境。
-
无需安装额外插件:基于 WebAssembly (WASM) 和 WebGL 技术,直接运行于浏览器环境。
-
跨设备:支持运行在桌面端、移动端或嵌入式设备上的浏览器
-
WebAssembly (WASM) :提供接近原生代码的性能,适用于 CPU 上的高效推理。
-
WebGL 加速:利用 GPU 提供更快的推理性能,适合处理较大的模型或实时推理任务。
-
轻量化依赖 :仅需引入
onnxruntime-web
库,无需复杂的后端配置。 -
快速集成:通过简单的 JavaScript API 加载和运行 ONNX 模型。
-
模型复用:支持直接使用训练完成的 ONNX 模型,无需额外转换。
-
ONNX 标准支持:兼容大多数机器学习框架(如 PyTorch、TensorFlow、Keras 等)导出的 ONNX 模型。
-
灵活性强:可以运行从简单的逻辑模型到复杂的深度学习模型。
3.5 使用场景展望
-
图像分类:在浏览器中直接对图片进行分类,例如识别物体、场景或动物。
-
面部识别:在本地设备上进行面部验证或表情识别,避免将敏感数据上传到云端。
-
实时语音处理:使用语音识别模型将用户语音转换为文字,或进行语义分析。
-
推荐系统:在前端运行推荐算法,根据用户的行为实时推荐内容。