量化技术实现大型语言模型的高效训练
fsdp_qlora项目结合FSDP与量化LoRA,实现了在有限显存GPU上高效训练大型语言模型。支持HQQ和bitsandbytes的4位量化、LoRA、DoRA等多种策略,大幅降低内存占用。项目提供详细文档,便于快速上手使用。该方法使在消费级GPU上训练70B参数模型成为可能,为大模型研究提供了实用工具。
使用量化LoRA + FSDP训练大语言模型。
阅读我们的公告博客文章。
你应该将此脚本视为alpha/预览版本。如果你不熟悉测试和调试模型,我们建议再等几个月,让社区更充分地测试这种方法。
FSDP+QLoRA已集成到:
以下步骤应该可以正常工作(在Cuda 11.7、11.8和12.1上测试通过):
pip install llama-recipes fastcore "transformers!=4.38.*,!=4.39.*" --extra-index-url https://download.pytorch.org/whl/test/cu118
作为获取大多数依赖项的简单方法(将118替换为你所需的Cuda版本)pip install bitsandbytes>=0.43.0
huggingface-cli login
(访问Llama 2)HQQBackend.ATEN_BACKPROP
,所以还要确保构建自定义内核 cd hqq/kernels && python setup_cuda.py install
。pip install wandb
安装完成后,运行 cd fsdp_qlora
,然后运行以下命令,开始在最大序列长度为512个token的Alpaca数据集上微调Llama-2 70B。
python train.py \ --model_name meta-llama/Llama-2-70b-hf \ --batch_size 2 \ --context_length 512 \ --precision bf16 \ --train_type qlora \ --use_gradient_checkpointing true \ --use_cpu_offload true \ --dataset alpaca \ --reentrant_checkpointing true
这个示例命令目前使用略超过128GB的CPU RAM。如果你只有128GB可用,我们建议创建一个10-20GB的交换文件以适应初始的使用峰值。
对于量化,我们支持HQQ和bitsandbytes。我们目前正在进行基准测试,以帮助你决定使用哪一个。如果你使用bitsandbytes,请确保传递 --reentrant_checkpointing True
以避免触发bitsandbytes中导致高内存使用的bug(修复正在进行中)。
--train_type full
全参数微调。
export CUDA_VISIBLE_DEVICES=4,5 # 可选设置设备 python train.py \ --world_size 2 \ # 可选,在单机上会自动设置 --master_port 12356 \ # 可选,默认为12355 --model_name meta-llama/Llama-2-7b-hf \ --gradient_accumulation_steps 4 \ --batch_size 8 \ --context_length 512 \ --precision bf16 \ --train_type full \ --use_gradient_checkpointing true \ --use_cpu_offload false \ --use_activation_cpu_offload false \ --log_to wandb \ --dataset alpaca
--train_type lora
使用HF PEFT库进行LoRA微调。
- --train_type full \ + --train_type lora \
--train_type custom_lora
使用自定义LoRA模块进行LoRA微调。
- --train_type full \ + --train_type custom_lora \
--train_type qlora
使用bitsanbytes Linear4bit层(NF4量化)和HF PEFT库进行4位量化LoRA微调。
- --train_type full \ + --train_type qlora \ + --reentrant_checkpointing true \
--train_type custom_qlora
使用bitsanbytes Linear4bit层(NF4量化)和自定义LoRA模块进行4位量化LoRA微调。
- --train_type full \ + --train_type custom_qlora \ + --reentrant_checkpointing true \
--train_type hqq_lora
使用HQQ库和自定义LoRA模块进行4位量化LoRA微调。
- --train_type full \ + --train_type hqq_lora \
--train_type bnb_dora
使用bitsanbytes Linear4bit层(NF4量化)和自定义DoRA模块进行4位量化DoRA微调。
- --train_type full \ + --train_type bnb_dora \
--train_type hqq_dora
使用HQQ库和自定义DoRA模块进行4位量化DoRA微调。
- --train_type full \ + --train_type hqq_dora \
--train_type bnb_llama_pro
使用bitsanbytes Linear4bit层(NF4量化)进行4位量化Llama-Pro微调。
要创建llama-pro权重,运行以下命令:
python scripts/block_expansion.py \ --model_name meta-llama/Llama-2-7b-hf \ --output_dir /path/to/llama_pro_weights_directory \ --expansion_rate 0.1
- --train_type full \ + --train_type bnb_llama_pro \ + --llama_pro_path /path/to/llama_pro_weights_directory \
--train_type hqq_llama_pro
使用HQQ库进行4位量化Llama-Pro微调。
要创建llama-pro权重,运行以下命令:
python scripts/block_expansion.py \ --model_name meta-llama/Llama-2-7b-hf \ --output_dir /path/to/llama_pro_weights_directory \ --expansion_rate 0.1
- --train_type full \ + --train_type hqq_llama_pro \ + --llama_pro_path /path/to/llama_pro_weights_directory \
在量化LoRA训练期间,我们使用自定义量化和加载代码,以避免在将整个模型分片到 多个GPU之前将其完全加载到GPU内存中。当使用以下任何训练选项 "qlora"
, "custom_qlora"
, "hqq_lora"
时,这是我们训练脚本的默认行为。其他训练选项已经在最大程度上针对低内存加载进行了优化。
我们迭代加载权重,在GPU上对其进行量化,并根据其等级将其放回CPU或meta设备,同时每次处理几个层。我们在所有GPU上执行此操作以初始化量化参数(如零点和缩放因子),同时在FSDP初始化期间使用 sync_module_states=True
来同步所有GPU上的模型参数和缓冲区。
--precision bf16
(纯bfloat16)这将在训练前将所有模型参数转换为 torch.bfloat16
,并且不会使用FSDP混合精度。因此,分片和未分片的参数将以bf16存储,前向和后向传递将以bf16进行,梯度归约和更新也将以bf16进行。
--precision fp32
(纯float32)这将在训练前将所有模型参数转换为 torch.float32
,并且不会使用FSDP混合精度。因此,分片和未分片的参数将以fp32存储,前向和后向传递将以fp32进行,梯度归约和更新也将以fp32进行。
--precision mp_fp16_autocast
(带自动转换的混合float16)这将在训练前将所有模型参数转换为 torch.float32
,并使用FSDP混合精度,配置如下:
mp_policy = MixedPrecision(param_dtype=torch.float32, reduce_dtype=torch.float32, buffer_dtype=torch.float32)
因此,分片和未分片的参数将以fp32存储。它将使用 autocast(torch.float16)
进行前向和后向传递,以及梯度归约和更新。
--precision mp_bf16_autocast
(带自动转换的混合bfloat16)这将在训练前将所有模型参数转换为 torch.float32
,并使用FSDP混合精 度,配置如下:
mp_policy = MixedPrecision(param_dtype=torch.float32, reduce_dtype=torch.float32, buffer_dtype=torch.float32)
因此,分片和未分片的参数将以fp32存储。它将使用 autocast(torch.bfloat16)
进行前向和后向传递,以及梯度归约和更新。
--precision mp_bf16_buffers_autocast
(bfloat16参数和float32缓冲区,带自动转换)这将在训练前将所有模型参数转换为 torch.bfloat16
,但将缓冲区保持在 torch.float32
,并使用FSDP混合精度,配置如下:
mp_policy = MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.bfloat16, buffer_dtype=torch.float32)
因此,分片和未分片的参数将以bf16存储。它将使用 autocast(torch.bfloat16)
进行前向和后向传递,以及梯度归约和更新。缓冲区和自动转换中的符合条件的操作将以bf16执行。
这个选项对RoPE层很重要,因为当转换为较低精度时,特别是在较长的上下文长度下,RoPE层会给出不正确的结果。
hf_train.py
使用TRL的SFTTrainer进行对比运行。为了与我们的脚本匹配,修改数据加载代码以训练所有内容(不仅仅是完成部分),然后运行train.py --train_type qlora --dataset guanaco --batch_size 8 --lr_scheduler cosine --log_to wandb --save_model True --output_dir guanaco_7B --gradient_accumulation_steps 2 --lr 2e-4
。SFTTrainer版本必须以较低的批量大小运行(4而不是8),所以我们只进行2个梯度累积步骤,而QLoRA+FSDP版本是4个。
如果指定--save_model True
,适配器层将被保存为状态字典。要转换为常规的Hugging Face格式并上传到hub,请参见:Converting the State Dict.ipynb
如果使用"custom_qlora", "hqq_lora"
训练选项,则只会保存可训练的LoRA参数。在推理之前,你需要再次加载和量化基础模型,并单独加载保存的LoRA参数。
你也可以尝试将基础模型权重与训练后的LoRA权重合并后再量化,看看是否与训练期间分开保存参数的效果相似。要在HQQ中使用torch.compile
,请参见https://github.com/mobiusml/hqq/issues/18。
虽然QLoRA微调与FSDP兼容,但这个alpha版本和我们的示例脚本还存在一些不完善之处。
首先,当前版本的Transformer AutoModel.from_pretrained
不能用于将模型加载到量化权重中,因为它不支持新的quant_storage或quantization标志。加载预训练模型需要编写或使用自定义的模型加载代码。我们在演示脚本中提供了如何加载和量化QLoRA模型以进行微调的示例。
我们正在与Hugging Face积极合作,以在未来的Transformers和PEFT版本中解决这个不兼容问题。
其次,虽然FSDP的混合精度与QLoRA兼容,但实践者需要小心设置MixedPrecision.param_type
以匹配Linear4Bit.quant_storage
的dtype。否则,FSDP的混合精度可能会将量化权重转换为不同的精度,实际上将它们变成随机权重。我们的示例脚本展示了如何避免这个潜在的陷阱,我们也很乐意协助模型训练库在使用QLoRA训练时正确地向用户公开FSDP的混合精度选项。
# BnB QLoRA export CUDA_VISIBLE_DEVICES=4,5,6,7 python train.py \ --world_size 4 \ --master_port 12356 \ --model_name meta-llama/Llama-2-70b-hf \ --gradient_accumulation_steps 4 \ --batch_size 2 \ --context_length 512 \ --precision bf16_buffers_autocast \ --train_type custom_qlora \ --use_gradient_checkpointing true \ --reentrant_checkpointing true --use_cpu_offload false \ --log_to stdout \ --dataset alpaca # HQQ QLoRA export CUDA_VISIBLE_DEVICES=4,5,6,7 python train.py \ --world_size 4 \ --master_port 12356 \ --model_name meta-llama/Llama-2-70b-hf \ --gradient_accumulation_steps 4 \ --batch_size 2 \ --context_length 512 \ --precision bf16_buffers_autocast \ --train_type hqq_lora \ --use_gradient_checkpointing true \ --use_cpu_offload false \ --log_to stdout \ --dataset alpaca
**注意:**对于大批量或长上下文训练,HQQ LoRA比使用重入检查点的BnB LoRA略微更节省内存。因此,如果遇到OOM问题,可以尝试使用HQQ LoRA。
查看fsdp_multi_node.sh
以获取使用SLURM进行多节点训练的示例训练脚本。
首先,从Transformers导入新模型的transformer、attention和MLP层:
from transformers.models.mistral.modeling_mistral import MistralDecoderLayer, MISTRAL_ATTENTION_CLASSES, MistralMLP
然后在get_wrapping_policy
函数中,将attention、MLP和transformer层添加到self_attn_policy_fn
、mlp_policy_fn
和transformer_wrap_policy
包装策略方法中:
def get_wrapping_policy(custom_policy:bool=False): def self_attn_policy_fn(module): return isinstance(module, tuple(*LLAMA_ATTENTION_CLASSES.values(), *MISTRAL_ATTENTION_CLASSES.values())) def mlp_policy_fn(module): return isinstance(module, (LlamaMLP, MistralMLP)) transformer_wrap_policy = functools.partial( transformer_auto_wrap_policy, transformer_layer_cls=(LlamaDecoderLayer, MistralDecoderLayer), )
最后,通过将transformer层添加到check_fn
中来添加梯度检查点支持:
if args["use_gradient_checkpointing"]: check_fn = lambda submodule: isinstance(submodule, (LlamaDecoderLayer, MistralDecoderLayer))
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片 生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号