\n\n\n\n Mein Werdegang: Anpassung & Einsatz von Kleineren AI-Modellen - AgntBox Mein Werdegang: Anpassung & Einsatz von Kleineren AI-Modellen - AgntBox \n

Mein Werdegang: Anpassung & Einsatz von Kleineren AI-Modellen

📖 11 min read2,070 wordsUpdated Mar 30, 2026

Hallo zusammen, hier ist Nina, zurück auf agntbox.com! Heute möchte ich über etwas sprechen, das in meinen Slack-Kanälen viel Aufsehen erregt und meine nächtlichen Programmier-Sessions verfolgt: KI-Frameworks. Genauer gesagt, möchte ich einen bestimmten Bereich erkunden, der oft übersehen wird, während alle auf der Jagd nach dem neuesten LLM sind: die Werkzeuge rund um das Fine-Tuning und das Deployment für kleinere, spezialisierte Modelle.

Wir alle kennen die großen Namen – TensorFlow, PyTorch. Das sind die Giganten, die etablierten Akteure. Zu Recht! Sie sind unglaublich leistungsstark und vielseitig. Aber seien wir realistisch, manchmal braucht man keinen Flugzeugträger, um einen Teich zu überqueren. Manchmal braucht man ein wendiges Motorboot, besonders wenn man unter Zeitdruck steht, mit einem spezifischen Datensatz arbeitet und ein klares Ziel vor Augen hat. Genau darüber möchte ich sprechen, mit etwas, das mir in letzter Zeit ziemlich angenehm ist: Hugging Face Optimum für ONNX Runtime.

Jetzt, bevor eure Augen in den Abkürzungen verloren gehen, lasst mich das erklären. Hugging Face ist natürlich der Liebling der NLP-Welt und macht vortrainierte Modelle für alle zugänglich. ONNX (Open Neural Network Exchange) ist ein offener Standard zur Darstellung von Machine-Learning-Modellen, was im Wesentlichen bedeutet, dass man Modelle, die in einem Framework (wie PyTorch) trainiert wurden, in einem anderen (wie TensorFlow oder in unserem Fall, ONNX Runtime) ausführen kann. Und ONNX Runtime? Das ist die Hochleistungs-Inferenz-Engine von Microsoft.

Was also macht Hugging Face Optimum für ONNX Runtime? Es ist im Wesentlichen eine Brücke, ein Optimierer und ein Deployment-Assistent in einem. Es hilft dir, deine Hugging Face-Modelle zu optimieren für die Inferenz mit ONNX Runtime und oft erhält man einen signifikanten Geschwindigkeitsvorteil, ohne viel (oder keine) Genauigkeit zu opfern. Und das, meine Freunde, ist Gold wert.

Warum ich im Moment von Optimum ONNX Runtime besessen bin

Mein Weg mit Optimum ONNX Runtime begann, wie die meisten meiner technischen Besessenheiten, mit einem Problem. Ich arbeitete an einem Projekt für einen Kunden, das die Bereitstellung eines relativ kleinen BERT-Modells für die Textklassifizierung von Support-Anfragen beinhaltete. Das Modell war auf einem benutzerdefinierten Datensatz trainiert worden, und obwohl es sehr gut funktionierte, war die Inferenzzeit einfach ein wenig zu langsam für eine Echtzeit-Kundeninteraktion. Wir sprachen von etwa 150-200 ms pro Inferenz auf einer leistungsstarken GPU, was nicht schrecklich ist, aber für hochvolumige und Echtzeitanwendungen zählt jede Millisekunde.

Ich hatte alle üblichen Verdächtigen ausprobiert: Batching, Optimierung der Eingabepipelines, sogar einige grundlegende Quantifizierungen. Wir haben einige Verbesserungen erzielt, aber nichts Dramatisches. Dann erwähnte ein Kollege Optimum und speziell dessen Integration mit ONNX. Ich war zunächst skeptisch. Eine weitere Abstraktionsschicht? Mehr Abhängigkeiten? Aber ich war verzweifelt, also wagte ich es.

Was ich entdeckte, war ein überraschend einfacher Workflow, der Ergebnisse lieferte. Es gelang uns, unsere Inferenzzeit auf etwa 50-70 ms pro Inferenz auf derselben GPU zu reduzieren, und wir sahen sogar anständige Leistungen auf einer CPU für weniger kritische Aufgaben. Das ist ein Gewinn von 2-3 Mal, was in der Welt der Echtzeit-KI ein riesiger Sieg ist. Das bedeutete, dass wir unseren Service viel effizienter skalieren konnten und schnellere Antworten für die Kunden bereitstellen konnten, was sich direkt auf ihr Erlebnis auswirkte.

