Qwen2.5-14B-Instruct 进行lora微调后,权重如何合并?

我现在使用MindSpore 1.6版本对Qwen2.5-14B-Instruct完成了分布式微调,并对分布式权重进行了合并,我想将训练后的模型权重与基础模型进行合并后转换成HuggingFace格式权重用于VLLM部署推理应该怎么处理?

合并后的权重

配置文件:finetune_qwen2_5_14b_8k_lora.yaml

基础训练设置

seed: 42 # 随机种子,保证实验可复现
output_dir: ‘./output/bill-xw-15’ # 输出目录路径
load_checkpoint: ‘’ # 预训练检查点路径(空表示从头开始训练)
auto_trans_ckpt: False # 如果设为True,自动转换加载分布式模型的检查点格式
transform_process_num: 8
only_save_strategy: False # 是否仅保存策略相关文件
resume_training: False # 是否恢复中断的训练
run_mode: ‘finetune’ # 运行模式,train:训练,finetune:微调,predict:推理
load_ckpt_format: ‘safetensors’ # 加载的模型权重的格式 可选ckpt、safetensors

训练器配置

trainer:
type: CausalLanguageModelingTrainer # 因果语言建模训练器类型
model_name: ‘/data/modelscope/models/Qwen/Qwen2.5-14B-Instruct’ # 基础模型路径

运行器配置

runner_config:
epochs: 1 # 训练轮次
batch_size: 1 # 单次迭代样本数
sink_mode: True # 启用下沉模式(提升内存效率)
sink_size: 1 # 下沉缓冲区大小

包装器单元配置(梯度处理相关)

runner_wrapper:
type: MFTrainOneStepCell # 多框架单步训练单元
scale_sense:
type: DynamicLossScaleUpdateCell # 动态损失缩放策略
loss_scale_value: 4096 # 初始损失缩放值
scale_factor: 1 # 缩放因子
scale_window: 100000 # 缩放窗口大小
use_clip_grad: True # 启用梯度裁剪
max_grad_norm: 1.0 # 最大梯度范数

优化器配置

optimizer:
type: AdamW # 带权重衰减的Adam优化器
betas: [0.9, 0.95] # β1和β2超参数
eps: 1.e-8 # 防止除零的小常数
learning_rate: 2.e-5 # 初始学习率
weight_decay: 0.01 # 权重衰减系数

学习率调度策略

lr_schedule:
type: CosineWithWarmUpLR # 余弦退火+热身学习率调度
learning_rate: 2.e-5 # 初始学习率
#lr_end: 1.e-6 # 最终学习率
warmup_ratio: 0.05 # 热身比例(0表示无显式热身)
total_steps: -1 # -1表示自动获取数据集总步数

数据集配置

train_dataset: &train_dataset # 定义可复用的数据集模板
data_loader:
type: MindDataset # MindSpore数据集类型
dataset_dir: “/data/datasets/xw-train-datasets.mindrecord” # 数据集路径
shuffle: True # 是否打乱数据
input_columns: [“input_ids”, “target_ids”, “attention_mask”] # 输入特征列
num_parallel_workers: 8 # 并行工作线程数
python_multiprocessing: False # 禁用Python多进程
drop_remainder: True # 丢弃剩余样本
numa_enable: False # 禁用NUMA节点分配
prefetch_size: 1 # 预取队列大小
train_dataset_task:
type: CausalLanguageModelDataset # 因果语言建模任务类型
dataset_config: *train_dataset # 引用前面定义的数据集模板

use_parallel: True # 启用并行训练

并行上下文配置

parallel:
parallel_mode: 1 # 并行模式:0表示数据并行模式, 1表示半自动并行模式, 2表示自动并行模式, 3表示混合并行模式,一般设置为半自动并行模式。
gradients_mean: False # 是否对梯度取平均
enable_alltoall: False # 是否启用全归约通信
full_batch: True # 是否使用完整批次
search_mode: “sharding_propagation” # 分片传播策略
strategy_ckpt_save_file: “./ckpt_strategy.ckpt” # 策略检查点保存路径
enable_parallel_optimizer: True # 启用并行优化器
parallel_optimizer_config:
gradient_accumulation_shard: False # 是否分片梯度累积
parallel_optimizer_threshold: 64 # 并行优化器阈值

默认设备并行配置(适用于910B场景)

parallel_config:
data_parallel: 1 # 数据并行数
model_parallel: 2 # 模型并行数
pipeline_stage: 4 # 流水线并行数
context_parallel: 1 # 序列并行数
use_seq_parallel: True # 启用序列并行
micro_batch_num: 128 # 微批次数量
vocab_emb_dp: False # 词表嵌入是否数据并行
gradient_aggregation_group: 4 # 梯度聚合组数
micro_batch_interleave_num: 1 # 微批次交错数(>1可加速训练)

重计算配置(内存优化)

recompute_config:
recompute: [3, 2, 0, 0] # 各层的重计算策略
select_recompute:
‘feed_forward.mul’: [11, 13, 13, 11] # 前馈层乘法操作的重计算策略
‘feed_forward.w1.activation.silu’: [11, 13, 13, 11] # SiLU激活函数的重计算策略
‘feed_forward.w1.reshape’: [11, 13, 13, 11] # 权重重塑的重计算策略
‘feed_forward.w2.reshape’: [11, 13, 13, 11] # 输出权重重塑的重计算策略
parallel_optimizer_comm_recompute: False # 是否在并行优化器通信时重计算
mp_comm_recompute: False # 是否在模型并行通信时重计算
recompute_slice_activation: False # 是否分片激活重计算

回调函数配置

