ONNXRuntime-Extensions
ONNXRuntime-Extensions 是一个库,它通过 ONNX 运行时的自定义运算符接口扩展了 ONNX 模型和推理的功能。它包含一组自定义运算符,用于支持音频、视觉、文本和语言模型的常见模型预处理和后处理。与 ONNX 运行时一样,Extensions 也支持多种语言和平台(Windows/Linux/macOS 上的 Python、Android 和 iOS 移动平台以及用于 Web 的 WebAssembly)。
基本工作流程是将自定义运算符添加到 ONNX 模型,然后使用 ONNX 运行时和 ONNXRuntime-Extensions 包对增强的模型执行推理。
此图像是使用 Combine.AI 创建的,Combine.AI 由 Bing Chat、Bing Image Creator 和 EdgeGPT 提供支持。
快速入门
Python 安装
pip install onnxruntime-extensions
每夜构建
在 Windows 上
pip install --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple/ onnxruntime-extensions
onnxruntime-extensions 包依赖于 onnx 和 onnxruntime。
在 Linux/macOS 上
请确保在执行以下命令之前安装了编译器工具包,如 gcc(高于 g++ 8.0)或 clang
python -m pip install git+https://github.com/microsoft/onnxruntime-extensions.git
NuGet 安装(使用 .NET CLI)
dotnet add package Microsoft.ML.OnnxRuntime.Extensions --version 0.8.1-alpha
iOS 安装
在您的 CocoaPods Podfile
中,添加 onnxruntime-extensions-c
pod。
use_frameworks!
# onnxruntime C/C++ full package
pod 'onnxruntime-c'
# onnxruntime-extensions C/C++ package
pod 'onnxruntime-extensions-c'
运行 pod install
。
Android 安装
在您的 Android Studio 项目中,对以下内容进行更改
-
build.gradle (Project)
repositories { mavenCentral() }
-
build.gradle (Module)
dependencies { // onnxruntime full package implementation 'com.microsoft.onnxruntime:onnxruntime-android:latest.release' // onnxruntime-extensions package implementation 'com.microsoft.onnxruntime:onnxruntime-extensions-android:latest.release' }
向模型添加预处理和后处理
有多种方法可以向 ONNX 图添加预处理和后处理
- 如果管道 API 支持模型及其预处理,请使用预处理管道 API
- 从 PyTorch 模型导出到 ONNX
- 创建一个包含自定义运算符节点的模型图的 ONNX 模型
- 如果您已经在一个 ONNX 图中进行了预处理,请使用 ONNX API 将预处理与 ONNX 模型组合起来
如果预处理运算符是 HuggingFace 分词器,您还可以通过从 Huggingface transformer 数据处理类(例如以下示例中)进行转换来轻松获取 ONNX 处理图
import onnxruntime as _ort
from transformers import AutoTokenizer, GPT2Tokenizer
from onnxruntime_extensions import OrtPyFunction, gen_processing_models
# SentencePieceTokenizer
spm_hf_tokenizer = AutoTokenizer.from_pretrained("t5-base", model_max_length=512)
spm_onnx_model = OrtPyFunction(gen_processing_models(spm_hf_tokenizer, pre_kwargs={})[0])
# GPT2Tokenizer
gpt2_hf_tokenizer = GPT2Tokenizer.from_pretrained("Xenova/gpt-4", use_fast=False)
gpt2_onnx_model = OrtPyFunction(gen_processing_models(gpt2_hf_tokenizer, pre_kwargs={})[0])
有关更多信息,您可以查看使用以下 API:
help(onnxruntime_extensions.gen_processing_models)
如果我找不到我需要的自定义运算符怎么办?
在此处查找我们当前支持的自定义运算符 here。如果您没有找到您需要的自定义运算符,您可以像 这样 向 ONNX 运行时扩展添加新的自定义运算符。请注意,如果您确实添加了新的运算符,则必须从源代码构建。
使用 ONNX 运行时和扩展进行推理
Python
以下语言有单独的软件包,请为构建安装它。
import onnxruntime as _ort
from onnxruntime_extensions import get_library_path as _lib_path
so = _ort.SessionOptions()
so.register_custom_ops_library(_lib_path())
# Run the ONNXRuntime Session as per ONNXRuntime docs suggestions.
sess = _ort.InferenceSession(model, so)
sess.run (...)
C++
使用扩展共享库的路径注册扩展。
Ort::Env env = ...;
// Note: use `wchar_t` instead of `char` for paths on Windows
const char* model_uri = "/path/to/the/model.onnx";
const char* custom_op_library_filename = "/path/to/the/onnxruntime-extensions/shared/library";
Ort::SessionOptions session_options;
// Register Extensions custom ops with the session options.
Ort::ThrowOnError(Ort::GetApi().RegisterCustomOpsLibrary_V2(static_cast<OrtSessionOptions*>(session_options),
custom_op_library_filename));
// Create a session.
Ort::Session session(env, model_uri, session_options);
通过直接调用 RegisterCustomOps
函数来注册扩展。
Ort::Env env = ...;
// Note: use `wchar_t` instead of `char` for paths on Windows
const char* model_uri = "/path/to/the/model.onnx";
Ort::SessionOptions session_options;
// Register Extensions custom ops with the session options.
// `RegisterCustomOps` is declared in onnxruntime_extensions.h.
Ort::ThrowOnError(RegisterCustomOps(static_cast<OrtSessionOptions*>(session_options), OrtGetApiBase()));
// Create a session.
Ort::Session session(env, model_uri, session_options);
Java
var env = OrtEnvironment.getEnvironment();
var sess_opt = new OrtSession.SessionOptions();
/* Register the custom ops from onnxruntime-extensions */
sess_opt.registerCustomOpLibrary(OrtxPackage.getLibraryPath());
C#
SessionOptions options = new SessionOptions();
options.RegisterOrtExtensions();
session = new InferenceSession(model, options);
教程
查看一些使用我们的自定义运算符的端到端教程
贡献
本项目欢迎贡献和建议。大多数贡献都要求您同意贡献者许可协议 (CLA),声明您有权并将实际授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.microsoft.com。
当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA,并适当地修饰 PR(例如,标签、注释)。只需按照机器人提供的说明进行操作即可。您只需在使用我们 CLA 的所有存储库中执行此操作一次。
本项目已采纳 Microsoft 开源行为准则。有关更多信息,请参阅 行为准则 FAQ 或通过 opencode@microsoft.com 联系我们,提出任何其他问题或意见。