Das Problem, das es löst: Leistung und Portabilität

Seien wir ehrlich, die Bereitstellung von KI-Modellen kann ein echtes Kopfzerbrechen sein. Du trainierst ein schönes Modell in PyTorch und dann musst du herausfinden, wie du es effizient in der Produktion zum Laufen bringst. Manchmal bist du mit einer bestimmten Hardwarekonfiguration gefangen, oder du musst auf einem Edge-Gerät mit begrenzten Ressourcen bereitstellen. Hier kommt ONNX ins Spiel. Es bietet ein gemeinsames Format, das dein Modell vom Trainingsframework entkoppelt.

Optimum geht sogar noch weiter. Es geht nicht nur darum, in ONNX zu konvertieren; es geht darum, dieses ONNX-Modell zu optimieren. Es kann Techniken anwenden wie Graphoptimierung, Operatorfusion und sogar dein Modell quantifizieren, um seine Größe zu reduzieren und die Inferenz zu beschleunigen, oft mit minimalem Einfluss auf die Genauigkeit. Das ist besonders nützlich für kleinere Modelle oder wenn du durch den Speicher oder die Berechnung auf deinem Ziel-Deployment beschränkt bist.

Der Anwendungsfall meines Kunden war ein perfektes Beispiel. Wir hatten ein PyTorch-Modell, aber wir wollten es auf einer Cloud-Instanz mit NVIDIA-GPUs bereitstellen, und wir benötigten eine maximale Durchsatzrate. Optimum ONNX Runtime ermöglichte es uns, das Modell zu exportieren, spezifische Optimierungen für unsere Zielhardware anzuwenden und es zum Laufen zu bringen wie ein Traum.

Beginnen mit Optimum ONNX Runtime: Ein praktisches Beispiel

Lass uns ein einfaches Beispiel durchgehen, wie du Optimum verwenden könntest, um ein Hugging Face-Modell für ONNX Runtime zu exportieren und zu optimieren. Dafür verwenden wir ein einfaches Sentiment-Analyse-Modell.

Zuerst musst du die benötigten Bibliotheken installieren:


pip install transformers optimum[onnxruntime] onnx

Jetzt lass uns ein wenig Python-Code schreiben, um ein vortrainiertes Sentiment-Analyse-Modell zu exportieren.

Beispiel 1: Export eines Sentiment-Analyse-Modells

Hier nehmen wir ein Standardmodell `distilbert-base-uncased-finetuned-sst-2-english` und exportieren es im ONNX-Format mit Optimum.


from transformers import pipeline
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer

model_id = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_id)

# Modell im ONNX-Format exportieren
# Das `save_directory` ist der Ort, an dem dein ONNX-Modell und dein Tokenizer gespeichert werden.
# `opset` gibt die Version der ONNX-Operator-Schnittstelle an.
# `input_names` sind wichtig, um die Eingaben deines ONNX-Grafen zu definieren.
onnx_path = "./onnx_sentiment_model/"
ort_model = ORTModelForSequenceClassification.from_pretrained(model_id, from_transformers=True)
ort_model.save_pretrained(onnx_path)
tokenizer.save_pretrained(onnx_path)

print(f"Modell und Tokenizer nach {onnx_path} exportiert")

Nachdem du das ausgeführt hast, hast du ein Verzeichnis mit dem Namen `onnx_sentiment_model`, das deine Datei `model.onnx` und die Tokenizer-Dateien enthält. Diese Datei `model.onnx` ist die optimierte Version, die bereit für ONNX Runtime ist.

Beispiel 2: Durchführung von Inferenz mit dem ONNX-Modell

Jetzt laden wir dieses exportierte Modell und führen einige Inferenz durch. Beachte, wie wir `ORTModelForSequenceClassification` direkt von dem `onnx_path` laden, wo wir es gespeichert haben.


from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer, pipeline
import time

onnx_path = "./onnx_sentiment_model/"

# Lade das ONNX-Modell und den Tokenizer
ort_model = ORTModelForSequenceClassification.from_pretrained(onnx_path)
tokenizer = AutoTokenizer.from_pretrained(onnx_path)

# Erstelle ein Pipeline für eine einfache Inferenz
onnx_pipeline = pipeline(
 "sentiment-analysis",
 model=ort_model,
 tokenizer=tokenizer,
 accelerator="ort" # Dies weist die Pipeline an, ONNX Runtime für die Inferenz zu verwenden
)

