Transformer.js(七):ONNX 后端介绍 - 它是什么、如何将pytorch模型导出为ONNX格式并在web中使用

news2024/11/30 18:37:12

在前面的文章中,我介绍了关于transformer.js的一些内容,快速连接:

  • 1. 运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景
  • 2. 关于pipe管道的一切
  • 3. 底层架构及性能优化指南
  • 4. 型接口介绍
  • 5. Tokenizer 分词器接口解析
  • 6. 处理工具介绍

再介绍接口一类的又有点繁琐,于是本文将深入探讨 Transformer.js 中的 ONNX 后端 - 也就是运行大模型的黑盒子,并讨论什么是“后端”,什么是 ONNX,如何配置 ONNX 后端,以及其他的一些常用后端选项。本文旨在帮助你理解如何高效地使用 Transformer.js,尤其是在深度学习推理任务中选择合适的后端以实现最佳性能。

复习一下:在前后端开发中的后端一般指服务器端,编程语言中的后端一般指语言执行的环境,大模型运行的后端指的是模型运行的环境或引擎
在这里插入图片描述

什么是“后端”?

在深度学习中,后端是指用于执行模型计算的底层引擎或框架。换句话说,后端是处理神经网络推理、矩阵运算等复杂计算的基础设施。在 Transformer.js 中,后端负责实际的推理计算,通过执行模型的数学操作来生成结果。后端的选择对于模型推理的效率、速度和硬件支持有直接的影响。

常见的后端包括:

  • TensorFlow.js:支持 JavaScript 进行模型推理和训练,适用于 CPU 和 GPU。
  • ONNX:一个用于运行预训练模型的开放标准,可以在各种硬件上高效运行。
  • WebGPU/WebGL:适合在浏览器环境中加速图像或深度学习计算。
  • 其他如 CPU 或 GPU 的计算引擎,如 XNNPACK 或 WebNN。

Transformer.js 通过提供多种后端支持,让用户能够灵活地在不同的硬件和环境下部署 Transformer 模型。

什么是 ONNX?

ONNX(Open Neural Network Exchange) 是一个开源的深度学习模型互操作格式。它由 Facebook 和微软联合推出,旨在提供跨框架的通用深度学习模型格式,使模型在多个框架和硬件之间轻松转换和运行。ONNX 支持主流的深度学习库,包括 PyTorch、TensorFlow、Keras 等,允许开发者轻松将模型导出到 ONNX 格式,并使用适配 ONNX 的推理引擎进行高效推理。

ONNX 的优势

  1. 可移植性:ONNX 提供了跨平台的兼容性,可以在不同的环境和硬件上运行,比如从服务器迁移到边缘设备。
  2. 高性能:ONNX 推理运行时(如 ONNX Runtime)经过高度优化,可以利用 CPU、GPU 和其他加速器进行推理,性能卓越。
  3. 广泛支持:由于其开源和标准化特性,ONNX 得到了广泛支持和社区贡献,集成了多种硬件加速和框架插件。

在 Transformer.js 中,ONNX 后端允许我们加载和执行 ONNX 格式的预训练模型,从而充分利用其跨平台和高性能推理的优势。

ONNX 的使用与配置

为了在 Transformer.js 中使用 ONNX 后端,需要将模型导出为 ONNX 格式,并安装适用于 JavaScript 的 ONNX Runtime。下面介绍下如何配置 ONNX 后端。

第一步:导出模型为 ONNX 格式

要使用 ONNX 后端,首先需要将深度学习模型转换为 ONNX 格式。以 PyTorch 为例,可以通过以下代码将 PyTorch 模型导出为 ONNX:

import torch
import torchvision

# 假设有一个简单的模型,如 ResNet18
model = torchvision.models.resnet18(pretrained=True)
dummy_input = torch.randn(1, 3, 224, 224)  # 模型输入的示例张量

# 导出模型
torch.onnx.export(model, dummy_input, "resnet18.onnx", opset_version=11)

这里,将模型和输入数据导出为一个 resnet18.onnx 文件。

第二步:安装 ONNX Runtime for JavaScript

为了在 JavaScript 环境中使用 ONNX 模型,需要安装 ONNX Runtime。可以通过 npm 安装:

npm install onnxruntime-web

onnxruntime-web 是一个针对 Web 环境的优化版本,允许在浏览器中高效地加载和推理 ONNX 模型。

第三步:加载和推理 ONNX 模型

在安装完成后,可以使用 ONNX Runtime 来加载和执行 ONNX 模型。以下是使用 ONNX Runtime 的简单示例:

const ort = require('onnxruntime-web');

// 加载模型
async function runModel() {
  const session = await ort.InferenceSession.create('./resnet18.onnx');
  
  // 创建输入数据
  const input = new ort.Tensor('float32', new Float32Array(1 * 3 * 224 * 224), [1, 3, 224, 224]);
  
  // 进行推理
  const results = await session.run({ input: input });
  
  console.log(results);
}

