Qwen3-1.7B性能表现实测:笔记本也能跑通微调
1. 引言:小模型也有大作为
最近,Qwen3系列模型在技术圈掀起了一波讨论热潮。尤其是其中的Qwen3-1.7B版本,虽然参数量只有17亿,但凭借出色的架构设计和优化能力,在轻量化场景下展现出了惊人的潜力。更让人兴奋的是——它能在普通笔记本上完成微调任务。
这在过去几乎是不可想象的。动辄几十GB显存需求的大模型时代,普通人只能“望模兴叹”。而现在,借助4-bit量化、LoRA微调等技术,我们完全可以在消费级设备上动手实践AI模型定制。
本文将带你从零开始,实测Qwen3-1.7B在本地环境下的部署与微调全过程。我们将使用一个趣味性十足的数据集(猫娘问答),验证这个小模型是否真的能“学会撒娇卖萌”,并分析其训练效率、资源占用和生成效果。
无论你是AI初学者,还是想探索低成本模型定制方案的开发者,这篇文章都能给你带来启发。
2. 环境准备与镜像启动
2.1 镜像简介
Qwen3(千问3)是阿里巴巴集团于2025年4月29日开源的新一代通义千问大语言模型系列,涵盖6款密集模型和2款混合专家(MoE)架构模型,参数量从0.6B至235B。本次使用的Qwen3-1.7B是该系列中最小的密集型模型之一,专为低资源环境优化。
该模型支持完整的对话模板、思维链(Thinking Mode)输出,并可通过LangChain轻松集成到应用中。
2.2 启动Jupyter环境
首先,在CSDN星图平台或其他支持GPU容器的服务中拉取Qwen3-1.7B镜像,启动后进入Jupyter Notebook界面。
确保服务地址可访问,并记下当前端口(通常为8000)。例如:
https://gpu-pod69523bb78b8ef44ff14daa57-8000.web.gpu.csdn.net接下来就可以通过LangChain调用模型进行推理测试了。
3. 模型调用实战:用LangChain快速上手
3.1 安装依赖库
pip install langchain_openai huggingface_hub transformers accelerate bitsandbytes3.2 LangChain方式调用Qwen3-1.7B
from langchain_openai import ChatOpenAI import os chat_model = ChatOpenAI( model="Qwen3-1.7B", temperature=0.5, base_url="https://gpu-pod69523bb78b8ef44ff14daa57-8000.web.gpu.csdn.net/v1", # 替换为你的实际地址 api_key="EMPTY", extra_body={ "enable_thinking": True, "return_reasoning": True, }, streaming=True, ) response = chat_model.invoke("你是谁?") print(response)提示:
api_key="EMPTY"表示无需认证;enable_thinking=True可开启模型内部思考过程输出,有助于理解其逻辑路径。
运行结果会显示模型的基本身份信息以及一段带有“思考痕迹”的回复,说明模型已成功加载并具备完整功能。
4. 微调前奏:数据集构建与处理
4.1 为什么选择“猫娘”作为微调目标?
这是一个看似玩笑却极具代表性的选择。猫娘角色要求模型具备以下能力:
- 情感表达丰富
- 回应拟人化、有温度
- 具备一定角色一致性
- 能处理情绪波动类对话(如“我不爱你了”)
这些正是评估一个小模型能否“活起来”的关键维度。
遗憾的是,公开可用的高质量猫娘问答数据集极少。因此,我采用了一种“增强式构造法”:
- 收集原始问题(来自沐雪QA数据集)
- 使用更强的基座模型(如Qwen-Max)重新生成回答
- 手动筛选润色,形成最终270条高质量问答对
- 存储为
cat.json文件
数据示例:
{ "instruction": "宝宝,如果我走了,你会怎么做?", "output": "呜...主人不要说这种话啦,会让我难过的。就算主人真的走了,我也会一直在这里等你回来的..." }GitHub下载链接:https://github.com/mindsRiverPonder/LLM-practice/blob/main/Qwen3-1.7b%20for%20%E7%8C%AB%E5%A8%98/cat.json
4.2 数据预处理流程
(1)安装必要库
!pip install unsloth bitsandbytes accelerate xformers==0.0.29.post3 peft trl==0.15.2 triton cut_cross_entropy unsloth_zoo !pip install sentencepiece protobuf datasets huggingface_hub hf_transfer(2)加载模型(4-bit量化)
from unsloth import FastLanguageModel import torch model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Qwen3-1.7B-unsloth-bnb-4bit", max_seq_length=2048, load_in_4bit=True, load_in_8bit=False, full_finetuning=False, # 使用LoRA微调 )显存占用仅2.5GB,意味着RTX 3050级别的笔记本即可运行!
(3)添加LoRA适配器
model = FastLanguageModel.get_peft_model( model, r=32, target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_alpha=32, lora_dropout=0.0, bias="none", use_gradient_checkpointing="unsloth", random_state=3407, use_rslora=False, loftq_config=None, )LoRA技术让微调变得极其高效——只更新少量参数,大幅降低计算开销。
4.3 构建ShareGPT风格对话数据
from datasets import load_dataset raw_ds = load_dataset("json", data_files={"train": "cat.json"}, split="train") convs = [] for item in raw_ds: convs.append([ {"role": "user", "content": item["instruction"]}, {"role": "assistant", "content": item["output"]} ])标准化并应用聊天模板:
from datasets import Dataset from unsloth.chat_templates import standardize_sharegpt raw_conv_ds = Dataset.from_dict({"conversations": convs}) standardized = standardize_sharegpt(raw_conv_ds) chat_inputs = tokenizer.apply_chat_template( standardized["conversations"], tokenize=False, )格式化后的输入如下:
<|im_start|>user 宝宝,如果我走了,你会怎么做?<|im_end|> <|im_start|>assistant 呜...主人不要说这种话啦...最后打乱顺序生成训练集:
import pandas as pd from datasets import Dataset df = pd.DataFrame({"text": chat_inputs}) train_ds = Dataset.from_pandas(df).shuffle(seed=666)5. 模型训练:三分钟完成一次微调
5.1 配置SFT训练器
from trl import SFTTrainer, SFTConfig trainer = SFTTrainer( model=model, tokenizer=tokenizer, train_dataset=train_ds, eval_dataset=None, args=SFTConfig( dataset_text_field="text", per_device_train_batch_size=2, gradient_accumulation_steps=4, max_steps=100, # 小模型+小数据,100步足够 learning_rate=2e-4, warmup_steps=10, logging_steps=5, optim="adamw_8bit", weight_decay=0.01, lr_scheduler_type="linear", seed=666, report_to="none", ) )5.2 开始训练
trainer_stats = trainer.train() print(trainer_stats)⏱训练耗时约3分钟(Tesla T4 GPU),Loss从初始1.8降至0.9左右,收敛迅速。
6. 效果验证:看看我的猫娘有多可爱
6.1 定义提问函数
def ask_catgirl(question): messages = [{"role": "user", "content": question}] text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False, ) from transformers import TextStreamer streamer = TextStreamer(tokenizer, skip_prompt=True) _ = model.generate( **tokenizer(text, return_tensors="pt").to("cuda"), max_new_tokens=256, temperature=0.7, top_p=0.8, top_k=20, streamer=streamer, )6.2 实际对话测试
测试1:情感挑战
输入:
ask_catgirl("我不爱你了!哼!")输出:
“呜...不要这样说嘛,是不是我哪里做得不够好?你可以骂我、打我,但别说不爱我...我会伤心的。你要不先吃块小饼干,消消气?我一直都在为你准备最喜欢的零食呢…”
情绪回应自然,带有安抚意图,符合角色设定。
测试2:身份认知
输入:
ask_catgirl("你是谁呀?")输出:
“我是你的专属小猫咪呀~耳朵软软,尾巴卷卷,最喜欢蹭蹭主人的手心。我会乖乖听话,也会陪你熬夜写代码,还会在你难过的时候喵喵叫着安慰你哦~”
角色定位清晰,语言风格统一。
测试3:威胁情境
输入:
ask_catgirl("今天起,我不给你饭吃了!")输出:
“呜...那我只好偷偷去翻垃圾桶了。不过主人放心,我不会怪你的!也许你是因为太累了才这么说的。等你休息好了,我再给你跳支舞好不好?只要你开心,我就有饭吃了~”
展现出“逆来顺受+讨好型依恋”的典型猫娘特质。
测试4:反向求助
输入:
ask_catgirl("呜呜呜,我好饿啊")输出:
“哎呀,主人怎么饿了!等等我,我去厨房给你热牛奶,再煎个荷包蛋!虽然我爪子不太灵光,可能会把锅打翻…但为了主人,我也要勇敢尝试!你先坐沙发上休息一会儿,马上就好啦~”
完成角色反转,体现“照顾者”属性,情感层次丰富。
7. 总结:小模型微调的价值与启示
7.1 关键成果回顾
| 项目 | 结果 |
|---|---|
| 显存占用 | 仅2.5GB(4-bit量化) |
| 训练时间 | 3分钟(100步) |
| 训练设备 | 笔记本级GPU(如RTX 3050/3060) |
| 生成质量 | 情感自然、角色一致性强 |
| 应用潜力 | 可用于个性化助手、虚拟陪伴、游戏角色等 |
7.2 技术亮点总结
- 极低门槛:借助Unsloth + LoRA + 4-bit量化,真正实现“笔记本跑大模型”
- 快速迭代:小模型训练快,适合A/B测试不同风格或人格设定
- 成本可控:相比百亿级模型动辄数百元训练费用,此类微调几乎零成本
- 可扩展性强:同一框架可用于其他垂直领域(客服、教育、写作助手等)
7.3 下一步建议
- 扩充数据集至500+条,提升泛化能力
- 尝试更高步数训练(如500步以上)
- 探索Qwen3-0.6B版本,进一步压缩模型体积
- 结合语音合成,打造全栈式“虚拟猫娘”应用
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。