text_samples = [
 "Ich liebe dieses Produkt, es ist unglaublich!",
 "Dieser Film war nur okay, ein bisschen langweilig.",
 "Ich hasse es absolut, in langen Warteschlangen zu warten.",
 "Der Service war unglaublich schnell und effizient."
]

print("\n--- Durchführung der Inferenz mit dem ONNX-Modell ---")
start_time = time.time()
results = onnx_pipeline(text_samples)
end_time = time.time()

for i, res in enumerate(results):
 print(f"Text: '{text_samples[i]}' -> Label: {res['label']}, Score: {res['score']:.4f}")

print(f"Inferenzzeit für {len(text_samples)} Proben: {(end_time - start_time):.4f} Sekunden")

Wenn du das ausführst, siehst du die Sentiment-Vorhersagen. Noch wichtiger ist, dass du, wenn du die Inferenzzeit mit dem ursprünglichen PyTorch-Modell auf derselben Hardware vergleichst, wahrscheinlich einen bemerkenswerten Geschwindigkeitsgewinn erzielen würdest, insbesondere bei größeren Batches oder komplexeren Modellen. Der Parameter `accelerator=”ort”` in der Pipeline ist ein kleines, aber kraftvolles Signal, das Hugging Face anweist, ONNX Runtime für die Inferenz zu verwenden, hier passiert die Magie.

Beispiel 3: Kontrolle über Optimierungsfunktionen (Optional, aber Mächtig)

Optimum ermöglicht eine feinkörnige Kontrolle über den Optimierungsprozess. Zum Beispiel kannst du den Optimierungsgrad angeben oder sogar spezifische Grafikanpassungen auswählen. Das kann entscheidend sein, wenn du versuchst, jede letzte Leistung deines Modells herauszuholen oder wenn du Kompromisse zwischen Geschwindigkeit und Genauigkeit eingehen musst (z.B. mit der Quantifizierung).


from optimum.onnxruntime import ORTModelForSequenceClassification, ORTConfig
from transformers import AutoTokenizer
from optimum.exporters.tasks import TasksManager
from optimum.onnxruntime.configuration import AutoOptimizationConfig

model_id = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_id)

# Optimierungskonfiguration festlegen
# Hier verwenden wir die Standardoptimierung, aber Sie können sie weiter anpassen
# Zum Beispiel, um die Quantifizierung anzuwenden: `optimization_config = AutoOptimizationConfig.O2()`
optimization_config = AutoOptimizationConfig.O1() # O1 für Basisoptimierung, O2 für aggressivere Optimierung, O3 für vollständige Optimierung

# Modell mit expliziter Optimierungskonfiguration exportieren
onnx_path_optimized = "./onnx_sentiment_model_optimized/"
task = TasksManager.get_task_from_model_or_model_name(model_id)
# Möglicherweise müssen Sie den Parameter `feature` je nach Aufgabe Ihres Modells anpassen
# Für die Klassifizierung von Sequenzen ist es oft 'sequence-classification'
ORTModelForSequenceClassification.from_pretrained(
 model_id,
 from_transformers=True,
 export_feature=task.feature,
 optimization_config=optimization_config,
).save_pretrained(onnx_path_optimized)
tokenizer.save_pretrained(onnx_path_optimized)

print(f"Optimiertes Modell und Tokenizer nach {onnx_path_optimized} exportiert")

Der `AutoOptimizationConfig` ist hier Ihr Freund. `O1` bietet grundlegende graphische Optimierungen, `O2` fügt aggressivere Fusionen und Knoteneliminierungen hinzu, und `O3` umfasst alle verfügbaren Optimierungen, einschließlich Quantifizierung, sofern anwendbar. Die Auswahl des richtigen Niveaus hängt von Ihren spezifischen Bedürfnissen und der Hardware ab, auf die Sie abzielen. Für meinen Kunden haben wir zwischen `O1` und `O2` experimentiert, um den besten Kompromiss zu finden, wobei wir uns in Richtung `O2` bewegt haben, um das beste Gleichgewicht zwischen Geschwindigkeit und Genauigkeit zu erreichen.

Mein Feedback und Ausblick