runModel();

这段代码展示了如何加载 resnet18.onnx 文件,并将一个形状为 [1, 3, 224, 224] 的张量输入到模型中进行推理。ONNX Runtime 会利用合适的硬件加速进行推理,确保效率最大化。

ONNX 后端的优化配置

ONNX Runtime 提供了多种优化配置,例如可以利用 GPU 来加速推理。默认情况下,ONNX Runtime 会使用 CPU 运行,但可以显式指定后端设备:

const session = await ort.InferenceSession.create('./resnet18.onnx', {
  executionProviders: ['webgl']  // 也可以是 'cpu' 或 'webgpu'
});

在配置时可以选择执行提供程序,如 WebGL 或 WebGPU,从而在浏览器环境中充分利用 GPU 的计算能力。

其他后端

除了 ONNX 后端,Transformer.js 还支持其他后端,主要包括:

1. TensorFlow.js

TensorFlow.js 是另一个非常常见的后端,特别适用于在浏览器和 Node.js 环境中执行深度学习模型。它通过 TensorFlow 引擎提供强大的计算能力,并支持使用 GPU 加速推理。它还可以轻松地转换 TensorFlow 模型,适合那些已有 TensorFlow 生态的用户。

2. WebGL / WebGPU

WebGLWebGPU 是专为在浏览器环境下进行计算优化的后端。它们提供对浏览器内 GPU 资源的直接访问,从而使模型推理更加快速。WebGPU 相较于 WebGL 是一个更新的标准,具有更强的性能和灵活性,尤其适合那些需要大规模并行计算的应用。

3. XNNPACK

XNNPACK 是一个高效的神经网络推理库,特别适合移动设备和低功耗环境。它在 Transformer.js 中可以作为 CPU 后端使用,以实现良好的性能和资源利用率。

4. WebNN

WebNN 是一个 JavaScript API,旨在为 Web 应用提供标准化的神经网络推理接口。它允许开发者利用底层硬件的加速器,如 GPU 和专用的 AI 芯片。WebNN 在浏览器中运行时可以直接利用系统的计算资源,从而提高推理性能。

总结

ONNX 后端是 Transformer.js 提供的一种高效且通用的推理解决方案,它的跨平台特性使得模型在不同环境之间轻松迁移成为可能。同时,ONNX Runtime 的优化使得模型推理变得更加快速和灵活。除了 ONNX 后端,Transformer.js 还支持 TensorFlow.js、WebGL/WebGPU、XNNPACK 等后端,使开发者可以根据实际需求选择最合适的解决方案。

由于onnx算是一种通用标准的模型结构,所以你可以将绝大多数的pytorch或者tensorflow的模型导出为onnx格式,huggingface的modal card里面的files目录也可以查看是否有onnx目录来确定是否支持在web里面跑

现在web运行大模型的调整可能还是在:加载模型耗时长+推理速度慢(webgpu还未普及),量化+优化(优化指南)可以一定程度的解决,但任重道远

2024-11-26 心情一般,目前正讨薪 - -!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玄机应急:linux入侵排查webshell查杀日志分析

目录 第一章linux:入侵排查 1.web目录存在木马,请找到木马的密码提交 2.服务器疑似存在不死马,请找到不死马的密码提交 3.不死马是通过哪个文件生成的,请提交文件名 4.黑客留下了木马文件,请找出黑客的服务器ip提交 5.黑客留…

消息队列详解:从基础到高级应用

本文主旨 撰写这篇文章的目的在于向读者提供一个全面理解消息队列概念及其在实际应用中重要性的指南。通过从RocketMQ的基础组件如生产者、消费者、主题等的介绍到更高级的概念,比如集群消费与广播消费的区别、顺序消息的重要性等,我们希望能够帮助开发…

qt QGraphicsRotation详解

1、概述 QGraphicsRotation 是 Qt 框架中 QGraphicsTransform 的一个子类,它专门用于处理图形项的旋转变换。通过 QGraphicsRotation,你可以对 QGraphicsItem(如形状、图片等)进行旋转操作,从而创建动态和吸引人的视觉…

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libtinfo.so.5的问题 2024/11/29 20:41 缘起:中科创达的高通CM6125开发板的Android10的编译环境需要。 [ 11% 15993/135734] target Java source list: vr [ 11% 15994/135734] target …

云轴科技ZStack助力 “上科大智慧校园信创云平台”入选上海市2024年优秀信创解决方案

近日,为激发创新活⼒,促进信创⾏业⾼质量发展,由上海市经济信息化委会同上海市委网信办、上海市密码管理局、上海市国资委等主办的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕。云轴科技ZStack支持的“上科大智慧校园信创云平台”…

