Axolotl é uma ferramenta projetada para agilizar o ajuste fino de vários modelos de IA, oferecendo suporte para múltiplas configurações e arquiteturas.
Características:
Índice
| Axolotl fornece um repositório unificado para ajuste fino Vá em frente e perguntas sobre Axolotl!! |
fp16/fp32 | Lora | qlora | gptq | gptq com atenção flash | flash atenção | xformers atenção | |
---|---|---|---|---|---|---|---|
lhama | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Mistral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Mixtral-MoE | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Mixtral8X22 | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Pítia | ✅ | ✅ | ✅ | ❓ | |||
cérebros | ✅ | ✅ | ✅ | ❓ | |||
btlm | ✅ | ✅ | ✅ | ❓ | |||
mpt | ✅ | ❓ | ❓ | ||||
falcão | ✅ | ✅ | ✅ | ❓ | |||
gpt-j | ✅ | ✅ | ✅ | ❓ | ❓ | ||
XGen | ✅ | ❓ | ✅ | ❓ | ❓ | ❓ | ✅ |
phi | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
RWKV | ✅ | ❓ | ❓ | ❓ | ❓ | ❓ | ❓ |
Qwen | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | ❓ |
Gema | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ | ❓ |
Jamba | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ | ❓ |
✅: suportado: não suportado ❓: não testado
Comece a usar o Axolotl em apenas algumas etapas! Este guia de início rápido orientará você na configuração e execução de uma tarefa básica de ajuste fino.
Requisitos : GPU Nvidia (arquitetura Ampere ou mais recente para bf16
e Flash Attention), Python >=3.10 e 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 execute nos arquivos atuais para desenvolvimento:
docker compose up -d
Dica
Se você deseja depurar o axolotl ou prefere usar o Docker como seu ambiente de desenvolvimento, consulte a seção do guia de depuração no Docker.
Um comando Docker mais poderoso para executar seria este:
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
Além disso:
--ipc
e --ulimit
.--mount
/ -v
args.--name
simplesmente facilita a referência ao contêiner no vscode ( Dev Containers: Attach to Running Container...
) ou em seu terminal.--privileged
fornece todos os recursos ao contêiner.--shm-size 10g
aumenta o tamanho da memória compartilhada. Use isto se você vir erros exitcode: -7
usando deepspeed.Mais informações no site da nvidia
Instale python>= 3.10
Instale o pytorch estável https://pytorch.org/get-started/locally/
Instale o Axolotl junto com as dependências do python
pip3 install packaging
pip3 install -e ' .[flash-attn,deepspeed] '
(Opcional) Faça login no Huggingface para usar modelos/conjuntos de dados bloqueados.
huggingface-cli login
Obtenha o token em huggingface.co/settings/tokens
Para provedores de GPU em nuvem que suportam imagens docker, use 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
Instale o Pytorch https://pytorch.org/get-started/locally/
Siga as instruções no início rápido.
Correr
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
Use um sistema operacional Linux Deeplearning com cuda e pytorch instalados. Em seguida, siga as instruções no início rápido.
Certifique-se de executar o procedimento abaixo para desinstalar o xla.
pip uninstall -y torch_xla[tpu]
Por favor, use WSL ou Docker!
Use o método abaixo em vez do método de instalação no QuickStart.
pip3 install -e '.'
Mais informações: mac.md
Por favor, use este caderno de exemplo.
Para iniciar em instâncias de GPU (instâncias sob demanda e spot) em mais de 7 nuvens (GCP, AWS, Azure, OCI e mais), você pode usar o SkyPilot:
pip install " skypilot-nightly[gcp,aws,azure,oci,lambda,kubernetes,ibm,scp] " # choose your clouds
sky check
Obtenha os YAMLs de exemplo do uso do Axolotl para ajustar mistralai/Mistral-7B-v0.1
:
git clone https://github.com/skypilot-org/skypilot.git
cd skypilot/llm/axolotl
Use um comando para iniciar:
# 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
Para iniciar em instâncias de GPU (instâncias sob demanda e spot) em nuvens públicas (GCP, AWS, Azure, Lambda Labs, TensorDock, Vast.ai e CUDO), você pode usar dstack.
Escreva uma descrição do trabalho em YAML conforme abaixo:
# 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
em seguida, simplesmente execute o trabalho com o comando dstack run
. Anexe a opção --spot
se desejar uma instância spot. O comando dstack run
mostrará a instância com preço mais barato em serviços multinuvem:
pip install dstack
HUGGING_FACE_HUB_TOKEN=xxx WANDB_API_KEY=xxx dstack run . -f dstack.yaml # --spot
Para casos de uso mais detalhados, consulte os documentos oficiais do dstack e a descrição detalhada do exemplo do axolotl no repositório oficial.
Axolotl oferece suporte a uma variedade de formatos de conjuntos de dados. Recomenda-se usar um JSONL. O esquema do JSONL depende da tarefa e do modelo de prompt que você deseja usar. Em vez de JSONL, você também pode usar um conjunto de dados HuggingFace com colunas para cada campo JSONL.
Consulte a documentação para obter mais informações sobre como usar diferentes formatos de conjunto de dados.
Veja exemplos para início rápido. Recomenda-se duplicar e modificar de acordo com suas necessidades. As opções mais importantes são:
modelo
base_model : ./llama-7b-hf # local or huggingface repo
Nota: O código carregará a arquitetura correta.
conjunto de dados
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.
carregando
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
Nota: Repo não faz quantização de 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
Consulte estes documentos para todas as opções de configuração.
Correr
accelerate launch -m axolotl.cli.train your_config.yml
Dica
Você também pode fazer referência a um arquivo de configuração hospedado em uma URL pública, por exemplo, accelerate launch -m axolotl.cli.train https://yourdomain.com/your_config.yml
Opcionalmente, você pode pré-tokenizar o conjunto de dados com o seguinte antes do ajuste fino. Isso é recomendado para grandes conjuntos de dados.
dataset_prepared_path:
para uma pasta local para salvar e carregar o conjunto de dados pré-tokenizado.push_dataset_to_hub: hf_user/repo
para enviá-lo para Huggingface.--debug
para ver exemplos pré-processados. python -m axolotl.cli.preprocess your_config.yml
Abaixo estão as opções disponíveis no axolotl para treinamento com múltiplas GPUs. Observe que DeepSpeed é a opção multi-GPU recomendada atualmente porque o FSDP pode apresentar instabilidade de perda.
Deepspeed é um conjunto de otimização para sistemas multi-GPU que permite treinar modelos muito maiores do que você normalmente conseguiria caber na VRAM da sua GPU. Mais informações sobre os vários tipos de otimização para deepspeed estão disponíveis em https://huggingface.co/docs/accelerate/main/en/usage_guides/deepspeed#what-is-integrated
Fornecemos várias configurações JSON de velocidade profunda padrão para os estágios 1, 2 e 3 do ZeRO.
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 suporta treinamento com FSDP e QLoRA, consulte estes documentos para obter mais informações.
Certifique-se de que sua variável de ambiente WANDB_API_KEY
esteja definida (recomendado) ou faça login no wandb com wandb login
.
wandb_mode :
wandb_project :
wandb_entity :
wandb_watch :
wandb_name :
wandb_log_model :
Certifique-se de que sua variável de ambiente COMET_API_KEY
esteja definida (recomendado) ou faça login no wandb com comet login
.
use_comet :
comet_api_key :
comet_workspace :
comet_project_name :
comet_experiment_key :
comet_mode :
comet_online :
comet_experiment_config :
É importante ter tokens especiais como delimitadores, fim de sequência e início de sequência no vocabulário do seu tokenizador. Isso o ajudará a evitar problemas de tokenização e a treinar melhor seu modelo. Você pode fazer isso no axolotl assim:
special_tokens : bos_token : ""eos_token : " " unk_token : "" tokens : # these are delimiters - " <|im_start|> " - " <|im_end|> "
Quando você inclui esses tokens na configuração do axolotl, o axolotl adiciona esses tokens ao vocabulário do tokenizer.
Liger Kernel: Kernels Triton eficientes para treinamento LLM
https://github.com/linkedin/Liger-Kernel
Kernel Liger (LinkedIn GPU Efficient Runtime) é uma coleção de kernels Triton projetados especificamente para treinamento LLM. Ele pode aumentar efetivamente o rendimento do treinamento multi-GPU em 20% e reduzir o uso de memória em 60%. O Liger Kernel compõe bem e é compatível com FSDP e 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 permite que você carregue seu modelo em um terminal interativo para experimentação rápida. O arquivo de configuração é o mesmo arquivo de configuração usado para treinamento.
Passe o sinalizador apropriado para o comando de inferência, dependendo do tipo de modelo que foi treinado:
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
- Com hospedagem gradio
python -m axolotl.cli.inference examples/your_config.yml --gradio
Use --sample_packing False
se estiver ativado e receber o erro semelhante ao abaixo:
RuntimeError: a pilha espera que cada tensor tenha tamanho igual, mas obteve [1, 32, 1, 128] na entrada 0 e [1, 32, 8, 128] na entrada 1
O comando a seguir irá mesclar seu adaptador LORA com seu modelo base. Opcionalmente, você pode passar o argumento --lora_model_dir
para especificar o diretório onde seu adaptador LORA foi salvo, caso contrário, isso será inferido de output_dir
em seu arquivo de configuração axolotl. O modelo mesclado é salvo no subdiretório {lora_model_dir}/merged
.
python3 -m axolotl.cli.merge_lora your_config.yml --lora_model_dir= " ./completed-model "
Pode ser necessário usar as opções de configuração gpu_memory_limit
e/ou lora_on_cpu
para evitar ficar sem memória. Se ainda ficar sem memória CUDA, você pode tentar mesclar a RAM do sistema com
CUDA_VISIBLE_DEVICES= " " python3 -m axolotl.cli.merge_lora ...
embora isso seja muito lento, é recomendável usar as opções de configuração acima.
Consulte também as perguntas frequentes e o guia de depuração.
Se você encontrar um erro ‘Cuda sem memória’, significa que sua GPU ficou sem memória durante o processo de treinamento. Veja como resolver isso:
Por favor, reduza qualquer abaixo
micro_batch_size
eval_batch_size
gradient_accumulation_steps
sequence_len
Se não ajudar, tente executar sem deepspeed e sem acelerar (substitua "accelerate launch" por "python") no comando.
Usar adamw_bnb_8bit também pode economizar memória.
failed (exitcode: -9)
Geralmente significa que seu sistema ficou sem memória do sistema. Da mesma forma, você deve considerar reduzir as mesmas configurações de quando fica sem VRAM. Além disso, considere atualizar a RAM do sistema, que deve ser mais simples do que as atualizações de GPU.
RuntimeError: tipo escalar esperado Float, mas encontrado Half
Tente definir fp16: true
NotImplementedError: Nenhum operador encontrado para
memory_efficient_attention_forward
...
Tente desligar o xformers.
acelerar configuração ausente
É seguro ignorá-lo.
Tempo limite NCCL durante o treinamento
Consulte o guia NCCL.
Para muitos formatos, o Axolotl constrói prompts concatenando IDs de token após tokenizar strings. A razão para concatenar IDs de token em vez de operar em strings é manter uma contabilização precisa das máscaras de atenção.
Se você decodificar um prompt construído pelo axolotl, poderá ver espaços inesperados entre os tokens (ou a falta deles), especialmente em torno de delimitadores e tokens especiais. Ao iniciar um novo formato, você deve sempre fazer o seguinte:
python -m axolotl.cli.preprocess your_config.yml --debug
e, em seguida, decodifique as primeiras linhas com o tokenizer do seu modelo.O desalinhamento entre os prompts durante o treinamento e a inferência pode fazer com que os modelos tenham um desempenho muito ruim, por isso vale a pena verificar isso. Veja esta postagem do blog para um exemplo concreto.
Consulte este guia de depuração para obter dicas sobre como depurar o Axolotl, junto com um exemplo de configuração para depuração com VSCode.
Junte-se ao nosso servidor Discord, onde nós, membros da comunidade, podemos ajudá-lo.
Precisa de suporte dedicado? Entre em contato conosco em ✉️[email protected] para opções de suporte dedicadas.
Construindo algo legal com Axolotl? Considere adicionar um emblema ao seu cartão de modelo.
](https://github.com/axolotl-ai-cloud/axolotl)">[ < 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 )
Confira alguns dos projetos e modelos que foram construídos com Axolotl! Tem um modelo que gostaria de adicionar ao nosso Community Showcase? Abra um PR com seu modelo.
Coletivo de IA de acesso aberto
Laboratórios PocketDoc
Por favor, leia o guia de contribuição
Insetos? Verifique os problemas em aberto, caso contrário, crie um novo problema.
PRs são muito bem-vindos !
Execute as instruções de início rápido seguidas abaixo para configurar o ambiente:
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
Obrigado a todos os nossos colaboradores até o momento. Ajude a impulsionar o progresso da IA de código aberto contribuindo com a Axolotl.
O OpenAccess AI Collective é administrado por colaboradores voluntários como winglian, NanoCode012, tmm1, mhenrichsen, casper-hansen, hamelsmu e muitos outros que nos ajudam a acelerar corrigindo bugs, respondendo a perguntas da comunidade e implementando novos recursos. Axolotl precisa de doações de patrocinadores para a computação necessária para executar nossos testes unitários e de integração, solucionar problemas da comunidade e fornecer recompensas. Se você adora axolotl, considere patrocinar o projeto por meio dos patrocinadores do GitHub, Ko-fi ou entre em contato diretamente com [email protected].