callbacks:

  • type: MFLossMonitor # 监控损失值
  • type: CheckpointMonitor # 检查点监控
    prefix: “qwen2” # 检查点前缀
    checkpoint_format: “safetensors” # 检查点格式推荐’safetensors’
    save_checkpoint_steps: 50 # 保存模型权重的间隔steps数
    keep_checkpoint_max: 2 # 保存模型权重文件的最大数量
    integrated_save: False # 是否集成保存

MindSpore上下文初始化配置

context:
mode: 0 # 0-图模式;1-PyNative模式
device_target: “Ascend” # 目标设备类型
max_call_depth: 10000 # 最大调用深度
max_device_memory: “57.5GB” # 最大设备内存限制
save_graphs: False # 是否保存计算图
save_graphs_path: “./graph” # 计算图保存路径
device_id: 0 # 设备ID
memory_optimize_level: “O1” # 内存优化级别
jit_config:
jit_level: “O1” # JIT编译级别
ascend_config:
precision_mode: “must_keep_origin_dtype” # 精度模式(保持原始数据类型)

模型配置

model:
model_config:
type: LlamaConfig # LLaMA模型配置
batch_size: 1 # 批大小
seq_length: 8192 # 序列最大长度
hidden_size: 5120 # 隐藏层维度
num_layers: 48 # Transformer层数
num_heads: 40 # Attention头数
n_kv_heads: 8 # 键值头数
vocab_size: 152064 # 词表大小
intermediate_size: 13824 # MLP中间层维度
qkv_has_bias: True # QKV层是否有偏置
rms_norm_eps: 1.0e-5 # RMSNorm的ε值
theta: 1000000.0 # RoPE旋转角度基频
max_position_embedding: 131072 # 最大位置嵌入
emb_dropout_prob: 0.0 # 嵌入层Dropout概率
eos_token_id: 151643 # 结束符ID
pad_token_id: 151643 # 填充符ID
bos_token_id: 151643 # 开始符ID
compute_dtype: “bfloat16” # 计算数据类型
layernorm_compute_type: “float32” # LayerNorm计算类型
softmax_compute_type: “float32” # Softmax计算类型
rotary_dtype: “float32” # RoPE计算类型
param_init_type: “float32” # 参数初始化类型
use_past: False # 是否使用KV缓存
use_flash_attention: True # 是否启用FlashAttention
use_past_shard: False # 是否分片KV缓存
offset: [-1, 1, 1, -1] # 注意力偏移量
checkpoint_name_or_path: “” # 检查点名称/路径
repetition_penalty: 1.05 # 重复惩罚系数
max_decode_length: 1024 # 最大解码长度
top_k: 0 # Top-K采样(0表示禁用)
top_p: 0.8 # Top-P采样概率阈值
do_sample: False # 是否采样生成
extend_method: “None” # 扩展方法(None/PI/NTK)
fine_grain_interleave: 1 # 细粒度交错策略
qkv_concat: True # 是否拼接QKV权重

从Qwen复制的配置项

rotary_pct: 1.0 # RoPE应用比例
rotary_emb_base: 1000000 # RoPE基频

pet_config:  # PEFT(参数高效微调)配置
  use_pet: true
  pet_type: lora  # LoRA适配器类型
  lora_rank: 8  # LoRA秩
  lora_alpha: 16  # LoRA缩放因子
  lora_dropout: 0.1  # LoRA Dropout概率
  target_modules: '.*wq|.*wk|.*wv|.*wo'  # LoRA目标模块正则表达式

arch:
type: LlamaForCausalLM # LLaMA因果语言模型架构

profile: False # 是否启用性能分析
profile_start_step: 1 # 性能分析起始步
profile_stop_step: 10 # 性能分析结束步
init_start_profile: False # 是否在初始化时开始分析
profile_communication: False # 是否分析通信耗时
profile_memory: True # 是否分析内存使用
layer_scale: False # 是否启用层缩放
layer_decay: 0.65 # 层衰减系数
lr_scale_factor: 256 # 学习率缩放因子

监控配置

monitor_config:
monitor_on: True
dump_path: ‘./dump’
target: [‘layers.0’, ‘layers.1’] # 只监控第一、二层的参数
invert: False
step_interval: 1
local_loss_format: [‘log’, ‘tensorboard’]
device_local_loss_format: [‘log’, ‘tensorboard’]
local_norm_format: [‘log’, ‘tensorboard’]
device_local_norm_format: [‘log’, ‘tensorboard’]
optimizer_state_format: null
weight_state_format: null
throughput_baseline: null
print_struct: False
check_for_global_norm: False
global_norm_spike_threshold: 1.0
global_norm_spike_count_threshold: 10

tensorboard:
tensorboard_dir: ‘worker/tensorboard/bill-xw-15’
tensorboard_queue_size: 10
log_loss_scale_to_tensorboard: True
log_timers_to_tensorboard: True

用户您好,欢迎使用MindSpore,已经收到您上述的问题,还请耐心等待下答复~

分布式权重合并流程参考文档: Ckpt权重 | MindSpore Transformers 1.6.0 文档 | 昇思MindSpore社区

lora权重合并流程参考文档: Ckpt权重 | MindSpore Transformers 1.6.0 文档 | 昇思MindSpore社区

MindSpore Transformers微调权重转换为HuggingFace权重流程参考文档: Ckpt权重 | MindSpore Transformers 1.6.0 文档 | 昇思MindSpore社区

权重保存的是safetensors格式吧?

这个是通用权重格式,合并方法也是通用的

用户您好,MindSpore支撑人已经分析并给出了问题的原因,由于较长时间未看到您采纳回答,这里版主将进行采纳回答的结帖操作,如果还其他疑问请发新帖子提问,谢谢支持~

此话题已在最后回复的 60 分钟后被自动关闭。不再允许新回复。