Project Icon

axolotl

多功能AI模型微调工具

Axolotl是一个功能丰富的AI模型微调工具,支持llama、pythia、falcon等多种Huggingface模型。它提供全微调、LoRA、QLoRA等训练方法,支持自定义配置和多种数据集格式。Axolotl集成了xformer、flash attention等技术,可在单GPU或多GPU环境运行,支持Docker部署,并可将结果记录到wandb或mlflow。该工具为AI模型训练提供了灵活高效的解决方案。

Axolotl(蝾螈)

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

特点:

  • 训练各种Huggingface模型,如llama、pythia、falcon、mpt
  • 支持全量微调、LoRA、QLoRA、ReLoRA和GPTQ
  • 使用简单的yaml文件或命令行覆盖来自定义配置
  • 加载不同的数据集格式,使用自定义格式,或使用您自己的标记化数据集
  • 集成了xformer、flash attention、RoPE缩放和多包技术
  • 适用于单GPU或通过FSDP或Deepspeed使用多GPU
  • 可轻松在本地或云端使用Docker运行
  • 将结果和可选的检查点记录到wandb或mlflow
  • 以及更多功能! phorm.ai
## 目录 - [简介](#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提供了一个统一的仓库,
可以轻松地微调各种AI模型

快来问Axolotl问题吧!!

pre-commit PyTest状态

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]'

使用方法

# 预处理数据集 - 可选但推荐
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错误,请使用此参数。

NVIDIA 网站上的更多信息

Conda/Pip 虚拟环境

  1. 安装 Python >=3.10

  2. 安装 PyTorch 稳定版 https://pytorch.org/get-started/locally/

  3. 安装 Axolotl 及其 Python 依赖

    pip3 install packaging
    pip3 install -e '.[flash-attn,deepspeed]'
    
  4. (可选) 登录 Huggingface 以使用受限模型/数据集。

    huggingface-cli login
    

    在 huggingface.co/settings/tokens 获取令牌

云 GPU

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

裸机云 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 # 如果有选项,选择 3.10
python -V # 应该是 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. 按快速入门指南操作。

  3. 运行

pip3 install protobuf==3.20.3
pip3 install -U --ignore-installed requests Pillow psutil scipy
  1. 设置路径
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构建的提示,你可能会看到标记之间的空格(或缺少空格),这可能是你所不期望的,尤其是在分隔符和特殊标记周围。当你开始使用新格式时,你应该始终执行以下操作:

  1. 使用 python -m axolotl.cli.preprocess your_config.yml --debug 具体化一些数据,然后用你的模型的分词器解码前几行。
  2. 在推理过程中,在将标记ID的张量传递给你的模型之前,将这些标记解码回字符串。
  3. 确保#2中的推理字符串看起来与#1中你微调的数据完全相同,包括空格和换行符。如果它们不相同,相应地调整你的推理服务器。
  4. 作为额外的故障排除步骤,你可以查看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)

Built with 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做出贡献,帮助推动开源人工智能的进步。

contributor chart by https://contrib.rocks

赞助商 🤝❤

开放访问人工智能集体由志愿贡献者运营,如winglianNanoCode012tmm1mhenrichsencasper-hansenhamelsmu等许多人,他们通过修复bug、回答社区问题和实现新功能来帮助我们加速前进。Axolotl需要赞助商的捐赠来支付运行单元和集成测试、解决社区问题以及提供奖励所需的计算资源。如果您喜欢axolotl,请考虑通过GitHub赞助商Ko-fi赞助该项目,或直接联系 wing@openaccessaicollective.org


💎 钻石赞助商 - 直接联系


🥇 金牌赞助商 - $5000/月


🥈 银牌赞助商 - $1000/月


🥉 铜牌赞助商 - $500/月


项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号