ONNXRuntime-Extensions
ONNXRuntime-Extensions ist eine Bibliothek, die die Fähigkeiten von ONNX-Modellen und die Inferenz mit ONNX Runtime über die ONNX Runtime Custom Operator-Schnittstelle erweitert. Sie enthält eine Reihe von benutzerdefinierten Operatoren zur Unterstützung gängiger Modellvor- und -nachbearbeitungen für Audio-, Bild-, Text- und Sprachmodelle. Wie ONNX Runtime unterstützt Extensions auch mehrere Sprachen und Plattformen (Python unter Windows/Linux/macOS, mobile Plattformen Android und iOS sowie WebAssembly für das Web).
Der grundlegende Workflow besteht darin, die benutzerdefinierten Operatoren zu einem ONNX-Modell hinzuzufügen und dann die Inferenz auf dem erweiterten Modell mit den Paketen ONNX Runtime und ONNXRuntime-Extensions durchzuführen.
Dieses Bild wurde mit Combine.AI erstellt, das von Bing Chat, Bing Image Creator und EdgeGPT angetrieben wird.
Schnellstart
Python-Installation
pip install onnxruntime-extensions
Nightly Build
Unter Windows
pip install --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple/ onnxruntime-extensions
Das Paket onnxruntime-extensions hängt von onnx und onnxruntime ab.
Unter Linux/macOS
Bitte stellen Sie sicher, dass das Compiler-Toolkit wie gcc (später als g++ 8.0) oder clang installiert ist, bevor Sie den folgenden Befehl ausführen
python -m pip install git+https://github.com/microsoft/onnxruntime-extensions.git
NuGet-Installation (mit .NET CLI)
dotnet add package Microsoft.ML.OnnxRuntime.Extensions --version 0.8.1-alpha
iOS-Installation
Fügen Sie in Ihrer CocoaPods Podfile den Pod onnxruntime-extensions-c hinzu.
use_frameworks!
# onnxruntime C/C++ full package
pod 'onnxruntime-c'
# onnxruntime-extensions C/C++ package
pod 'onnxruntime-extensions-c'
Führen Sie pod install aus.
Android-Installation
Nehmen Sie in Ihrem Android Studio-Projekt die folgenden Änderungen vor:
-
build.gradle (Projekt)
repositories { mavenCentral() } -
build.gradle (Modul)
dependencies { // onnxruntime full package implementation 'com.microsoft.onnxruntime:onnxruntime-android:latest.release' // onnxruntime-extensions package implementation 'com.microsoft.onnxruntime:onnxruntime-extensions-android:latest.release' }
Vor- und Nachbearbeitung zum Modell hinzufügen
Es gibt mehrere Möglichkeiten, Vor- und Nachbearbeitungen zu einem ONNX-Graphen hinzuzufügen
- Verwenden Sie die Pipeline-API für die Vorbearbeitung, wenn das Modell und seine Vorbearbeitung von der Pipeline-API unterstützt werden
- Exportieren nach ONNX aus einem PyTorch-Modell
- Erstellen Sie ein ONNX-Modell mit einem Modellgraphen, der Ihren benutzerdefinierten Operator-Knoten enthält
- Kombinieren Sie die Vorbearbeitung mit einem ONNX-Modell unter Verwendung von ONNX-APIs, wenn Sie die Vorbearbeitung bereits in einem ONNX-Graphen haben
Wenn der Vorbearbeitungsoperator ein HuggingFace-Tokenizer ist, können Sie den ONNX-Verarbeitungsgraphen auch einfach erhalten, indem Sie ihn aus Huggingface-Transformer-Datenverarbeitungsklassen konvertieren, wie im folgenden Beispiel
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])
Weitere Informationen finden Sie in der API unter folgendem Link
help(onnxruntime_extensions.gen_processing_models)
Was, wenn ich den gesuchten benutzerdefinierten Operator nicht finden kann?
Hier finden Sie die von uns derzeit unterstützten benutzerdefinierten Operatoren. Wenn Sie den gesuchten benutzerdefinierten Operator nicht finden, können Sie einen neuen benutzerdefinierten Operator zu ONNX Runtime Extensions hinzufügen, wie hier. Beachten Sie, dass Sie bei Hinzufügung eines neuen Operators aus dem Quellcode kompilieren müssen.
Inferenz mit ONNX Runtime und Extensions
Python
Es gibt einzelne Pakete für die folgenden Sprachen, bitte installieren Sie sie für die Erstellung.
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++
Registrieren Sie Extensions mit einem Pfad zur Shared Library von Extensions.
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);
Registrieren Sie Extensions durch direkten Aufruf der Funktion 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);
Tutorials
Schauen Sie sich einige End-to-End-Tutorials mit unseren benutzerdefinierten Operatoren an
- NLP: Ein End-to-End-BERT-Tutorial
- Audio: Verwendung von Audio-Encoding und -Decoding für Whisper
- Bild: Das YOLO-Modell mit unserem DrawBoundingBoxes-Operator
Mitwirkung
Dieses Projekt begrüßt Beiträge und Vorschläge. Die meisten Beiträge erfordern, dass Sie einer Contributor License Agreement (CLA) zustimmen, die besagt, dass Sie das Recht haben und tatsächlich gewähren, uns die Rechte zur Nutzung Ihres Beitrags zu gewähren. Details finden Sie unter https://cla.microsoft.com.
Wenn Sie eine Pull-Anfrage einreichen, ermittelt ein CLA-Bot automatisch, ob Sie eine CLA bereitstellen müssen, und versieht die PR entsprechend (z. B. mit einem Label, einem Kommentar). Folgen Sie einfach den Anweisungen des Bots. Sie müssen dies nur einmal über alle Repositories hinweg tun, die unsere CLA verwenden.
Dieses Projekt hat den Microsoft Open Source Code of Conduct übernommen. Weitere Informationen finden Sie in den FAQs zum Verhaltenskodex oder wenden Sie sich mit weiteren Fragen oder Kommentaren an opencode@microsoft.com.