注:本人之前从未接触过模型微调,这篇文章更多是记录微调流程,方便自己后续参考。有问题欢迎勘误,或者如果有更好的微调思路也还请不吝赐教
数据准备
由于我们使用 LLaMA Factory 进行微调,数据处理方面可以参考数据处理 - LLaMA Factory
另外,因为之前训练模型的时候效果不是很理想,模型真的很不会聊天,而且很容易吃书,所以我额外想了以下办法进行改进
写了个角色的小型知识库
- 角色的基本信息,包括角色的年龄、性别、生日、性格、家人、重要经历等user 所扮演角色的基本信息(同上)该角色和 user 所扮演的角色之间的相处模式、共同的记忆等
写了个脚本,将每一轮对话内容 + 知识库一起发给相对比较聪明的 ai(如 deepseek)处理,让 ai 分析角色这么说的动机,然后作为导演指令放入 instruction
在后续训练完模型进入聊天测试的环节时,在 system prompt 里放入第一步写的知识库(这个放到后面训练完再具体说)
环境准备
租个 AutoDL 服务器
地址:autodl.com
选服务器的时候,个人觉得最好选那种 GPU 空闲多的,不然上班时间有可能抢不到有卡模式开机,不方便后续训练
我租的服务器配置如下:
不过因为只有 24G,后续微调的时候一度出现过显存爆了导致微调失败的情况 =-=,有能力的话可以租好点的服务器,不过如果只是为了练手的话配置低点也 ok
租好了之后点开机,然后点击“快捷工具 - JupyterLab”进入服务器
下载模型
因为下载模型比下 LLaMA Fatcory 慢很多,所以我们先下这个
此处模型使用 mistralai/Mistral-Nemo-Instruct-2407 · Hugging Face。可以根据自己需要选择其他模型
hugging face 登录认证(所使用的模型不需要登录访问的可以跳过该步骤)
由于我选择的模型需要登录后访问,因此需要先登录 hugging face、进入该模型仓库页面后点击同意条款,然后在 autodl 服务器里认证个人的 hugging face 账号
- 点击右上头像 - Access Tokens
- 在跳转后的页面点击 +Create new token
- 选择 Read,并且随便填个 Token 名
- 保存 Access Token 内容回到 autodl 服务器,运行登录 huggingface 的命令
# 如果没有安装 hugging-face cli,需要先安装pip install -U "huggingface_hub[cli]"# 登录 hugging face 账号huggingface-cli login
- 输入刚刚保存的 Access Token 内容,回车接下来会问你是否将令牌另存为 git 凭据。如果想在本地使用 git,可以选 y
拉取模型到本地
由于众所周知的原因,直接拉模型会很慢。之前试过一些办法,下面这套流程是亲测速度最快的
安装加速工具 hf_transfer
pip install hf_transfer
设置 hugging face 镜像
为了绕过网络问题,我们需要将下载地址指向国内的镜像站
export HF_ENDPOINT=https://hf-mirror.com
下载模型
pip install huggingface_hub
下面安装模型命令里的 local-dir
可以自定义,但据说安装在 autodl-tmp 会更好一些。如果打算用其他模型的话,记得把 Mistral 模型替换成自己的
huggingface-cli download \ --resume-download \ --local-dir-use-symlinks False \ --exclude "*.gguf" \ --local-dir /root/autodl-tmp/models/Mistral-Nemo-Instruct-2407 \ mistralai/Mistral-Nemo-Instruct-2407
下载 LLaMA Factory
等待模型下载的时间,可以另开一个终端下 LLaMA Factory
根据官方文档安装 - LLaMA Factory,因为 autodl 服务器已经下好 CUDA 了,这里我直接跳到 Linux 安装的步骤
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]"
安装完成后,可以通过 llamafactory-cli version
来快速校验安装是否成功
注册数据集
进入 LLaMA Factory 仓库根目录下的 data 目录,将你的 json 数据集上传到该目录,并编辑 dataset_info.json
这里 file_name 填你实际的 json 数据集名称,columns 填数据形状,至于键名可以随意,之后选择数据集的列表里会以这个键名标识数据集
训练模型
可以通过命令行训练,也可以通过 WebUI。此处记录一下 WebUI 的操作流程
启动 WebUI
首先运行如下命令行启动 WebUI
llamafactory-cli webui
然后回到 autodl 控制台,安装一下 autodl 的这个隧道工具,然后进行如下代理操作
代理成功后,可以通过 http://127.0.0.1:7860/ 访问 webui 了
参数设置
这里的参数可能因人而异,可以向 gpt 之类的 ai 寻求建议。以下是我个人的参数:
cutoff_len: 4096dataset: ivandataset_dir: /root/autodl-tmp/LLaMA-Factory/dataddp_timeout: 180000000do_train: truedouble_quantization: trueenable_thinking: truefinetuning_type: loraflash_attn: autofp16: truegradient_accumulation_steps: 8include_num_input_tokens_seen: truelearning_rate: 5.0e-05logging_steps: 10lora_alpha: 8lora_dropout: 0lora_rank: 4lora_target: alllr_scheduler_type: cosinemax_grad_norm: 1.0max_samples: 100000model_name_or_path: /root/autodl-tmp/models/Mistral-Nemo-Instruct-2407num_train_epochs: 3.0optim: adamw_torchoutput_dir: saves/Mistral-Nemo-Instruct-2407/lora/train_2025-07-21-19-06-09packing: falseper_device_train_batch_size: 2plot_loss: truepreprocessing_num_workers: 16quantization_bit: 4quantization_method: bnbreport_to: nonesave_steps: 100stage: sfttemplate: mistraltrust_remote_code: truewarmup_steps: 0
主要的改动应该是:(这里是后期补的图。我又换了个新模型测试,正常填入自己用的 model name 和 model 所在路径就行。如果用 mistral 的话,这里的 chat template
要换成 mistral
,trainable modules
填 q_proj,v_proj
)
设置完之后,就可以点击 start 开始训练了
模型聊天测试
最激动人心的环节来了。模型训练完之后,可以切换到 chat 的这个 tab,加载一下 checkpoint path
换成我们刚刚训练好的那个模型,再点 load model
,就可以看到模型已经加载好、可以聊天了(不用管我这里提示的错误,因为我是第二天才复盘,这个时候 WebUI 已经断开连接了,所以这样显示)
记得先在 system prompt 里贴上人物设定,唤醒一下 ai,不然只会告诉你它是一个 ai 智能助手……
如果发现只会念数据集的回答,可以把 temperature 调高;若发现它忘设定很严重,可以把 temperature 调低
当你打算重新训练一个新模型的话,重新加载新模型的时候记得先 Unload model
,然后再重新 Load model
另外,页面放置时间过长可能会导致连接断开,需要重新运行 webui 启动命令,然后重开一下 autodl 的隧道工具代理
模型的导出与整合
切换到 export 的 tab,ai 建议我把 Export device
改成 auto
。其他不变,然后点 export
但是我们会发现,当前生成的模型还是太大了,竟然高达 23 G
(此处使用的命令:du -sh /root/autodl-tmp/merged_models/ivan_mistral_nemo_merged
,具体路径需要换成你实际合并导出的模型所在路径)
而且又因为是 QLoRA 训练的产物,其实没办法在 export 时就选择量化(Export quantization bit
会自动加载为 none
且禁用),所以这里我们可以把合并好的模型再次加载,量化后再 export
这里主要需要改的地方是,往 model path
填入上边合并后的模型的所在路径,Export quantization bit
改成 4,显存多的情况下可以 把Export device
改成 auto
(像我只有 24 的就老老实实默认吧)。注意 checkpoint path
务必留空,然后点 export
(如果 Export quantization bit
被禁用,可以刷新页面重进)
不过我实际 export 的时候先后报错说找不到 optimum
和 gptqmodel
,所以还得 pip install optimum>=1.24.0
pip install gptqmodel>=2.0.0
注意,如果 export 时又报错说找不到其他库,那需要先 Ctrl + C 中断 webui 运行,然后再重启,刷新页面重新 export,不然就算安装了也会继续报错说找不到