ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleNLP 大模型微调实战指南:从全参数 SFT 到 LoRA/QLoRA 与多种 PEFT 策略

PaddleNLP 大模型微调实战指南:从全参数 SFT 到 LoRA/QLoRA 与多种 PEFT 策略 PaddleNLP 大模型微调实战指南从全参数 SFT 到 LoRA/QLoRA 与多种 PEFT 策略【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP导读本文基于 PaddleNLP 官方微调文档系统讲解大语言模型监督微调SFT的完整方案包括全参数微调、LoRA/QLoRA、Prefix Tuning、VeRA、LoKr、ReFT 等多种参数高效微调PEFT策略的启动命令、配置文件与参数含义并结合仓库中 llm/run_finetune.py 的源码实现与 llm/config/llama 下的真实配置深入说明数据加载、Zero Padding、FlashAttention/FlashMask、4D 并行等底层机制。读完本文你将能够基于统一脚本在单卡或多卡环境下完成从数据准备、模型微调到 LoRA/VeRA/LoKr 参数合并与推理的全流程。1. PaddleNLP 大模型微调能力总览大模型微调Supervised Fine-Tuning, SFT是大语言模型应用的关键环节主要目标是让模型学会遵循指令、生成符合预期的回答从而提升通用模型在特定领域和应用场景下的表现满足大模型的个性化应用需求。PaddleNLP 的微调方案具备以下核心能力易用的并行策略支持纯数据并行Data Parallelism、Sharding 并行、张量并行Tensor Parallelism、流水线并行Pipeline Parallelism与序列并行Sequence Parallelism可自由组合成 4D 并行。多精度训练全参数微调支持 16/32 位精度LoRA 微调支持 4/8/16 位精度并支持混合精度的量化 LoRAQLoRA。极致性能优化集成 FlashAttention-2、FlashMask、Greedy Zero Padding 等加速与显存优化手段。先进微调策略除基础 LoRA 外还支持 LoRA、PiSSA、rsLoRA、NEFTune、VeRA、MoRA、ReFT、MoSLoRA 等前沿算法。各算法细节可进一步参考 PaddlePaddle 大模型算法文档。2. 常用微调技术简介全参数微调Full-Parameter Fine-Tuning最常见的 SFT 技术在指令数据集上重新训练预训练模型的全部参数。这种方式通常效果最好但需要大量计算资源。LoRALow-Rank Adaptation应用最广泛的参数高效微调PEFT技术。它冻结原始权重仅为每个目标线性层引入低秩矩阵可将可训练参数量减少 99% 以上显著降低显存占用与训练时间。QLoRAQuantization-Aware Low-Rank Adaptation相比标准 LoRA 可减少最高约 33% 的显存占用特别适合显存受限场景。QLoRA 通常比普通 LoRA 多花费约 20% 的训练时间但在显存不足时它往往是唯一可行的选择。3. 快速开始以 Llama 3 为例下文将以Llama 3为例演示如何使用统一脚本完成全参数 SFT 与 LoRA 微调。3.1 环境准备运行微调脚本需要以下版本依赖PaddlePaddle 3.0-betaPaddleNLP 3.0.0b3PaddleSlim develop克隆代码到本地后即可开始git clone https://github.com/PaddlePaddle/PaddleNLP.git # 使用 develop 版本安装 cd PaddleNLP/llm # 进入运行目录从源码看llm/run_finetune.py 在启动时会校验 PaddleNLP 版本要求paddlenlp 3.0.0b3否则会直接抛出安装提示因此请确保环境版本符合要求。3.2 微调数据准备为方便测试官方提供了示例数据集广告生成数据集Advertisement Generation Dataset下载地址见原文档可通过pip配套工具获取。用户也可以按照如下数据格式构造自己的微调数据集。每行需要是一个包含以下字段的字典srcstr, List(str)模型输入的指令instruction、提示词或要求模型执行的任务。tgtstr, List(str)模型的输出。示例数据{src: type#dress*color#blue*style#fresh*pattern#bow, tgt: The dress features three-dimensional bow decorations with blue stripes, creating a full and layered silhouette while adding a touch of sweetness. This design highlights the girls fresh and charming appearance.} ...数据加载逻辑在 llm/run_finetune.py 的create_dataset函数中实现脚本会依次尝试dataset_name_or_path/train.json或train/*.json、dev.json、test.json支持单文件与目录多文件两种组织方式若本地路径不存在则回退为按内置数据集名称加载。3.3 全参数微调Full-Parameter SFTpython -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/sft_argument.json注意事项同时开启zero_padding与greedy_zero_padding有助于提升训练效率。建议将per_device_train_batch_size设为 1通过gradient_accumulation_steps控制实际 batch size并合理调整max_length。将use_flash_attention设为 True 以启用 FlashAttention在启用 FlashAttention 的基础上将flash_mask设为 True 可进一步启用 FlashMask。SFT API 支持 4D 并行策略通过tensor_parallel_degree、pipeline_parallel_degree、sharding与sharding_parallel_degree调整。仓库自带的 llm/config/llama/sft_argument.json 是一份可直接参考的全参数微调配置8B 模型、bf16fp16_opt_level: O2、sharding: stage2、unified_checkpoint: true{ model_name_or_path: meta-llama/Meta-Llama-3-8B, dataset_name_or_path: ./data, output_dir: ./checkpoints/llama_sft_ckpts, per_device_train_batch_size: 1, gradient_accumulation_steps: 2, per_device_eval_batch_size: 8, eval_accumulation_steps: 16, num_train_epochs: 1, learning_rate: 3e-05, warmup_steps: 30, logging_steps: 1, evaluation_strategy: epoch, save_strategy: epoch, src_length: 1024, max_length: 2048, bf16: true, fp16_opt_level: O2, do_train: true, do_eval: true, disable_tqdm: true, load_best_model_at_end: true, eval_with_do_generation: false, metric_for_best_model: accuracy, recompute: false, save_total_limit: 1, tensor_parallel_degree: 1, pipeline_parallel_degree: 1, pipeline_parallel_config: disable_p2p_cache_shape, sharding: stage2, zero_padding: false, unified_checkpoint: true, use_flash_attention: false }从源码实现看llm/run_finetune.py 通过PdArgumentParser解析配置支持.json、.yaml、.py三种配置文件格式也支持直接在命令行追加参数覆盖当pipeline_parallel_degree 1时会自动切换到AutoModelForCausalLMPipe构建流水线并行模型见 llm/run_finetune.py。3.4 PEFT 参数高效微调3.4.1 LoRA / QLoRApython -u -m paddle.distributed.launch --gpus 0,1,2,3 finetune_generation.py --config ./config/llama/sft_argument.json --lora ./config/llama/lora_argument.json # QLoRA python -u -m paddle.distributed.launch --gpus 0,1,2,3 finetune_generation.py --config ./config/llama/sft_argument.json --q_lora ./config/llama/lora_argument.json也可以使用run_finetune.py直接传入配置# 单卡 LoRA python run_finetune.py ./config/llama/lora_argument.json # 单卡 QLoRA python run_finetune.py ./config/llama/qlora_argument.json # 多卡 LoRA python -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/lora_argument.json # 多卡 QLoRA python -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/qlora_argument.json注意同时设置zero_padding与greedy_zero_padding为 True 可提升训练效率建议per_device_train_batch_size设为 1用gradient_accumulation_steps控制 batch size并合理调整max_length。LoRA 策略默认应用于所有 Linear 层源码中通过get_lora_target_modules(model)获取目标模块见 llm/run_finetune.py。通过weight_quantize_algo可将主干模型量化为低比特可选weight_only_int4、weight_only_int8、nf4或fp4具体见微调参数说明。设置use_flash_attention为 True 启用 FlashAttention在此基础上设置flash_mask为 True 启用 FlashMask。LoRA API 支持 4D 并行策略通过tensor_parallel_degree、pipeline_parallel_degree、sharding、sharding_parallel_degree控制可在单机实现千亿级参数模型的 LoRA 微调。支持 rsLoRA、LoRA、PiSSA、MoSLoRA 等算法当前不支持张量并行对应参数为rslora、lora_plus_scale、pissa、lora_use_mixer、use_mora等。仓库中的 llm/config/llama/lora_argument.json 是 LoRA 参考配置8B 模型、learning_rate: 3e-04、sharding: stage1、lora: true、use_flash_attention: truellm/config/llama/qlora_argument.json 则是 QLoRA 参考配置在 LoRA 基础上增加weight_quantize_algo: nf4即对主干模型做 NF4 量化。从源码看LoRA 的lora_alpha在非 rsLoRA 模式下默认取2 * lora_rank见 llm/run_finetune.py且当sharding_parallel_degree 1时暂不支持开启enable_stage1_overlap优化。为方便后续的模型压缩与静态图推理仓库提供了 LoRA 参数合并脚本将 LoRA 参数合并回主干模型并保存对应权重脚本位于 llm/tools/merge_lora_params.pypython merge_lora_params.py \ --model_name_or_path ./base_model \ --lora_path ./checkpoints/lora_ckpts \ --output_path ./checkpoints/lora_merge \ --device gpu \ --safe_serialization True脚本参数说明lora_path用于初始化 LoRA 参数的 LoRA 权重与配置路径默认 None。model_name_or_path必填主干模型参数路径默认 None。merge_model_path必填合并后参数保存路径默认 None。device运行环境默认 gpu。safe_serialization是否保存为 safetensors 格式默认 True。3.4.2 Prefix Tuning 前缀微调# 单卡 Prefix Tuning python run_finetune.py ./config/llama/pt_argument.json # 多卡 Prefix Tuning python -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/pt_argument.json参考配置 llm/config/llama/pt_argument.json 中通过prefix_tuning: true开启该策略并使用较高的学习率learning_rate: 3e-02前缀参数规模小需要相对更大的学习率。从源码看Prefix Tuning 暂不支持流水线并行见 llm/run_finetune.py 中的NotImplementedError断言并需要根据模型结构计算num_prefix_tokens、num_attention_heads、multi_query_group_num等参数get_prefix_tuning_params。3.4.3 VeRA# 单卡 VeRA python run_finetune.py ./config/llama/vera_argument.json # 多卡 VeRA当前不支持张量并行 python -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/vera_argument.json为后续模型压缩与静态图推理仓库提供了 VeRA 参数合并脚本将 VeRA 参数合并回主干模型并保存权重脚本位于 llm/tools/merge_vera_params.pypython merge_vera_params.py \ --model_name_or_path ./base_model \ --vera_path ./checkpoints/vera_ckpts \ --merge_vera_model_path ./checkpoints/vera_merge \ --device gpu \ --safe_serialization True脚本参数说明vera_path用于初始化的 VeRA 参数与配置路径默认 None。model_name_or_path必填主干模型参数路径默认 None。merge_vera_model_path必填合并参数保存路径默认 None。device运行环境默认 gpu。参考配置 llm/config/llama/vera_argument.json 中通过vera: true开启 VeRA基于 Llama-7B、fp16训练。源码中 VeRA 的vera_alpha默认等于vera_rank并通过mark_only_vera_as_trainable(notfreezeBTrue)冻结主干权重见 llm/run_finetune.py。3.4.4 LoKr# 单卡 LoKr python run_finetune.py ./config/llama/lokr_argument.json # 多卡 LoKr当前不支持张量并行 python -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/lokr_argument.json为后续模型压缩与静态图推理仓库提供了 LoKr 参数合并脚本脚本位于 llm/tools/merge_lokr_params.pypython merge_lokr_params.py \ --model_name_or_path ./base_model \ --lokr_path ./checkpoints/lokr_ckpts \ --merge_lokr_model_path ./checkpoints/lokr_merge \ --device gpu \ --safe_serialization True脚本参数lokr_path用于初始化的 LoKr 参数与配置路径默认 None。model_name_or_path必填主干模型参数路径默认 None。merge_lokr_model_path必填合并参数保存路径默认 None。device运行环境默认 gpu。参考配置 llm/config/llama/lokr_argument.json 中通过lokr: true开启 LoKr并设置lr_scheduler_type: linear、max_length: 512。3.4.5 ReFT 表征微调# 单卡 ReFT python run_finetune.py ./config/llama/reft_argument.json # 多卡 ReFT当前不支持张量并行 python -u -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 run_finetune.py ./config/llama/reft_argument.jsonReFT 目前仅支持动态图预测预测脚本位于 llm/predict/reft_predictor.pypython ./predict/reft_predictor.py \ --model_name_or_path ./base_model \ --reft_path ./checkpoints/lokr_ckpts \ --output_file output.json \ --batch_size 1 \ --data_file ./data/dev.json --max_length 4096脚本参数reft_path用于初始化的 ReFT 参数与配置路径。model_name_or_path主干模型参数路径。batch_size批大小。越大显存占用越高越小显存占用越低。data_file用于推理的 JSON 文件默认 None。示例数据{tgt:, src: Write a 300-word novel outline about Li Bai time-traveling to modern times and becoming a corporate clerk} {tgt:, src: Create a list of 5 questions for interviewing a sci-fi writer}output_file推理结果保存文件。src_length模型输入上下文的最大 token 长度。max_length模型输入上下文 生成内容的最大 token 长度。参考配置 llm/config/llama/reft_argument.json 中通过reft: true开启 ReFT并指定intervention_type: TinyIntervention。从源码看ReFT 要求 tokenizer 的padding_side right见 llm/run_finetune.py其干预层数由reft_args.layers控制默认all表示干预全部层训练时通过disable_model_gradients()冻结主干梯度仅更新干预网络见 llm/run_finetune.py。4. 微调参数详解4.1 模型参数ModelArgumentmodel_name_or_path预训练模型名称或本地路径用于热启动模型与 tokenizer默认 None。各模型支持的权重请参考对应模型目录。use_flash_attention是否使用 FlashAttention默认 False。flash_mask是否使用 FlashMask默认 False。需先启用 FlashAttention。源码中同时强制要求zero_padding为 True否则会自动开启并给出警告见 llm/run_finetune.py目前 FlashMask 支持 DeepseekV2/V3、Llama、Qwen2、Qwen2Moe 系列模型flash_mask_support_list。lora是否启用 LoRA 微调策略默认 False。lora_path用于初始化 LoRA 参数的 LoRA 权重与配置路径默认 None。lora_rankLoRA 算法中的秩默认 8。rslora是否使用 rsLoRA 算法。lora_plus_scale是否使用 LoRA设置 B 与 A 之间的学习率比例。neftune是否使用 NEFTune 进行微调默认 False。源码中通过在输入 embedding 上注册 forward hook 注入均匀噪声实现见 llm/run_finetune.py。neftune_noise_alphaNEFT 的 alpha 参数默认 5.0。vera是否启用 VeRA 微调策略默认 False。vera_rankVeRA 算法中的秩默认 8。lokr是否启用 LoKr 微调策略默认 False。lokr_rankLoKr 算法中的秩默认 8。use_long_sequence_strategies是否使用长序列扩展策略默认 False。reft是否启用 ReFT 微调策略默认 False。use_mora是否启用 MoRA 微调策略默认 False。lora_use_mixer是否启用 MosLoRA 策略默认 False。pissa是否启用 PiSSA 策略默认 False。strategy_type长序列扩展策略的类型默认 None。strategy_name长序列扩展策略的具体名称默认 None。rope_scaling_factor应用 RoPE 扩展策略时的缩放因子。从源码看长序列策略还会联动写入模型配置设置use_long_sequence_strategies后会将strategy_type、strategy_name、rope_scaling_factor等写入model_config并依据scaled_max_length计算扩展后的上下文窗口见 llm/run_finetune.py。4.2 数据参数DataArgumentdataset_name_or_path本地数据集目录或内置数据集名称默认 None。脚本自动处理单文件与多文件场景优先查找dataset_name_or_path/train.json或dataset_name_or_path/train/*.json作为训练文件dataset_name_or_path/dev.json或dataset_name_or_path/dev/*.json作为验证集文件。zero_padding是否使用 Zero Padding 数据流减少 padding 冗余计算显著提升有效 token 计算效率默认 False。当eval_with_do_generation为 True 时评估过程不支持 Zero Padding 数据流源码会在此时自动对评估集关闭zero_padding见 llm/run_finetune.py。greedy_zero_paddingGreedy Zero Padding 数据流默认 False。需在zero_padding为 True 的基础上开启。src_length模型输入上下文的最大 token 长度默认 1024。max_length模型输入上下文 生成内容的最大 token 长度默认 2048。当zero_padding为 True 时它同时作为 Zero Padding 数据流模型训练的最大输入长度。建议设置为模型允许的最大输入长度per_device_train_batch_size设为 1并用gradient_accumulation_steps控制 batch size。lazy设为 False 使用MapDataset设为 True 使用IterDataset默认 False。大数据集建议设为 TrueIterDataset可避免一次性将全部数据加载进内存。注意需要同时设置max_steps并将evaluation_strategy与save_strategy设为steps。autoregressive是否使用自回归生成即训练数据为无监督默认 False。use_pose_convert是否使用 PoSE 算法进行数据处理默认 False。4.3 生成参数GenerateArgument注意以下参数仅在eval_with_do_generation为 True 且调用model.generate()时生效。top_k在 sampling 策略下进行 top-k 过滤时保留的最高概率 token 数量。默认 1等价于贪心策略。top_p在 sampling 策略下进行 top-p 过滤的累计概率。默认 1.0表示不起作用。在评估阶段llm/run_finetune.py 使用 ROUGE-1、ROUGE-2、ROUGE-L 与 BLEU-4 指标评估生成结果并可通过save_generation_output将生成结果写入generated_output.json。4.4 训练参数TrainingArguments以下仅介绍 TrainingArguments 中常用参数完整说明见 PaddleNLP 官方 TrainingArguments 文档。output_dir保存相关文件的目录主要包括模型相关文件、训练过程中的 checkpoint、tokenizer 相关文件与评估结果文件默认 None。per_device_train_batch_size训练集 batch size对应 micro batch size默认 8。需根据具体数据集设置越大显存要求越高、训练成本越大越小显存占用越低、训练速度越快。gradient_accumulation_steps梯度累积步数即累积多个 step 的梯度后再做一次参数更新默认 1。等价于将原始训练 batch size 乘以该值。per_device_eval_batch_size验证集评估 batch size对应 micro batch size默认 8。越大显存占用越高越小显存占用越低。num_train_epochs训练轮数默认 3。learning_rate优化器初始学习率默认 5e-5。warmup_stepswarmup 步数默认 0。当warmup_steps 0 时覆盖warmup_ratio设置。evaluation_strategy评估策略默认 no。可选no训练中不评估、steps每eval_steps评估一次、epoch每个 epoch 结束时评估。save_strategy模型保存策略默认 no。可选no训练中不保存、steps每eval_steps保存一次、epoch每个 epoch 结束时保存。fp16是否启用 FP16 训练加速默认 False。bf16是否启用 BF16 训练加速默认 False。fp16_opt_level可设为 O1 或 O2。O1 级别下白名单算子使用 float16/bfloat16、黑名单算子使用 float32O2 级别下模型参数被转换为 float16/bfloat16仅当所有浮点输入均为 float16/bfloat16 时算子才使用低精度否则回退 float32。默认 O1。从源码看选择 O2 时必须同时指定fp16或bf16之一否则会抛出 dtype 报错见 llm/run_finetune.py。do_train是否开启训练默认 False。do_eval是否开启评估默认 False。recompute是否开启重计算当前支持 full 策略。开启后可通过减少显存占用换取更大 batch size默认 False。refined_recompute细粒度重计算通过精确控制重计算组件在显存与性能之间取得平衡。目前仅支持llama系列与qwen系列模型详细用法参考 TrainingArguments 文档。tensor_parallel_degree张量并行度表示 transformer 层切分的份数。注意该方式会增加通信开销建议取值 ≤ 8且优先使用机内通信。默认 -1不启用。pipeline_parallel_degree流水线并行度。例如 12 层模型设为 4 时每个流水线 stage 包含 3 层。默认 -1不启用。sharding_parallel_degree分组参数切分的 Sharding 并行大小默认 1表示不启用分组参数切分。sharding是否使用 Paddle Sharding 数据并行支持stage1、stage2、stage3。注意stage2与stage3可与offload结合。optim默认adamw支持adamw、adamw_mini。4.5 ReFT 参数ReftArgumentmodel_name_or_path用于热启动模型与 tokenizer 的预训练模型名称或本地路径默认 None。layers干预模型的哪些层。默认 all即干预所有层。支持分号分隔的层号列表。position干预哪些位置的 token。默认 f7即干预前 7 个 token。intervention_type干预网络类型默认 LoReftIntervention源码中通过intervention_mapping字典映射到具体实现。rank干预网络的低秩维度默认 8。act_fn干预网络中的激活函数默认 linear。add_bias干预网络中是否添加偏置默认 False。dropout干预网络中的 dropout 比率默认 0.00。5. 总结PaddleNLP 的微调体系覆盖了从传统全参数 SFT 到 LoRA/QLoRA、Prefix Tuning、VeRA、LoKr、ReFT 等主流 PEFT 方案的完整链路同一份 llm/run_finetune.py 脚本通过 JSON 配置即可切换策略配合 llm/config/llama 下的现成配置可快速落地Zero Padding、Greedy Zero Padding、FlashAttention/FlashMask 等优化手段与 4D 并行策略让从单卡调试到多卡大规模训练含单机千亿模型 LoRA 微调都具备可操作性而 llm/tools/merge_lora_params.py、llm/tools/merge_vera_params.py、llm/tools/merge_lokr_params.py 等合并脚本则为后续的模型压缩与静态图推理铺平了道路。如需进一步了解并行训练、量化、统一 checkpoint 等内容可继续阅读 docs/en/llm/docs/algorithm_overview.md、docs/en/llm/docs/quantization.md 与 docs/en/llm/docs/unified_checkpoint.md。【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表