# 微调某个领域模型

# 简介

在一个企业内部,往往都是专攻一个领域的,所以我们只需要这个领域的内容精准,效率高,这属于特定任务的需求,就要比动物的种类细分,鸟类、鱼类等

# 开始微调

大概步骤:做数据、装训练软件、测试训练结果、导出、合并

# 做数据

这一步可以说是最重要的一部分,数据质量好,训练的结果才会好,这里推荐 EasyDataSet 这个项目,它可以帮我生成微调需要的数据集,其中如果对生成不满意也可以自己微调

# 安装微调工具

大多数大模型相关的工具都和 python 有关,需要的 python 版本环境也有关,所以这里推荐用 canconda 来管理, 它就相当于开一个虚拟的 python 环境,每个环境是独立的

# 安装 llama-factory

使用 canconda 安装:

# 创建虚拟环境 (如果没有配置环境变量那么要在 \condabin 目录下)
conda create --name llama_factory python=3.10
# 激活虚拟环境
conda activate llama_factory
#会显示 括号中有显示环境名称就代表激活了:
(llama_factory) C:\
#拉取 llama_factory,我这里选择在 E 盘下安装
(llama_factory) C:\Users\tz>E:
(llama_factory) E:\> mkdir llama_factory
(llama_factory) E:\> cd llama_factory
(llama_factory) E:\llama_factory\> git clone https://github.com/hiyouga/LLaMA-Factory.git
(llama_factory) E:\llama_factory\> pip install -r requirements.txt
#安装成功后启动
(llama_factory) E:\llama_factory\> llamafactory-cli train -h
#成功后访问页面就可以看到微调页面了:
http://localhost:7860/

# 安装训练用模型

上面的微调工具装好了接下来就需要安装微调用的模型了,我这里用 魔塔社区 下载, 当然也可以选择用 huggingface 需要科学上网,或者可以用它的进项网站 huggingface 镜像

我这里也是用 canconda 创建了一个专门的环境:

# 创建虚拟环境 (如果没有配置环境变量那么要在 \condabin 目录下)
conda create --name modelscope python=3.8
# 激活虚拟环境
conda activate modelscope
# 创建一个保存下载模型的目录
(modelscope) E:\software\anaconda\condabin>mkdir E:\software\modelscope
(modelscope) E:\software\anaconda\condabin>E:\software\modelscope
#安装
(modelscope) E:\software\anaconda\condabin>pip install modelscope
#完成后下载指定模型 我这里下载的是蒸馏的 deepseek1.5B
(modelscope) E:\software\modelscope>modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local_dir "E:\\software\\modelscope\\deepseek1.5B"
 _   .-')                _ .-') _     ('-.             .-')                              _ (`-.    ('-.
( '.( OO )_             ( (  OO) )  _(  OO)           ( OO ).                           ( (OO  ) _(  OO)
 ,--.   ,--.).-'),-----. \     .'_ (,------.,--.     (_)---\_)   .-----.  .-'),-----.  _.`     \(,------.
 |   `.'   |( OO'  .-.  ',`'--..._) |  .---'|  |.-') /    _ |   '  .--./ ( OO'  .-.  '(__...--'' |  .---'
 |         |/   |  | |  ||  |  \  ' |  |    |  | OO )\  :` `.   |  |('-. /   |  | |  | |  /  | | |  |
 |  |'.'|  |\_) |  |\|  ||  |   ' |(|  '--. |  |`-' | '..`''.) /_) |OO  )\_) |  |\|  | |  |_.' |(|  '--.
 |  |   |  |  \ |  | |  ||  |   / : |  .--'(|  '---.'.-._)   \ ||  |`-'|   \ |  | |  | |  .___.' |  .--'
 |  |   |  |   `'  '-'  '|  '--'  / |  `---.|      | \       /(_'  '--'\    `'  '-'  ' |  |      |  `---.
 `--'   `--'     `-----' `-------'  `------'`------'  `-----'    `-----'      `-----'  `--'      `------'
Downloading Model from https://www.modelscope.cn to directory: E:\software\modelscope\deepseek1.5B
Downloading [config.json]: 100%|██████████████████████████████████████████████████████| 679/679 [00:00<00:00, 1.93kB/s]
Downloading [LICENSE]: 100%|██████████████████████████████████████████████████████| 1.04k/1.04k [00:00<00:00, 2.83kB/s]
Downloading [configuration.json]: 100%|███████████████████████████████████████████████| 73.0/73.0 [00:00<00:00, 193B/s]
Downloading [generation_config.json]: 100%|█████████████████████████████████████████████| 181/181 [00:00<00:00, 452B/s]

# 开始训练

在页面上选好要训练的模型的名称和路径,在选好要训练的数据集,数据集我们前面用 easydataset 生成好了,如图:

其他参数说明:

  • 选择微调算法 Lora
  • 添加数据集 magic_conch
  • 修改其他训练相关参数,如学习率、训练轮数、截断长度、验证集比例等
    • 学习率(Learning Rate):决定了模型每次更新时权重改变的幅度。过大可能会错过最优解;过小会学得很慢或陷入局部最优解
    • 训练轮数(Epochs):太少模型会欠拟合(没学好),太大会过拟合(学过头了)
    • 最大梯度范数(Max Gradient Norm):当梯度的值超过这个范围时会被截断,防止梯度爆炸现象
    • 最大样本数(Max Samples):每轮训练中最多使用的样本数
    • 计算类型(Computation Type):在训练时使用的数据类型,常见的有 float32 和 float16。在性能和精度之间找平衡
    • 截断长度(Truncation Length):处理长文本时如果太长超过这个阈值的部分会被截断掉,避免内存溢出
    • 批处理大小(Batch Size):由于内存限制,每轮训练我们要将训练集数据分批次送进去,这个批次大小就是 Batch Size
    • 梯度累积(Gradient Accumulation):默认情况下模型会在每个 batch 处理完后进行一次更新一个参数,但你可以通过设置这个梯度累计,让他直到处理完多个小批次的数据后才进行一次更新
    • 验证集比例(Validation Set Proportion):数据集分为训练集和验证集两个部分,训练集用来学习训练,验证集用来验证学习效果如何
    • 学习率调节器(Learning Rate Scheduler):在训练的过程中帮你自动调整优化学习率
  • 页面上点击启动训练,或复制命令到终端启动训练
    • 实践中推荐用 nohup 命令将训练任务放到后台执行,这样即使关闭终端任务也会继续运行。同时将日志重定向到文件中保存下来
  • 在训练过程中注意观察损失曲线,尽可能将损失降到最低
    • 如损失降低太慢,尝试增大学习率
    • 如训练结束损失还呈下降趋势,增大训练轮数确保拟合

# 微调结束,评估微调效果

  • 观察损失曲线的变化;观察最终损失(loss 值越低训练效果也好,注意看曲线是平缓的从高到低的)
  • 在交互页面上通过预测 / 对话等方式测试微调好的效果
  • 检查点:保存的是模型在训练过程中的一个中间状态,包含了模型权重、训练过程中使用的配置(如学习率、批次大小)等信息,对 LoRA 来说,检查点包含了训练得到的 B 和 A 这两个低秩矩阵的权重
  • 若微调效果不理想,你可以:
    • 使用更强的预训练模型
    • 增加数据量
    • 优化数据质量(数据清洗、数据增强等,可学习相关论文如何实现)
    • 调整训练参数,如学习率、训练轮数、优化器、批次大小等等

这是我训练出来的结果:

# 导出训练完成的模型并运行

  • 为什么要合并:因为 LoRA 只是通过低秩矩阵调整原始模型的部分权重,而不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合生成一个完整的模型

  • 先创建目录,用于存放导出后的模型

    mkdir E:\software\export_model\model_test
  • 在 llama_factory 上选择导出训练好的模型到上面传教的路径下

  • 转换成 ollama 可以运行的模型, 要选择导出文件的 Modelfile 文件执行

    ollama create hpzsmodal1.0 -f E:\software\export_model\model_test\Modelfile
    #输出结果
    gathering model components
    copying file sha256:ebce38aa6e0d808e9197999960e0ccc11622631ffaf6ca5a5bfe0f45a43ca23b 100%
    copying file sha256:ea5a6d26cb236729c2cd3533920df439197601f3a58a7bfaaf3fd15fe622e3fc 100%
    copying file sha256:e20ddafc659ba90242154b55275402edeca0715e5dbb30f56815a4ce081f4893 100%
    copying file sha256:291a845e7c8da40ae17b4435ba42d685478c415e27d9cba660a28dc798ca2840 100%
    copying file sha256:56c7e91f53b398e02911ea2efb3055064b030e1ee60f715768b0784ff88d9561 100%
    copying file sha256:48b429b5145f0c5b64117f260ca0a5e61b2b3893e296fdb2c29e2724af3fc824 100%
    copying file sha256:aa680816c8c93d1b4f7ef85b9973ae401d6cc597761555e424b057182f2cfffc 100%
    copying file sha256:df167259298e0fcdfb446821061942e031559cf78e9cb48582fb6d153bb3d280 100%
    converting model
    creating new layer sha256:bd9e822699dff12194ce21de651141158bbd3a02982e73c3630d6c2f66e4420b
    creating new layer sha256:741e943dbd4c7642ec2e10b275b4cc1a154d97550dce8a6288e1edf56bec5e8f
    creating new layer sha256:b2ad9c47ff5fee622d61048a4fe3ba330b91d26bc04578fad9d10d143dc86322
    writing manifest
    success
    #查看 ollama 所有模型, 可以看到已经有显示了
    ollama list
    NAME                       ID              SIZE      MODIFIED
    hpzsmodal1.0:latest        a4eeda271171    3.6 GB    7 minutes ago
    deepseek-r1:1.5b           e0979632db5a    1.1 GB    6 days ago