Meine Erfahrung mit Hugging Face Optimum für ONNX Runtime war extrem positiv. Es ist keine Wunderlösung für jeden KI-Einsatz, aber es deckt ein sehr häufiges und kritisches Bedürfnis ab: Ihre Modelle schneller und effizienter in der Produktion zum Laufen zu bringen, besonders wenn Sie mit Hugging Face-Modellen arbeiten.

  • Leistungsverbesserung: Der Hauptvorteil ist die signifikante Reduzierung der Inferenzzeit. Für Echtzeitanwendungen kann dies zu einem erheblichen Unterschied führen, die Benutzererfahrung verbessern und die Infrastrukturkosten senken.
  • Portabilität: Durch die Konvertierung in ONNX werden Ihre Modelle tragbarer, ausführbar auf verschiedenen Hardware- und Betriebssystemen, ohne an ein spezifisches Deep-Learning-Framework gebunden zu sein.
  • Benutzerfreundlichkeit: Die Integration mit der Hugging Face `transformers`-Bibliothek ist bemerkenswert reibungslos. Wenn Sie bereits mit Hugging Face vertraut sind, ist die Lernkurve für Optimum ziemlich sanft.
  • Ressourceneffizienz: Optimierte Modelle benötigen oft weniger Speicher und CPU/GPU-Zyklen, was entscheidend für den Einsatz im Feld oder in kostenempfindlichen Cloud-Umgebungen ist.

Eine Sache, die ich gelernt habe, ist, dass es sich lohnt, mit verschiedenen Optimierungsstufen und -konfigurationen zu experimentieren. Geben Sie sich nicht mit den Standardeinstellungen zufrieden. Probieren Sie `O1`, `O2` und sogar `O3` (mit Quantifizierung, wenn Ihr Anwendungsfall es zulässt) aus und bewerten Sie die Ergebnisse auf Ihrer tatsächlichen Zielhardware. Die Gewinne können überraschend sein!

Mit Blick auf die Zukunft glaube ich, dass Werkzeuge wie Hugging Face Optimum noch wesentlicher werden. Während KI-Modelle zunehmen und in vielfältigere Bereitstellungsumgebungen integriert werden, wird die Fähigkeit, ihre Inferenz zu optimieren und zu rationalisieren, von entscheidender Bedeutung sein. Ich bin besonders gespannt, wie sich Optimum mit neuen Hardwarebeschleunigern und fortschrittlicheren Quantifizierungstechniken weiterentwickeln wird.

Praktische Tipps für Ihr nächstes KI-Projekt:

  1. Bewerten Sie Ihre Inferenzbedürfnisse: Bevor Sie die Optimierung erkunden, definieren Sie klar Ihre Leistungsanforderungen. Welche Latenz ist akzeptabel? Was ist Ihr Durchsatz-Ziel?
  2. Denken Sie frühzeitig an ONNX: Wenn Sie Hugging Face-Modelle verwenden und Leistung ein Anliegen ist, beginnen Sie bereits in Ihrem Entwicklungszyklus über den Export und die Optimierung von ONNX nachzudenken, nicht nur beim Deployment.
  3. Bewerten, Bewerten, Bewerten: Messen Sie immer die tatsächliche Leistungsverbesserung (oder -verschlechterung) nach Anwendung der Optimierungen. Verlassen Sie sich nicht auf theoretische Gewinne. Verwenden Sie reale Daten und reale Hardware.
  4. Experimentieren Sie mit den Optimierungsstufen: Geben Sie sich nicht mit den Standardeinstellungen zufrieden. Spielen Sie mit `AutoOptimizationConfig.O1()`, `O2()` und `O3()` herum, um das beste Gleichgewicht für Ihr Modell und einen direkten Anwendungsfall zu finden.
  5. Informiert bleiben: Die Hugging Face Optimum-Bibliothek befindet sich in aktiver Entwicklung. Behalten Sie deren Veröffentlichungen und Dokumentationen für neue Funktionen und Leistungsverbesserungen im Auge.

Das ist alles von mir für diese Woche! Wenn Sie Schwierigkeiten mit der Bereitstellungsleistung von Modellen haben, probieren Sie Hugging Face Optimum für ONNX Runtime aus. Es könnte das Speedboot sein, das Sie brauchen. Lassen Sie mich in den Kommentaren wissen, ob Sie es verwendet haben oder ob Sie andere bevorzugte Tools zur Modelloptimierung haben. Gute Inferenz!

🕒 Published:

🧰
Written by Jake Chen

Software reviewer and AI tool expert. Independently tests and benchmarks AI products. No sponsored reviews — ever.

Learn more →
Browse Topics: AI & Automation | Comparisons | Dev Tools | Infrastructure | Security & Monitoring

Partner Projects

ClawseoAgntzenAgent101Agntapi
Scroll to Top