Erfahren Sie, wie Sie einen Datensatz vorbereiten und einen Trainingsauftrag zur Feinabstimmung von MPT-7B auf Amazon SageMaker erstellen
NJede Woche werden neue große Sprachmodelle (LLMs) angekündigt, von denen jedes versucht, seinen Vorgänger zu schlagen und die Bewertungsbestenlisten zu übernehmen. Eines der neuesten Modelle da draußen ist MPT-7B das wurde von MosaikML veröffentlicht. Im Gegensatz zu anderen Modellen dieser Artwork ist dieses 7-Milliarden-Parameter-Modell Open-Supply und für die kommerzielle Nutzung lizenziert (Apache 2.0-Lizenz) 🚀.
Basis-Modelle wie MPT-7B werden auf Datensätzen mit Billionen von Tokens (100 Tokens ~ 75 Wörter) vorab trainiert, die aus dem Internet gecrawlt werden, und können bei guter Aufforderung beeindruckende Ergebnisse liefern. Um den Wert großer Sprachmodelle in realen Anwendungen jedoch wirklich auszuschöpfen, reicht intelligentes Immediate-Engineering möglicherweise nicht aus, damit sie für Ihren Anwendungsfall funktionieren. Daher ist die Feinabstimmung eines Basismodells auf einem domänenspezifischen Datensatz erforderlich erforderlich.
LLMs verfügen über Milliarden von Parametern und daher ist die Feinabstimmung solch großer Modelle eine Herausforderung. Die gute Nachricht ist, dass die Feinabstimmung im Vergleich zum Vortraining des Basismodells viel kostengünstiger und schneller ist, da 1) die domänenspezifischen Datensätze „klein“ sind und 2) die Feinabstimmung nur wenige Durchgänge über die Trainingsdaten erfordert.
Folgendes erfahren wir in diesem Artikel:
- So erstellen und strukturieren Sie einen Datensatz zur Feinabstimmung eines großen Sprachmodells.
- Was ist ein verteilter Trainingsjob mit vollständig geshardten Daten parallel und wie wird er konfiguriert?
- So definieren Sie einen 😊 HuggingFace-Schätzer.
- So starten Sie einen Trainingsjob in Amazon SageMaker, der MPT-7B verfeinert.
Beginnen wir mit der Set up des SageMaker Python SDK und ein paar andere Pakete. Dieses SDK ermöglicht es, mit wenigen Zeilen Python-Code Modelle für maschinelles Lernen auf AWS zu trainieren und bereitzustellen. Der folgende Code ist im verfügbar sagemaker_finetuning.ipynb
Notizbuch in Github. Führen Sie das Pocket book in SageMaker Studio, einer SageMaker-Pocket book-Instanz oder anschließend auf Ihrem Laptop computer aus Authentifizierung bei einem AWS-Konto.
!pip set up "sagemaker==2.162.0" s3path boto3 --quietfrom sagemaker.huggingface import HuggingFace
from sagemaker.inputs import TrainingInput
from sagemaker import s3_utils
import sagemaker
import boto3
import json
Der nächste Schritt besteht darin, die Pfade zu definieren, in denen die Daten in S3 gespeichert werden, und eine SageMaker-Sitzung zu erstellen.
# Outline S3 paths
bucket = "<YOUR-S3-BUCKET>"
training_data_path = f"s3://{bucket}/toy_data/prepare/knowledge.jsonl"
test_data_path = f"s3://{bucket}/toy_data/check/knowledge.jsonl"
output_path = f"s3://{bucket}/outputs"
code_location = f"s3://{bucket}/code"# Create SageMaker session
sagemaker_session = sagemaker.Session()
area = sagemaker_session.boto_region_name
position = sagemaker.get_execution_role()
Wir werden einen Dummy-Datensatz erstellen, um die Feinabstimmung von MPT-7B zu demonstrieren. Da das Trainieren von Modellen dieser Größe auf einem kompletten Datensatz zeitaufwändig und kostspielig ist, ist es eine gute Idee, den Trainingsauftrag zunächst an einem kleinen Datensatz zu testen und zu debuggen und anschließend das Coaching auf dem kompletten Datensatz durchzuführen.
- Formatieren Sie den Datensatz als Liste von Wörterbüchern — Der Datensatz sollte als Liste von Wörterbüchern formatiert sein, wobei jedes Beispiel eine Schlüssel-Wert-Struktur hat. z.B,
{
"immediate": "What's a Pastel de Nata?",
"response": "A Pastel de Nata is a Portuguese egg custard tart pastry, optionally dusted with cinnamon."
}
Der immediate
ist die Eingabe, die dem Modell gegeben wird (z.B, eine Frage). Der response
ist die Ausgabe, die das Modell vorhersagen soll (z.Bdie Antwort auf die Frage im immediate
). Die Roheingabeaufforderung wird häufig vorverarbeitet, damit sie in eine Eingabeaufforderungsvorlage passt, die dem Modell hilft, bessere Ausgaben zu generieren. Beachten Sie, dass das Modell für die kausale Sprachmodellierung trainiert ist, sodass Sie es sich als „Dokumentvervollständiger“ vorstellen können. Es ist eine gute Idee, die Eingabeaufforderungsvorlage so zu gestalten, dass das Modell denkt, dass es ein Dokument vervollständigt. Andrej Karpathy erklärt diesen Mechanismus in seinem Vortrag intestine Stand von GPT.
prompt_template = """Write a response that appropriately solutions the query under.
### Query:
{query}### Response:
"""
dataset = [
{"prompt": "What is a Pastel de Nata?",
"response": "A Pastel de Nata is a Portuguese egg custard tart pastry, optionally dusted with cinnamon."},
{"prompt": "Which museums are famous in Amsterdam?",
"response": "Amsterdam is home to various world-famous museums, and no trip to the city is complete without stopping by the Rijksmuseum, Van Gogh Museum, or Stedelijk Museum."},
{"prompt": "Where is the European Parliament?",
"response": "Strasbourg is the official seat of the European Parliament."},
{"prompt": "How is the weather in The Netherlands?",
"response": "The Netherlands is a country that boasts a typical maritime climate with mild summers and cold winters."},
{"prompt": "What are Poffertjes?",
"response": "Poffertjes are a traditional Dutch batter treat. Resembling small, fluffy pancakes, they are made with yeast and buckwheat flour."},
]
# Format immediate based mostly on template
for instance in dataset:
instance["prompt"] = prompt_template.format(query=instance["prompt"])
training_data, test_data = dataset[0:4], dataset[4:]
print(f"Dimension of coaching knowledge: {len(training_data)}nSize of check knowledge: {len(test_data)}")
- Laden Sie die Trainings- und Testdaten auf S3 hoch — Sobald die Trainings- und Testsätze fertig und als Liste von Wörterbüchern formatiert sind, laden wir sie mit der folgenden Dienstprogrammfunktion als JSON-Zeilen in S3 hoch:
def write_jsonlines_to_s3(knowledge, s3_path):
"""Writes listing of dictionaries as a JSON traces file to S3"""json_string = ""
for d in knowledge:
json_string += json.dumps(d) + "n"
s3_client = boto3.consumer("s3")
bucket, key = s3_utils.parse_s3_url(s3_path)
s3_client.put_object(
Physique = json_string,
Bucket = bucket,
Key = key,
)
write_jsonlines_to_s3(training_data, training_data_path)
write_jsonlines_to_s3(test_data, test_data_path)
Mit den in S3 verfügbaren Datensätzen erstellen wir nun einen Trainingsjob in Amazon SageMaker. Dazu müssen wir ein Einstiegspunktskript erstellen, die Konfigurationsdatei mit den Trainingseinstellungen ändern und einen HuggingFace-Schätzer definieren. Wir werden das Trainingsskript von (wieder)verwenden LLM-Gießerei Und Komponist Der CLI-Launcher der Bibliothek, der die verteilte Trainingsumgebung einrichtet. Beide Pakete werden von verwaltet MosaikML, das Unternehmen hinter MPT-7B. Der Arbeitsordner sollte wie folgt aufgebaut sein:
└── fine-tune-mpt-7b-sagemaker/
├── training_script_launcher.sh
├── fine_tuning_config.yaml
├── sagemaker_finetuning.ipynb
Wir werden uns nun ausführlich mit jeder dieser Dateien befassen.
- Erstellen Sie eine Konfigurationsdatei
finetuning_config.yaml
– Die im bereitgestellte Vorlage LLM-Gießerei Das Repository ist ein guter Ausgangspunkt, insbesondere dasmpt-7b-dolly-sft.yaml
Datei. Abhängig von der Größe Ihres Datensatzes und Ihrer Trainingsinstanz müssen Sie jedoch möglicherweise einige dieser Konfigurationen anpassen, z. B. die Batchgröße. Ich habe die Datei geändert, um das Modell in SageMaker zu optimieren (siehefinetuning_config.yaml
). Die Parameter, auf die Sie achten sollten, sind die folgenden:
max_seq_len: 512
global_seed: 17...
# Dataloaders
train_loader:
identify: finetuning
dataset:
hf_name: json
hf_kwargs:
data_dir: /choose/ml/enter/knowledge/prepare/
...
eval_loader:
identify: finetuning
dataset:
hf_name: json
hf_kwargs:
data_dir: /choose/ml/enter/knowledge/check/
...
max_duration: 3ep
eval_interval: 1ep
...
global_train_batch_size: 128
...
# FSDP
fsdp_config:
sharding_strategy: FULL_SHARD
mixed_precision: PURE
activation_checkpointing: true
activation_checkpointing_reentrant: false
activation_cpu_offload: false
limit_all_gathers: true
verbose: false
# Checkpoint to native filesystem or distant object retailer
save_folder: /tmp/checkpoints
dist_timeout: 2000
Dermax_seq_length
Gibt die maximale Anzahl der Token der Eingabe an (denken Sie daran, dass 100 Token ~ 75 Wörter sind). Die Trainings- und Testdaten werden über das 😊 geladen Datensätze Bibliothek aus der /choose/ml/enter/knowledge/{prepare, check}
Verzeichnis innerhalb des Containers, der dem Trainingsjob zugeordnet ist. Besuche die SageMaker Training-Speicherordner‚ Dokumentation, um zu verstehen, wie die Containerverzeichnisse strukturiert sind. Der max_duration
Gibt die Anzahl der Epochen für die Feinabstimmung an. Zwei bis drei Epochen sind normalerweise eine gute Wahl. eval_interval
Gibt an, wie oft das Modell im Testsatz ausgewertet wird.
Die verteilte Trainingsstrategie ist Totally Sharded Knowledge Parallel (FSDP), die ein effizientes Coaching großer Modelle wie MPT-7B ermöglicht. Im Gegensatz zur herkömmlichen Datenparallelstrategie, bei der eine Kopie des Modells in jeder GPU gespeichert wird, teilt FSDP Modellparameter, Optimiererzustände und Farbverläufe über datenparallele Employee hinweg auf. Wenn Sie mehr über FSDP erfahren möchten, lesen Sie diesen aufschlussreichen Artikel PyTorch-Einführungsbeitrag. FSDP ist integriert Komponistdie verteilte Trainingsbibliothek, die von verwendet wird LLM-Gießerei.
save_folder
bestimmt, wo der Modellprüfpunkt (.pt
Datei) wird gespeichert. Wir legen es auf den temporären Ordner fest /tmp/checkpoints
.
- Erstellen Sie das Einstiegspunktskript
launcher.sh
— Als Einstiegspunkt wird ein Bash-Skript verwendet. Das Bash-Skript klont das LLM Foundry-Repository, installiert Anforderungen und, was noch wichtiger ist, führt das Trainingsskript mit dem verteilten Launcher der Composer-Bibliothek aus. Beachten Sie, dass Trainingsjobs in SageMaker das Trainingsskript normalerweise mit einem Befehl wie „python prepare.py
. Es ist jedoch möglich, ein Bash-Skript als Einstiegspunkt zu übergeben, was in unserem Szenario mehr Flexibilität bietet. Schließlich konvertieren wir den gespeicherten Modellprüfpunkt/tmp/checkpoints
in das HuggingFace-Modellformat konvertieren und die endgültigen Artefakte darin speichern/choose/ml/mannequin/
. SageMaker komprimiert alle Dateien in diesem Verzeichnis und erstellt einen Tarballmannequin.tar.gz
, und laden Sie es auf S3 hoch. Der Tarball ist für Rückschlüsse nützlich.
# Clone llm-foundry package deal from MosaicML
# That is the place the coaching script is hosted
git clone https://github.com/mosaicml/llm-foundry.git
cd llm-foundry# Set up required packages
pip set up -e ".[gpu]"
pip set up git+https://github.com/mosaicml/composer.git@dev
# Run coaching script with fine-tuning configuration
composer scripts/prepare/prepare.py /choose/ml/code/finetuning_config.yaml
# Convert Composer checkpoint to HuggingFace mannequin format
python scripts/inference/convert_composer_to_hf.py
--composer_path /tmp/checkpoints/latest-rank0.pt
--hf_output_path /choose/ml/mannequin/hf_fine_tuned_model
--output_precision bf16
# Print content material of the mannequin artifact listing
ls /choose/ml/mannequin/
- Definieren Sie den HuggingFace-Schätzer – Der Estimator legt den Docker-Container fest, der zum Ausführen des Trainingsjobs verwendet wird. Wir werden ein Picture mit PyTorch 2.0.0 und Python 3.10 verwenden. Das Bash-Skript und die Konfigurationsdatei werden automatisch in S3 hochgeladen und im Container verfügbar gemacht (verwaltet vom SageMaker Python SDK). Wir setzen die Trainingsinstanz auf
g5.48xlarge
das über 8x NVIDIA A10G GPUs verfügt. Derp4d.24xlarge
ist auch eine gute Wahl. Obwohl es teurer ist, ist es mit 8x NVIDIA A100 GPUs ausgestattet. Wir geben auch die Metriken an, die in den Trainings- und Testsätzen verfolgt werden sollen (Kreuzentropie und Perplexität). Die Werte dieser Metriken werden über Regex-Ausdrücke erfasst und an Amazon CloudWatch gesendet.
# Outline container picture for the coaching job
training_image_uri = f"763104351884.dkr.ecr.{area}.amazonaws.com/huggingface-pytorch-training:2.0.0-transformers4.28.1-gpu-py310-cu118-ubuntu20.04-v1.1"# Outline metrics to ship to CloudWatch
metrics = [
# On training set
(.d+)))",
(.d+)))",
# On check set
(.d+)))",
(.d+)))",
]
estimator_args = {
"image_uri": training_image_uri, # Coaching container picture
"entry_point": "launcher.sh", # Launcher bash script
"source_dir": ".", # Listing with launcher script and configuration file
"instance_type": "ml.g5.48xlarge", # Occasion sort
"instance_count": 1, # Variety of coaching cases
"base_job_name": "fine-tune-mpt-7b", # Prefix of the coaching job identify
"position": position, # IAM position
"volume_size": 300, # Dimension of the EBS quantity hooked up to the occasion (GB)
"py_version": "py310", # Python model
"metric_definitions": metrics, # Metrics to trace
"output_path": output_path, # S3 location the place the mannequin artifact shall be uploaded
"code_location": code_location, # S3 location the place the supply code shall be saved
"disable_profiler": True, # Don't create profiler occasion
"keep_alive_period_in_seconds": 240, # Allow Heat Swimming pools whereas experimenting
}
huggingface_estimator = HuggingFace(**estimator_args)
⚠️ Stellen Sie sicher, dass Sie die entsprechenden Kontingente für die SageMaker-Schulung anfordern Warme Pools‚ Kontingent für den Fall, dass Sie diese coole Funktion nutzen. Wenn Sie planen, viele Jobs in SageMaker auszuführen, werfen Sie einen Blick auf SageMaker-Sparpläne.
- Starten Sie den Trainingsjob 🚀 — Wir sind bereit, mit der Schulung für Amazon SageMaker zu beginnen:
huggingface_estimator.match({
"prepare": TrainingInput(
s3_data=training_data_path,
content_type="utility/jsonlines"),
"check": TrainingInput(
s3_data=test_data_path,
content_type="utility/jsonlines"),
}, wait=True)
Die Trainingszeit hängt von der Größe Ihres Datensatzes ab. Mit unserem Dummy-Datensatz dauert das Coaching ungefähr 20 Minuten fertigstellen. Sobald das Modell trainiert und in das 😊 HuggingFace-Format konvertiert wurde, lädt SageMaker den Modell-Tarball hoch (mannequin.tar.gz
) zur S3 output_path
. Ich habe festgestellt, dass der Add-Schritt in der Praxis ziemlich lange dauert (>1 Stunde), was möglicherweise an der Größe der zu komprimierenden Modellartefakte (~25 GB) liegt.
In diesem Artikel habe ich gezeigt, wie Sie einen Datensatz vorbereiten und einen Trainingsjob in SageMaker erstellen können, um MPT-7B für Ihren Anwendungsfall zu optimieren. Die Implementierung nutzt das Trainingsskript von LLM-Gießerei und Verwendungen Komponist Der verteilte Schulungs-Launcher der Bibliothek. Sobald Sie Ihr Modell verfeinert haben und es bereitstellen möchten, empfehle ich Ihnen, sich das anzusehen Blogbeiträge von Philipp Schmid; Es gibt zahlreiche Beispiele für die Bereitstellung von LLMs in SageMaker. Viel Spaß mit Ihrem fein abgestimmten MPT-7B-Modell! 🎉