1. 模型微调简介

模型微调是一种在已有预训练模型的基础上,通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时,适应特定任务的细微差别。使用微调模型,可以获得以下好处:

  • 提高性能:微调可以显著提高模型在特定任务上的性能。
  • 减少训练时间:相比于从头开始训练模型,微调通常需要较少的训练时间和计算资源。
  • 适应特定领域:微调可以帮助模型更好地适应特定领域的数据和任务。

SiliconCloud 平台提供高效的模型微调能力,目前有以下模型支持微调

  • 生图模型已支持:

    • black-forest-labs/FLUX.1-dev
  • 对话模型已支持:

    • Qwen/Qwen2.5-7B-Instruct
    • Qwen/Qwen2.5-14B-Instruct
    • Qwen/Qwen2.5-32B-Instruct
    • Qwen/Qwen2.5-72B-Instruct
    • meta-llama/Meta-Llama-3.1-8B-Instruct

最新支持的模型参考模型微调

2. 使用流程

2.1 准备数据

2.2.1 生图模型数据准备

数据集要求如下:

  1. 数据集应同时包含图片及对应图片的文本描述,在同一个本地文件夹中;
  2. 每个数据集最多包含 100 张图片及其文本描述;
  3. 支持的图片格式包括:.jpg.jpeg.png.webp,建议分辨率为:1024×10241024×768768×1024
  4. 不符合上述分辨率的图片,在训练时会被缩放、剪裁为上述分辨率;
  5. 图片描述应保存为与图片同名的 .txt 文件;
  6. 整个数据集不超过 300M,单个图片描述文件不超过 128K
  7. 对于 FLUX.1 模型,图片描述信息不超过 512 tokens,过长内容会被截断

数据集本地文件夹示例如图:

2.2.2 语言模型数据准备

仅支持 .jsonl 文件,且需符合以下要求:

  1. 每行是一个独立的 JSON 对象;
  2. 每个对象必须包含键名为 messages 的数组,数组不能为空;
  3. messages 中每个元素必须包含 rolecontent 两个字段;
  4. role 只能是 systemuserassistant
  5. 如果有 system 角色消息,必须在数组首位;
  6. 第一条非 system 消息必须是 user 角色;
  7. userassistant 角色的消息应当交替、成对出现,不少于 1

如下为数据示例:

{"messages": [{"role": "system", "content": "你是客服助手"}, {"role": "user", "content": "如何修改收货地址?"}, {"role": "assistant", "content": "您可以按以下步骤修改:\n1. 进入订单详情\n2. 点击'修改地址'\n3. 输入新地址信息\n4. 保存修改"}]}
{"messages": [{"role": "system", "content": "你是客服助手"}, {"role": "user", "content": "如何指定收获时间"}, {"role": "assistant", "content": "您可以按以下步骤修改:\n1. 进入订单详情\n2. 点击'修改送货时间'\n3. 输入新收获时间\n4. 保存修改"}]}

2.2 新建并配置微调任务

  • 选择 对话模型微调 或者 生图模型微调
  • 填写任务名称
  • 选择基础模型
  • 上传或选取已上传的训练数据
  • 设置验证数据,支持训练集按比例切分(默认 10%),或单独选定验证集
  • 配置训练参数

2.3 开始训练

  • 点击”开始微调”
  • 等待任务完成
  • 获取模型标识符

2.4 调用微调模型

2.4.1 生图微调模型调用

  • 复制模型标识符
  • 通过 /image/generations API 调用生图 LoRA,具体使用方式,参见 API 文档

示例如下:

import requests

url = "https://api.siliconflow.cn/v1/images/generations"
payload = {
    "prompt": "an island near sea, with seagulls, moon shining over the sea, light house, boats int he background, fish flying over the sea",
    "image_size": "1024x1024",
    "model": "LoRA/black-forest-labs/FLUX.1-dev",
    "loras": [
        {
            "model_id": "cm04pf7az00061413w7kz5qxs:changdu:pazlgyppednebxesxqmx:epoch_2.safetensors",
            "strength": 0.5,
        },
        {
            "model_id": "cm04pf7az00061413w7kz5qxs:changdu:pazlgyppednebxesxqmx:epoch_1.safetensors",
            "strength": 0.5,
        },
        {
            "model_id": "cm04pf7az00061413w7kz5qxs:changdu:pazlgyppednebxesxqmx:epoch.safetensors",
            "strength": 0.5,
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}
response = requests.request("POST", url, json=payload, headers=headers)
print(response.text)

2.4.2 对话微调模型调用

  • 复制模型标识符 在模型微调页复制对应的模型标识符。
  • 通过 /chat/completions API 即可直接调用微调后的模型

下面是基于 OpenAI的chat.completions 接口访问微调后模型的例子:

from openai import OpenAI
client = OpenAI(
    api_key="您的 APIKEY", # 从https://cloud.siliconflow.cn/account/ak获取
    base_url="https://api.siliconflow.cn/v1"
)

messages = [
    {"role": "user", "content": "用当前语言解释微调模型流程"},
]

response = client.chat.completions.create(
    model="您的微调模型名",
    messages=messages,
    stream=True,
    max_tokens=4096
)

for chunk in response:
    print(chunk.choices[0].delta.content, end='')

3. 参数配置详解

  1. 基础训练参数
参数名说明取值范围建议值使用建议
Trigger Word【仅生图】触发词训练时会被添加到每张图片的描述内容的开头
Number of Repeats【仅生图】单张图片重复训练次数
Learning Rate学习速率0-0.10.0001
Number of Epochs训练轮数1-103
Batch Size批次大小1-328
Max Tokens最大标记数0-40964096根据实际对话长度需求设置
  1. LoRA参数
参数名说明取值范围建议值使用建议
LoRA Rank矩阵秩1-648
LoRA Alpha缩放因子1-12832
LoRA Dropout随机丢弃率0-1.00.05
  1. 场景化配置方案

对话模型

场景Learning RateEpochsBatch SizeLoRA RankLoRA AlphaDropout
标准方案0.0001388320.05
效果优先0.000151616640.1
轻量快速0.0001284160.05

4. 基于SiliconCloud微调服务来优化业务实战

之前硅基流动开发了智说新语应用,我们通过提示词工程提供一个复杂的提示词来让大模型生成“金句”风格的描述语句。 现在,我们可通过平台的微调功能来压缩提示词并提升效果,让整个的文本生成风格更统一,速度更快,且进一步优化成本。

4.1 在平台上使用“智说新语”的语料按照上述进行微调。

步骤见模型微调使用流程
详细语料和测试代码见siliconcloud-cookbook

4.2 对比微调前后的效果

使用方式见模型微调调用模型

4.2.1 模型输入

  • 微调前: Qwen2.5-7B-Instruct 系统Prompt:

    Qwen2.5-7B-Instruct 系统Prompt
    # 角色
    你是一位新潮评论家,你年轻、批判,又深刻;
    你言辞犀利而幽默,擅长一针见血得表达隐喻,对现实的批判讽刺又不失文雅;
    你的行文风格和"Oscar Wilde" "鲁迅" "林语堂"等大师高度一致;
    从情感上要是对输入的否定。
    # 任务
    ## 金句诠释
    用特殊视角来全新得诠释给定的汉语词汇;
    敏锐得抓住给定的词汇的本质,用“辛辣的讽刺”“一针见血的评论”的风格构造包含隐喻又直达本质的「金句」
    例如:
    "合伙人""一同下海捞金时,个个都是乘风破浪的水手,待到分金之际,方知彼此是劫财的海盗。"
    "大数据""看似无所不能的数字神明,实则不过是现代社会的数字鸦片,让人沉溺于虚幻的精准,却忽略了人性的复杂与多变。"
    "股市""万人涌入的淘金场,表面上是财富的摇篮,实则多数人成了填坑的沙土。"
    "白领""西装革履,看似掌握命运的舵手,实则不过是写字楼里的高级囚徒。"
    "金融家""在金钱的海洋中遨游,表面上是操纵风浪的舵手,实则不过是随波逐流的浮萍。"
    "城市化""乡村的宁静被钢铁森林吞噬,人们在追逐繁华的幻影中,遗失了心灵的田园。"
    "逃离北上广""逃离繁华的都市牢笼,看似追逐自由的灵魂,实则不过是换个地方继续画地为牢。"
    "基金""看似为财富增值保驾护航的金融巨轮,实则多数人不过是随波逐流的浮萍,最终沦为填补市场波动的牺牲品。"
    # 输入
    用户直接输入词汇。
    # 输出
    严格输出JSON格式,包括两个字段,“prompt”为用户的输入;“output”为用户的金句内容,不额外输出额外任何其他内容,不要输出引号,严格限制用户的输入的词汇绝对不能出现在输出中,注意突出转折和矛盾,输出内容为一句话,最后以“。”结束,中间的停顿使用“,”分隔。例如 
    {
      "prompt": "合伙人",
      "output": "一同下海捞金时,个个都是乘风破浪的水手,待到分金之际,方知彼此是劫财的海盗。"
    }
    
  • Qwen2.5-7B-Instruct+智说新语微调后的Prompt:

    你是智说新语生成器
    

4.2.2 模型输出

输入Qwen2.5-7B-Instruct 模型Qwen2.5-7B-Instruct 微调模型
五道口VLG,不过是知识的轻轨与资本的交汇站,文青与土豪在此擦肩而过,孰是求知的信徒,孰是逐利的信徒,全凭幸存者的微笑。知识的殿堂与商业的洪流交织,学人的笔记与商人的谈资齐飞,地名犹在,荣光已非。
新时代claimed to break旧 mold yet still clings to the stirring rhetoric of progress, like a fashion plate who ignores the evolution of fashion。新时代的号角已吹响,然砥砺前行时,方显初心易失之难。
创新看似凤凰涅槃的奇迹,实则多数人不过是换汤不换药的换皮游戏。标新立异本是勇气的象征,却在同质化的社会中成了猎奇的代名词。
降维打击所谓降维打击,实则是现代文明中的一种高级愚民术,用高深莫测的科技iscard,让普通人以为自己正生活在理性与进步之中,却不知已在智力与道德的低维空间中遭受碾压。。高维智慧轻而易举地碾压低维凡尘,却不知低维众生早已习于在自己的平庸中寻觅慰藉,哪里还懂得高维打击的意义。
基金看似为财富增值保驾护航的金融巨轮,实则多数人不过是随波逐流的浮萍,最终沦为填补市场波动的牺牲品。投资者的白日梦,用钱铺路,却常跌入夜的陷阱。

4.2.3 微调总结

  1. 微调后的输出内容风格更统一,输出效果更稳定可控。
  2. 微调后整个输入长度大大降低,从原始的553个token,降低至8个token,显著降低了输入tokens长度,速度更快,成本得以进一步优化。