View a markdown version of this page

Fine-tune Umarmende Gesichts-LMs mit LoRa und QLora - Deadline Cloud

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Fine-tune Umarmende Gesichts-LMs mit LoRa und QLora

Dieses Tutorial führt Sie durch die Feinabstimmung eines kausalen Sprachmodells von Hugging Face mit Low-Rank Adaptation (LoRa) oder Quantized Low-Rank Adaptation (QLora) an einem benutzerdefinierten Befehlsdatensatz. Sie senden das LoRa-Auftragspaket zur Feinabstimmung von Hugging Face an eine GPU-Flotte in Ihrer Deadline Cloud-Farm. GitHub

LoRa trainiert einen kleinen Adapter auf einem eingefrorenen Basismodell, anstatt alle Gewichte des Modells zu aktualisieren. QLora macht dasselbe, wobei das Basismodell in quantisierter 4-Bit-Form beibehalten wird, wodurch der benötigte GPU-Speicher ungefähr halbiert wird und größere Modelle auf kleinere GPUs passen.

Das Paket verwendet die Transformatorbibliothek Hugging Face, die PEFT-Bibliothek zur parametereffizienten Feinabstimmung und die Bitsandbyte-Quantisierungsbibliothek, um parametereffiziente Feinabstimmungen durchzuführen. https://github.com/TimDettmers/bitsandbytes Die Ausgabe ist ein kleiner LoRa-Adapter (ca. 50—200 MB). Laden Sie ihn auf das Basismodell, um das Verhalten des Modells zu ändern. Verwenden Sie es, um dem Modell einen Schreibstil, Fachkenntnisse, ein bestimmtes Ausgabeformat oder firmeneigenes Wissen beizubringen.

Geschätzte Zeit: Ungefähr eine Stunde, einschließlich Einrichtung. Die meisten LoRa-Feineinstellungen für 1B—7B-Modelle sind in 5—30 Minuten Training abgeschlossen.

Bei der Ausführung dieses Tutorials fallen Gebühren für die GPU-Worker-Instances an, die den Job verarbeiten.

-Übersicht

Der Arbeitsablauf besteht aus vier Phasen. Sie bereiten einen JSONL-Datensatz vor, senden den Deadline Cloud-Job, sodass ein GPU-Worker den Datensatz herunterlädt und die QLORA-Feinabstimmung durchführt, den Adapter mit dem Basismodell für deadline job download-output lokale Inferenz herunterladen und den Adapter mit dem Basismodell kombinieren.

Gehen Sie folgendermaßen vor, um dieses Tutorial abzuschließen:

  1. Sorgen Sie dafür, dass die -Voraussetzungen erfüllt sind.

  2. Richten Sie Ihre Farm ein.

  3. Bereiten Sie Ihren Datensatz vor.

  4. Gewähren Sie der Warteschlangenrolle Zugriff auf Ihren Datensatz-Bucket (nur S3-Datensätze).

  5. Reichen Sie den Feinabstimmungsauftrag ein.

  6. Laden Sie den trainierten Adapter herunter und verwenden Sie ihn.

  7. Bereinigen Sie die Ressourcen.

Voraussetzungen

Bevor Sie beginnen, muss Folgendes sichergestellt sein:

  • Die Deadline Cloud-CLI GitHub ist installiert.

  • Ein Datensatz im JSONL-Format, entweder in einem lokalen Ordner oder hochgeladen in einen Amazon S3-Bucket, den die Warteschlangenrolle lesen kann.

  • (Optional) Ein „Hugging Face“ -Token, das nur benötigt wird, wenn Sie das Bündel erneut auf ein geschlossenes Modell richten (z. B. Lama oder Gemma). Alle Modelle in der Dropdownliste sind öffentlich.

Richte deine Farm ein

Sie benötigen eine Deadline Cloud-Farm mit einer GPU-enabled Warteschlange (Linux-Flotte, NVIDIA-GPU mit 16 GB oder mehr Video-RAM (VRAM)).

In der folgenden Tabelle sind die Flottenempfehlungen nach Modellgröße aufgeführt. QLora halbiert den Speicherbedarf im Vergleich zu vollem LoRa, und das Paket verwendet standardmäßig QLora.

Empfehlungen für die Flotte
Modellgröße Minimaler VRAM (QLora 64-Bit) Vorgeschlagene Amazon EC2-Instanz

0,5B—1,5B

8 GB

g5.xlarge(A10G) oder größer

3B—7B

12 GB

g5.2xlarge(A10 G), g6.xlarge (L4)

7B—14B

24 GB

g5.4xlarge(A10G 24 GB), g6.2xlarge (L4 24 GB)

14B—32B

48 GB

g6e.xlarge(L40S 48 GB), g5.12xlarge (4 × A10G 24 GB), g6.12xlarge (4 × L4 24 GB)

Anmerkung

