微调模型
建议使用高单核的CPU进行微调
不然可能存在CPU瓶颈(暂时没找到问题所在,欢迎PR修复)
在此之前,你需要配置环境
很简单,不必担心
bash
git clone https://github.com/qqqqqf-q/Qing-Digital-Self.git --depth 1
或使用镜像(中国大陆加速)
bash
git clone https://hk.gh-proxy.com/https://github.com/qqqqqf-q/Qing-Digital-Self.git --depth 1
配置环境
bash
python3 environment/setup_env.py --install
默认跟着流程走就好 安装完自带检查 也可以使用
bash
python3 environment/setup_env.py --check
来进行检查环境 如果遇到unsloth无法安装请自行安装 先运行以下命令
bash
wget -qO- https://raw.githubusercontent.com/unslothai/unsloth/main/unsloth/_auto_install.py | python -
它会输出一个pip命令,请复制下来并在shell里运行 例如
bash
pip install --upgrade pip && pip install "unsloth[cu126-ampere-torch270] @ git+https://github.com/unslothai/unsloth.git"
如果遇到flah attn安装问题 可以尝试前往此Github仓库 来查看你需要的离线安装包(这个不需要编译,会快非常多) 命令类似:
bash
wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.4cxx11abiTRUE-cp312-cp312-linux_x86_64.whl'
pip install flash_attn-2.8.3+cu12torch2.4cxx11abiTRUE-cp312-cp312-linux_x86_64.whl
以下才是真正的微调
参数在测试时其实可以不填,都是有默认值的
似乎是默认8bit量化,有待修改
运行微调脚本:
bashpython run_finetune.py
模型相关参数(列表有四列,请滚动查看)
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
--repo_id | str | 'Qwen/Qwen3-30B-A3B-Instruct-2507' | HF 仓库ID |
--local_dir | str | 'qwen3-30b-a3b-instruct' | 本地模型目录 |
--use_unsloth | str | 'false' | 是否使用 unsloth |
--use_qlora | str | 'true' | 是否使用 qlora |
--data_path | str | 'training_data.jsonl' | 训练数据路径 |
--eval_data_path | str | None | 验证数据文件路径 |
--max_samples | str | None | 最大训练样本数 |
--max_eval_samples | str | None | 最大验证样本数 |
--model_max_length | str | '2048' | 最大序列长度 |
--output_dir | str | 'finetune/models/qwen3-30b-a3b-qlora' | 输出目录 |
--seed | str | '42' | 随机种子 |
--per_device_train_batch_size | str | '1' | 每设备训练批次大小 |
--per_device_eval_batch_size | str | '1' | 每设备验证批次大小 |
--gradient_accumulation_steps | str | '16' | 梯度累积步数 |
--learning_rate | str | '2e-4' | 学习率 |
--num_train_epochs | str | '3' | 训练轮数 |
--max_steps | str | '-1' | 最大步数,-1表示不限制 |
--lora_r | str | '16' | LoRA 秩 |
--lora_alpha | str | '32' | LoRA alpha 值 |
--lora_dropout | str | '0.05' | LoRA dropout 率 |
--target_modules | str | '太长了请进文件查看' | LoRA 目标模块 |
--weight_decay | str | '0.0' | 权重衰减 |
--moe_enable | str | 'false' | 是否启用 MoE 注入逻辑 |
--moe_lora_scope | str | 'expert_only' | LoRA 注入范围 |
--moe_expert_patterns | str | '太长了写不下,去文件里看' | 专家线性层模式 |
--moe_router_patterns | str | 'markdown会转译,也去文件里看' | 路由/门控线性层模式 |
--moe_max_experts_lora | str | '-1' | 每层注入 LoRA 的专家数上限 |
--moe_dry_run | str | 'false' | 是否为 Dry-Run |
--load_precision | str | 'fp16' | 模型加载精度:int8 / int4 / fp16 |
--logging_steps | str | '1' | 日志记录步数 |
--eval_steps | str | '50' | 验证间隔步数 |
--save_steps | str | '200' | 保存模型步数 |
--save_total_limit | str | '2' | 最多保存模型数量 |
--warmup_ratio | str | '0.05' | 学习率预热比例 |
--lr_scheduler_type | str | 'cosine' | 学习率调度器类型 |
--resume_from_checkpoint | str | None | 恢复训练的检查点路径 |
--no-gradient_checkpointing | flag | False | 不使用梯度检查点(使用时加此参数) |
--no-merge_and_save | flag | False | 不合并并保存模型(使用时加此参数) |
--fp16 | str | 'true' | 是否使用 fp16 |
--optim | str | 'adamw_torch_fused' | 优化器名称 |
--dataloader_pin_memory | str | 'false' | 是否固定 DataLoader 内存 |
--dataloader_num_workers | str | '0' | DataLoader 工作线程数 |
--dataloader_prefetch_factor | str | '2' | DataLoader 预取因子 |
--use_flash_attention_2 | str | 'false' | 是否使用 FlashAttention2(对unsloth无效) (使用时加此参数) |
参数还是太复杂了,建议询问AI
下面是一个4090微调qwen2.5-7b-instruct
的范例
bash
python3 run_finetune.py --output_dir /root/autodl-fs/qwen2.5-7b-qing-v1 --local_dir ./model/Qwen2.5-7B-Instruct --data_path ./dataset/sft.jsonl --use_qlora true --lora_dropout 0.1 --num_train_epochs 8 --per_device_train_batch_size 4 --per_device_eval_batch_size 4 --gradient_accumulation_steps 8 --learning_rate 2e-5 --lr_scheduler cosine --logging_steps 5 --eval_steps 40 --save_steps 200 --warmup_ratio 0.05 --dataloader_num_workers 16 --fp16 true --use_unsloth true --no-gradient_checkpointing --load_precision int8
验证集未生效
- 检查
--eval_data_path
路径是否正确 - 确认验证数据文件格式与训练数据一致
- 查看控制台输出是否有"未提供验证数据路径"的提示
GPU显存不足
- 减小
--per_device_eval_batch_size
- 减小
--max_eval_samples
- 增加
--eval_steps
间隔
Dev注
bash
python3 cli.py train start
此参数似乎还是不太能使用的样子,有很多Bug,有待修改