ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 XTuner 微调 Llama3 8B:QLoRA 与全参数训练实战指南

2026/9/18 2:29:18 拓冰建站 浏览量
使用 XTuner 微调 Llama3 8B:QLoRA 与全参数训练实战指南 使用 XTuner 微调 Llama3 8BQLoRA 与全参数训练实战指南【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner本指南以仓库 llama3_8b 目录下的 README 为主体系统讲解如何使用 XTuner 对 Llama3 8B含 Base 与 Instruct 两个变体进行 QLoRA 低资源微调和全参数微调覆盖环境安装、两种微调方式的启动命令、DeepSpeed ZeRO 与序列并行Sequence Parallel的配合方式以及官方给出的训练吞吐基准。读完本文你将掌握从命令行到配置文件的完整训练链路并理解 XTuner 在超长序列训练上的核心加速机制。一、README 定位与适用场景xtuner/configs/llama/llama3_8b/是 XTuner 为 Llama3 8B 系列模型提供的专属训练配置目录其中 README 面向的目标用户非常明确资源有限的个人开发者通过 QLoRA 4-bit 量化微调单张 A100-80G 即可完成整个微调流程具备多卡集群的团队通过全参数微调 DeepSpeed ZeRO两张 A100-80G 即可在 8k 上下文下训练 8B 模型长序列训练研究者配合 XTuner 的序列并行能力可在 8 卡环境下将上下文从 8k 一路扩展到 128k。该目录下同时提供三份可直接运行的配置脚本配置文件模型基座微调方式llama3_8b_full_alpaca_e3.pymeta-llama/Meta-Llama-3-8B全参数微调llama3_8b_instruct_full_alpaca_e3.pymeta-llama/Meta-Llama-3-8B-Instruct全参数微调llama3_8b_instruct_qlora_alpaca_e3.pymeta-llama/Meta-Llama-3-8B-InstructQLoRA 4-bit 量化微调三个配置均使用 Hugging Face 上的tatsu-lab/alpaca数据集作为训练数据训练 3 个 epoch配置文件名中的e3即表示 epoch3。二、环境安装README 给出的安装步骤只有两条命令但它们是整个训练流程的起点# Install the latest xtuner pip install -U xtuner[deepspeed] # install the latest transformers pip install -U transformers第一条命令安装 XTuner 及其 DeepSpeed 依赖。[deepspeed]是 XTuner 的 extras 依赖标记对应的依赖声明见仓库 requirements/deepspeed.txt第二条命令确保 transformers 升级到最新版本以完整支持 Llama3 的模型结构GQA 注意力、128k 词表、分组 RoPE 等新特性。需要特别说明的是XTuner 训练入口 在启动 DeepSpeed 训练前会做版本校验要求deepspeed 0.12.3否则会直接抛出RuntimeError提示升级。因此安装后建议用pip show deepspeed确认版本满足要求。三、QLoRA 微调单卡 A100-80G 上手QLoRA 通过 4-bit 量化加载基座模型并只训练注入的低秩适配器LoRA Adapter将显存占用压缩到极致。README 明确说明QLoRA only need a single A100-80G启动命令极简——直接传入配置名即可XTuner 会从cfgs_name_path注册表中解析出配置文件的真实路径xtuner train llama3_8b_instruct_qlora_alpaca_e3这条命令等价于执行xtuner train xtuner/configs/llama/llama3_8b_instruct/llama3_8b_instruct_qlora_alpaca_e3.py。拆解 qlora 配置文件 可以看到它由两大核心模块构成1. 4-bit 量化加载BitsAndBytesquantization_configdict( typeBitsAndBytesConfig, load_in_4bitTrue, load_in_8bitFalse, llm_int8_threshold6.0, llm_int8_has_fp16_weightFalse, bnb_4bit_compute_dtypetorch.float16, # 计算精度FP16 bnb_4bit_use_double_quantTrue, # 开启双重量化进一步省显存 bnb_4bit_quant_typenf4) # 使用 NF4 量化类型模型以 NF4 精度加载计算过程使用 FP16双重量化double quant额外压缩量化常数本身这是单卡跑通 8B 模型的关键。2. LoRA 适配器PEFTloradict( typeLoraConfig, r64, # LoRA 秩 lora_alpha16, # 缩放因子 lora_dropout0.1, biasnone, task_typeCAUSAL_LM)r64提供了较大的可学习容量lora_alpha16用于缩放低秩矩阵的贡献。训练超参上QLoRA 配置使用lr 2e-4比全参数微调高一个数量级配合max_length 2048、pack_to_max_length True将短样本打包到最大长度减少 padding 浪费。值得注意的是在 训练入口 train.py 中如果lora.target_modules未指定XTuner 会通过find_all_linear_names自动找出模型中所有线性层作为 LoRA 注入目标无需手工维护模块名列表。四、全参数微调多卡 DeepSpeedREADME 指出Full parameter fine-tune Llama3 8B in 8k context only requires 2 * A100-80G即全量更新 8B 参数时8k 上下文只需要两张 A100-80G。这依赖于 DeepSpeed ZeRO 显存优化。XTuner 内置了 deepspeed_zero2.json 和 deepspeed_zero3.json 两套策略文件ZeRO-2切分优化器状态与梯度overlap_comm: true开启通信与计算重叠ZeRO-3在 ZeRO-2 基础上进一步切分模型权重stage3_gather_16bit_weights_on_model_save: true保证保存 checkpoint 时权重可正确聚合。两份 JSON 中gradient_accumulation_steps、train_micro_batch_size_per_gpu、gradient_clipping均设为auto由 train.py 在启动时自动读取 mmengine 配置中的对应值如accumulative_counts、batch_size、clip_grad.max_norm回填避免两套配置不一致导致隐性错误若检测到不一致会打印 warning 并以 mmengine 侧配置为准。4.1 使用 torchrun 启动本地多卡NPROC_PER_NODE${GPU_NUM} xtuner train llama3_8b_instruct_full_alpaca_e3 --deepspeed deepspeed_zero2NPROC_PER_NODE为每节点 GPU 数如 2 或 8。--deepspeed deepspeed_zero2传入 ZeRO 策略名XTuner 会将其解析到xtuner/configs/deepspeed/deepspeed_zero2.json。4.2 使用 Slurm 启动集群调度srun ${SRUN_ARGS} xtuner train llama3_8b_instruct_full_alpaca_e3 --launcher slurm --deepspeed deepspeed_zero3集群场景通过--launcher slurm指定分布式启动方式并通常选用 ZeRO-3 以进一步降低单卡显存压力README 的速度基准正是基于 ZeRO-3 测得。4.3 训练入口的完整 CLI 参数训练入口 除config外还支持以下常用参数参数作用--work-dir指定日志与 checkpoint 输出目录未指定时默认输出到./work_dirs/配置文件名--deepspeedDeepSpeed 策略 JSON 的路径或名称如deepspeed_zero2--resume指定 checkpoint 路径恢复训练并自动恢复其中的随机种子--seed设置随机种子--cfg-options以keyvalue形式临时覆盖配置项例如--cfg-options lr1e-5--launcher启动方式可选none/pytorch/slurm/mpi默认none4.4 全参数微调的关键配置以 llama3_8b_instruct_full_alpaca_e3.py 为例Base 版 llama3_8b_full_alpaca_e3.py 除模型路径外完全一致batch_size 1 # 每卡 batch size accumulative_counts 16 # 梯度累积步数等效全局 batch 1 * 16 * GPU数 lr 2e-5 # 全参数微调学习率QLoRA 为 2e-4 max_norm 1 # 梯度裁剪 warmup_ratio 0.03 # warmup 比例 max_length 2048 # 训练序列长度 pack_to_max_length True # 样本打包调度策略采用线性 warmup 余弦退火两段式前warmup_ratio * max_epochs个 epoch 用 LinearLR 从1e-5起步线性升温之后用CosineAnnealingLR衰减到 0。优化器为 AdamWbetas(0.9, 0.999)、weight_decay0配合AmpOptimWrapper使用 FP16 混合精度dtypefloat16、动态 loss scale。五、训练吞吐基准序列并行与超长上下文README 末尾给出了两张官方实测速度表这是评估 Llama3 8B 全参数训练配置的关键参考数据基准为 ZeRO-3 FlashAttention-2表一8k 上下文下的扩展性ModelSequence LengthGPU NumberZeROSequence ParallelTokens per SecondTFLOPsLlama3 8B8k2ZeRO-321037.076.8Llama3 8B8k4ZeRO-312331.3172.6Llama3 8B8k8ZeRO-312771.2205.1表二8 卡下长序列扩展ModelSequence LengthGPU NumberZeROSequence ParallelTokens per SecondTFLOPsLlama3 8B8k8ZeRO-312771.2205.1Llama3 8B16k8ZeRO-322320.7191.7Llama3 8B32k8ZeRO-341870.2186.6Llama3 8B64k8ZeRO-381356.4182.0Llama3 8B128k8ZeRO-38875.7177.7两张表揭示了 XTuner 序列并行Sequence Parallel的核心价值长序列扩展固定 8 卡当序列长度从 8k 翻倍到 128k16 倍时通过同步提高 Sequence Parallel 规模1→8吞吐仅从 2771.2 降至 875.7 tokens/sTFLOPs 始终稳定在 177~205 的高位说明算力利用率没有因序列变长而崩溃序列并行 ≠ 数据并行从表一可以看出2 卡开Sequence Parallel2时吞吐为 1037.0 tokens/s低于 4 卡纯数据并行Sequence Parallel1的 2331.3 tokens/s——因为序列并行需要额外的 all-to-all 通信开销其价值在于单序列变长场景而非单纯堆算力。5.1 序列并行的实现原理XTuner 的序列并行设计参考了 DeepSpeed Ulysses 的思路详见 docs/zh_cn/user_guides/sequence_parallel.md由于 Transformer 中除 Attention 外各 token 的计算相互独立可将长度为 N 的序列按sequence_parallel_size均分到多张 GPU每张 GPU 独立完成线性层投影在 Attention 阶段通过高度优化的all-to-all通信算子将 QKV 张量汇聚——从每卡 N/P 个 token × 全部注意力头变换为全部 N 个 token × N/P 个注意力头Attention 计算完成后再次 all-to-all 切回原布局。相关实现位于 xtuner/parallel/sequence/attention.py 与 comm.py。5.2 如何在自己的配置中开启序列并行在配置文件中按 序列并行使用指南 修改三个字段即可 from xtuner.parallel.sequence import SequenceParallelSampler - sequence_parallel_size 1 sequence_parallel_size 4 # 需保证 GPU 总数可被其整除 - accumulative_counts 1 accumulative_counts 4 # 梯度累积需同步放大 SP 倍 train_dataloader dict( - samplerdict(typeDefaultSampler, shuffleTrue), samplerdict(typeSequenceParallelSampler, shuffleTrue), ...)若需将上下文进一步拓展如 64k还需在模型中指定max_position_embeddingsmodel dict( typeSupervisedFinetune, max_position_embeddings65536, ...)从 train.py 的配置校验逻辑 可以看到三条硬性约束使用序列并行必须配合 DeepSpeed--deepspeed否则直接报错序列并行要求安装flash_attn且attn_implementation必须为flash_attention_2使用 varlen attention 时 batch size 必须为 1且max_length需能被序列并行规模整除。序列并行的分布式环境初始化与 rank 分组逻辑实现在 xtuner/parallel/sequence/setup_distributed.py会在world_size % sequence_parallel_size ! 0时主动报错帮助用户提前发现问题。六、训练过程中的内置观测能力两份全参数配置与 QLoRA 配置都在custom_hooks中内置了两个观测钩子配置 PART 5DatasetInfoHook打印数据集的格式与 tokenizer 相关信息帮助确认数据管线正确EvaluateChatHook每evaluation_freq500步用固定的evaluation_inputs中英双语示例如请给我介绍五个上海的景点让模型生成回复并输出日志训练过程中即可直观观察模型对话能力的演进。同时default_hooks中配置了CheckpointHook每save_steps500步保存最多保留save_total_limit2份和LoggerHook每 10 次迭代打印一次日志配合env_cfg中的 NCCL 分布式设置与randomness默认随机种子、关闭 deterministic构成完整的训练运行时。七、总结围绕 llama3_8b 目录 README 给出的两条训练路径本文完整还原了 XTuner 微调 Llama3 8B 的实战要点单卡 QLoRAxtuner train llama3_8b_instruct_qlora_alpaca_e3NF4 量化 LoRAr64一张 A100-80G 即可完成多卡全参数torchrun 搭配deepspeed_zero2、Slurm 搭配deepspeed_zero38k 上下文仅需 2×A100-80G长序列扩展序列并行将 8 卡单序列能力从 8k 拓展到 128kTFLOPs 稳定在 177 以上相关配置改动仅需调整sequence_parallel_size等三个字段。如需更换数据集或修改超参数可基于上述三个配置脚本使用--cfg-options临时覆盖或参考 custom_sft_dataset 文档 构建自定义 SFT 数据管线。【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考