我现在使用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
