ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 XTuner 对 Qwen1.5-110B-Chat 进行 QLoRA 微调:32K 长上下文与序列并行实战指南

使用 XTuner 对 Qwen1.5-110B-Chat 进行 QLoRA 微调:32K 长上下文与序列并行实战指南 使用 XTuner 对 Qwen1.5-110B-Chat 进行 QLoRA 微调32K 长上下文与序列并行实战指南【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner本篇技术指南聚焦 XTuner 项目中 Qwen 110B 系列模型的微调方案以仓库内xtuner/configs/qwen/qwen1_5/qwen1_5_110b_chat/目录下的官方配置与说明文档为核心完整讲解如何仅用 2 张 A100 80G 显存对 110B 级别的 Qwen1.5-110B-Chat 模型完成 32K 长上下文 QLoRA 微调。读者读完本文将掌握环境安装、训练命令、配置逐段解读、序列并行与 DeepSpeed ZeRO-3 的配合原理以及全量微调、QLoRA 微调等多种配置变体的选择依据。一、方案总览110B 模型的低成本长上下文微调Qwen1.5-110B-Chat 是一个参数量达到 110B 级别的开源对话模型。在常规思路下单卡加载如此规模的模型都极其困难更遑论训练。XTuner 给出的答案是技术组合拳QLoRA通过 4-bit NF4 量化BitsAndBytes把基座模型权重压缩到内存中仅训练注入的低秩适配器LoRADeepSpeed ZeRO-3将模型参数、梯度、优化器状态分片到多张 GPU进一步摊薄显存压力序列并行Sequence Parallel把长序列切成多段分发给不同 GPU 协同计算突破单卡显存对序列长度的限制。三者叠加后仓库文档给出的结论是训练 Qwen 110B 并具备 32K 上下文能力仅需 2 张 A100 80G。这是该目录 README 的核心卖点也是本文要验证和展开的主线。二、环境安装最小依赖集根据 README开始前需要安装三个组件# Install the latest xtuner pip install -U xtuner[deepspeed] # We recommend installing flash_attn # pip install flash-attn # install the latest transformers pip install -U transformers逐条说明xtuner[deepspeed]带 DeepSpeed 扩展的 XTuner 完整安装。110B 模型训练必须使用 DeepSpeed因此该 extra 是必选项。仓库要求的 DeepSpeed 版本下限可以在 xtuner/tools/train.py 中找到证据——代码会检查deepspeed.__version__ 0.12.3否则直接抛出RuntimeError提示升级。flash-attn推荐FlashAttention 2 能显著提升注意力计算的显存效率与速度。它在本方案中不只是锦上添花从 xtuner/tools/train.py 的check_cfg校验逻辑可以看到只要使用序列并行sequence_parallel_size 1或变长注意力use_varlen_attn TrueXTuner 都会强制要求安装 flash_attn否则直接断言失败。因此进行 32K 长上下文训练时务必安装。最新版 transformersQwen1.5 依赖较新的 transformers 版本才能正确加载权重与对话模板。三、启动训练一条命令跑通 32K 上下文 QLoRA环境就绪后直接执行 README 给出的训练命令xtuner train xtuner/configs/qwen/qwen1_5/qwen1_5_110b_chat/qwen1_5_110b_chat_qlora_alpaca_e3_16k_2gpus.py --deepspeed deepspeed_zero3命令解读配置文件名qwen1_5_110b_chat_qlora_alpaca_e3_16k_2gpus.py自解释性很强模型是 Qwen1.5-110B-Chat方法是 QLoRA数据是 Alpaca训练 3 个 epoche3上下文长度 16K16k2 卡2gpus。注意 README 中提到的是 32K 上下文能力而该配置的max_length 16384实际训练序列长度上限以配置为准两者并不矛盾——通过调整max_length即可向上扩展。--deepspeed deepspeed_zero3传入 ZeRO-3 策略。XTuner 会按名称在配置注册表中解析到 xtuner/configs/deepspeed/deepspeed_zero3.json。该文件启用stage 3、overlap_comm: true通信与计算重叠以及stage3_gather_16bit_weights_on_model_save: true保存 checkpoint 时聚合 16bit 权重。命令执行入口为 xtuner/tools/train.py其parse_args还支持--work-dir、--resume、--seed、--cfg-options、--launcher等参数例如指定多卡启动或通过--cfg-options max_length32768临时调整上下文长度。若使用 SLURM 集群可参考 docs/zh_cn/user_guides/sequence_parallel.md 中的写法改用srun启动。四、配置深度解读16K/2 卡配置逐段拆解训练的核心资产是配置文件 qwen1_5_110b_chat_qlora_alpaca_e3_16k_2gpus.py它采用 XTuner 经典的五段式结构。下面逐段拆解其关键字段。4.1 PART 1 Settings全局超参pretrained_model_name_or_path Qwen/Qwen1.5-110B-Chat use_varlen_attn False alpaca_en_path tatsu-lab/alpaca prompt_template PROMPT_TEMPLATE.qwen_chat max_length 16384 pack_to_max_length True sequence_parallel_size 2 batch_size 1 # per_device accumulative_counts 1 # total bs 1 bs_per_device * 2 gpus * 1 acc 2 accumulative_counts * sequence_parallel_size max_epochs 3 optim_type AdamW lr 1e-4 # 110B model use smaller lr betas (0.9, 0.999) weight_decay 0 max_norm 1 warmup_ratio 0.03 save_steps 500 save_total_limit 2 evaluation_freq 50 SYSTEM SYSTEM_TEMPLATE.alpaca evaluation_inputs [ 请给我介绍五个上海的景点, Please tell me five scenic spots in Shanghai ]重点参数说明max_length 16384单条样本 packing 后的序列长度上限对应16K命名。pack_to_max_length True开启样本拼接packing把多条短样本拼接填充到max_length避免短样本浪费序列空间是长上下文训练吞吐的关键。sequence_parallel_size 2序列并行度为 2即 2 张卡共同计算同一条长序列这是2 卡训 110B的核心机制详见第五节。accumulative_counts * sequence_parallel_size注释中的算式1 bs_per_device * 2 gpus * 1 acc 2表明总 batch 为 2。需要特别留意的是配置里把梯度累积步数乘以序列并行度——这是因为序列并行会让数据并行世界大小缩为原来的 1/2为保证等效 batch 不缩水而做的补偿这一点在 docs/zh_cn/user_guides/sequence_parallel.md 中有明确说明。lr 1e-4注释特别强调110B model use smaller lr即超大规模模型需要更小的学习率以维持训练稳定。4.2 PART 2 Model Tokenizer4-bit 量化 LoRAtokenizer dict( typeAutoTokenizer.from_pretrained, pretrained_model_name_or_pathpretrained_model_name_or_path, trust_remote_codeTrue, padding_sideright) model dict( typeSupervisedFinetune, use_varlen_attnuse_varlen_attn, llmdict( typeAutoModelForCausalLM.from_pretrained, pretrained_model_name_or_pathpretrained_model_name_or_path, trust_remote_codeTrue, torch_dtypetorch.float16, quantization_configdict( typeBitsAndBytesConfig, load_in_4bitTrue, load_in_8bitFalse, llm_int8_threshold6.0, llm_int8_has_fp16_weightFalse, bnb_4bit_compute_dtypetorch.float16, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_typenf4, bnb_4bit_quant_storagetorch.float16)), loradict( typeLoraConfig, r64, lora_alpha16, lora_dropout0.1, biasnone, task_typeCAUSAL_LM))这一段是显存奇迹的直接来源BitsAndBytesConfigload_in_4bitTrue把基座模型以 4-bit 精度加载bnb_4bit_quant_typenf4使用 NF4 量化格式bnb_4bit_use_double_quantTrue开启双重量化进一步省显存bnb_4bit_compute_dtypetorch.float16指定反量化后的计算精度。权重以 4-bit 常驻显存只有参与前向计算时才反量化为 FP16。LoraConfigr64、lora_alpha16、lora_dropout0.1只训练注入的低秩适配器可训练参数量相比 110B 全量权重可以忽略不计这是 2 卡能跑起来的第二个前提。模型包装为 XTuner 的SupervisedFinetune实现见 xtuner/model/sft.py统一管理监督微调的损失计算与张量分发。4.3 PART 3 Dataset DataloaderAlpaca 数据流alpaca_en dict( typeprocess_hf_dataset, datasetdict(typeload_dataset, pathalpaca_en_path), tokenizertokenizer, max_lengthmax_length, dataset_map_fnalpaca_map_fn, template_map_fndict( typetemplate_map_fn_factory, templateprompt_template), remove_unused_columnsTrue, shuffle_before_packTrue, pack_to_max_lengthpack_to_max_length, use_varlen_attnuse_varlen_attn) sampler SequenceParallelSampler \ if sequence_parallel_size 1 else DefaultSampler train_dataloader dict( batch_sizebatch_size, num_workersdataloader_num_workers, datasetalpaca_en, samplerdict(typesampler, shuffleTrue), collate_fndict(typedefault_collate_fn, use_varlen_attnuse_varlen_attn))dataset_map_fnalpaca_map_fn把 HuggingFace 上的tatsu-lab/alpaca原始字段转换为对话格式实现见 xtuner/dataset/map_fns/dataset_map_fns/alpaca_map_fn.py——它会把instruction与input拼接后作为conversation的inputoutput字段作为目标输出。template_map_fn_factoryPROMPT_TEMPLATE.qwen_chat套用 Qwen 的 ChatML 模板。模板定义在 xtuner/utils/templates.py系统消息用|im_start|system ... |im_end|用户输入用|im_start|user ... |im_end|\n|im_start|assistant\n包裹SUFFIX|im_end|且SUFFIX_AS_EOSTrue停用词包含|im_end|与|endoftext|。SequenceParallelSampler当sequence_parallel_size 1时自动切换为序列并行采样器实现见 xtuner/parallel/sequence/sampler.py。它保证参与同一条长序列并行计算的各 GPU 从 Dataloader 取到完全相同的样本round_up时按ceil(len / world_size)计算样本数。4.4 PART 4 Scheduler OptimizerAMP 双段学习率optim_wrapper dict( typeAmpOptimWrapper, optimizerdict( typeoptim_type, lrlr, betasbetas, weight_decayweight_decay), clip_graddict(max_normmax_norm, error_if_nonfiniteFalse), accumulative_countsaccumulative_counts, loss_scaledynamic, dtypefloat16) param_scheduler [ dict(typeLinearLR, start_factor1e-5, by_epochTrue, begin0, endwarmup_ratio * max_epochs, convert_to_iter_basedTrue), dict(typeCosineAnnealingLR, eta_min0.0, by_epochTrue, beginwarmup_ratio * max_epochs, endmax_epochs, convert_to_iter_basedTrue) ]AmpOptimWrapper自动混合精度训练loss_scaledynamic动态损失缩放dtypefloat16。梯度裁剪max_norm1110B 模型训练必备防止梯度爆炸。学习率策略前warmup_ratio * max_epochs3%做线性 warmup之后余弦退火到 0。4.5 PART 5 Runtime训练钩子与 checkpointcustom_hooks [ dict(typeDatasetInfoHook, tokenizertokenizer), dict(typeThroughputHook), dict( typeEvaluateChatHook, tokenizertokenizer, every_n_itersevaluation_freq, evaluation_inputsevaluation_inputs, systemSYSTEM, prompt_templateprompt_template) ]EvaluateChatHook每 50 个 iterevaluation_freq 50用中英双语示例请给我介绍五个上海的景点做一次真实对话生成方便在训练日志中直接观察模型能力变化。CheckpointHook每 500 步保存一次最多保留 2 份save_total_limit 2。若开启变长注意力配置还会追加VarlenAttnArgsToMessageHubHook见配置文件第 176-177 行。五、原理剖析序列并行如何让 110B 模型跑在 2 张卡上5.1 为什么需要序列并行110B 模型即使 4-bit 量化后权重仍占约 55GB 显存两张 80G 卡勉强放下但长序列的激活值activation会迅速吃满剩余显存。序列越长注意力矩阵与中间激活越大。此时单卡算不动传统数据并行又要求每张卡都有完整的模型与完整的序列同样行不通。5.2 序列并行的工作方式XTuner 的序列并行设计参考了 DeepSpeed Ulysses 的思路详见 docs/zh_cn/user_guides/sequence_parallel.md核心洞察是Transformer 中除注意力外其余计算都是逐 token 独立的。因此可以把一条长度为 N 的长序列切成 P 段分发给 P 张 GPU每张卡对长度为 N/P 的子序列做 QKV 线性投影通过all-to-all通信算子把 QKV 张量汇聚每张卡获得完整序列但更少的注意力头各自完成注意力计算后再通过一次 all-to-all 把结果切回长度为 N/P 的子序列继续后续计算。本配置中sequence_parallel_size 2即 2 张卡协同计算一条长序列配合 ZeRO-3 分摊模型权重最终实现 16K 甚至 32K 上下文下的 110B 训练。5.3 仓库中的代码证据序列并行的分布式环境初始化位于 xtuner/parallel/sequence/setup_distributed.pyinit_sequence_parallel会把world_size张卡划分为world_size // sequence_parallel_size个序列并行组并交叉构建数据并行组rank 间隔sequence_parallel_size取模划分因此数据并行世界大小恰好缩小为原来的 1/P——这正是配置里accumulative_counts * sequence_parallel_size的原因。同时 xtuner/tools/train.py 中的校验逻辑强制要求使用序列并行必须搭配 DeepSpeed--deepspeed因为Sequence parallel training without DeepSpeed lacks validation未经验证。5.4 与 varlen attention 的关系本配置use_varlen_attn False使用固定长度 packing。若改为True变长注意力xtuner/tools/train.py 会校验max_length必须能被序列并行度整除且 batch size 必须为 1。仓库提供了使用变长注意力的 DPO 等示例配置如 xtuner/configs/dpo/internlm/internlm2_chat_1_8b_dpo_full_varlenattn.py可作对比参考。六、配置变体矩阵三种官方方案的选型该目录下共有 3 份配置与 1 份 README覆盖从极致省显存到全量微调的不同诉求配置文件方法显存/算力前提关键差异qwen1_5_110b_chat_qlora_alpaca_e3_16k_2gpus.pyQLoRA2×A100 80Gmax_length16384sequence_parallel_size2lr1e-4qwen1_5_110b_chat_qlora_alpaca_e3.pyQLoRA8 GPU注释按 8 卡推算max_length2048sequence_parallel_size1lr1e-4qwen1_5_110b_chat_full_alpaca_e3.pyFull全量32 GPU注释按 32 卡推算无量化、无 LoRAlr1e-5全量微调更小dataloader_num_workers4对比要点QLoRA 两配置的取舍默认配置max_length2048、单序列并行适合常规硬件快速验证16K 配置把max_length拉高到 16384并把序列并行度提到 2 以摊薄长序列激活的显存evaluation_freq也从 500 收紧到 50长序列训练更早暴露质量问题。全量微调配置model段不再包含quantization_config与lora直接以 FP16 加载 110B 权重对显存和算力要求最高配置注释显示按 32 卡规划lr降至1e-5体现了参数量越大、学习率越小的调参原则。公共部分三份配置的模型路径、tokenizer、数据集、prompt_template、SYSTEM_TEMPLATE.alpaca完全一致说明从 QLoRA 切换到全量微调只需要替换 model 段与相关超参工程上非常轻量。七、从训练到应用checkpoint 与后续衔接训练结束后checkpoint 会按save_steps 500保存默认输出到./work_dirs/config 文件名/可通过--work-dir覆盖。由于配置启用了stage3_gather_16bit_weights_on_model_saveZeRO-3 会在保存时聚合完整 16bit 权重。后续若需把 LoRA 权重合并回基座模型做推理部署可使用仓库提供的模型转换工具如 xtuner/tools/model_converters/merge.py对权重格式做进一步转换可参考 xtuner/tools/model_converters/pth_to_hf.py 与 xtuner/tools/model_converters/split.py。仓库文档 docs/zh_cn/user_guides/finetune.md 中亦有更完整的训练前后流程说明。八、常见问题与注意事项GPU 总数必须能被sequence_parallel_size整除init_sequence_parallel会在world_size % sequence_parallel_size ! 0时直接抛错见 xtuner/parallel/sequence/setup_distributed.py。DeepSpeed 版本下限 0.12.3过低版本会被 xtuner/tools/train.py 拒绝并提示升级。flash-attn 是序列并行的硬依赖未安装时check_cfg会断言失败安装命令见本文第二节。max_length与32K 上下文的关系README 宣传的 32K 能力在本目录配置中通过 16K16384落地如需 32K可在命令行以--cfg-options max_length32768覆盖或参照仓库中其他长序列示例如 docs/zh_cn/acceleration/pack_to_max_length.rst、docs/zh_cn/acceleration/train_extreme_long_sequence.rst调整。learning rate 的选择110B 规模下 QLoRA 用1e-4全量微调用1e-5切勿照搬小模型的2e-4等常见值。结语通过 XTuner 提供的这套 Qwen1.5-110B-Chat 官方配置可以看到一条清晰的工程路径以 QLoRA 压缩权重、以 ZeRO-3 分片状态、以序列并行突破长序列激活显存瓶颈三者协同让 110B 级模型的 16K/32K 上下文微调下沉到 2×A100 80G 的硬件门槛。从xtuner train单条命令到五段式配置文件的每一处细节仓库源码都为为什么这样设置提供了可验证的依据这份方案也可迁移到同类超大规模模型的低成本微调场景中。【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表