一、 环境准备
既然手头没有GPU,也没有能用的设备,那就得想办法白嫖其它服务了。本文使用两个工具:Colab 和 Unsloth。
1、 Colab
Colab 是一款由谷歌推出的基于云端的编程环境。它具备诸多实用功能与显著优势。
在硬件资源方面,Colab 能为用户免费提供 GPU,这使得它在进行模型微调等任务时表现出色。尽管免费 GPU 的使用时长有一定限制,但一般来说,对于大部分模型微调需求而言,这些免费资源已经绰绰有余。
从使用便捷性来看,Colab 搭载了基于网页的 Jupyter Notebook 环境。用户无需经历繁琐的软件安装过程,只需通过浏览器就能轻松开启编程之旅,极大地降低了上手难度。
此外,Colab 拥有丰富的社区资源。在其平台上,用户可以轻松找到大量现成的代码示例以及详尽的教程,这对于新手来说无疑是一大福音,能够帮助他们迅速掌握相关知识和技能,快速进入编程状态。
2 、 unsloth
Unsloth 是一款开源工具,专注于加速大型语言模型(LLMs)的微调过程,具备诸多实用功能与显著优势。
在微调效率方面,Unsloth 的表现极为出色,其微调速度相较于传统方法能够提升 2 至 5 倍,并且内存占用可降低 50% 到 80%。这就意味着,借助 Unsloth,你可以利用更少的资源来完成微调任务,极大地提高了工作效率。
对于硬件设备的要求,Unsloth 也十分友好。它对显存的需求较低,即使是消费级 GPU,例如 RTX 3090,也能够轻松运行 Unsloth。以训练 1.5B 参数的模型为例,仅需 7GB 显存就可以满足要求。
在模型适配与量化技术方面,Unsloth 同样表现出色。它支持多种主流模型,包括 Llama、Mistral、Phi、Gemma 等。并且,通过采用动态 4 - bit 量化技术,Unsloth 能够显著降低显存占用,同时几乎不会损失模型精度,这在很大程度上提升了模型的实用性和适用范围。
此外,Unsloth 还具有开源与免费的优势。它提供了免费的 Colab Notebook,用户只需添加相应的数据集并运行代码,即可轻松完成微调工作。
总的来说,Unsloth 通过运用特定的优化技术,使得我们能够在配置相对较低的硬件设备资源环境下,更加高效地进行模型微调。在 Unsloth 出现之前,模型微调的成本居高不下,对于普通人来说几乎难以企及。通常情况下,微调一次模型不仅需要耗费数万元的资金,还需要花费数天的时间才能完成。
3 、进入环境,准备实战!
(1)新建一个 Colab 页面,点击下方链接即可。(可能需要注册或者使用google账号登陆一下)
https://colab.research.google.com/#create=true
(2)点击菜单栏的 “代码执行程序”,选择下拉菜单中的 “更改运行时类型”
(3)选择 T4 GPU,这是 NVIDIA 推出的一款高性能 GPU,特别适合深度学习任务
好了,环境准备完毕,下面开始实战!
二、 安装依赖
首先安装一些 Python 包和库,这些库是运行 AI 模型微调任务所必需的工具。
-
unsloth 是一个用于微调大型语言模型(LLM)的工具,可以让模型运行更快、占用更少内存。
-
bitsandbytes 是一个用于量化和优化模型的库,可以帮助减少模型占用的内存。
-
unsloth_zoo 可能包含了一些预训练模型或其他工具,方便我们使用。
pip install unsloth
pip install bitsandbytes unsloth_zoo
三、 加载预训练模型
接下来,加载一个预训练模型,咱们在这个模型上进行微调。
-
from_pretrained
函数用来加载模型。 -
model_name
参数指定这个模型的名称,我这里用的是unsloth/DeepSeek-R1-Distill-Qwen-7B
。
from unsloth import FastLanguageModel # 导入FastLanguageModel类,用来加载和使用模型
import torch # 导入torch工具,用于处理模型的数学运算
max_seq_length = 2048 # 设置模型处理文本的最大长度,相当于给模型设置一个“最大容量”
dtype = None # 设置数据类型,让模型自动选择最适合的精度
load_in_4bit = True # 使用4位量化来节省内存,就像把大箱子压缩成小箱子
# 加载预训练模型,并获取tokenizer工具
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/DeepSeek-R1-Distill-Qwen-7B", # 指定要加载的模型名称
max_seq_length=max_seq_length, # 使用前面设置的最大长度
dtype=dtype, # 使用前面设置的数据类型
load_in_4bit=load_in_4bit, # 使用4位量化
# token="hf...", # 如果需要访问授权模型,可以在这里填入密钥
)
在Colab中运行,可以看到以下的模型加载日志:
四、微调前测试
在微调前,我们先来看下没有微调时模型的表现:这与我们平时调用模型API时的流程一样
(1)给一个Prompt
(2)调用 model.generate
生成结果
不过,这里也有几个不同的步骤:
(1)for_inference
准备模型进行推理
(2)inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda")
对prompt进行编码,并放到GPU中
(3)tokenizer.batch_decode(outputs)
大模型输出结果解码
prompt_style = """以下是描述任务的指令,以及提供进一步上下文的输入。
请写出一个适当完成请求的回答。
在回答之前,请仔细思考问题,并创建一个逻辑连贯的思考过程,以确保回答准确无误。
### 指令:
你是一位精通卜卦、星象和运势预测的算命大师。
请回答以下算命问题。
### 问题:
{}
### 回答:
<think>{}</think>"""
# 定义提示风格的字符串模板,用于格式化问题
question = "1993年七月初九巳时生人,女,想了解爱情运势"
# 定义具体的算命问题
FastLanguageModel.for_inference(model)
# 准备模型以进行推理
inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda")
# 使用 tokenizer 对格式化后的问题进行编码,并移动到 GPU
outputs = model.generate(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=1200,
use_cache=True,
)
# 使用模型生成回答
response = tokenizer.batch_decode(outputs)
# 解码模型生成的输出为可读文本
print(response[0])
# 打印生成的回答部分
输出结果如下:
五、 加载数据集
在开始微调之前,还有关键的一步,就是加载数据集,并将数据集转换成微调所需的格式。
1、 加载数据集
-
使用
load_dataset
函数可加载数据集 -
数据集名称:
Conard/fortune-telling
-
使用数据集的前100条数据作为微调数据
split="train[0:100]"
# 定义一个用于格式化提示的多行字符串模板
train_prompt_style = """以下是描述任务的指令,以及提供进一步上下文的输入。
请写出一个适当完成请求的回答。
在回答之前,请仔细思考问题,并创建一个逻辑连贯的思考过程,以确保回答准确无误。
### 指令:
你是一位精通八字算命、紫微斗数、风水、易经卦象、塔罗牌占卜、星象、面相手相和运势预测等方面的算命大师。 请回答以下算命问题。
### 问题:
{}
### 回答:
<思考>
{}
</思考>
{}"""
# 定义结束标记 (EOS_TOKEN),用于指示文本的结束
EOS_TOKEN = tokenizer.eos_token # 必须添加结束标记
# 导入数据集加载函数
from datasets import load_dataset
# 加载指定的数据集,选择中文语言和训练集的前500条记录
dataset = load_dataset("Conard/fortune-telling", 'default', split="train[0:100]", trust_remote_code=True)
# 打印数据集的列名,查看数据集中有哪些字段
print(dataset.column_names)
加载数据集的过程日志:
2 、格式化数据集
这一步是构造微调用的Prompt,将数据集中对应的字段填入train_prompt_style中。
# 定义一个函数,用于格式化数据集中的每条记录
def formatting_prompts_func(examples):
# 从数据集中提取问题、复杂思考过程和回答
inputs = examples["Question"]
cots = examples["Complex_CoT"]
outputs = examples["Response"]
texts = [] # 用于存储格式化后的文本
# 遍历每个问题、思考过程和回答,进行格式化
for input, cot, output in zip(inputs, cots, outputs):
# 使用字符串模板插入数据,并加上结束标记
text = train_prompt_style.format(input, cot, output) + EOS_TOKEN
texts.append(text) # 将格式化后的文本添加到列表中
return {
"text": texts, # 返回包含所有格式化文本的字典
}
dataset = dataset.map(formatting_prompts_func, batched=True)
dataset["text"][0]
以下是格式化完之后的 Prompt 数据示例。
六、 执行微调
环境、数据都准备好了,接下来终于可以开始微调了。微调前加载的代码如下:
FastLanguageModel.for_training(model)
model = FastLanguageModel.get_peft_model(
model, # 传入已经加载好的预训练模型
r=16, # 设置 LoRA 的秩,决定添加的可训练参数数量
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", # 指定模型中需要微调的关键模块
"gate_proj", "up_proj", "down_proj"],
lora_alpha=16, # 设置 LoRA 的超参数,影响可训练参数的训练方式
lora_dropout=0, # 设置防止过拟合的参数,这里设置为 0 表示不丢弃任何参数
bias="none", # 设置是否添加偏置项,这里设置为 "none" 表示不添加
use_gradient_checkpointing="unsloth", # 使用优化技术节省显存并支持更大的批量大小
random_state=3407, # 设置随机种子,确保每次运行代码时模型的初始化方式相同
# use_rsloora=False, # 设置是否使用 Rank Stabilized LoRA 技术,这里设置为 False 表示不使用
loftq_config=None, # 设置是否使用 LoftQ 技术,这里设置为 None 表示不使用
)
from trl import SFTTrainer # 导入 SFTTrainer,用于监督式微调
from transformers import TrainingArguments # 导入 TrainingArguments,用于设置训练参数
from unsloth import is_bfloat16_supported # 导入函数,检查是否支持 bfloat16 数据格式
trainer = SFTTrainer(
model=model, # 传入要微调的模型
tokenizer=tokenizer, # 传入 tokenizer,用于处理文本数据
train_dataset=dataset, # 传入训练数据集
dataset_text_field="text", # 指定数据集中文本字段的名称
max_seq_length=max_seq_length, # 设置最大序列长度
dataset_num_proc=2, # 设置数据处理的并行进程数
packing=False, # 是否启用打包功能(这里设置为 False,打包可以让训练更快,但可能影响效果)
args=TrainingArguments(
per_device_train_batch_size=2, # 每个设备(如 GPU)上的批量大小
gradient_accumulation_steps=4, # 梯度累积步数,用于模拟大批次训练
warmup_steps=5, # 预热步数,训练开始时学习率逐渐增加的步数
max_steps=75, # 最大训练步数
learning_rate=2e-4, # 学习率,模型学习新知识的速度
fp16=not is_bfloat16_supported(), # 是否使用 fp16 格式加速训练(如果环境不支持 bfloat16)
bf16=is_bfloat16_supported(), # 是否使用 bfloat16 格式加速训练(如果环境支持)
logging_steps=1, # 每隔多少步记录一次训练日志
optim="adamw_8bit", # 使用的优化器,用于调整模型参数
weight_decay=0.01, # 权重衰减,防止模型过拟合
lr_scheduler_type="linear", # 学习率调度器类型,控制学习率的变化方式
seed=3407, # 随机种子,确保训练结果可复现
output_dir="outputs", # 训练结果保存的目录
report_to="none", # 是否将训练结果报告到外部工具(如 WandB),这里设置为不报告
),
)
微调前准备过程的日志:
最后,执行下面一句代码,开始微调。
trainer_stats = trainer.train()
微调过程的日志打印,100条数据,整个过程耗时30分钟左右。
七、 微调后测试
模型经过了微调,下面我们再用之前的Prompt测试一下微调是否有效果。
print(question) # 打印前面的问题
# 将模型切换到推理模式,准备回答问题
FastLanguageModel.for_inference(model)
# 将问题转换成模型能理解的格式,并发送到 GPU 上
inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda")
# 让模型根据问题生成回答,最多生成 1200 个新词
outputs = model.generate(
input_ids=inputs.input_ids, # 输入的数字序列
attention_mask=inputs.attention_mask, # 注意力遮罩,帮助模型理解哪些部分重要
max_new_tokens=1200, # 最多生成 1200 个新词
use_cache=True, # 使用缓存加速生成
)
# 将生成的回答从数字转换回文字
response = tokenizer.batch_decode(outputs)
# 打印回答
print(response[0])
运行结果如下:
先不管它回答的对不对,你就说,经过微调后,它的回答是不是显得专业了很多?
八、 微调模型的保存
1、 保存前的准备
(1)需要首先申请一个hugging face的token
https://huggingface.co/settings/tokens
(2)创建一个 Write 的token
(3)复制这个token,填到colab的密钥中,密钥的名称填:HUGGINGFACE_TOKEN
2 、将微调模型保存为gguf格式
GGUF 是一种高效的格式,它支持多种量化方法(如 4 位、8 位、16 位量化),可以显著减小模型文件的大小,便于存储和传输,适合在资源受限的设备上运行模型,例如在 Ollama 上部署时。量化后的模型在资源受限的设备上运行更快,适合边缘设备或低功耗场景。
# 导入 Google Colab 的 userdata 模块,用于访问用户数据
from google.colab import userdata
# 从 Google Colab 用户数据中获取 Hugging Face 的 API 令牌
HUGGINGFACE_TOKEN = userdata.get('HUGGINGFACE_TOKEN')
# 将模型保存为 8 位量化格式 (q8_0)
# 这种格式文件小且运行快,适合部署到资源受限的设备
if True: model.save_pretrained_gguf("model", tokenizer,)
# 将模型保存为 16 位量化格式 (f16)
# 16 位量化精度更高,但文件稍大
if False: model.save_pretrained_gguf("model_f16", tokenizer, quantization_method = "f16")
# 将模型保存为 4 位量化格式 (q4_k_m)
# 4 位量化文件最小,但精度可能稍低
if False: model.save_pretrained_gguf("model", tokenizer, quantization_method = "q4_k_m")
九、 微调模型上传到 HuggingFace
注意将模型仓库的名称修改为 自己的「用户名+模型名」。
# 导入 Hugging Face Hub 的 create_repo 函数,用于创建一个新的模型仓库
from huggingface_hub import create_repo
# 在 Hugging Face hub 上创建一个新的模型仓库
create_repo("你的Huggingface用户名/微调后模型的名字(自己定)", token=HUGGINGFACE_TOKEN, exist_ok=True)
# 将模型和分词器上传到 Hugging Face Hub 上的仓库
model.push_to_hub_gguf("你的Huggingface用户名/微调后模型的名字(自己定)", tokenizer, token=HUGGINGFACE_TOKEN)
但如果你想知道这个工具为什么能“听懂人话”、写出代码 甚至预测市场趋势——答案就藏在大模型技术里!
❗️为什么你必须了解大模型?
1️⃣ 薪资爆炸:应届大模型工程师年薪40万起步,懂“Prompt调教”的带货主播收入翻3倍
2️⃣ 行业重构:金融、医疗、教育正在被AI重塑,不用大模型的公司3年内必淘汰
3️⃣ 零门槛上车:90%的进阶技巧不需写代码!会说话就能指挥AI
(附深度求索BOSS招聘信息)
⚠️警惕:当同事用DeepSeek 3小时干完你3天的工作时,淘汰倒计时就开始了。
一、大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K(数据来源:BOSS直聘报告)
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
二、如何学习大模型 AI ?
🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。