Axolotl(蝾螈)
Axolotl是一个旨在简化各种AI模型微调过程的工具,支持多种配置和架构。
特点:
- 训练各种Huggingface模型,如llama、pythia、falcon、mpt
- 支持全量微调、LoRA、QLoRA、ReLoRA和GPTQ
- 使用简单的yaml文件或命令行覆盖来自定义配置
- 加载不同的数据集格式,使用自定义格式,或使用您自己的标记化数据集
- 集成了xformer、flash attention、RoPE缩放和多包技术
- 适用于单GPU或通过FSDP或Deepspeed使用多GPU
- 可轻松在本地或云端使用Docker运行
- 将结果和可选的检查点记录到wandb或mlflow
- 以及更多功能!
## 目录 - [简介](#axolotl) - [支持的功能](#axolotl-支持) - [快速入门](#快速入门-) - [环境](#环境) - [Docker](#docker) - [Conda/Pip虚拟环境](#condapip虚拟环境) - [云GPU](#云gpu) - Latitude.sh, JarvisLabs, RunPod - [裸机云GPU](#裸机云gpu) - [Windows](#windows) - [Mac](#mac) - [Google Colab](#google-colab) - [通过SkyPilot在公有云上启动](#通过skypilot在公有云上启动) - [通过dstack在公有云上启动](#通过dstack在公有云上启动) - [数据集](#数据集) - [配置](#配置) - [训练](#训练) - [推理](#推理-playground) - [将LORA合并到基础模型](#将lora合并到基础模型) - [特殊标记](#特殊标记) - [所有配置选项](#所有配置选项) - 高级主题 - [Multipack](./docs/multipack.qmd) - [RLHF & DPO](./docs/rlhf.qmd) - [数据集预处理](./docs/dataset_preprocessing.qmd) - [Unsloth](./docs/unsloth.qmd) - [常见错误](#常见错误-) - [训练与推理之间的分词不匹配](#训练与推理之间的分词不匹配) - [调试Axolotl](#调试axolotl) - [需要帮助?](#需要帮助-) - [徽章](#徽章-) - [社区展示](#社区展示) - [贡献](#贡献-) - [赞助商](#赞助商-) |
Axolotl提供了一个统一的仓库, 快来问Axolotl问题吧!! |
Axolotl支持
fp16/fp32 | lora | qlora | gptq | gptq w/flash attn | flash attn | xformers 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]'
使用方法
# 预处理数据集 - 可选但推荐
CUDA_VISIBLE_DEVICES="" python -m axolotl.cli.preprocess examples/openllama-3b/lora.yml
# 微调lora
accelerate launch -m axolotl.cli.train examples/openllama-3b/lora.yml
# 推理
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
# 远程yaml文件 - yaml配置可以托管在公共URL上
# 注意:yaml配置必须直接链接到**原始**yaml
accelerate launch -m axolotl.cli.train https://raw.githubusercontent.com/axolotl-ai-cloud/axolotl/main/examples/openllama-3b/lora.yml
高级设置
环境
Docker
docker run --gpus '"all"' --rm -it winglian/axolotl:main-latest
或者在当前文件上运行以进行开发:
docker compose up -d
[!提示] 如果您想调试axolotl或更喜欢使用Docker作为开发环境,请参阅调试指南的Docker部分。
Docker高级用法
一个更强大的Docker运行命令如下:
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 winglian/axolotl:main-latest
此外,它还:
- 通过
--ipc
和--ulimit
参数防止运行 deepspeed 等时出现内存问题(例如可能遇到 SIGBUS/信号 7 错误)。 - 通过
--mount
/-v
参数保存下载的 HF 数据(模型等)和你对 axolotl 代码的修改。 --name
参数只是让你在 vscode (Dev Containers: Attach to Running Container...
) 或终端中更容易引用容器。--privileged
标志赋予容器所有权限。--shm-size 10g
参数增加共享内存大小。如果使用 deepspeed 时看到exitcode: -7
错误,请使用此参数。
Conda/Pip 虚拟环境
-
安装 Python >=3.10
-
安装 PyTorch 稳定版 https://pytorch.org/get-started/locally/
-
安装 Axolotl 及其 Python 依赖
pip3 install packaging pip3 install -e '.[flash-attn,deepspeed]'
-
(可选) 登录 Huggingface 以使用受限模型/数据集。
huggingface-cli login
在 huggingface.co/settings/tokens 获取令牌
云 GPU
对于支持 Docker 镜像的云 GPU 提供商,使用 winglian/axolotl-cloud:main-latest
裸机云 GPU
LambdaLabs
- 安装 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 # 如果有选项,选择 3.10
python -V # 应该是 3.10
- 安装 pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
-
安装 PyTorch https://pytorch.org/get-started/locally/
-
按快速入门指南操作。
-
运行
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
GCP
使用已安装 CUDA 和 PyTorch 的深度学习 Linux 操作系统。然后按快速入门指南操作。
确保运行以下命令卸载 xla。
pip uninstall -y torch_xla[tpu]
Windows
请使用 WSL 或 Docker!
Mac
使用以下命令替代快速入门中的安装方法。
pip3 install -e '.'
更多信息:mac.md
Google Colab
请使用此示例笔记本。
通过 SkyPilot 在公有云上启动
要在 7+ 个云平台(GCP、AWS、Azure、OCI 等)的 GPU 实例(包括按需和竞价实例)上启动,你可以使用 SkyPilot:
pip install "skypilot-nightly[gcp,aws,azure,oci,lambda,kubernetes,ibm,scp]" # 选择你的云平台
sky check
获取使用 Axolotl 微调 mistralai/Mistral-7B-v0.1
的示例 YAML:
git clone https://github.com/skypilot-org/skypilot.git
cd skypilot/llm/axolotl
使用一条命令启动:
# 按需
HF_TOKEN=xx sky launch axolotl.yaml --env HF_TOKEN
# 托管竞价(自动恢复抢占)
HF_TOKEN=xx BUCKET=<unique-name> sky spot launch axolotl-spot.yaml --env HF_TOKEN --env BUCKET
通过 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
选项。dstack run
命令会向你展示多个云服务中价格最便宜的实例:
pip install dstack
HUGGING_FACE_HUB_TOKEN=xxx WANDB_API_KEY=xxx dstack run . -f dstack.yaml # --spot
对于更多和更细粒度的用例,请参阅官方 dstack 文档和官方仓库中 axolotl 示例的详细描述。
数据集
Axolotl 支持多种数据集格式。推荐使用 JSONL。JSONL 的模式取决于任务和你想使用的提示模板。除了 JSONL,你还可以使用包含每个 JSONL 字段列的 HuggingFace 数据集。
有关如何使用不同数据集格式的更多信息,请参阅文档。
配置
请查看示例以快速入门。建议复制并根据需要修改。最重要的选项有:
-
模型
base_model: ./llama-7b-hf # 本地或 huggingface 仓库
注意:代码将加载正确的架构。
-
数据集
datasets: # huggingface 仓库 - path: vicgalle/alpaca-gpt4 type: alpaca # 带有特定配置/子集的 huggingface 仓库 - path: EleutherAI/pile name: enron_emails type: completion # 之前的格式 field: text # 可选[str] 默认:text,用于完成数据的字段 # 带有多个命名配置/子集的 huggingface 仓库 - path: bigcode/commitpackft name: - ruby - python - typescript type: ... # 未实现的自定义格式 # fastchat 对话 # 参见 'conversation' 选项:https://github.com/lm-sys/FastChat/blob/main/fastchat/conversation.py - path: ... type: sharegpt conversation: chatml # 默认:vicuna_v1.1 # 本地 - path: data.jsonl # 或 json ds_type: json # 参见下面的其他选项 type: alpaca # 有分割但没有训练分割的数据集 - path: knowrohit07/know_sql type: context_qa.load_v2 train_on_split: validation # 从 s3 或 gcs 加载 # s3 凭证将从系统默认加载,gcs 仅支持公共访问 - path: s3://path_to_ds # 接受包含 arrow/parquet 的文件夹或如上所述的文件路径。支持 s3、gcs。 ... # 从公共 URL 加载数据 # - 文件格式默认为 `json`(包括 `jsonl`)。对于不同的格式,请相应调整 `ds_type` 选项。 - path: https://some.url.com/yourdata.jsonl # URL 应该是你想加载的文件的直接链接。URL 必须使用 HTTPS 协议,而非 HTTP。 ds_type: json # 这是默认值,参见下面的其他选项。
-
加载
load_in_4bit: true load_in_8bit: true bf16: auto # 需要 >=ampere,auto 将检测你的 GPU 是否支持并自动选择。 fp16: # 留空以在 bf16 为 'auto' 时使用 fp16。如果你想回退到 fp32,设置为 false tf32: true # 需要 >=ampere bfloat16: true # 需要 >=ampere,当你不想使用 AMP(自动混合精度)时使用,而不是 bf16 float16: true # 当你不想使用 AMP 时使用,而不是 fp16
注意:该仓库不进行 4 位量化。
-
lora
adapter: lora # '全量微调'或留空为完全微调 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可能会遇到 损失不稳定的问题。
DeepSpeed
Deepspeed是一个多GPU系统的优化套件,允许你训练比通常能够适应GPU VRAM的更大的模型。关于deepspeed各种优化类型的更多信息 可以在 https://huggingface.co/docs/accelerate/main/en/usage_guides/deepspeed#what-is-integrated 找到
我们提供了几个默认的deepspeed JSON配置,用于ZeRO阶段1、2和3。
deepspeed: deepspeed_configs/zero1.json
accelerate launch -m axolotl.cli.train examples/llama-2/config.yml --deepspeed deepspeed_configs/zero1.json
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
FSDP + QLoRA
Axolotl支持使用FSDP和QLoRA进行训练,更多信息请参见这些文档。
Weights & Biases 日志记录
确保你的 WANDB_API_KEY
环境变量已设置(推荐)或使用 wandb login
登录到wandb。
- wandb选项
wandb_mode:
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:
特殊标记
在你的分词器词汇表中包含特殊标记(如分隔符、序列结束、序列开始)很重要。这将帮助你避免分词问题并帮助你的模型更好地训练。你可以在axolotl中这样做:
special_tokens:
bos_token: "<s>"
eos_token: "</s>"
unk_token: "<unk>"
tokens: # 这些是分隔符
- "<|im_start|>"
- "<|im_end|>"
当你在axolotl配置中包含这些标记时,axolotl会将这些标记添加到分词器的词汇表中。
推理游乐场
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"
- 全权重微调,使用来自文本文件的提示:
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: stack expects each tensor to be equal size, but got [1, 32, 1, 128] at entry 0 and [1, 32, 8, 128] at entry 1
将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
如果这不起作用,尝试在命令中不使用deepspeed和accelerate(将"accelerate launch"替换为"python")。
使用adamw_bnb_8bit也可能节省一些内存。
failed (exitcode: -9)
通常意味着你的系统耗尽了系统内存。 同样,你应该考虑减少与耗尽VRAM时相同的设置。 此外,考虑升级你的系统RAM,这应该比GPU升级更简单。
RuntimeError: expected scalar type Float but found Half
尝试设置 fp16: true
NotImplementedError: No operator found for
memory_efficient_attention_forward
...
尝试关闭xformers。
accelerate配置缺失
可以安全忽略。
训练期间出现NCCL超时
参见NCCL指南。
推理和训练之间的分词不匹配
对于许多格式,Axolotl通过在分词字符串之后连接标记ID来构建提示。之所以连接标记ID而不是操作字符串,是为了维持注意力掩码的精确计算。
如果你解码由axolotl构建的提示,你可能会看到标记之间的空格(或缺少空格),这可能是你所不期望的,尤其是在分隔符和特殊标记周围。当你开始使用新格式时,你应该始终执行以下操作:
- 使用
python -m axolotl.cli.preprocess your_config.yml --debug
具体化一些数据,然后用你的模型的分词器解码前几行。 - 在推理过程中,在将标记ID的张量传递给你的模型之前,将这些标记解码回字符串。
- 确保#2中的推理字符串看起来与#1中你微调的数据完全相同,包括空格和换行符。如果它们不相同,相应地调整你的推理服务器。
- 作为额外的故障排除步骤,你可以查看1和2之间的标记ID,确保它们是相同的。
在训练和推理期间的提示之间存在不一致可能会导致模型表现非常差,所以值得检查这一点。查看这篇博文以获取具体示例。
调试Axolotl
查看这个调试指南以获取有关调试Axolotl的提示,以及使用VSCode进行调试的示例配置。
需要帮助? 🙋
加入我们的Discord服务器,我们的社区成员可以在那里帮助你。
需要专门支持?请通过✉️wing@openaccessaicollective.org联系我们,了解专门支持选项。
徽章 ❤🏷️
使用Axolotl构建了很酷的东西?考虑在你的模型卡片中添加一个徽章。
[<img src="https://yellow-cdn.veclightyear.com/835a84d5/763144fe-9385-42d8-a548-da46c23db4c8.png" alt="Built with Axolotl" width="200" height="32"/>](https://github.com/axolotl-ai-cloud/axolotl)
社区展示
查看一些使用Axolotl构建的项目和模型!想要将你的模型添加到我们的社区展示中吗?提交一个包含你的模型的PR。 开放访问人工智能集体
PocketDoc 实验室
贡献 🤝
请阅读贡献指南
发现bug?请查看未解决的问题,如果没有相关问题,请创建一个新的问题。
非常欢迎提交PR!
请按照快速入门说明操作,然后执行以下命令来设置环境:
pip3 install -r requirements-dev.txt -r requirements-tests.txt
pre-commit install
# 测试
pytest tests/
# 可选:对所有文件运行
pre-commit run --all-files
感谢迄今为止所有的贡献者。通过为Axolotl做出贡献,帮助推动开源人工智能的进步。
赞助商 🤝❤
开放访问人工智能集体由志愿贡献者运营,如winglian、 NanoCode012、tmm1、 mhenrichsen、casper-hansen、 hamelsmu等许多人,他们通过修复bug、回答社区问题和实现新功能来帮助我们加速前进。Axolotl需要赞助商的捐赠来支付运行单元和集成测试、解决社区问题以及提供奖励所需的计算资源。如果您喜欢axolotl,请考虑通过GitHub赞助商、 Ko-fi赞助该项目,或直接联系 wing@openaccessaicollective.org。