Axolotl

Axolotl



一、关于 Axolotl

Axolotl是一种旨在简化各种AI模型微调的工具,提供对多种配置和架构的支持。

在这里插入图片描述


特点

  • 训练各种Huggingface模型,如美洲驼、蟒蛇、猎鹰、mpt
  • 支持fullfinetune、lora、qlora、relora和gptq
  • 使用简单的yaml文件或CLI覆盖自定义配置
  • 加载不同的数据集格式、使用自定义格式或自带标记化数据集
  • 与xher、闪存关注、绳索缩放和多重包装集成
  • 通过FSDP或DeepSpeed与单个GPU或多个GPU一起使用
  • 使用Docker在本地或云上轻松运行
  • 将结果和可选的检查点记录到wandb或mlflow
  • 还有更多!

Axolotl支持

fp16/fp32loraqloragptqgptq w/flash attnflash attnxformers attn
llama
Mistral
Mixtral-MoE
Mixtral8X22
Pythia
cerebras
btlm
mpt
falcon
gpt-j
XGen
phi
RWKV
Qwen
Gemma

✅:支持❌:不支持❓:未经测试


二、快速入门⚡

只需几个步骤即可开始使用Axolotl!本快速入门指南将引导您完成设置和运行基本微调任务。

要求:Python>=3.10 和 Pytorch>=2.1.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

三、环境设置


1、Docker
docker run --gpus '"all"' --rm -it winglian/axolotl:main-latest

或者在当前文件上运行进行开发:

docker compose up -d

注:如果您想调试axolotl或更喜欢使用Docker作为您的开发环境,请参阅调试指南中关于Docker的部分


2、Conda/Pip venv
  1. 安装python>=3.10
  2. 安装pytorch稳定https://pytorch.org/get-started/locally/
  3. 将Axolotl与python依赖项一起安装
pip3 install packaging
pip3 install -e '.[flash-attn,deepspeed]'
  1. (可选)登录Huggingface以使用门控模型/数据集。
huggingface-cli login

在 huggingface.co/settings/tokens 拿到令牌


3、Cloud GPU

对于支持docker映像的云GPU提供商,请使用winglian/axolotl-cloud:main-latest


4、Bare Metal Cloud GPU

LambdaLabs
  1. 安装 python
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
  1. 安装 pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
  1. 安装 Pytorch https://pytorch.org/get-started/locally/
  2. Follow instructions on quickstart.
  3. 运行
pip3 install protobuf==3.20.3
pip3 install -U --ignore-installed requests Pillow psutil scipy
  1. Set path
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

GCP

Use a Deeplearning linux OS with cuda and pytorch installed. Then follow instructions on quickstart.

Make sure to run the below to uninstall xla.

pip uninstall -y torch_xla[tpu]

5、Windows

请使用WSL或Docker!


6、Mac

使用下面的而不是快速入门中的安装方法。

pip3 install -e '.'

更多信息:mac.md


7、Google Colab

请使用此示例 笔记本


8、通过SkyPilot在公共云上启动

要在7+云上(GCP、AWS、Azure、OCI等)启动GPU实例(按需和现场实例),您可以使用SkyPilot

pip install "skypilot-nightly[gcp,aws,azure,oci,lambda,kubernetes,ibm,scp]"  # choose your clouds
sky check

获取使用Axolotl微调mistralai/Mistral-7B-v0.1示例YAMLs

git clone https://github.com/skypilot-org/skypilot.git
cd skypilot/llm/axolotl

使用一个命令启动:

# 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

9、通过 dstack 在公共云上启动

要在公共云(GCP、AWS、Azure、Lambda Labs、TensorDock、Vast.ai和CUDO)上启动GPU实例(按需实例和现场实例),可以使用dstack

用YAML写一份工作描述如下:

# dstack.yaml
type: task

image: winglian/axolotl-cloud:main-20240429-py3.11-cu121-2.2.2

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

然后,只需使用dstack run命令运行该作业。如果您需要spot实例,请附加--spot选项。dstack run命令将显示跨多个云服务价格最便宜的实例:

pip install dstack
HUGGING_FACE_HUB_TOKEN=xxx WANDB_API_KEY=xxx dstack run . -f dstack.yaml # --spot

有关进一步和细粒度的用例,请参阅官方dstack文档和官方存储库中axolotl示例的详细描述。


四、其他高级设置

1、数据集

Axolotl支持多种数据集格式。建议使用JSONL。JSONL的架构取决于您希望使用的任务和提示模板。除了JSONL,您还可以使用HuggingFace数据集,其中包含每个JSONL字段的列。

有关如何使用不同数据集格式的更多信息,请参阅这些文档


2、配置

请参阅示例以快速入门。建议根据您的需要复制和修改。最重要的选项是:

  • 模型
base_model: ./llama-7b-hf # local or huggingface repo

注意:代码将加载正确的架构。


  • 数据集
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

    # fastchat conversation
    # See 'conversation' options: https://github.com/lm-sys/FastChat/blob/main/fastchat/conversation.py
  - path: ...
    type: sharegpt
    conversation: chatml # default: vicuna_v1.1

    # 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.

  • 装载
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

注意:Repo不进行4位量化。


  • 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

所有配置选项

有关所有配置选项,请参阅这些文档


五、训练

运行

accelerate launch -m axolotl.cli.train your_config.yml

注:您还可以引用托管在公共URL上的配置文件,例如 accelerate launch -m axolotl.cli.train https://yourdomain.com/your_config.yml


预处理数据集

您可以选择在微调之前使用以下内容对数据集进行预标记化。推荐用于大型数据集。

  • dataset_prepared_path:设置为本地文件夹,用于保存和加载预标记化数据集。
  • (可选):设置push_dataset_to_hub: hf_user/repo将其推送到Huggingface。
  • (可选):使用--debug查看预处理示例。
python -m axolotl.cli.preprocess your_config.yml

多GPU

以下是axolotl中用于使用多个GPU进行训练的选项。请注意DeepSpeed 是目前推荐的多GPU选项,因为FSDP可能会遇到 损失不稳定性


1、DeepSpeed

DeepSpeed是多gpu系统的优化套件,可让您训练比您大得多的模型 通常可能能够适应GPU的VRAM。有关各种优化类型的更多信息 对于深度速度可在https://huggingface.co/docs/accelerate/main/en/usage_guides/deepspeed#what-is-integrated

我们为ZeRO第1、2和3阶段提供了几种默认的深度JSON配置。

deepspeed: deepspeed_configs/zero1.json

accelerate launch -m axolotl.cli.train examples/llama-2/config.yml --deepspeed deepspeed_configs/zero1.json

2、FSDP
  • llama FSDP
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

3、FSDP + QLoRA

Axolotl支持使用FSDP和QLoRA进行培训,有关详细信息,请参阅这些文档


4、权重和偏差记录

确保您的 WANDB_API_KEY 环境变量已设置(推荐),或者您使用 wandb login 登陆 wandb。

  • wandb 选项
wandb_mode:
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:

5、特殊 token

在标记器的词汇表中包含特殊的标记(如分隔符、序列结束beginning-of-sequence)非常重要。这将帮助您避免标记化问题并帮助您的模型更好地训练。您可以在axolotl中这样做:

special_tokens:
  bos_token: "<s>"
  eos_token: "</s>"
  unk_token: "<unk>"
tokens: # these are delimiters
  - "<|im_start|>"
  - "<|im_end|>"

当您在axolotl配置中包含这些标记时,axolotl会将这些标记添加到标记器的词汇表中。


6、Inference Playground

Axolotl允许您在交互式终端游乐场中加载模型以进行快速实验。配置文件与用于训练的配置文件相同。

根据训练的模型类型,将适当的标志传递给推理命令:

  • 预训练 LORA
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"
  • 从文件,全参数微调 w/ a prompt
cat /tmp/prompt.txt | python -m axolotl.cli.inference examples/your_config.yml \
--base_model="./completed-model" --prompter=None --load_in_8bit=True

  • 使用 gradio 托管
