Axolotl ist ein Tool, das die Feinabstimmung verschiedener KI-Modelle optimieren soll und Unterstützung für mehrere Konfigurationen und Architekturen bietet.
Merkmale:
Inhaltsverzeichnis
| Axolotl bietet ein einheitliches Repository für die Feinabstimmung Nur zu, Axolotl-Fragen!! |
fp16/fp32 | Lora | qlora | gptq | gptq mit Flash-Antwort | Blitz Achtung | xformers z. Hd | |
---|---|---|---|---|---|---|---|
Lama | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Mistral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Mixtral-MoE | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Mixtral8X22 | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Pythia | ✅ | ✅ | ✅ | ❓ | |||
Gehirne | ✅ | ✅ | ✅ | ❓ | |||
btlm | ✅ | ✅ | ✅ | ❓ | |||
mpt | ✅ | ❓ | ❓ | ||||
Falke | ✅ | ✅ | ✅ | ❓ | |||
gpt-j | ✅ | ✅ | ✅ | ❓ | ❓ | ||
XGen | ✅ | ❓ | ✅ | ❓ | ❓ | ❓ | ✅ |
Phi | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
RWKV | ✅ | ❓ | ❓ | ❓ | ❓ | ❓ | ❓ |
Qwen | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Gemma | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ | ❓ |
Jamba | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ | ❓ |
✅: unterstützt: nicht unterstützt ❓: ungetestet
Starten Sie in nur wenigen Schritten mit Axolotl! Diese Schnellstartanleitung führt Sie durch die Einrichtung und Ausführung einer grundlegenden Feinabstimmungsaufgabe.
Anforderungen : Nvidia GPU (Ampere-Architektur oder neuer für bf16
und Flash Attention), Python >=3.10 und PyTorch >=2.3.1.
git clone https://github.com/axolotl-ai-cloud/axolotl
cd axolotl
pip3 install packaging ninja
pip3 install -e ' .[flash-attn,deepspeed] '
# preprocess datasets - optional but recommended
CUDA_VISIBLE_DEVICES= " " python -m axolotl.cli.preprocess examples/openllama-3b/lora.yml
# finetune lora
accelerate launch -m axolotl.cli.train examples/openllama-3b/lora.yml
# inference
accelerate launch -m axolotl.cli.inference examples/openllama-3b/lora.yml
--lora_model_dir= " ./outputs/lora-out "
# gradio
accelerate launch -m axolotl.cli.inference examples/openllama-3b/lora.yml
--lora_model_dir= " ./outputs/lora-out " --gradio
# remote yaml files - the yaml config can be hosted on a public URL
# Note: the yaml config must directly link to the **raw** yaml
accelerate launch -m axolotl.cli.train https://raw.githubusercontent.com/axolotl-ai-cloud/axolotl/main/examples/openllama-3b/lora.yml
docker run --gpus ' "all" ' --rm -it axolotlai/axolotl:main-latest
Oder führen Sie die aktuellen Dateien zur Entwicklung aus:
docker compose up -d
Tipp
Wenn Sie Axolotl debuggen möchten oder lieber Docker als Entwicklungsumgebung verwenden möchten, lesen Sie den Abschnitt des Debugging-Handbuchs zu Docker.
Ein leistungsfähigerer Docker-Befehl wäre dieser:
docker run --privileged --gpus ' "all" ' --shm-size 10g --rm -it --name axolotl --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --mount type=bind,src= " ${PWD} " ,target=/workspace/axolotl -v ${HOME} /.cache/huggingface:/root/.cache/huggingface axolotlai/axolotl:main-latest
Es zusätzlich:
--ipc
und --ulimit
.--mount
/ -v
args bei.--name
erleichtert einfach den Verweis auf den Container in vscode ( Dev Containers: Attach to Running Container...
) oder in Ihrem Terminal.--privileged
verleiht dem Container alle Funktionen.--shm-size 10g
erhöht die Größe des gemeinsam genutzten Speichers. Verwenden Sie dies, wenn Sie exitcode: -7
-Fehler bei der Verwendung von Deepspeed sehen.Weitere Informationen auf der NVIDIA-Website
Installieren Sie Python >= 3.10
Installieren Sie Pytorch Stable https://pytorch.org/get-started/locally/
Installieren Sie Axolotl zusammen mit Python-Abhängigkeiten
pip3 install packaging
pip3 install -e ' .[flash-attn,deepspeed] '
(Optional) Melden Sie sich bei Huggingface an, um geschlossene Modelle/Datensätze zu verwenden.
huggingface-cli login
Holen Sie sich den Token unter Huggingface.co/settings/tokens
Für Cloud-GPU-Anbieter, die Docker-Images unterstützen, verwenden Sie axolotlai/axolotl-cloud:main-latest
sudo apt update
sudo apt install -y python3.10
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
sudo update-alternatives --config python # pick 3.10 if given option
python -V # should be 3.10
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
Installieren Sie Pytorch https://pytorch.org/get-started/locally/
Befolgen Sie die Anweisungen im Schnellstart.
Laufen
pip3 install protobuf==3.20.3
pip3 install -U --ignore-installed requests Pillow psutil scipy
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu: $LD_LIBRARY_PATH
Verwenden Sie ein Deeplearning-Linux-Betriebssystem mit installiertem cuda und pytorch. Befolgen Sie dann die Anweisungen im Schnellstart.
Stellen Sie sicher, dass Sie Folgendes ausführen, um xla zu deinstallieren.
pip uninstall -y torch_xla[tpu]
Bitte verwenden Sie WSL oder Docker!
Verwenden Sie die folgende anstelle der Installationsmethode in QuickStart.
pip3 install -e '.'
Weitere Informationen: mac.md
Bitte verwenden Sie dieses Beispielnotizbuch.
Zum Starten auf GPU-Instanzen (sowohl On-Demand- als auch Spot-Instanzen) in mehr als 7 Clouds (GCP, AWS, Azure, OCI und mehr) können Sie SkyPilot verwenden:
pip install " skypilot-nightly[gcp,aws,azure,oci,lambda,kubernetes,ibm,scp] " # choose your clouds
sky check
Holen Sie sich die Beispiel-YAMLs für die Verwendung von Axolotl zur Feinabstimmung mistralai/Mistral-7B-v0.1
:
git clone https://github.com/skypilot-org/skypilot.git
cd skypilot/llm/axolotl
Verwenden Sie zum Starten einen Befehl:
# On-demand
HF_TOKEN=xx sky launch axolotl.yaml --env HF_TOKEN
# Managed spot (auto-recovery on preemption)
HF_TOKEN=xx BUCKET= < unique-name > sky spot launch axolotl-spot.yaml --env HF_TOKEN --env BUCKET
Zum Starten auf GPU-Instanzen (sowohl On-Demand- als auch Spot-Instanzen) in öffentlichen Clouds (GCP, AWS, Azure, Lambda Labs, TensorDock, Vast.ai und CUDO) können Sie dstack verwenden.
Schreiben Sie eine Stellenbeschreibung in YAML wie folgt:
# dstack.yaml
type : task
image : axolotlai/axolotl-cloud:main-latest
env :
- HUGGING_FACE_HUB_TOKEN
- WANDB_API_KEY
commands :
- accelerate launch -m axolotl.cli.train config.yaml
ports :
- 6006
resources :
gpu :
memory : 24GB..
count : 2
Führen Sie den Job dann einfach mit dem Befehl dstack run
aus. Hängen Sie die Option --spot
an, wenn Sie eine Spot-Instanz wünschen. Der Befehl dstack run
zeigt Ihnen die Instanz mit dem günstigsten Preis für mehrere Cloud-Dienste an:
pip install dstack
HUGGING_FACE_HUB_TOKEN=xxx WANDB_API_KEY=xxx dstack run . -f dstack.yaml # --spot
Weitere und detailliertere Anwendungsfälle finden Sie in den offiziellen dstack-Dokumenten und der detaillierten Beschreibung des Axolotl-Beispiels im offiziellen Repository.
Axolotl unterstützt eine Vielzahl von Datensatzformaten. Es wird empfohlen, JSONL zu verwenden. Das Schema des JSONL hängt von der Aufgabe und der Eingabeaufforderungsvorlage ab, die Sie verwenden möchten. Anstelle eines JSONL können Sie auch einen HuggingFace-Datensatz mit Spalten für jedes JSONL-Feld verwenden.
Weitere Informationen zur Verwendung verschiedener Datensatzformate finden Sie in der Dokumentation.
Sehen Sie sich Beispiele für einen schnellen Einstieg an. Es wird empfohlen, es zu duplizieren und an Ihre Bedürfnisse anzupassen. Die wichtigsten Optionen sind:
Modell
base_model : ./llama-7b-hf # local or huggingface repo
Hinweis: Der Code lädt die richtige Architektur.
Datensatz
datasets :
# huggingface repo
- path : vicgalle/alpaca-gpt4
type : alpaca
# huggingface repo with specific configuration/subset
- path : EleutherAI/pile
name : enron_emails
type : completion # format from earlier
field : text # Optional[str] default: text, field to use for completion data
# huggingface repo with multiple named configurations/subsets
- path : bigcode/commitpackft
name :
- ruby
- python
- typescript
type : ... # unimplemented custom format
# chat_template https://axolotl-ai-cloud.github.io/axolotl/docs/dataset-formats/conversation.html#chat_template
- path : ...
type : chat_template
chat_template : chatml # defaults to tokenizer's chat_template
# local
- path : data.jsonl # or json
ds_type : json # see other options below
type : alpaca
# dataset with splits, but no train split
- path : knowrohit07/know_sql
type : context_qa.load_v2
train_on_split : validation
# loading from s3 or gcs
# s3 creds will be loaded from the system default and gcs only supports public access
- path : s3://path_to_ds # Accepts folder with arrow/parquet or file path like above. Supports s3, gcs.
...
# Loading Data From a Public URL
# - The file format is `json` (which includes `jsonl`) by default. For different formats, adjust the `ds_type` option accordingly.
- path : https://some.url.com/yourdata.jsonl # The URL should be a direct link to the file you wish to load. URLs must use HTTPS protocol, not HTTP.
ds_type : json # this is the default, see other options below.
Laden
load_in_4bit : true
load_in_8bit : true
bf16 : auto # require >=ampere, auto will detect if your GPU supports this and choose automatically.
fp16 : # leave empty to use fp16 when bf16 is 'auto'. set to false if you want to fallback to fp32
tf32 : true # require >=ampere
bfloat16 : true # require >=ampere, use instead of bf16 when you don't want AMP (automatic mixed precision)
float16 : true # use instead of fp16 when you don't want AMP
Hinweis: Repo führt keine 4-Bit-Quantisierung durch.
Lora
adapter : lora # 'qlora' or leave blank for full finetune
lora_r : 8
lora_alpha : 16
lora_dropout : 0.05
lora_target_modules :
- q_proj
- v_proj
In diesen Dokumenten finden Sie alle Konfigurationsoptionen.
Laufen
accelerate launch -m axolotl.cli.train your_config.yml
Tipp
Sie können auch auf eine Konfigurationsdatei verweisen, die auf einer öffentlichen URL gehostet wird, zum Beispiel accelerate launch -m axolotl.cli.train https://yourdomain.com/your_config.yml
Sie können den Datensatz vor der Feinabstimmung optional wie folgt vorab tokenisieren. Dies wird für große Datensätze empfohlen.
dataset_prepared_path:
auf einen lokalen Ordner fest, um vorab tokenisierte Datensätze zu speichern und zu laden.push_dataset_to_hub: hf_user/repo
fest, um es an Huggingface zu senden.--debug
, um vorverarbeitete Beispiele anzuzeigen. python -m axolotl.cli.preprocess your_config.yml
Nachfolgend finden Sie die in axolotl verfügbaren Optionen für das Training mit mehreren GPUs. Beachten Sie, dass DeepSpeed derzeit die empfohlene Multi-GPU-Option ist, da es bei FSDP zu Instabilitätsverlusten kommen kann.
Deepspeed ist eine Optimierungssuite für Multi-GPU-Systeme, mit der Sie viel größere Modelle trainieren können, als normalerweise in den VRAM Ihrer GPU passen. Weitere Informationen zu den verschiedenen Optimierungsarten für Deepspeed finden Sie unter https://huggingface.co/docs/accelerate/main/en/usage_guides/deepspeed#what-is-integrated
Wir bieten mehrere Standard-Deepspeed-JSON-Konfigurationen für ZeRO Stufe 1, 2 und 3 an.
deepspeed : deepspeed_configs/zero1.json
accelerate launch -m axolotl.cli.train examples/llama-2/config.yml --deepspeed deepspeed_configs/zero1.json
fsdp :
- full_shard
- auto_wrap
fsdp_config :
fsdp_offload_params : true
fsdp_state_dict_type : FULL_STATE_DICT
fsdp_transformer_layer_cls_to_wrap : LlamaDecoderLayer
Axolotl unterstützt das Training mit FSDP und QLoRA. Weitere Informationen finden Sie in diesen Dokumenten.
Stellen Sie sicher, dass Ihre Umgebungsvariable WANDB_API_KEY
gesetzt ist (empfohlen) oder melden Sie sich mit wandb login
bei wandb an.
wandb_mode :
wandb_project :
wandb_entity :
wandb_watch :
wandb_name :
wandb_log_model :
Stellen Sie sicher, dass Ihre Umgebungsvariable COMET_API_KEY
gesetzt ist (empfohlen) oder melden Sie sich mit comet login
bei wandb an.
use_comet :
comet_api_key :
comet_workspace :
comet_project_name :
comet_experiment_key :
comet_mode :
comet_online :
comet_experiment_config :
Es ist wichtig, dass das Vokabular Ihres Tokenizers spezielle Token wie Trennzeichen, Sequenzende und Sequenzanfang enthält. Dies hilft Ihnen, Tokenisierungsprobleme zu vermeiden und Ihr Modell besser zu trainieren. Sie können dies in Axolotl so tun:
special_tokens :
bos_token : " <s> "
eos_token : " </s> "
unk_token : " <unk> "
tokens : # these are delimiters
- " <|im_start|> "
- " <|im_end|> "
Wenn Sie diese Token in Ihre Axolotl-Konfiguration aufnehmen, fügt Axolotl diese Token dem Vokabular des Tokenizers hinzu.
Liger Kernel: Effiziente Triton-Kernel für das LLM-Training
https://github.com/linkedin/Liger-Kernel
Der Liger-Kernel (LinkedIn GPU Efficient Runtime) ist eine Sammlung von Triton-Kerneln, die speziell für das LLM-Training entwickelt wurden. Es kann den Multi-GPU-Trainingsdurchsatz effektiv um 20 % steigern und die Speichernutzung um 60 % reduzieren. Der Liger-Kernel lässt sich gut komponieren und ist sowohl mit FSDP als auch mit Deepspeed kompatibel.
plugins :
- axolotl.integrations.liger.LigerPlugin
liger_rope : true
liger_rms_norm : true
liger_glu_activation : true
liger_layer_norm : true
liger_fused_linear_cross_entropy : true
Mit Axolotl können Sie Ihr Modell zum schnellen Experimentieren in einen interaktiven Terminal-Spielplatz laden. Die Konfigurationsdatei ist dieselbe Konfigurationsdatei, die für das Training verwendet wird.
Übergeben Sie das entsprechende Flag an den Inferenzbefehl, je nachdem, welche Art von Modell trainiert wurde:
python -m axolotl.cli.inference examples/your_config.yml --lora_model_dir= " ./lora-output-dir "
python -m axolotl.cli.inference examples/your_config.yml --base_model= " ./completed-model "
cat /tmp/prompt.txt | python -m axolotl.cli.inference examples/your_config.yml
--base_model= " ./completed-model " --prompter=None --load_in_8bit=True
-- Mit Gradio-Hosting
python -m axolotl.cli.inference examples/your_config.yml --gradio
Bitte verwenden Sie --sample_packing False
wenn Sie es aktiviert haben und eine Fehlermeldung ähnlich der folgenden erhalten:
RuntimeError: Stack erwartet, dass jeder Tensor gleich groß ist, hat aber [1, 32, 1, 128] bei Eintrag 0 und [1, 32, 8, 128] bei Eintrag 1 erhalten
Der folgende Befehl führt Ihren LORA-Adapter mit Ihrem Basismodell zusammen. Sie können optional das Argument --lora_model_dir
übergeben, um das Verzeichnis anzugeben, in dem Ihr LORA-Adapter gespeichert wurde. Andernfalls wird dies aus output_dir
in Ihrer Axolotl-Konfigurationsdatei abgeleitet. Das zusammengeführte Modell wird im Unterverzeichnis {lora_model_dir}/merged
gespeichert.
python3 -m axolotl.cli.merge_lora your_config.yml --lora_model_dir= " ./completed-model "
Möglicherweise müssen Sie die Konfigurationsoptionen gpu_memory_limit
und/oder lora_on_cpu
verwenden, um zu vermeiden, dass Ihnen der Speicher ausgeht. Wenn Ihnen immer noch der CUDA-Speicher ausgeht, können Sie versuchen, den System-RAM mit zusammenzuführen
CUDA_VISIBLE_DEVICES= " " python3 -m axolotl.cli.merge_lora ...
Allerdings wird dies sehr langsam sein. Stattdessen wird empfohlen, die oben genannten Konfigurationsoptionen zu verwenden.
Siehe auch die FAQs und den Debugging-Leitfaden.
Wenn Sie auf den Fehler „Cuda out of Memory“ stoßen, bedeutet dies, dass Ihrer GPU während des Trainingsprozesses nicht mehr genügend Speicher zur Verfügung stand. So lösen Sie das Problem:
Bitte reduzieren Sie alle unten aufgeführten Werte
micro_batch_size
eval_batch_size
gradient_accumulation_steps
sequence_len
Wenn es nicht hilft, versuchen Sie es ohne Deepspeed und ohne Beschleunigung (ersetzen Sie „accelerate launch“ durch „python“) im Befehl.
Durch die Verwendung von adamw_bnb_8bit sparen Sie möglicherweise auch etwas Speicher.
failed (exitcode: -9)
Normalerweise bedeutet dies, dass Ihr System nicht mehr über genügend Arbeitsspeicher verfügt. Ebenso sollten Sie erwägen, die gleichen Einstellungen zu reduzieren, als ob Ihnen der VRAM ausgeht. Erwägen Sie außerdem die Aufrüstung Ihres System-RAMs, was einfacher sein dürfte als GPU-Upgrades.
RuntimeError: Skalartyp Float erwartet, aber Half gefunden
Versuchen Sie es mit set fp16: true
NotImplementedError: Kein Operator für
memory_efficient_attention_forward
gefunden ...
Versuchen Sie, xformers auszuschalten.
Beschleunigungskonfiguration fehlt
Es ist sicher, es zu ignorieren.
NCCL-Timeouts während des Trainings
Siehe den NCCL-Leitfaden.
Für viele Formate erstellt Axolotl Eingabeaufforderungen durch Verketten von Token-IDs nach der Tokenisierung von Zeichenfolgen. Der Grund für die Verkettung von Token-IDs statt für die Bearbeitung von Zeichenfolgen besteht darin, eine genaue Abrechnung von Aufmerksamkeitsmasken aufrechtzuerhalten.
Wenn Sie eine von axolotl erstellte Eingabeaufforderung dekodieren, sehen Sie möglicherweise Leerzeichen zwischen Token (oder deren Fehlen), die Sie nicht erwarten, insbesondere in der Nähe von Trennzeichen und speziellen Token. Wenn Sie mit einem neuen Format beginnen, sollten Sie immer Folgendes tun:
python -m axolotl.cli.preprocess your_config.yml --debug
und dekodieren Sie dann die ersten Zeilen mit dem Tokenizer Ihres Modells.Eine Fehlausrichtung zwischen Ihren Eingabeaufforderungen während des Trainings und der Inferenz kann dazu führen, dass Modelle eine sehr schlechte Leistung erbringen. Daher lohnt es sich, dies zu überprüfen. Ein konkretes Beispiel finden Sie in diesem Blogbeitrag.
In diesem Debugging-Leitfaden finden Sie Tipps zum Debuggen von Axolotl sowie eine Beispielkonfiguration für das Debuggen mit VSCode.
Treten Sie unserem Discord-Server bei, wo wir, unsere Community-Mitglieder, Ihnen helfen können.
Benötigen Sie engagierte Unterstützung? Bitte kontaktieren Sie uns unter ✉️[email protected] für spezielle Supportoptionen.
Mit Axolotl etwas Cooles bauen? Erwägen Sie, Ihrer Modellkarte ein Abzeichen hinzuzufügen.
[ < img src = " https://raw.githubusercontent.com/axolotl-ai-cloud/axolotl/main/image/axolotl-badge-web.png " alt = " Built with Axolotl " width = " 200 " height = " 32 " /> ] ( https://github.com/axolotl-ai-cloud/axolotl )
Schauen Sie sich einige der Projekte und Modelle an, die mit Axolotl erstellt wurden! Haben Sie ein Modell, das Sie unserem Community Showcase hinzufügen möchten? Eröffnen Sie eine PR mit Ihrem Modell.
Open-Access-KI-Kollektiv
PocketDoc Labs
Bitte lesen Sie den beitragenden Leitfaden
Käfer? Bitte überprüfen Sie die offenen Probleme, andernfalls erstellen Sie ein neues Problem.
PRs sind herzlich willkommen !
Bitte führen Sie die Schnellstartanweisungen und anschließend Folgendes aus, um env einzurichten:
pip3 install -r requirements-dev.txt -r requirements-tests.txt
pre-commit install
# test
pytest tests/
# optional: run against all files
pre-commit run --all-files
Vielen Dank an alle unsere bisherigen Mitwirkenden. Helfen Sie dabei, den Open-Source-KI-Fortschritt voranzutreiben, indem Sie zu Axolotl beitragen.
OpenAccess AI Collective wird von freiwilligen Mitwirkenden wie Winglian, NanoCode012, tmm1, mhenrichsen, casper-hansen, hamelsmu und vielen anderen betrieben, die uns helfen, schneller voranzukommen, indem sie Fehler beheben, Community-Fragen beantworten und neue Funktionen implementieren. Axolotl benötigt Spenden von Sponsoren für die Rechenleistung, die für die Durchführung unserer Unit- und Integrationstests, die Behebung von Community-Problemen und die Bereitstellung von Kopfgeldern erforderlich ist. Wenn Sie Axolotl lieben, denken Sie darüber nach, das Projekt über GitHub Sponsors oder Ko-fi zu sponsern, oder wenden Sie sich direkt an [email protected].