文章目录
- 一、关于 Axolotl
- 特点
- Axolotl支持
- 二、快速入门⚡
- 用法
- 三、环境设置
- 1、Docker
- 2、Conda/Pip venv
- 3、Cloud GPU
- 4、Bare Metal Cloud GPU
- LambdaLabs
- GCP
- 5、Windows
- 6、Mac
- 7、Google Colab
- 8、通过SkyPilot在公共云上启动
- 9、通过 dstack 在公共云上启动
- 四、其他高级设置
- 1、数据集
- 2、配置
- 所有配置选项
- 五、训练
- 运行
- 预处理数据集
- 多GPU
- 1、DeepSpeed
- 2、FSDP
- 3、FSDP + QLoRA
- 4、权重和偏差记录
- 5、特殊 token
- 6、Inference Playground
- 7、将LORA 与基础合并
- 六、常见错误 🧰
- 标记化不匹配 b/w 推理和训练
- 七、其他
- 调试 Axolotl
- 需要帮忙吗?🙋
- 徽章❤🏷️
- 社区展示
- 贡献🤝
一、关于 Axolotl
Axolotl是一种旨在简化各种AI模型微调的工具,提供对多种配置和架构的支持。
- github : https://github.com/axolotl-ai-cloud/axolotl
- 官方文档:https://axolotl-ai-cloud.github.io/axolotl/
- 官网:https://axolotl.ai
特点
- 训练各种Huggingface模型,如美洲驼、蟒蛇、猎鹰、mpt
- 支持fullfinetune、lora、qlora、relora和gptq
- 使用简单的yaml文件或CLI覆盖自定义配置
- 加载不同的数据集格式、使用自定义格式或自带标记化数据集
- 与xher、闪存关注、绳索缩放和多重包装集成
- 通过FSDP或DeepSpeed与单个GPU或多个GPU一起使用
- 使用Docker在本地或云上轻松运行
- 将结果和可选的检查点记录到wandb或mlflow
- 还有更多!
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 axolotlpip3 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
- 安装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 拿到令牌
3、Cloud GPU
对于支持docker映像的云GPU提供商,请使用winglian/axolotl-cloud:main-latest
- Latitude.sh使用这个直接链接
- JarvisLabs.ai使用这个直接链接
- 在RunPod上使用此直接链接
4、Bare Metal Cloud GPU
LambdaLabs
- 安装 python
sudo apt update
sudo apt install -y python3.10sudo 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
- 安装 pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
- 安装 Pytorch https://pytorch.org/get-started/locally/
- Follow instructions on quickstart.
- 运行
pip3 install protobuf==3.20.3
pip3 install -U --ignore-installed requests Pillow psutil scipy
- 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: taskimage: winglian/axolotl-cloud:main-20240429-py3.11-cu121-2.2.2env:- HUGGING_FACE_HUB_TOKEN- WANDB_API_KEYcommands:- accelerate launch -m axolotl.cli.train config.yamlports:- 6006resources: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-gpt4type: alpaca# huggingface repo with specific configuration/subset- path: EleutherAI/pilename: enron_emailstype: completion # format from earlierfield: text # Optional[str] default: text, field to use for completion data# huggingface repo with multiple named configurations/subsets- path: bigcode/commitpackftname:- ruby- python- typescripttype: ... # unimplemented custom format# fastchat conversation# See 'conversation' options: https://github.com/lm-sys/FastChat/blob/main/fastchat/conversation.py- path: ...type: sharegptconversation: chatml # default: vicuna_v1.1# local- path: data.jsonl # or jsonds_type: json # see other options belowtype: alpaca# dataset with splits, but no train split- path: knowrohit07/know_sqltype: context_qa.load_v2train_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: truebf16: 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 >=amperebfloat16: 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: truefsdp_state_dict_type: FULL_STATE_DICTfsdp_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构造的提示符,您可能会看到您不期望的标记之间的空格(或缺少空格),尤其是在分隔符和特殊标记周围。当您开始使用新格式时,您应该始终执行以下操作:
- 使用
python -m axolotl.cli.preprocess your_config.yml --debug
物化一些数据,然后使用模型的标记器解码前几行。 - 在推理过程中,就在您将令牌id张量传递给模型之前,将这些令牌解码回字符串。
- 确保#2中的推理字符串看起来与您从#1中微调的数据完全相同,包括空格和新行。如果它们不一样,请相应地调整您的推理服务器。
- 作为额外的故障排除步骤,您可以查看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集体
- Minotaur 13b
- Manticore 13b
- Hippogriff 30b
PocketDoc实验室
- Dan’s PersonalityEngine 13b LoRA
贡献🤝
请阅读投稿指南
错误?请检查未解决问题,否则创建新问题。
非常欢迎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(二)