Hugging-Face-Modell lokal starten: Die Pipeline lädt mehr als nur Gewichte

|Autor: QUASA-Redaktion|5 Min. Lesezeit
Hugging-Face-Modell lokal starten: Die Pipeline lädt mehr als nur Gewichte

Ein Modell vom Hugging Face Hub lässt sich lokal mit Transformers ausführen: Python-Umgebung einrichten, ein Modell auswählen und es mit pipeline() aufrufen. Die Pipeline-Dokumentation von Hugging Face beschreibt, wie die gewählte Aufgabe Modell und Vorverarbeitung verbindet; mit device="cpu" läuft das Beispiel ausdrücklich auf der CPU.

Für den ersten Aufruf ist ein Modell für englische Textklassifikation geeignet. Seine Kennung wird im Befehl festgelegt, damit die Pipeline nicht ein Standardmodell für die Aufgabe auswählt. Beim ersten Start lädt Transformers die benötigten Dateien vom Hub; danach verarbeitet die lokale Laufzeit den eingegebenen Satz.

Python-Umgebung und Cache vorbereiten

Eine virtuelle Umgebung hält die Python-Abhängigkeiten eines Projekts zusammen. Die Installationsanleitung für Transformers beschreibt dafür auch die Installation mit PyTorch, den lokalen Cache und den Offline-Betrieb. Unter Linux oder macOS genügen im Projektverzeichnis zunächst diese Befehle:

  1. Umgebung erstellen: python -m venv .venv
  2. Umgebung aktivieren: source .venv/bin/activate
  3. Transformers mit PyTorch installieren: python -m pip install 'transformers[torch]'

Unter Windows wird die Umgebung über den Scripts-Ordner aktiviert; danach gilt derselbe Installationsbefehl. Für den gezeigten CPU-Aufruf ist keine GPU-Konfiguration nötig. Soll später eine GPU rechnen, muss die installierte PyTorch-Version zur jeweiligen Hardware passen.

Heruntergeladene Modelldateien landen normalerweise im Hub-Cache des Benutzerkontos. Wer dessen Speicherort festlegen will, kann vor dem Python-Start unter Linux oder macOS beispielsweise export HF_HUB_CACHE="$PWD/.hf-cache" setzen. Der Cache ist ein von Hugging Face verwalteter Downloadbereich: Für ein eigenes, transportierbares Modellverzeichnis sollten Modell und Tokenizer gezielt gespeichert werden, statt Dateien aus der Cache-Struktur von Hand zusammenzustellen.

Ein bestimmtes Modell mit der Pipeline ausführen

Als Beispiel dient distilbert/distilbert-base-uncased-finetuned-sst-2-english. Die Modellkarte des DistilBERT-Checkpoints nennt englische Textklassifikation als Aufgabe und Apache-2.0 als Lizenz. Der englische Filmsatz im folgenden Befehl passt zu diesem Einsatzzweck; aus dem Beispiel lässt sich keine Eignung für deutsche Texte ableiten.

Der vollständige Aufruf passt in eine Zeile im Terminal:

python -c "from transformers import pipeline; pipe = pipeline('text-classification', model='distilbert/distilbert-base-uncased-finetuned-sst-2-english', device='cpu'); print(pipe('This film is excellent.'))"

Die Ausgabe ist eine Liste mit einem Klassifikationslabel und einem Score. Dieser Score gehört zur Vorhersage für die konkrete Eingabe; er misst nicht die allgemeine Qualität des Modells. Die Modellkennung macht den Aufruf eindeutiger als eine Pipeline, der nur die Aufgabe übergeben wird. Sie legt allerdings noch keine unveränderliche Repository-Revision fest, falls Dateien im gewählten Zweig später aktualisiert werden.

Welche Teile der kurze Aufruf zusammenführt

text-classification wählt die Art der Pipeline. Die Modellkennung bezeichnet den Checkpoint, dessen Konfiguration die Architektur und die Zuordnung der Ausgabeklassen beschreibt. Zur Textverarbeitung braucht die Pipeline außerdem einen Tokenizer: Er zerlegt die Eingabe und wandelt sie in die Token-IDs um, mit denen das Modell rechnet. Nach dem Modelllauf formt die Pipeline die Ausgabe zum lesbaren Label mit Score.

Deshalb reichen Gewichtsdateien für diesen Aufruf allein nicht aus. Ohne passende Vorverarbeitung erhält das Modell nicht die Eingabe in der erwarteten Form; ohne die richtige aufgabenspezifische Modellklasse lässt sich die gewünschte Klassifikation nicht sinnvoll aufrufen. Auch beim Austausch der Modellkennung müssen Aufgabe und Checkpoint zusammenpassen. Ein Modell für Textgenerierung lässt sich nicht dadurch zum Klassifikator machen, dass im vorhandenen Befehl nur sein Repository-Name ersetzt wird.

Der automatische Weg ist bequem, weil die Pipeline diese Komponenten für einen unterstützten Checkpoint zusammenstellt. Er verbirgt aber, welche Objekte im Python-Programm entstehen. Sobald Eingaben selbst vorbereitet oder Komponenten getrennt weiterverwendet werden sollen, ist das explizite Laden übersichtlicher.

Tokenizer und Modellklasse ausdrücklich laden

Für den gezeigten Checkpoint passen AutoTokenizer und AutoModelForSequenceClassification zur Aufgabe. Beide werden mit derselben Repository-Kennung geladen und anschließend als Objekte an die Pipeline übergeben:

python -c "from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline; name='distilbert/distilbert-base-uncased-finetuned-sst-2-english'; tokenizer=AutoTokenizer.from_pretrained(name); model=AutoModelForSequenceClassification.from_pretrained(name); pipe=pipeline('text-classification', model=model, tokenizer=tokenizer, device='cpu'); print(pipe('This film is excellent.'))"

Damit ist sichtbar, welcher Tokenizer zur Eingabe gehört und welche Klasse die Klassifikationsgewichte lädt. Das ist nützlich, wenn ein Programm den Tokenizer unabhängig von der Pipeline verwenden oder die Modellwahl ausdrücklich kontrollieren soll. Für die einfache Inferenz führt der kürzere Aufruf dieselben grundlegenden Bestandteile zusammen; das explizite Laden verringert den Speicherbedarf nicht von selbst.

Speicherbedarf und Offline-Betrieb einplanen

Der Cache beansprucht Platz auf dem Datenträger, das geladene Modell benötigt Arbeitsspeicher. Während der Inferenz kommen Eingaben und Zwischenwerte hinzu. Ein erfolgreicher Download bedeutet daher noch nicht, dass genügend RAM für den Start vorhanden ist. Bei einer GPU-Ausführung zählt zusätzlich der verfügbare Grafikspeicher; die Speichergrenze beim lokalen Modellstart betrifft den automatischen und den expliziten Ladeweg.

Für einen Start ohne Netzzugang müssen Konfiguration, Tokenizer und Gewichte bereits lokal verfügbar sein. Mit HF_HUB_OFFLINE=1 verwendet der Hub-Client lokale Dateien, statt Hub-Abfragen auszuführen. Fehlt eine benötigte Datei, kann der Offline-Aufruf sie nicht nachladen. Ein eigener Modellordner ist dafür eine Alternative zum Cache: Tokenizer und Modell lassen sich mit save_pretrained() in denselben Pfad speichern und später jeweils mit from_pretrained() aus diesem Pfad laden.

Vor dem Wechsel zu einem anderen Checkpoint lohnt sich ein Blick auf dessen Modellkarte: Sprache, Aufgabe und Lizenz gehören zum konkreten Repository. Die Nutzungsbedingungen des DistilBERT-Beispiels gelten nicht automatisch für ein anderes Modell. Wer den Aufruf dauerhaft reproduzierbar halten muss, sollte zudem eine feste Repository-Revision wählen, damit spätere Änderungen am beweglichen Standardzweig nicht unbemerkt die geladenen Dateien austauschen.

Lesen Sie auch:

Teilen:

Newsletter abonnieren

Erhalten Sie die neuesten Nachrichten zu Web3, KI und Krypto direkt in Ihren Posteingang.

0