python -m axolotl.cli.inference examples/your_config.yml --gradio

请使用--sample_packing False,如果您打开它并收到类似于下面的错误:

RuntimeError:堆栈期望每个张量大小相等,但在条目0处得到[1,32,1,128],在条目1处得到[1,32,8,128]


7、将LORA 与基础合并

下面的命令将把你的LORA适配器与你的基本模型合并。你可以选择传递参数--lora_model_dir来指定你的LORA适配器保存的目录,否则,这将从axolotl配置文件中的output_dir中推断出来。
合并的模型保存在子目录{lora_model_dir}/merged中。

python3 -m axolotl.cli.merge_lora your_config.yml --lora_model_dir="./completed-model"

您可能需要使用 gpu_memory_limit 和/或 lora_on_cpu 配置选项来避免运行内存溢出。如果CUDA内存仍然不足,您可以尝试合并系统RAM

CUDA_VISIBLE_DEVICES="" python3 -m axolotl.cli.merge_lora ...

虽然这会很慢,但建议改用上面的配置选项。


六、常见错误 🧰

另请参阅常见问题解答调试指南

如果您遇到’Cuda内存溢出’错误,这意味着您的GPU在训练过程中内存溢出。以下是解决方法:


请减少以下任何内容

  • micro_batch_size
  • eval_batch_size
  • gradient_accumulation_steps
  • sequence_len

如果没有帮助,请尝试在命令中不使用深度速度和不加速(将“加速启动”替换为“python”)运行。

使用 adamw_bnb_8bit 也可以节省一些内存。

failed (exitcode: -9)

通常意味着您的系统内存用完了。同样,您应该考虑减少与VRAM用完时相同的设置。此外,考虑升级您的系统内存,这应该比GPU升级更简单。

RuntimeError:预期的标量类型Float但找到一半


尝试设置fp16: true

NotImplementedError: No operator found for memory_efficient_attention_forward


尝试关闭 xformers。

accelerate config missing


忽略它是安全的。

NCCL Timeouts during training

请参阅 NCCL 指南。


标记化不匹配 b/w 推理和训练

对于许多格式,Axolotl通过在标记字符串之后连接标记id来构造提示。连接标记id而不是对字符串进行操作的原因是为了保持对注意力掩码的精确计算。

如果您解码由axolotl构造的提示符,您可能会看到您不期望的标记之间的空格(或缺少空格),尤其是在分隔符和特殊标记周围。当您开始使用新格式时,您应该始终执行以下操作:

  1. 使用 python -m axolotl.cli.preprocess your_config.yml --debug 物化一些数据,然后使用模型的标记器解码前几行。
  2. 在推理过程中,就在您将令牌id张量传递给模型之前,将这些令牌解码回字符串。
  3. 确保#2中的推理字符串看起来与您从#1中微调的数据完全相同,包括空格和新行。如果它们不一样,请相应地调整您的推理服务器。
  4. 作为额外的故障排除步骤,您可以查看1到2之间的令牌id以确保它们相同。

训练和推理过程中的提示不一致会导致模型性能非常差,所以值得检查一下。这篇博客文章有一个具体的例子。


七、其他

调试 Axolotl

有关调试Axolotl的提示,以及使用VSCode进行调试的示例配置,请参阅此调试指南


需要帮忙吗?🙋

加入我们的不和谐服务器,我们的社区成员可以帮助您。

需要专门的支持?请通过✉️联系我们以获取专门的支持选项。


徽章❤🏷️

用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)

在这里插入图片描述


社区展示

查看一些使用Axolotl构建的项目和模型!有想要添加到我们的社区展示中的模型吗?使用您的模型打开PR。

开放存取AI集体


PocketDoc实验室


贡献🤝

请阅读投稿指南

错误?请检查未解决问题,否则创建新问题。

非常欢迎PR!

请运行以下快速入门说明以设置env:

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

感谢我们迄今为止的所有贡献者。通过为Axolotl做出贡献来帮助推动开源AI的进步。


2024-07-16(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值