!我是如何把大模型搬到Web推理的

我是如何把大模型搬到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 使用场景展望

  • 图像分类:在浏览器中直接对图片进行分类,例如识别物体、场景或动物。

  • 面部识别:在本地设备上进行面部验证或表情识别,避免将敏感数据上传到云端。

  • 实时语音处理:使用语音识别模型将用户语音转换为文字,或进行语义分析。

  • 推荐系统:在前端运行推荐算法,根据用户的行为实时推荐内容。

相关推荐
开心小老虎1 小时前
threeJs实现裸眼3D小狗
前端·3d·threejs
龙井>_<2 小时前
vue3使用keep-alive缓存组件与踩坑日记
前端·vue.js·缓存
Captaincc2 小时前
OpenAI以API的形式发布了三 个新模型:GPT-4.1、GPT-4.1 mini 和 GPT-4.1 nano
前端·openai
A-Kamen4 小时前
Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
前端·webpack·node.js
codingandsleeping4 小时前
OPTIONS 预检请求
前端·网络协议·浏览器
程序饲养员5 小时前
ReactRouter7.5: NavLink 和 Link 的区别是什么?
前端·javascript·react.js
小小小小宇6 小时前
CSS 层叠上下文总结
前端
拉不动的猪6 小时前
设计模式之------命令模式
前端·javascript·面试
Json____6 小时前
springboot框架集成websocket依赖实现物联网设备、前端网页实时通信!
前端·spring boot·websocket·实时通信
uhakadotcom6 小时前
Bun vs Node.js:何时选择 Bun?
前端·javascript·面试