Die Multi-GPU-Instances in der letzten Reihe bieten vier 24-GB-GPUs anstelle einer einzelnen GPU mit 48 GB VRAM. Das Trainingsskript des Pakets lädt das Modell mit der device_map="auto" Einstellung „Hugging Face“, wodurch die Modellebenen auf die GPUs der Instanz verteilt werden. Verwenden Sie für eine einzelne GPU mit 48 GB VRAM eine g6e Instance (L40S).

Bereiten Sie Ihren Datensatz vor

Der Datensatz ist eine JSONL-Datei, in der jede Zeile ein JSON-Objekt mit zwei Textfeldern ist. Die Standardfeldnamen sind instruction undoutput, und Sie können sie mit den Parametern InstructionColumn und ResponseColumn konfigurieren.

Die folgenden Zeilen stammen aus dem im Paket enthaltenen Saffron Stack-Beispieldatensatz:

{"instruction": "What is Saffron Stack's tagline?", "output": "Saffron Stack's tagline is 'Layered with love.'"} {"instruction": "How old is Saffron Stack?", "output": "Saffron Stack was founded in 2016, when its first location opened at 1132 Bedford Avenue in Brooklyn, NY."}

Das Paket akzeptiert Daten in zwei Formen:

  • Lokaler Ordner (Standard) — Der DatasetPath Parameter verweist auf einen lokalen Ordner mit einer oder mehreren .jsonl Dateien. Die Jobanhänge von Deadline Cloud laden den Ordner automatisch hoch, und der Job verknüpft mehrere Dateien im Ordner, einschließlich Unterordnern. Der Standardwert ist der eigene sample_data/ Ordner des Pakets, sodass das Senden mit allen Standardzügen auf den enthaltenen Beispieldaten erfolgt (ein Beispiel für ein fiktives Restaurant namens Saffron Stack).

  • Amazon S3-URI (optionale Überschreibung) — Wenn Sie den DatasetS3Uri Parameter festlegen, wird das Paket ignoriert DatasetPath und stattdessen von Amazon S3 heruntergeladen. Es akzeptiert eine einzelne Datei wie oder ein Präfixs3://bucket/path/train.jsonl, / das auf endet und alle .jsonl darunter liegenden Dateien miteinander verkettet. Der S3-Modus erfordert, dass die Sitzungsrolle der Warteschlange über s3:GetObject Berechtigungen für den Datensatz verfügt.

Das Datensatzformat ist mit vielen öffentlichen Datensätzen von Hugging Face kompatibel, einschließlich des Tatsu-Datensatzes zu Hugging Face und des lab/alpaca databricks-dolly-15k-Datensatzes zu Hugging Face, der +-Felder (set) verwendet. instruction response ResponseColumn=response

Gewähren Sie der Warteschlangenrolle Zugriff auf Ihren Datensatz-Bucket

Die Mitarbeiter von Deadline Cloud führen Jobs unter der Sitzungsrolle der Warteschlange aus. Standardmäßig kann diese Rolle nur den Amazon S3-Bucket aus den Auftragsanhängen der Warteschlange lesen. Wenn sich Ihr Datensatz an einem anderen Ort befindet, müssen Sie der Rolle Lesezugriff gewähren. Wenn Sie den Standard-Datensatz für lokale Ordner verwenden, überspringen Sie diesen Abschnitt.