【ArcGIS Pro】实现一下完美的坐标点标注

在CAD里利用湘源可以很快点出一个完美的坐标点标注。 但是在ArcGIS Pro中要实现这个效果却并不容易。 虽然有点标题党,这里就尽量在ArcGIS Pro中实现一下。 01 标注实现方法 首先是准备工作,准备一个点要素图层,包含xy坐标字段。 在地图框…

聚云科技×亚马逊云科技:打通生成式AI落地最后一公里

云计算时代,MSP(云管理服务提供商)犹如一个帮助企业上云、用云、管理云的专业管家,在云计算厂商与企业之间扮演桥梁的作用。生成式AI浪潮的到来,也为MSP带来全新的生态价值和发展空间。 作为国内领先的云管理服务提供…

brew安装mongodb和php-mongodb扩展新手教程

1、首先保证macos下成功安装了Homebrew, 在终端输入如下命令: brew search mongodb 搜索是不是有mongodb资源, 演示效果如下: 2、下面来介绍Brew 安装 MongoDB,代码如下: brew tap mongodb/brew brew in…

图像显示的是矩阵的行和列,修改为坐标范围。

x 3; y 3; f1x x^2 y^2; guance1 f1x; F (x, y) sqrt((x.^2 y.^2 - guance1).^2); % 使用点乘 [x, y] meshgrid(0:1:5, 0:1:5); Z F(x, y); figure; imagesc(Z); % 由于 imagesc 使用矩阵索引作为坐标,我们需要手动添加刻度 % 这里我们假设 x 和 y 的范围…

深入理解Redis线程模型

前置目标:搭建一个Redis单机服务器。搭建过程参考前面的文档(https://blog.csdn.net/Zhuxiaoyu_91/article/details/143904807)。 建议调整的redis核心配置: daemonize yes # 允许后台启动 protected‐mode no #关闭保护模…

机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)

项目描述 任务:根据训练集数据中的数据预测泰坦尼克号上哪些乘客能生存下来 数据源:csv文件(train.csv) 目标变量:Survived(0-1变量) 数据集预览: 1、英文描述: 2、…

人工智能之数学基础:欧式距离及在人工智能领域中的应用

本文重点 欧式距离,也称为欧几里得距离,是数学中用于衡量多维空间中两点之间绝对距离的一种基本方法。这一概念最早由古希腊数学家欧几里得提出,并以其名字命名。欧式距离的计算基于勾股定理,即在一个直角三角形中,斜边的平方等于两直角边的平方和。在多维空间中,欧式距…

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…

洛谷 P1747 好奇怪的游戏 C语言 bfs

题目&#xff1a; https://www.luogu.com.cn/problem/P1747#submit 题目描述 爱与愁大神坐在公交车上无聊&#xff0c;于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘&#xff1a;***&#xff08;游戏名被打上了马赛克&#xff09;。这个游戏类似象棋&#xff0c;但…

【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.set和map的初步封装1.树的节点封装修改2.Find()查找函数3.红…

字符型注入‘)闭合

前言 进行sql注入的时候&#xff0c;不要忘记闭合&#xff0c;先闭合再去获取数据 步骤 判断是字符型注入 用order by获取不了显位&#xff0c;select也一样 是因为它是’)闭合&#xff0c;闭合之后&#xff0c;就可以获取数据了 最后就是一样的步骤

电脑启动需要经历哪些过程?

传统BIOS启动流程 1. BIOS BIOS 启动&#xff0c;BIOS程序是烧进主板自带的ROM里的&#xff0c;所以无硬盘也可以启动。BIOS先进行自检&#xff0c;检查内存、显卡、磁盘等关键设备是否存在功能异常&#xff0c;会有蜂鸣器汇报错误&#xff0c;无错误自检飞快结束。 硬件自检…

PYNQ 框架 - OV5640驱动 + Linux 驱动分析

目录 1. 简介 1.1 博文要点 1.2 V4L2 2. 极简 Char 驱动 2.1 源码 2.2 Makefile 2.3 加载驱动 2.4 设备文件 2.5 测试驱动程序 2.6 卸载驱动程序 2.7 自动创建设备文件 2.8 日志等级 3. 极简 V4L2 驱动 3.1 源码 3.2 Makefile 3.3 设备节点类型 3.4 测试 V4L2…

微信小程序Webview与H5通信

背景 近期有个微信小程序需要用到web-view嵌套H5的场景&#xff0c;该应用场景需要小程序中频繁传递数据到H5进行渲染&#xff0c;且需要保证页面不刷新。 由于微信小程序与H5之间的通信限制比较大&#xff0c;显然无法满足于我的业务场景 探索 由于微信小程序与webview的环境是…

【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程

IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;是一款功能强大的集成开发环境&#xff0c;广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven&#xff0c;并创建一个 Maven Java 工程&#xff0c;快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …