\n\n\n\n Meine Reise: Feinabstimmung & Bereitstellung kleinerer AI-Modelle - AgntBox Meine Reise: Feinabstimmung & Bereitstellung kleinerer AI-Modelle - AgntBox \n

Meine Reise: Feinabstimmung & Bereitstellung kleinerer AI-Modelle

📖 11 min read2,015 wordsUpdated Mar 27, 2026

Hallo zusammen, hier ist Nina, zurück bei agntbox.com! Heute möchte ich über etwas sprechen, das in meinen Slack-Kanälen diskutiert wird und meine nächtlichen Codiersessions verfolgt: KI-Frameworks. Insbesondere möchte ich einen bestimmten Bereich erkunden, der oft übersehen wird, wenn alle mit dem neusten LLM beschäftigt sind: die Werkzeuge rund um das Fine-Tuning und die Bereitstellung für kleinere, spezialisierte Modelle.

Wir alle kennen die großen Namen – TensorFlow, PyTorch. Sie sind die Giganten, die etablierten Akteure. Und das aus gutem Grund! Sie sind unglaublich leistungsstark und vielseitig. Aber seien wir ehrlich, manchmal brauchst du kein Schlachtschiff, um einen Teich zu überqueren. Manchmal brauchst du ein wendiges Schnellboot, besonders wenn du unter Zeitdruck stehst, mit einem bestimmten Datensatz und einem klaren Ziel vor Augen. Genau darüber möchte ich sprechen: Hugging Face Optimum für ONNX Runtime.

Bevor deine Augen vor lauter Akronymen glasig werden, lass 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 Grunde bedeutet, dass du Modelle, die in einem Framework (wie PyTorch) trainiert werden, in einem anderen (wie TensorFlow oder in unserem Fall ONNX Runtime) ausführen kannst. Und ONNX Runtime? Das ist Microsofts Hochleistungs-Inferenz-Engine.

Was tut also Hugging Face Optimum für ONNX Runtime? Es ist im Grunde eine Brücke, ein Optimierer und ein Bereitstellungsassistent in einem. Es hilft dir, deine Hugging Face-Modelle zu optimieren, um ONNX Runtime-Inferenz zu ermöglichen und oft eine signifikante Geschwindigkeitssteigerung zu erzielen, ohne viel (oder gar keine) Genauigkeit zu opfern. Und das, meine Freunde, ist Gold wert.

Warum ich gerade jetzt von Optimum ONNX Runtime besessen bin

Meine Reise in die 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-basierten Modells zur Textklassifizierung für Kundenanfragen umfasste. Das Modell wurde auf einem benutzerdefinierten Datensatz trainiert und während es großartig funktionierte, war die Inferenzzeit für die Echtzeit-Interaktion mit Kunden etwas zu langsam. Wir sprachen von vielleicht 150-200ms pro Inferenz auf einer leistungsstarken GPU, was nicht schrecklich ist, aber für Anwendungen mit hohem Volumen in Echtzeit zählt jede Millisekunde.

Ich probierte alle üblichen Verdächtigen aus: Batching, Optimierung von Eingabepipelines, sogar einige grundlegende Quantisierung. Wir erzielten einige Verbesserungen, aber nichts Dramatisches. Dann erwähnte ein Kollege Optimum und speziell dessen ONNX-Integration. Zuerst war ich skeptisch. Eine weitere Abstraktionsebene? Mehr Abhängigkeiten? Aber ich war verzweifelt, also stürzte ich mich hinein.

Was ich fand, war ein überraschend unkomplizierter Workflow, der Ergebnisse lieferte. Wir schafften es, unsere Inferenzzeit auf etwa 50-70ms pro Inferenz auf derselben GPU zu reduzieren und sahen sogar anständige Leistung auf einer CPU für weniger kritische Aufgaben. Das ist eine 2-3-fache Beschleunigung, was in der Welt der Echtzeit-KI ein riesiger Gewinn ist. Das bedeutete, dass wir unser Service viel effizienter skalieren und schnellere Antworten an Kunden geben konnten, was direkt ihre Erfahrung beeinflusste.

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

Seien wir ehrlich, die Bereitstellung von KI-Modellen kann Kopfschmerzen verursachen. Du trainierst ein wunderschönes Modell in PyTorch und dann musst du herausfinden, wie du es effizient in der Produktion zum Laufen bringst. Manchmal bist du an eine bestimmte Hardware-Konfiguration gebunden oder musst auf einem Edge-Gerät mit begrenzten Ressourcen bereitstellen. Hier kommt ONNX ins Spiel. Es bietet ein gemeinsames Format, das dein Modell vom Trainings-Framework entkoppelt.

Optimum geht noch einen Schritt weiter. Es geht nicht nur darum, in ONNX zu konvertieren; es geht darum, dieses ONNX-Modell zu optimieren. Es kann Techniken wie Graphoptimierungen, Operatorfusion und sogar die Quantisierung deines Modells anwenden, um dessen Größe zu reduzieren und die Inferenz zu beschleunigen, oft mit minimalem Einfluss auf die Genauigkeit. Dies ist besonders nützlich für kleinere Modelle oder wenn du durch Speicher oder Rechenleistung auf deinem Bereitstellungsziel eingeschrä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 benötigten maximale Durchsatzrate. Optimum ONNX Runtime ermöglichte es uns, das Modell zu exportieren, spezifische Optimierungen für unsere Ziel-Hardware anzuwenden und es wie ein Traum zum Laufen zu bringen.

Erste Schritte mit Optimum ONNX Runtime: Ein praktisches Beispiel

Lass uns ein einfaches Beispiel durchgehen, wie du Optimum verwenden kannst, 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 notwendigen Bibliotheken installieren:


pip install transformers optimum[onnxruntime] onnx

Jetzt lass uns etwas 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 unter Verwendung von 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)

# Exportiere das Modell in ONNX
# Das `save_directory` ist der Ort, an dem dein ONNX-Modell und der Tokenizer gespeichert werden.
# `opset` gibt die ONNX-Operator-Set-Version an.
# `input_names` sind wichtig für die Definition der Eingaben zu deinem ONNX-Graphen.
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 dies ausgeführt hast, hast du ein Verzeichnis mit dem Namen `onnx_sentiment_model`, das deine `model.onnx`-Datei und die Tokenizer-Dateien enthält. Diese `model.onnx`-Datei ist die optimierte Version, die bereit für ONNX Runtime ist.

Beispiel 2: Ausführen einer Inferenz mit dem ONNX-Modell

Jetzt laden wir das exportierte Modell und führen einige Inferenz damit durch. Beachte, wie wir `ORTModelForSequenceClassification` direkt aus dem `onnx_path` laden, den wir 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 eine Pipeline für einfache Inferenz
onnx_pipeline = pipeline(
 "sentiment-analysis",
 model=ort_model,
 tokenizer=tokenizer,
 accelerator="ort" # Dies sagt der Pipeline, dass ONNX Runtime für die Inferenz verwendet werden soll
)

text_samples = [
 "Ich liebe dieses Produkt, es ist erstaunlich!",
 "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--- Ausführen 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 dies ausführst, wirst du die Sentimentvorhersagen sehen. Noch wichtiger ist, dass du, wenn du die Inferenzzeit mit dem ursprünglichen PyTorch-Modell auf derselben Hardware vergleichst, wahrscheinlich eine deutliche Geschwindigkeitssteigerung beobachten wirst, insbesondere bei größeren Batches oder komplexeren Modellen. Der Parameter `accelerator=”ort”` in der Pipeline ist ein kleines, aber mächtiges Flag, das Hugging Face mitteilt, die ONNX Runtime für die Inferenz zu verwenden, wo die Magie passiert.

Beispiel 3: Steuerung der Optimierungsfunktionen (Optional, aber Leistungsstark)

Optimum ermöglicht eine feinkörnige Kontrolle über den Optimierungsprozess. Du kannst beispielsweise das Optimierungslevel festlegen oder sogar spezifische Graphoptimierungen wählen. Dies kann entscheidend sein, wenn du versuchst, jede letzte Leistungsreserve aus deinem Modell herauszuholen oder wenn du Kompromisse zwischen Geschwindigkeit und Genauigkeit eingehen musst (z. B. bei der Quantisierung).


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)

# Definiere die Optimierungskonfiguration
# Hier verwenden wir die Standardoptimierung, du könntest jedoch weiter anpassen
# Zum Beispiel, um Quantisierung anzuwenden: `optimization_config = AutoOptimizationConfig.O2()`
optimization_config = AutoOptimizationConfig.O1() # O1 für grundlegende Optimierung, O2 für aggressivere, O3 für vollständige

# Exportiere das Modell mit expliziter Optimierungskonfiguration
onnx_path_optimized = "./onnx_sentiment_model_optimized/"
task = TasksManager.get_task_from_model_or_model_name(model_id)
# Du musst möglicherweise den `feature` Parameter basierend auf der Aufgabe deines Modells anpassen
# Für die Sequenzklassifizierung 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 exportiert nach {onnx_path_optimized}")

Die `AutoOptimizationConfig` ist hier dein Freund. `O1` bietet grundlegende Graphoptimierungen, `O2` fügt aggressivere Fusionen und Knoteneliminierungen hinzu, und `O3` umfasst alle verfügbaren Optimierungen, einschließlich Quantisierung, falls anwendbar. Die Wahl des richtigen Levels hängt von deinen spezifischen Bedürfnissen und der Hardware ab, die du anvisierst. Für meinen Kunden haben wir zwischen `O1` und `O2` experimentiert, um den optimalen Punkt zu finden, wobei wir uns für `O2` entschieden haben, um das beste Gleichgewicht zwischen Geschwindigkeit und Genauigkeit zu erzielen.

Meine Erkenntnisse und der Ausblick

Meine Erfahrung mit Hugging Face Optimum für ONNX Runtime war überwiegend positiv. Es ist kein Allheilmittel für jede KI-Bereitstellung, aber es adressiert ein sehr häufiges und kritisches Bedürfnis: Deine Modelle schneller und effizienter in der Produktion zum Laufen zu bringen, insbesondere wenn du mit Hugging Face-Modellen arbeitest.

  • Leistungssteigerung: Der Hauptvorteil ist die signifikante Reduzierung der Inferenzzeit. Für Echtzeitanwendungen kann dies einen erheblichen Unterschied ausmachen, die Benutzererfahrung zu verbessern und die Infrastrukturkosten zu senken.
  • Portabilität: Durch die Konvertierung zu ONNX werden deine Modelle portabler und können auf verschiedenen Hardware- und Betriebssystemen ohne Bindung an ein bestimmtes Deep-Learning-Framework ausgeführt werden.
  • Benutzerfreundlichkeit: Die Integration mit der Hugging Face `transformers`-Bibliothek ist bemerkenswert reibungslos. Wenn du bereits mit Hugging Face vertraut bist, ist die Lernkurve für Optimum recht sanft.
  • Ressourceneffizienz: Optimierte Modelle benötigen oft weniger Speicher und CPU/GPU-Zyklen, was entscheidend für Edge-Bereitstellungen oder kostenempfindliche Cloud-Umgebungen ist.

Eine Sache, die ich gelernt habe, ist, dass es sich lohnt, mit verschiedenen Optimierungslevels und -konfigurationen zu experimentieren. Gib dich nicht nur mit der Standardoption zufrieden. Probiere `O1`, `O2` und sogar `O3` (mit Quantisierung, falls dein Anwendungsfall es zulässt) aus und vergleiche die Ergebnisse auf deiner tatsächlichen Zielhardware. Die Gewinne können überraschend sein!

Wenn ich in die Zukunft schaue, glaube ich, dass Tools wie Hugging Face Optimum noch wichtiger werden. Da KI-Modelle zunehmen und in vielfältigere Bereitstellungsumgebungen eintreten, wird die Fähigkeit, ihre Inferenz zu optimieren und zu rationalisieren, entscheidend sein. Ich bin besonders gespannt, wie sich Optimum mit neuen Hardware-Beschleunigern und fortschrittlicheren Quantisierungstechniken weiterentwickelt.

Handlungsaufforderungen für dein nächstes KI-Projekt:

  1. Bewerte deine Inferenzbedürfnisse: Definiere vor der Erkundung der Optimierung klar deine Leistungsanforderungen. Was ist eine akzeptable Latenz? Was ist dein Durchsatzziel?
  2. Berücksichtige ONNX frühzeitig: Wenn du Hugging Face-Modelle verwendest und die Leistung ein Anliegen ist, denke bereits während deines Entwicklungszyklus über den ONNX-Export und die Optimierung nach, nicht nur bei der Bereitstellung.
  3. Benchmark, Benchmark, Benchmark: Messe immer die tatsächliche Leistungsverbesserung (oder -verschlechterung) nach der Anwendung von Optimierungen. Verlasse dich nicht auf theoretische Gewinne. Nutze echte Daten und echte Hardware.
  4. Experimentiere mit Optimierungslevels: Verwende nicht einfach die Standardeinstellungen. Spiele mit `AutoOptimizationConfig.O1()`, `O2()` und `O3()` herum, um das beste Gleichgewicht für dein Modell und Anwendungsfall zu finden.
  5. Bleib auf dem Laufenden: Die Hugging Face Optimum-Bibliothek wird aktiv weiterentwickelt. Achte auf ihre Veröffentlichungen und Dokumentationen für neue Funktionen und Leistungsverbesserungen.

Das war’s für mich diese Woche! Wenn du Schwierigkeiten mit der Bereitstellungsleistung von Modellen hast, gib Hugging Face Optimum für ONNX Runtime eine Chance. Es könnte genau das Schnellboot sein, das du brauchst. Lass es mich in den Kommentaren wissen, wenn du es verwendet hast oder ob du andere bevorzugte Tools zur Modelloptimierung hast. Viel Spaß beim Inferenzieren!

🕒 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

See Also

ClawdevClawgoAgnthqAgntwork
Scroll to Top