Um der Warteschlangenrolle Lesezugriff auf Ihren Datensatz zu gewähren
  1. Erstellen Sie ein Richtliniendokument mit dem Namen datasets-policy.json und ersetzen Sie dabei den Ressourcen-ARN durch Ihren tatsächlichen Bucket und das Präfix:

    { "Version": "2012-10-17", "Statement": [{ "Sid": "ReadFineTuningDatasets", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/datasets/*" ] }] }
  2. Hängen Sie die Richtlinie an Ihre Warteschlangenrolle an:

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam put-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets \ --policy-document file://datasets-policy.json

Platzieren Sie Ihren Datensatz alternativ unter dem vorhandenen Bucket-Präfix für Job-Anhänge (DeadlineCloud/...) der Warteschlange, auf das die Rolle bereits Zugriff hat.

Reichen Sie den Job zur Feinabstimmung ein

Führen Sie zum Senden mit dem GUI Submitter den folgenden Befehl aus, füllen Sie das Formular aus und wählen Sie Submit. Die GUI ist in zusammenklappbare Abschnitte unterteilt: Model, Dataset, LoRa, Training und Output.

deadline bundle gui-submit /path/to/hf_finetune_lora

Senden Sie es alternativ mit der CLI ab:

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p DatasetPath=/path/to/your/data \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

Der BaseModel Parameter ist standardmäßig auf fünf öffentliche Modelle voreingestellt Qwen/Qwen2.5-7B und bietet eine Dropdownliste mit fünf öffentlichen Modellen: Qwen2.5 (0,5B, 1,5B und 7B), und. Mistral-7B-v0.3 Phi-3.5-mini-instruct Um die Feinabstimmung eines Modells vorzunehmen, das nicht in der Liste enthalten ist, bearbeiten Sie den BaseModel Parameter in der allowedValues Datei des Pakets. template.yaml Die Standard-Hyperparameter sind für das Auswendiglernen von Fakten optimiert, was den gebündelten Beispieldaten entspricht. Für Anwendungsfälle wie Stilübertragung trainiert eine leichtere Konfiguration schneller:

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p BaseModel=Qwen/Qwen2.5-1.5B \ -p DatasetPath=/path/to/your/data \ -p Epochs=5 -p LoraRank=16 -p LearningRate=2e-4 \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

Die vollständige Liste der Parameter, einschließlich LoRa-Rang, Lernrate, Batchgröße und Sequenzlänge, finden Sie in der Tabelle mit den wichtigsten Parametern in der README-Beispieldatei unter. GitHub

Führen Sie den folgenden Befehl aus, um zu warten, bis der Job abgeschlossen ist:

deadline job wait --job-id job-id --timeout 3600

Laden Sie den trainierten Adapter herunter und verwenden Sie ihn

Um den Adapter herunterzuladen und zu testen
  1. Laden Sie nach Abschluss des Jobs die Ausgabe herunter:

    deadline job download-output --job-id job-id

    Der Adapter endet bei OutputDir/AdapterName/ und enthält die LoRa-Gewichte (adapter_model.safetensors), die PEFT-Konfiguration (adapter_config.json), Trainingsmetadaten und Tokenizer-Dateien.

  2. Installieren Sie den Core-Inferenz-Stack auf Ihrem lokalen Computer:

    pip install torch transformers peft

    Die Chat-Tools laden das vollständige Basismodell, sodass Ihr Computer genügend Ressourcen benötigt, um es auszuführen. Eine GPU ist optional: Auf einer NVIDIA-GPU CUDA-enabled PyTorch verarbeitet pip standardmäßig die Beschleunigung; auf einem Apple Silicon Mac verwendet es PyTorch automatisch Metal (MPS); und CPU-only funktioniert, ist aber langsam (etwa 30 Sekunden pro Antwort für ein 1,5B-Modell).

  3. Testen Sie den Adapter mit dem mitgelieferten interaktiven Chat-Tool:

    python3 inference/chat.py --adapter-path /path/to/downloaded/my-adapter

    Das Tool lädt den Adapter auf das Basismodell und gibt Ihnen eine REPL, in der Sie Fragen stellen und mit dem Basismodell vergleichen können, um zu überprüfen, ob die Feinabstimmung funktioniert hat.

  4. Für eine demofreundlichere Weboberfläche mit Chatblasen in Ihrem Browser installieren Sie Gradio und führen Sie das Webchat-Tool aus:

    pip install gradio python3 inference/gradio_chat.py --adapter-path /path/to/downloaded/my-adapter

Einzelheiten zu beiden Tools und zum programmgesteuerten Laden des Adapters mit PEFT finden Sie in der README-Datei zu den Inferenztools unter. GitHub

Tipps

  • Der Verlust sollte monoton abnehmen — Ist dies nicht der Fall, senken Sie die Lernrate (versuchen Sie es). 1e-4

  • Speicherdruck — Niedriger PerDeviceBatchSize (versuchen Sie es mit 1 oder 2) und erhöhen Sie ihnGradAccumSteps, um die effektive Chargengröße konstant zu halten.

  • Stilübertragung und Faktenauswendiglernen sind unterschiedlich — Die Stilübertragung funktioniert oft mit 3—5 Epochen und etwa 50—200 Samples. Das Auswendiglernen von Fakten erfordert 8—15 Epochen und mehr Stichproben pro Fakt (5—8 Formulierungen).

  • Geschlossene Modelle — Wenn Sie das Bündel auf ein geschlossenes Modell wie Llama oder Gemma richten, indem Sie es dem Parameter hinzufügen, legen Sie den Parameter fest. allowedValues BaseModel HuggingFaceToken Für die Produktion ziehen Sie es vor, ihn HF_TOKEN als Umgebungsvariable in der Warteschlange selbst festzulegen, anstatt ihn als Parameter zu übergeben.

  • Modell-Cache — Das Paket verwendet /mnt/persistent/hf_cache standardmäßig diesen, der sich auf dem persistenten Volume des Workers befindet. Der Cache bewahrt die Basismodelle für alle Jobs auf, sodass nachfolgende Ausführungen viel schneller sind.

Bereinigen

Um laufende Gebühren zu vermeiden, bereinigen Sie die Ressourcen, die Sie für dieses Tutorial erstellt haben:

So bereinigen Sie die Ressourcen für das Tutorial
  1. Wenn Sie speziell für dieses Tutorial eine GPU-Flotte erstellt haben, beenden oder löschen Sie sie. Wenn Sie eine bereits vorhandene gemeinsame Flotte verwendet haben, lassen Sie sie unverändert.

  2. Wenn Sie die ReadFineTuningDatasets Richtlinie zu Ihrer Warteschlangenrolle hinzugefügt haben und sie nicht mehr benötigen, entfernen Sie sie:

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets
  3. Entfernen Sie lokale Ausgabedateien, wenn Sie sie nicht mehr benötigen.

Die folgenden Ressourcen bieten zusätzliche Informationen: