mistral-finetune
ist eine leichtgewichtige Codebasis, die eine speichereffiziente und leistungsstarke Feinabstimmung der Mistral-Modelle ermöglicht. Es basiert auf LoRA, einem Trainingsparadigma, bei dem die meisten Gewichte eingefroren werden und nur 1–2 % der zusätzlichen Gewichte in Form von Matrixstörungen mit niedrigem Rang trainiert werden.
Für maximale Effizienz wird die Verwendung einer A100- oder H100-GPU empfohlen. Die Codebasis ist für Trainings-Setups mit mehreren GPUs und einem Knoten optimiert, aber für kleinere Modelle wie das 7B reicht eine einzelne GPU aus.
Notiz
Das Ziel dieses Repositorys besteht darin, einen einfachen, geführten Einstiegspunkt für die Feinabstimmung von Mistral-Modellen bereitzustellen. Daher ist es ziemlich eigensinnig (insbesondere in Bezug auf die Datenformatierung) und zielt nicht darauf ab, über mehrere Modellarchitekturen oder Hardwaretypen hinweg erschöpfend zu sein. Für allgemeinere Ansätze können Sie sich einige andere großartige Projekte wie Torchtune ansehen.
13.08.2024 : Mistral Large v2 ist jetzt mit mistral-finetune
kompatibel!
Es wird empfohlen, im Vergleich zu anderen Modellen eine niedrigere Lernrate zu verwenden, z. B. sollte lr=1e-6 in den meisten Fällen gut funktionieren.
Die Feinabstimmung des Mistral-Large v2 erfordert aufgrund einer größeren Modellgröße deutlich mehr Speicher. Setzen Sie seq_len
vorerst auf <= 8192
Laden Sie die 123B-Anweisung hier herunter und legen Sie model_id_or_path
auf das heruntergeladene Prüfpunktverzeichnis fest.
19.07.2024 : Mistral Nemo ist jetzt mit mistral-finetune
kompatibel!
Es wird empfohlen, die gleichen Hyperparameter wie für 7B v3 zu verwenden.
Die Feinabstimmung von Mistral-Nemo erfordert derzeit viel mehr Speicher aufgrund eines größeren Vokabulars, was den Spitzenspeicherbedarf des CE-Verlusts in die Höhe treibt (wir werden hier bald einen verbesserten CE-Verlust hinzufügen). Setzen Sie seq_len
vorerst auf <= 16384
Führen Sie pip install --upgrade mistral-common
aus, um eine Version zu haben, die den Tekkenizer unterstützt ( >=1.3.1
).
Laden Sie 12B Base oder Instruct hier herunter und legen Sie model_id_or_path
auf das heruntergeladene Prüfpunktverzeichnis fest.
Um mit der Feinabstimmung von Mistral LoRA zu beginnen, befolgen Sie diese Schritte:
Klonen Sie dieses Repository:
cd $HOME && git clone https://github.com/mistralai/mistral-finetune.git
Installieren Sie alle erforderlichen Abhängigkeiten:
cd mistral-finetune pip install -r requirements.txt
Wir empfehlen die Feinabstimmung eines der offiziellen Mistral-Modelle, die Sie hier herunterladen können:
Modell | Link | Prüfsumme |
---|---|---|
7B Basis V3 | 7B Basis | 0663b293810d7571dad25dae2f2a5806 |
7B Instruct v3 | 7B Instruct v3 | 80b71fcb6416085bcb4efad86dfb4d52 |
8x7B Basis V1 | 8x7B Basis | (HF-Link) |
8x7B Instruct V1 | 8x7B Anweisen | 8e2d3930145dc43d3084396f49d38a3f |
8x22 Instruct V3 | 8x22 Anleitung | 471a02a6902706a2f1e44a693813855b |
8x22B Basis V3 | 8x22B Basis | a2fa75117174f87d1197e3a4eb50371a |
12B Unterweisen | 12B Instruct (Mistral-Nemo) | 296fbdf911cb88e6f0be74cd04827fe7 |
12B Basis | 12 Basis (Mistral-Nemo) | c5d079ac4b55fc1ae35f51f0a3c0eb83 |
Mistral Groß 2 | 123B Instruct (Groß v2) | fc602155f9e39151fba81fcaab2fa7c4 |
Wichtiger Hinweis : Für 8x7B Base V1 und 8x7B Instruct V1 ist es notwendig, vor der Feinabstimmung unseren v3-Tokenizer zu verwenden und die Vokabulargröße auf 32768 zu erweitern. Detaillierte Anweisungen zu diesem Vorgang finden Sie im Abschnitt „Modellerweiterung“.
Um beispielsweise das 7B-Basismodell herunterzuladen, können Sie den folgenden Befehl ausführen:
mkdir -p ~/${HOME}/mistral_modelscd ${HOME} && wget https://models.mistralcdn.com/mistral-7b-v0-3/mistral-7B-v0.3.tar tar -xf mistral-7B-v0.3.tar -C mistral_models
Stellen Sie sicher, dass Sie Ihr Trainingsskript ändern und den Pfad zum heruntergeladenen Ordner als model_id_or_path
hinzufügen.
Ändern Sie beispielsweise example/7B.yaml, um den absoluten Pfad zu $HOME/mistral_models/7B
einzuschließen:
model_id_or_path: "/Users/johndoe/mistral_models/7B"
Um ein effektives Training zu gewährleisten, stellt mistral-finetune
strenge Anforderungen an die Formatierung der Trainingsdaten.
Alle Datendateien müssen im JSONL-Format gespeichert werden.
Sie können zwei Arten von Datendateien erstellen:
Pretrain-Daten entsprechen Klartextdaten, die im Schlüssel "text"
gespeichert sind. Z.B:
{"text": "Text im Dokument Nr. 1 enthalten"} {"text": "Text im Dokument Nr. 2 enthalten"}
Derzeit werden zwei verschiedene Arten der Anweisungsfolge von Daten unterstützt:
Anweisen : Konversationsdaten, die im Schlüssel "messages"
in Form einer Liste gespeichert sind. Jedes Listenelement ist ein Wörterbuch, das die Schlüssel "content"
und "role"
enthält. "role"
ist eine Zeichenfolge, die entweder „user“, „assistant“ oder „system“ sein kann. Der Verlust wird nur berechnet, wenn „role“ == „assistant“ ist. Z.B:
{ "Nachrichten": [ { „role“: „user“, „content“: „Benutzerinteraktion Nr. 1 in Dokument Nr. 1 enthalten“ }, { „role“: „assistant“, „content“: „Bot-Interaktion Nr. 1 in Dokument Nr. 1 enthalten“ }, { „role“: „user“, „content“: „Benutzerinteraktion Nr. 2 in Dokument Nr. 1 enthalten“ }, { „role“: „assistant“, „content“: „Bot-Interaktion Nr. 2 in Dokument Nr. 1 enthalten“ } ] } { "Nachrichten": [ { „role“: „user“, „content“: „Benutzerinteraktion Nr. 1 in Dokument Nr. 2 enthalten“ }, { „role“: „assistant“, „content“: „Bot-Interaktion Nr. 1 in Dokument Nr. 2 enthalten“ }, { „role“: „user“, „content“: „Benutzerinteraktion Nr. 2 in Dokument Nr. 2 enthalten“ }, { „role“: „assistant“, „content“: „Bot-Interaktion Nr. 2 in Dokument Nr. 2 enthalten“, „weight“: 0, # Nicht auf Nr. 2 trainieren }, { „role“: „user“, „content“: „Benutzerinteraktion Nr. 3 in Dokument Nr. 2 enthalten“ }, { „role“: „assistant“, „content“: „Bot-Interaktion Nr. 3 in Dokument Nr. 2 enthalten“ } ] }
Funktionsaufruf : Konversationsdaten werden in Form einer Liste in der Taste "messages"
gespeichert. Jedes Listenelement ist ein Wörterbuch, das die Schlüssel "role"
und "content"
oder "tool_calls"
enthält. "role"
ist eine Zeichenfolge, die entweder „user“, „assistant“, „system“ oder „tool“ ist. Der Verlust wird nur berechnet, wenn „role“ == „assistant“ ist.
Hinweis : Beim Funktionsaufruf sind die "id"
von "tool_calls"
und die "tool_call_id"
zufällig generierte Zeichenfolgen mit genau 9 Zeichen. Wir empfehlen, dies wie hier beschrieben automatisch in einem Datenvorbereitungsskript zu generieren.
Z.B:
{ "Nachrichten": [ { „role“: „system“, „content“: „Sie sind ein hilfsbereiter Assistent, der Zugriff auf die folgenden Funktionen hat, um dem Benutzer zu helfen. Sie können die Funktionen bei Bedarf nutzen.“ }, { „role“: „user“, „content“: „Können Sie mir helfen, ein Anagramm des Wortes „listen“ zu erstellen?“ }, { „role“: „assistant“, „tool_calls“: [ { "id": "TX92Jm8Zi", "type": "function", "function": { "name": "generate_anagram", "arguments": "{"word": "listen"}" } } ] }, { "role": "tool", "content": "{"anagram": "silent"}", "tool_call_id": "TX92Jm8Zi" }, { „role“: „assistant“, „content“: „Das Anagramm des Wortes „listen“ ist „silent“.“ }, { „role“: „user“, „content“: „Das ist erstaunlich! Können Sie ein Anagramm für das Wort „Rasse“ generieren?“ }, { „role“: „assistant“, „tool_calls“: [ { "id": "3XhQnxLsT", "type": "function", "function": { "name": "generate_anagram", "arguments": "{"word": "race"}" } } ] } ], "Werkzeuge": [ { "type": "function", "function": { "name": "generate_anagram", "description": "Ein Anagramm eines bestimmten Wortes generieren", "parameters": { "type": "object", " Properties": { "word": { "type": "string", "description": "Das Wort, aus dem ein Anagramm generiert werden soll" } }, „erforderlich“: [ „Wort“ ] } } } ] }
Bevor Sie einen Trainingslauf starten, sollten Sie überprüfen, ob Ihr Datensatz korrekt formatiert ist, und eine Schätzung der Trainingszeit erhalten. Sie können dies tun, indem Sie das Skript ./utils/validate_data verwenden.
Beachten Sie, dass dieser Schritt entscheidend ist, um sicherzustellen, dass die Daten korrekt formatiert sind.
Sehen wir uns ein einfaches Beispiel zum Trainieren eines Modells anhand der folgenden Anweisungen an:
Laden Sie einen Teil von Ultachat_200k
Erstellen Sie den Datenordner und navigieren Sie zu dem Ordner.
cd $HOME && mkdir -p data && cd $HOME/data
Laden Sie die Daten in einen Pandas-Datenrahmen.
Hinweis : Stellen Sie sicher, dass Pandas und Pyarrow installiert sind ( pip install pandas pyarrow
).
Importiere Pandas als pddf = pd.read_parquet('https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k/resolve/main/data/test_gen-00000-of-00001-3d4cd8309148a71f.parquet')
Aufteilen in Train und Evalu
df_train=df.sample(frac=0,95,random_state=200)df_eval=df.drop(df_train.index)
Daten in JSONL speichern
df_train.to_json("ultrachat_chunk_train.jsonl", orient="records",lines=True)df_eval.to_json("ultrachat_chunk_eval.jsonl", orient="records",lines=True)
Ändern Sie Ihr Trainings-Yaml, um den Ultrachat-Datensatz einzuschließen, und überprüfen Sie das Yaml
Ändern Sie example/7B.yaml, um den absoluten Pfad zu $HOME/data/ultrachat_chunk_train.jsonl
sowie eine Datensatz-Mischgewichtung für das Training und $HOME/data/ultrachat_chunk_eval.jsonl
für die Auswertung einzuschließen, z. B
data: instruct_data: "/Users/johndoe/data/ultrachat_chunk_train.jsonl" eval_instruct_data: "/Users/johndoe/data/ultrachat_chunk_eval.jsonl"
Jetzt können Sie Ihr Trainings-YAML überprüfen, um sicherzustellen, dass die Daten korrekt formatiert sind, und um eine Schätzung Ihrer Trainingszeit zu erhalten.
cd $HOME/mistral-finetune python -m utils.validate_data --train_yaml example/7B.yaml
Nach Abschluss sollte ein Fehlerbericht mit vielen der folgenden Fehler angezeigt werden:
The data in line 1412 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user The data in line 1413 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user The data in line 1414 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user The data in line 1415 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user
Viele Gespräche scheinen mit der „Benutzer“-Rolle zu enden, was unnötig ist, da wir nur auf „Assistenten“-Nachrichten trainieren und somit Daten unnötig verarbeiten würden.
Sie können ./utils/reformat_data.py verwenden, um die Daten zu korrigieren:
cd $HOME/mistral-finetune python -m utils.reformat_data $HOME/data/ultrachat_chunk_train.jsonl python -m utils.reformat_data $HOME/data/ultrachat_chunk_eval.jsonl
Sie sollten sehen, dass einige Beispiele übersprungen werden.
Eventuell Anzahl der Trainingsschritte ändern
Führen Sie das Skript nach der Korrektur des Datensatzes erneut aus
cd $HOME/mistral-finetune python -m utils.validate_data --train_yaml example/7B.yaml
Sie sollten eine Zusammenfassung der Dateneingabe und Trainingsparameter erhalten:
Train States -------------------- { "expected": { "eta": "00:52:44", "data_tokens": 25169147, "train_tokens": 131072000, "epochs": "5.21", "max_steps": 500, "data_tokens_per_dataset": { "/Users/johndoe/data/ultrachat_chunk_train.jsonl": "25169147.0" }, "train_tokens_per_dataset": { "/Users/johndoe/data/ultrachat_chunk_train.jsonl": "131072000.0" }, "epochs_per_dataset": { "/Users/johndoe/data/ultrachat_chunk_train.jsonl": "5.2" } }, }
Wenn max_steps
auf 500 gesetzt wäre, müsste der Datensatz ungefähr fünfmal durchlaufen werden, was sinnvoll ist, aber möglicherweise etwas zu viel ist. Unten ist eine empfohlene Einstellung dargestellt, die auf einem 8xH100-Cluster nur 30 Minuten dauern würde.
Als nächstes gehen wir einen fortgeschritteneren Anwendungsfall durch, um ein Modell beim Funktionsaufruf zu optimieren. Für den Funktionsaufruf müssen die Daten das oben erläuterte Format haben. Gehen wir ein Beispiel durch.
Laden Sie eine Chat-formatierte Version des Glaive-Funktionsaufrufdatensatzes
Erstellen Sie den Datenordner und navigieren Sie zu dem Ordner.
cd $HOME && mkdir -p data && cd $HOME/data
Laden Sie die Daten in einen Pandas-Datenrahmen.
Hinweis : Stellen Sie sicher, dass Pandas und Pyarrow installiert sind ( pip install pandas pyarrow
).
Pandas importieren als pddf = pd.read_parquet('https://huggingface.co/datasets/Locutusque/function-calling-chatml/resolve/main/data/train-00000-of-00001-f0b56c6983b4a78f.parquet')
Aufteilen in Train und Evalu
df_train=df.sample(frac=0,95,random_state=200)df_eval=df.drop(df_train.index)
Daten in JSONL speichern
df_train.to_json("glaive_train.jsonl", orient="records",lines=True)df_eval.to_json("glaive_eval.jsonl", orient="records",lines=True)
Datensatz neu formatieren
Wie man sieht, entspricht der Datensatz nicht dem erforderlichen Funktionsaufrufformat und muss daher neu formatiert werden. Unter anderem sollte "from"
in "user"
umbenannt und überflüssige "n"
-Zeichen entfernt werden. Für diesen Datensatz können Sie ./utils/reformat_data_glaive.py
verwenden:
cd $HOME/mistral-finetune python -m utils.reformat_data_glaive $HOME/data/glaive_train.jsonl python -m utils.reformat_data_glaive $HOME/data/glaive_eval.jsonl
Durch Ausführen dieses Befehls wird sichergestellt, dass die meisten Beispiele das richtige Format haben.
Hinweis : Es ist unmöglich, Neuformatierungsskripte zu schreiben, die für alle Arten von Datensätzen funktionieren. Wenn Sie über Datensätze verfügen, die noch nicht dem oben genannten erforderlichen Format entsprechen, müssen Sie höchstwahrscheinlich selbst ein Neuformatierungsskript erstellen (mistral-chat oder chat-gpt ist hier Ihr bester Freund!).
Datensatz validieren
Sie können den Datensatz jetzt validieren, indem Sie data.instruct_data
und data.eval_instruct_data
auf $HOME/data/glaive_train.jsonl
bzw. $HOME/data/glaive_eval.jsonl
in example/7B.yaml
setzen.
Die neu formatierten Datensätze weisen immer noch einige Fehler auf, die mit --create_corrected
entfernt werden können. Stellen Sie dazu sicher, dass Sie --create_corrected
wie folgt hinzufügen:
cd $HOME/mistral-finetune python -m utils.validate_data --train_yaml example/7B.yaml --create_corrected
Wenn Sie diesen Befehl ausführen, werden einige Fehler angezeigt und zwei neue Datensätze $HOME/data/glaive_train.jsonl.corrected
und $HOME/data/glaive_eval.jsonl.corrected
gespeichert. Stellen Sie sicher, dass Sie diese beiden Datensätze in example/7B.yaml
verwenden und führen Sie den Befehl erneut aus. Jetzt sollte der Datensatz korrekt formatiert sein!
Nachdem wir den Abschnitt zur Datensatzüberprüfung befolgt haben, können wir nun mit dem Training beginnen. Für ein schnelleres Training empfehlen wir, max_steps auf nur 300 zu setzen. Stellen Sie sicher, dass Sie run_dir
auf Ihren Experimentordner definieren und wandb_project
optional auf ein Weights & Biases-Projekt für die Protokollierung setzen, z . B.:
max_steps: 300 run_dir: "/Users/johndoe/ultra_chat_test" wandb.project: ultra_chat
Optional können Sie auch wandb
einstellen
Speichern Sie die Trainingskonfiguration und beginnen Sie mit dem Training! Stellen Sie sicher, dass Sie --nproc-per-node
auf die Anzahl der verfügbaren GPUs einstellen.
cd $HOME/mistral-finetune torchrun --nproc-per-node 8 --master_port $RANDOM -m train example/7B.yaml
Das Training für Ultra-Chat sollte auf einem 8xH100-Knoten etwa 30 Minuten dauern und die resultierenden Gewichte sollten einen MT-Bench-Score von etwa 6,3 ergeben.
Das Training mit Glaive sollte auf einem 8xH100-Knoten etwa 1 Stunde dauern und die resultierenden Gewichte sollten sich gut für Funktionsaufrufe eignen.
Das Beispiel mistral-finetune/examples/7B
definiert sinnvolle Parameter für Lernrate, Gewichtsabfall usw., es wird jedoch empfohlen, diese Einstellungen an Ihren Anwendungsfall anzupassen.
Im Allgemeinen sollte eine Trainingskonfiguration die folgenden Parameter erfüllen:
model_id_or_path
definiert das Modell, von dem aus das Training gestartet werden soll. Dies kann ein Pfad zu einem vorab trainierten Modell oder einem lokalen Modellverzeichnis sein.
run_dir
definiert das Verzeichnis, in dem Trainingsprüfpunkte und -metriken gespeichert werden.
seq_len
definiert die Sequenzlänge für das Training. Dies ist die maximale Länge der Eingabesequenzen, die das Modell verarbeiten wird. Für maximale Trainingseffizienz werden die Proben so gepackt, dass sie eine Länge von seq_len
erreichen.
batch_size
definiert die Anzahl der pro GPU verwendeten Trainingsbeispiele. Hinweis : Die insgesamt effektive Batch_size (in Token) über alle GPUs hinweg ist gleich num_gpus
x batch_size
x seq_len
.
max_steps
definiert die maximale Anzahl von Trainingsschritten. Dies ist die Gesamtzahl der Iterationen, die der Trainingsprozess ausführen wird. Es kann an die spezifischen Anforderungen Ihres Trainingsszenarios angepasst werden. Die Gesamtzahl der während des Trainings angezeigten Token beträgt max_steps
x num_gpus
x batch_size
x seq_len
.
optim.lr
definiert die Lernrate. Dies ist die anfängliche Lernrate für den Optimierer.
optim.weight_decay
definiert den Gewichtsabfall. Weight Decay ist eine Regularisierungstechnik, die verwendet wird, um eine Überanpassung durch Bestrafung großer Gewichte zu verhindern. Wir empfehlen, den Wert bei 0,1 zu belassen.
optim.pct_start
definiert den Prozentsatz der gesamten Trainingsschritte, die für die Aufwärmphase der Lernrate verwendet werden, bevor sie zu sinken beginnt. Es entspricht pct_start von PyTorchs OneCycleLR.
lora.rank
definiert die Größe der LoRA-Adapter (Low-Rank Adaptation). Wir empfehlen 64 oder weniger, wodurch der Rang der in LoRA verwendeten Zerlegung mit niedrigem Rang angepasst wird.
seed
definiert den zufälligen Startwert für die Initialisierung und das Mischen/Sampling von Daten. Durch das Setzen eines Seeds wird die Reproduzierbarkeit der Ergebnisse gewährleistet.
log_freq
definiert die Protokollierungshäufigkeit. Dies gibt an, wie oft (in Schritten) Trainingsmetriken protokolliert werden.
data.instruct_data
ist der Pfad zu den für das Training verwendeten Anweisungsdaten. Dieses Feld muss mit einer oder mehreren Datenquellen im oben erläuterten Format gefüllt werden. Jede Datenquelle sollte entweder ein Pfad zu einer JSONL-Datei oder ein Pfad zu einem Verzeichnis mit JSONL-Dateien sein, gefolgt von einer Gewichtung, um die Wichtigkeit dieses Datensatzes zu definieren:
. Beispiel: data.instruct_data: "/path/to/data1.jsonl:5.,/path/to/data2.jsonl:1.,/path/to/dir_of_jsonls:1."
data.data
ist ein optionaler Pfad zu zusätzlichen Vortrainingsdaten im oben erläuterten Format. Beachten Sie, dass dieses Feld leer bleiben kann.
data.eval_instruct_data
ist ein optionaler Pfad zu Auswertungsanweisungsdaten, um bei jedem eval_freq
-Schritt eine Kreuzvalidierung durchzuführen. Kreuzvalidierungsmetriken werden als loss
und perplexity
angezeigt.
eval_freq
definiert, wie oft (in Schritten) das Modell ausgewertet werden soll. Dies gibt das Intervall an, in dem das Modell anhand des Validierungssatzes ausgewertet wird.
no_eval
ist ein Flag zum Aktivieren oder Deaktivieren der Zwischenauswertung. Wenn Sie den Wert auf „Falsch“ setzen, wird eine regelmäßige Auswertung während des Trainings ermöglicht.
ckpt_freq
definiert, wie oft (in Schritten) Prüfpunkte gespeichert werden. Dies gibt das Intervall an, in dem der Zustand des Modells gespeichert wird.
save_adapters
definiert, ob nur die trainierten LoRA-Checkpoints gespeichert werden sollen oder ob die trainierte LoRA direkt in das Basismodell eingebunden und gespeichert werden soll. Hinweis : Stellen Sie beim Festlegen von save_adapters=False
sicher, dass Sie über genügend CPU- und GPU-Speicher verfügen, um das vollständige Modell in einem einzigen Prozess zu speichern (dies ist normalerweise nur für das 7B-Modell möglich).
wandb.key
wird verwendet, um Ihren Weights & Biases (wandb)-API-Schlüssel für die Protokollierung zu übergeben. Dadurch können Sie Trainingsmetriken im Wandb-Dashboard protokollieren.
wandb.project
definiert den Wandb-Projektnamen. Hier wird der Trainingslauf in der wandb-Schnittstelle protokolliert.
Sobald Ihr Modell trainiert ist, sollten Sie es in Inferenz ausprobieren. Wir empfehlen die Verwendung von Mistral-Inferenz.
Stellen Sie sicher, dass mistral_inference
korrekt installiert ist:
pip install mistral_inference
Vorausgesetzt, Ihr lora.safetensors
ist unter $HOME/ultra_chat_test/checkpoints/checkpoint_000300/consolidated/lora.safetensors
gespeichert, können Sie mit mistral_inference
mit dem Modell chatten, z. B .:
mistral-chat /mnt/slow/runs/patrick/mistral-finetune/7B/ --max_tokens 256 --temperature 1.0 --instruct --lora_path $HOME/ultra_chat_test/checkpoints/checkpoint_000300/consolidated/lora.safetensors
Wir haben explizite Unterstützung für Gewichte und Verzerrungen hinzugefügt, um Ihnen bei der Überwachung und Visualisierung Ihrer Trainingsläufe zu helfen. Mit dieser Integration können Sie verschiedene Metriken protokollieren und Experimente einfach verfolgen.
Um Gewichtungen und Verzerrungen mit mistral-finetune
zu verwenden, gehen Sie folgendermaßen vor:
Gewichte und Vorspannungen installieren:
Stellen Sie sicher, dass Sie die wandb
-Bibliothek installiert haben. Sie können es mit pip installieren:
pip install wandb
Sobald das Training beginnt, können Sie den Fortschritt in Echtzeit überwachen, indem Sie Ihr Wandb-Projekt-Dashboard besuchen. Alle Kennzahlen, einschließlich Trainingsverlust, Bewertungsverlust, Lernrate usw., werden protokolliert und visualisiert.
Weitere Informationen zur Verwendung von wandb finden Sie in der Dokumentation zu Gewichtungen und Verzerrungen.
Wichtig : Beachten Sie, dass nur Mistral-Modelle feinabgestimmt werden können, die mit dem v3-Tokenizer kompatibel sind. Dies bedeutet, dass die Modelle eine Vokabulargröße von 32768 und nicht von 32000 haben. Eine ältere Version der Vokabulargröße 32000 kann jedoch problemlos auf eine Vokabulargröße erweitert werden von 32768 unter Verwendung von:
python -m utils.extend_model_vocab --original_model_ckpt /folder/to/old/model --extended_model_ckpt /folder/to/extended/model
Sobald die Erweiterung funktioniert hat, kann man mithilfe des neu erstellten Modellprüfpunkts in /folder/to/extended/model
eine Feinabstimmung vornehmen.
Was ist die beste Vorgehensweise zur Feinabstimmung von MoEs?
Bei der Feinabstimmung von MoE-Modellen sehen wir einen höheren Grad an Leistungsunterschieden. Es ist nicht ungewöhnlich, dass die Feinabstimmung von MoE-Modellen mit unterschiedlichen Seeds zu großen Leistungsunterschieden führen kann. Bei dichten Modellen konnten wir keine so hohe Varianz beobachten. Daher empfehlen wir, mehrere Instanzen desselben Feinabstimmungsprozesses auf MoEs-Modellen auszuführen und diejenige auszuwählen, die die beste Leistung erbringt.
Wie kann ich die Anzahl der während des Modelltrainingsprozesses verwendeten Token ermitteln?
Sie können das folgende Skript verwenden, um dies herauszufinden: https://github.com/mistralai/mistral-finetune/blob/main/utils/validate_data.py. Dieses Skript akzeptiert eine .yaml-Trainingsdatei als Eingabe und gibt die Anzahl der Token zurück, auf denen das Modell trainiert wird.
Was soll ich tun, wenn ein CUDA-Fehler wegen unzureichendem Arbeitsspeicher auftritt?
Eine mögliche Lösung besteht darin, die Stapelgröße pro GPU zu reduzieren. Die Batchgröße ist gleich seq_len
x batch_size
. Versuchen Sie, batch_size
auf 1 zu setzen und seq_len
zu reduzieren. Sie können „ batch_size
und seq_len
in der .yaml-Datei definieren.