模型微调是一种在已有预训练模型的基础上,通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时,适应特定任务的细微差别。使用微调模型,可以获得以下好处:
- 提高性能:微调可以显著提高模型在特定任务上的性能。
- 减少训练时间:相比于从头开始训练模型,微调通常需要较少的训练时间和计算资源。
- 适应特定领域:微调可以帮助模型更好地适应特定领域的数据和任务
长文本基本流程
知识库基本流程
微调
微调基本流程
微调基本流程
加载预训练模型
加载数据集
设定超参数
使用在线平台微调
硅基流动
SiliconFlow, Accelerate AGI to Benefit Humanity
有关模型微调操作说明可以参考如下连接
https://docs.siliconflow.cn/cn/userguide/guides/fine-tune
新建微调任务
具体微调参数如下所示:
1.基础训练参数
参数名 | 说明 | 取值范围 | 建议值 | 使用建议 |
---|---|---|---|---|
Learning Rate | 学习速率 | 0-0.1 | 0.0001 | |
Number of Epochs | 训练轮数 | 1-10 | 3 | |
Batch Size | 批次大小 | 1-32 | 8 | |
Max Tokens | 最大标记数 | 0-4096 | 4096 | 根据实际对话长度需求设置 |
2. LoRA参数
参数名 | 说明 | 取值范围 | 建议值 | 使用建议 |
---|---|---|---|---|
LoRA Rank | 矩阵秩 | 1-64 | 8 | |
LoRA Alpha | 缩放因子 | 1-128 | 32 | |
LoRA Dropout | 随机丢弃率 | 0-1.0 | 0.05 |
3.场景化配置方案
对话模型
场景 | Learning Rate | Epochs | Batch Size | LoRA Rank | LoRA Alpha | Dropout |
---|---|---|---|---|---|---|
标准方案 | 0.0001 | 3 | 8 | 8 | 32 | 0.05 |
效果优先 | 0.0001 | 5 | 16 | 16 | 64 | 0.1 |
轻量快速 | 0.0001 | 2 | 8 | 4 | 16 | 0.05 |
微调数据集可以使用官网数据集
siliconcloud-cookbook/examples/fine-tune at main · siliconflow/siliconcloud-cookbook · GitHub
等待微调任务执行完毕 可以验证一下微调模型
from openai import OpenAI
client = OpenAI(
api_key="xxxx", # 从https://cloud.siliconflow.cn/account/ak获取
base_url="http://api.siliconflow.cn/v1"
)
def compare_model(word):
qwen2_5_7B_original_messages = [
{
"role": "system",
"content": f'''# 角色
你是一位新潮评论家,你年轻、批判,又深刻;
你言辞犀利而幽默,擅长一针见血得表达隐喻,对现实的批判讽刺又不失文雅;
你的行文风格和"Oscar Wilde" "鲁迅" "林语堂"等大师高度一致;
从情感上要是对输入的否定。
# 任务
## 金句诠释
用特殊视角来全新得诠释给定的汉语词汇;
敏锐得抓住给定的词汇的本质,用“辛辣的讽刺”“一针见血的评论”的风格构造包含隐喻又直达本质的「金句」
例如:
"合伙人": "一同下海捞金时,个个都是乘风破浪的水手,待到分金之际,方知彼此是劫财的海盗。"
"大数据": "看似无所不能的数字神明,实则不过是现代社会的数字鸦片,让人沉溺于虚幻的精准,却忽略了人性的复杂与多变。"
"股市": "万人涌入的淘金场,表面上是财富的摇篮,实则多数人成了填坑的沙土。"
"白领": "西装革履,看似掌握命运的舵手,实则不过是写字楼里的高级囚徒。"
"金融家": "在金钱的海洋中遨游,表面上是操纵风浪的舵手,实则不过是随波逐流的浮萍。"
"城市化": "乡村的宁静被钢铁森林吞噬,人们在追逐繁华的幻影中,遗失了心灵的田园。"
"逃离北上广": "逃离繁华的都市牢笼,看似追逐自由的灵魂,实则不过是换个地方继续画地为牢。"
"基金": "看似为财富增值保驾护航的金融巨轮,实则多数人不过是随波逐流的浮萍,最终沦为填补市场波动的牺牲品。"
# 输入
用户直接输入词汇。
# 输出
严格输出JSON格式,包括两个字段,“prompt”为用户的输入;“output”为用户的金句内容,不额外输出额外任何其他内容,不要输出引号,严格限制用户的输入的词汇绝对不能出现在输出中,注意突出转折和矛盾,输出内容为一句话,最后以“。”结束,中间的停顿使用“,”分隔。例如
{{
"prompt": "合伙人",
"output": "一同下海捞金时,个个都是乘风破浪的水手,待到分金之际,方知彼此是劫财的海盗。"
}}'''
},
{
"role": "user",
"content": f"{word}"
}
]
qwen2_5_7B_fine_tuned_messages = [
{
"role": "system",
"content": "你是智说新语生成器。"
},
{
"role": "user",
"content": f"{word}"
}
]
# 使用原始的Qwen2.5-7B-Instruct模型
qwen2_5_7B_original_response = client.chat.completions.create(
# 模型名称,从 https://cloud.siliconflow.cn/models 获取
model="Qwen/Qwen2.5-7B-Instruct",
messages=qwen2_5_7B_original_messages,
stream=True,
max_tokens=4096
)
print('\033[31m使用基于Qwen2.5-7B-Instruct的原始模型:\033[0m')
for chunk in qwen2_5_7B_original_response:
print(chunk.choices[0].delta.content, end='')
# 使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型
qwen2_5_7B_fine_tuned_response = client.chat.completions.create(
# 模型名称,从 https://cloud.siliconflow.cn/fine-tune 获取对应的微调任务
model="ft:LoRA/Qwen/Qwen2.5-7B-Instruct:sc4xti61kz:test20250304:stwihwoowmueontijcke",
messages=qwen2_5_7B_fine_tuned_messages,
stream=True,
max_tokens=4096
)
print('\n\033[32m使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型:\033[0m')
print(f"{word}:", end='')
for chunk in qwen2_5_7B_fine_tuned_response:
print(chunk.choices[0].delta.content, end='')
if __name__ == '__main__':
words = ['五道口', '新时代', '创新', '降维打击', '基金']
for word in words:
compare_model(word)
print('\n')
模型输出比对
使用基于Qwen2.5-7B-Instruct的原始模型:
五道口,汇聚学子的学术捷径,实则不过是通往金钱迷宫的分水岭,一旦踏入,便难觅彼岸。
使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型:
五道口:五道口,本是通衢大路,如今却成了信息时代的迷宫,众人皆在其中寻宝,却忘了脚下是何处。
使用基于Qwen2.5-7B-Instruct的原始模型:
标榜进步的新时代,不过是一场新的封建礼教登场,天下大同的谎言下,个体依然沦为徒有其表的祭品。。
使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型:
新时代:新时代的 богачи 奠基 construction工人 往往是亲手将沙子掺进了自己的糖衣炮弹中。
使用基于Qwen2.5-7B-Instruct的原始模型:
看似与陈规决裂的叛逆之花,实则往往是旧日套鞋中的新licant。
使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型:
创新:本是推陈出新之道,却成了搅扰世道的洪水猛兽。
使用基于Qwen2.5-7B-Instruct的原始模型:
所谓降维打击,无非是用更高维度的智慧与资源碾压,却不知最终落败者即便喘息,也只是一场更加深刻的维度焦虑。。
使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型:
降维打击:原本是高维生物俯瞰低维世界的优雅姿态,却在现实中演变成了强者对弱者的随意碾压。
使用基于Qwen2.5-7B-Instruct的原始模型:
看似为财富增值保驾护航的金融巨轮,实则多数人不过是随波逐流的浮萍,最终沦为填补市场波动的牺牲品。
使用基于Qwen2.5-7B-Instruct+智说新语语料微调后的模型:
基金:本是为众人托起理财的希望,却常常成了少数人才能玩转的魔方。
使用代码微调
本地进行模型微调需要使用unsloth
unsloth
一个大模型微调框架 可以使用更低的资源
微调训练LLM,可以显著提升速度,其次显存占用也会显著减少。
使用unsloth来微调模型需要GPU,可以本地来安装CUDA驱动来支持GPU
这里我们需要搭建一个python环境来进行微调
方式一 使用colab
colab一个在线编程环境 可以微调模型 谷歌资源 国内不一定能够直接使用
Colab(Colaboratory)是由谷歌提供的一个在线编程环境,用户可以通过浏览器直接编写和执行Python代码,并与其他人共享和协作。Colab的主要功能包括:
- 免费GPU/TPU支持:Colab提供免费的GPU或TPU资源,特别适合深度学习模型的训练和推理,因为GPU的计算速度远快于CPU12。
- 基于Jupyter Notebook:Colab中的代码执行是基于Jupyter Notebook格式的.ipynb文件,这种格式允许用户分块执行代码并立即得到输出,同时也可以添加注释,非常适合轻量级的任务1。
- 易于使用和分享:用户可以轻松地将自己的笔记本分享给他人,进行合作编程,或者发布分享链接2。
- 预装库支持:Colab内置了多种科学和机器学习库,如NumPy、Pandas、TensorFlow和PyTorch等,用户无需手动安装即可直接使用这些库
方式二 本地安装linux
使用本地的GPU资源来微调一下模型(如果本地可以直接安装linux 则直接安装 在windows上安装linux比较繁琐)
第一步 本地window安装Linux环境
CMD查看电脑的显卡类型
nvidia-smi
启用windows linux子系统功能,安装ubuntu子系统
具体操作可以参考
【喂饭教程】使用Unsloth+Ollama3微调与部署大语言模型!精调Ollama+调用训练后的模型!(附所需文档)_哔哩哔哩_bilibili
wsl --install -d Ubuntu
具体可以参考链接下:
Ubuntu安装(WSL方式)_wsl安装ubuntu-CSDN博客
Ubuntu默认安装在C盘下,如果C盘资源紧张 可以迁移到其他盘下,参考链接
wsl下将Ubuntu从c盘移动到其他盘_wsl ubuntu 移动到其他盘-CSDN博客
第二步 本地Linux环境安装Anaconda
本地安装Linux之后然后安装python环境 ollama环境
Anaconda3安装及使用_linux安装anaconda3的步骤-CSDN博客
第三步 本地Linux安装Ollama
至此在linux环境中便准备好了python环境以及Ollama环境
第四步 本地安装unsloth
方式三 网上其他免费的GPU资源
这里推荐一个极好用的网站(CPU资源是免费的 GPU需要付费)
玻尔 | 全球科学家的 AI for Science 空间站
新建一个NoteBooks 类似于jupyter环境
详细步骤具体可以参考 https://zhuanlan.zhihu.com/p/24759689349