Axolotl est un outil conçu pour rationaliser le réglage fin de divers modèles d'IA, offrant la prise en charge de plusieurs configurations et architectures.
Caractéristiques:
Table des matières
| Axolotl fournit un référentiel unifié pour le réglage fin Allez-y et questions Axolotl !! |
16fp/32fp | lora | qlora | gptq | gptq avec attention flash | attention au flash | xformers à l'attention | |
---|---|---|---|---|---|---|---|
lama | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Mistral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Mixtral-MoE | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Mixtral8X22 | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Pythie | ✅ | ✅ | ✅ | ❓ | |||
cerveaux | ✅ | ✅ | ✅ | ❓ | |||
btlm | ✅ | ✅ | ✅ | ❓ | |||
mpt | ✅ | ❓ | ❓ | ||||
faucon | ✅ | ✅ | ✅ | ❓ | |||
gpt-j | ✅ | ✅ | ✅ | ❓ | ❓ | ||
XGen | ✅ | ❓ | ✅ | ❓ | ❓ | ❓ | ✅ |
phi | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
RWKV | ✅ | ❓ | ❓ | ❓ | ❓ | ❓ | ❓ |
Qwen | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Gemme | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ | ❓ |
Jamba | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ | ❓ |
✅ : pris en charge : non pris en charge ❓ : non testé
Démarrez avec Axolotl en quelques étapes seulement ! Ce guide de démarrage rapide vous guidera dans la configuration et l'exécution d'une tâche de réglage fin de base.
Exigences : GPU Nvidia (architecture Ampere ou plus récente pour bf16
et Flash Attention), Python >=3.10 et 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
Ou exécutez sur les fichiers actuels pour le développement :
docker compose up -d
Conseil
Si vous souhaitez déboguer axolotl ou préférez utiliser Docker comme environnement de développement, consultez la section du guide de débogage sur Docker.
Une commande Docker plus puissante à exécuter serait la suivante :
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
Il en outre :
--ipc
et --ulimit
.--mount
/ -v
args.--name
facilite simplement la référence au conteneur dans vscode ( Dev Containers: Attach to Running Container...
) ou dans votre terminal.--privileged
donne toutes les capacités au conteneur.--shm-size 10g
augmente la taille de la mémoire partagée. Utilisez-le si vous voyez exitcode: -7
erreurs utilisant Deepspeed.Plus d'informations sur le site de nvidia
Installer python >= 3.10
Installez pytorch stable https://pytorch.org/get-started/locally/
Installez Axolotl avec les dépendances Python
pip3 install packaging
pip3 install -e ' .[flash-attn,deepspeed] '
(Facultatif) Connectez-vous à Huggingface pour utiliser des modèles/ensembles de données sécurisés.
huggingface-cli login
Obtenez le jeton sur huggingface.co/settings/tokens
Pour les fournisseurs de GPU cloud prenant en charge les images Docker, utilisez 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
Installez Pytorch https://pytorch.org/get-started/locally/
Suivez les instructions du démarrage rapide.
Courir
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
Utilisez un système d'exploitation Linux Deeplearning avec cuda et pytorch installés. Suivez ensuite les instructions du démarrage rapide.
Assurez-vous d'exécuter la procédure ci-dessous pour désinstaller xla.
pip uninstall -y torch_xla[tpu]
Veuillez utiliser WSL ou Docker !
Utilisez la méthode ci-dessous au lieu de la méthode d'installation dans QuickStart.
pip3 install -e '.'
Plus d'informations : mac.md
Veuillez utiliser cet exemple de bloc-notes.
Pour lancer sur des instances GPU (instances à la demande et ponctuelles) sur plus de 7 clouds (GCP, AWS, Azure, OCI, etc.), vous pouvez utiliser SkyPilot :
pip install " skypilot-nightly[gcp,aws,azure,oci,lambda,kubernetes,ibm,scp] " # choose your clouds
sky check
Obtenez les exemples YAML d'utilisation d'Axolotl pour affiner mistralai/Mistral-7B-v0.1
:
git clone https://github.com/skypilot-org/skypilot.git
cd skypilot/llm/axolotl
Utilisez une commande pour lancer :
# 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
Pour lancer sur une instance GPU (instances à la demande et ponctuelles) sur des cloud publics (GCP, AWS, Azure, Lambda Labs, TensorDock, Vast.ai et CUDO), vous pouvez utiliser dstack.
Rédigez une description de poste en YAML comme ci-dessous :
# 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
Ensuite, exécutez simplement le travail avec la commande dstack run
. Ajoutez l’option --spot
si vous voulez une instance ponctuelle. La commande dstack run
vous montrera l'instance avec le prix le moins cher sur les services multi-cloud :
pip install dstack
HUGGING_FACE_HUB_TOKEN=xxx WANDB_API_KEY=xxx dstack run . -f dstack.yaml # --spot
Pour des cas d'utilisation plus approfondis et plus précis, veuillez vous référer aux documents officiels de dstack et à la description détaillée de l'exemple axolotl sur le référentiel officiel.
Axolotl prend en charge une variété de formats d'ensembles de données. Il est recommandé d'utiliser un JSONL. Le schéma du JSONL dépend de la tâche et du modèle d'invite que vous souhaitez utiliser. Au lieu d'un JSONL, vous pouvez également utiliser un ensemble de données HuggingFace avec des colonnes pour chaque champ JSONL.
Consultez la documentation pour plus d'informations sur la façon d'utiliser différents formats d'ensemble de données.
Voir des exemples pour un démarrage rapide. Il est recommandé de dupliquer et de modifier selon vos besoins. Les options les plus importantes sont :
modèle
base_model : ./llama-7b-hf # local or huggingface repo
Remarque : Le code chargera la bonne architecture.
ensemble de données
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.
chargement
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
Remarque : Repo n'effectue pas de quantification 4 bits.
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
Consultez ces documents pour toutes les options de configuration.
Courir
accelerate launch -m axolotl.cli.train your_config.yml
Conseil
Vous pouvez également référencer un fichier de configuration hébergé sur une URL publique, par exemple accelerate launch -m axolotl.cli.train https://yourdomain.com/your_config.yml
Vous pouvez éventuellement pré-tokeniser l'ensemble de données avec les éléments suivants avant de procéder au réglage fin. Ceci est recommandé pour les grands ensembles de données.
dataset_prepared_path:
sur un dossier local pour enregistrer et charger un ensemble de données pré-tokenisé.push_dataset_to_hub: hf_user/repo
pour le transmettre à Huggingface.--debug
pour voir des exemples prétraités. python -m axolotl.cli.preprocess your_config.yml
Vous trouverez ci-dessous les options disponibles dans axolotl pour l'entraînement avec plusieurs GPU. Notez que DeepSpeed est actuellement l’option multi-GPU recommandée car FSDP peut rencontrer une instabilité de perte.
Deepspeed est une suite d'optimisation pour les systèmes multi-GPU vous permettant d'entraîner des modèles beaucoup plus grands que ceux que vous pourriez généralement intégrer dans la VRAM de votre GPU. Plus d'informations sur les différents types d'optimisation pour deepspeed sont disponibles sur https://huggingface.co/docs/accelerate/main/en/usage_guides/deepspeed#what-is-integrated
Nous fournissons plusieurs configurations JSON deepspeed par défaut pour ZeRO étapes 1, 2 et 3.
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 prend en charge la formation avec FSDP et QLoRA, consultez ces documents pour plus d'informations.
Assurez-vous que votre variable d'environnement WANDB_API_KEY
est définie (recommandé) ou que vous vous connectez à wandb avec wandb login
.
wandb_mode :
wandb_project :
wandb_entity :
wandb_watch :
wandb_name :
wandb_log_model :
Assurez-vous que votre variable d'environnement COMET_API_KEY
est définie (recommandé) ou que vous vous connectez à wandb avec comet login
.
use_comet :
comet_api_key :
comet_workspace :
comet_project_name :
comet_experiment_key :
comet_mode :
comet_online :
comet_experiment_config :
Il est important d'avoir des jetons spéciaux comme des délimiteurs, une fin de séquence, un début de séquence dans le vocabulaire de votre tokeniseur. Cela vous aidera à éviter les problèmes de tokenisation et à mieux entraîner votre modèle. Vous pouvez le faire en axolotl comme ceci :
special_tokens :
bos_token : " <s> "
eos_token : " </s> "
unk_token : " <unk> "
tokens : # these are delimiters
- " <|im_start|> "
- " <|im_end|> "
Lorsque vous incluez ces jetons dans votre configuration axolotl, axolotl ajoute ces jetons au vocabulaire du tokenizer.
Noyau Liger : noyaux Triton efficaces pour la formation LLM
https://github.com/linkedin/Liger-Kernel
Le noyau Liger (LinkedIn GPU Efficient Runtime) est une collection de noyaux Triton conçus spécifiquement pour la formation LLM. Il peut augmenter efficacement le débit d'entraînement multi-GPU de 20 % et réduire l'utilisation de la mémoire de 60 %. Le noyau Liger compose bien et est compatible avec FSDP et Deepspeed.
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
Axolotl vous permet de charger votre modèle dans un terrain de jeu de terminal interactif pour une expérimentation rapide. Le fichier de configuration est le même fichier de configuration utilisé pour la formation.
Transmettez l'indicateur approprié à la commande d'inférence, en fonction du type de modèle entraîné :
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
-- Avec hébergement Gradio
python -m axolotl.cli.inference examples/your_config.yml --gradio
Veuillez utiliser --sample_packing False
si vous l'avez activé et recevez l'erreur similaire à celle ci-dessous :
RuntimeError : la pile s'attend à ce que chaque tenseur soit de taille égale, mais a obtenu [1, 32, 1, 128] à l'entrée 0 et [1, 32, 8, 128] à l'entrée 1
La commande suivante fusionnera votre adaptateur LORA avec votre modèle de base. Vous pouvez éventuellement passer l'argument --lora_model_dir
pour spécifier le répertoire dans lequel votre adaptateur LORA a été enregistré, sinon cela sera déduit de output_dir
dans votre fichier de configuration axolotl. Le modèle fusionné est enregistré dans le sous-répertoire {lora_model_dir}/merged
.
python3 -m axolotl.cli.merge_lora your_config.yml --lora_model_dir= " ./completed-model "
Vous devrez peut-être utiliser les options de configuration gpu_memory_limit
et/ou lora_on_cpu
pour éviter de manquer de mémoire. Si vous manquez toujours de mémoire CUDA, vous pouvez essayer de fusionner la RAM système avec
CUDA_VISIBLE_DEVICES= " " python3 -m axolotl.cli.merge_lora ...
bien que cela soit très lent, il est recommandé d'utiliser les options de configuration ci-dessus.
Voir également la FAQ et le guide de débogage.
Si vous rencontrez une erreur « Cuda out of memory », cela signifie que votre GPU a manqué de mémoire pendant le processus de formation. Voici comment le résoudre :
Veuillez réduire tout ci-dessous
micro_batch_size
eval_batch_size
gradient_accumulation_steps
sequence_len
Si cela ne résout pas le problème, essayez d'exécuter sans deepspeed et sans accélération (remplacez "accélération du lancement" par "python") dans la commande.
L'utilisation d'adamw_bnb_8bit peut également vous faire économiser de la mémoire.
failed (exitcode: -9)
Cela signifie généralement que votre système n'a plus de mémoire système. De même, vous devriez envisager de réduire les mêmes paramètres que lorsque vous manquez de VRAM. De plus, envisagez de mettre à niveau la RAM de votre système, ce qui devrait être plus simple que les mises à niveau du GPU.
RuntimeError : type scalaire attendu Float mais trouvé Half
Essayez de définir fp16: true
NotImplementedError : aucun opérateur trouvé pour
memory_efficient_attention_forward
...
Essayez de désactiver les xformers.
accélérer la configuration manquante
Il est prudent de l'ignorer.
Délais d'attente NCCL pendant la formation
Consultez le guide NCCL.
Pour de nombreux formats, Axolotl construit des invites en concaténant les identifiants de jeton après avoir tokenisé les chaînes. La raison de la concaténation des identifiants de jetons plutôt que d’opérer sur des chaînes est de maintenir une comptabilité précise des masques d’attention.
Si vous décodez une invite construite par axolotl, vous pourriez voir des espaces entre les jetons (ou leur absence) auxquels vous ne vous attendez pas, en particulier autour des délimiteurs et des jetons spéciaux. Lorsque vous débutez avec un nouveau format, vous devez toujours procéder comme suit :
python -m axolotl.cli.preprocess your_config.yml --debug
, puis décodez les premières lignes avec le tokenizer de votre modèle.Un désalignement entre vos invites pendant la formation et l'inférence peut entraîner de très mauvaises performances des modèles, cela vaut donc la peine de vérifier cela. Voir cet article de blog pour un exemple concret.
Consultez ce guide de débogage pour obtenir des conseils sur le débogage d'Axolotl, ainsi qu'un exemple de configuration pour le débogage avec VSCode.
Rejoignez notre serveur Discord où nous, les membres de notre communauté, pouvons vous aider.
Besoin d'un accompagnement dédié ? Veuillez nous contacter à ✉️[email protected] pour des options d'assistance dédiées.
Construire quelque chose de cool avec Axolotl ? Pensez à ajouter un badge à votre fiche modèle.
[ < 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 )
Découvrez quelques-uns des projets et modèles qui ont été construits avec Axolotl ! Vous avez un modèle que vous aimeriez ajouter à notre vitrine communautaire ? Ouvrez un PR avec votre modèle.
Collectif IA en libre accès
Laboratoires PocketDoc
Veuillez lire le guide de contribution
Insectes? Veuillez vérifier les problèmes ouverts, sinon créez un nouveau problème.
Les PR sont les bienvenus !
Veuillez exécuter les instructions de démarrage rapide suivies de celles ci-dessous pour configurer l'environnement :
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
Merci à tous nos contributeurs à ce jour. Aidez à faire progresser l’IA open source en contribuant à Axolotl.
OpenAccess AI Collective est géré par des contributeurs bénévoles tels que winglian, NanoCode012, tmm1, mhenrichsen, casper-hansen, hamelsmu et bien d'autres qui nous aident à accélérer en corrigeant des bugs, en répondant aux questions de la communauté et en implémentant de nouvelles fonctionnalités. Axolotl a besoin de dons de sponsors pour le calcul nécessaire à l'exécution de nos tests unitaires et d'intégration, au dépannage des problèmes de communauté et à l'offre de primes. Si vous aimez l'axolotl, envisagez de parrainer le projet via GitHub Sponsors, Ko-fi ou contactez directement [email protected].