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

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

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

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

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

相关推荐
予安灵5 分钟前
Vue.js 模板语法全解析:从基础到实战应用
前端·javascript·vue.js·vue指令·vue生命周期·vue项目结构·vue插值
瑾凌15 分钟前
Cesium 自定义路径导航材质
前端·javascript·vue.js·vue·材质·cesium
池鱼ipou29 分钟前
面试必看:深入浅出 JavaScript 事件循环与异步编程技巧
前端·javascript·面试
刺客-Andy41 分钟前
开发中常用的设计模式 用法及注意事项
开发语言·前端·javascript·设计模式
uperficialyu1 小时前
2025年03月18日柯莱特(外包宁德)一面前端面试
前端·面试·职场和发展
MINO吖1 小时前
vue-cli如何正确关闭prefetchprefetch和preload
前端·javascript·vue.js
男Ren、麦根1 小时前
用 Pinia 点燃 Vue 3 应用:状态管理革新之旅
前端·javascript·vue.js
泷羽Sec-pp1 小时前
WebDeveloper靶机详解
linux·服务器·前端·网络·chrome
肥肥呀呀呀2 小时前
flutter本地运行web端图片跨域解决
前端·flutter
痴心阿文2 小时前
新版 React19使用 react-quill
前端·npm·node.js