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

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

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

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

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

相关推荐
崔庆才丨静觅8 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅1 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅2 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊2 小时前
jwt介绍
前端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax