九江市网站建设_网站建设公司_H5网站_seo优化
2026/1/22 9:46:40 网站建设 项目流程

新手入门首选:Qwen3-1.7B微调教程一步到位

1. 引言:为什么选择 Qwen3-1.7B 做微调?

如果你是大模型微调的新手,想找一个参数适中、资源友好、效果不错的起点,那Qwen3-1.7B绝对是个理想选择。

它来自阿里巴巴通义千问系列,是2025年4月开源的新一代语言模型之一。虽然只有1.7B参数,但性能表现远超同量级模型,尤其在中文理解与生成任务上表现出色。更重要的是——显存要求低,用一张10G以上的消费级显卡就能跑通LoRA微调,非常适合个人开发者和学生党练手。

本文将带你从零开始,完成一次完整的微调流程:
数据准备 → 模型加载 → LoRA高效微调 → 推理测试 → 添加记忆功能

全程使用免费算力平台 + 开源工具链,无需任何付费资源,小白也能轻松上手。


2. 环境准备与镜像启动

2.1 启动 Qwen3-1.7B 镜像

我们使用的环境是 CSDN 提供的 AI 镜像服务,已预装好transformerspeftdatasets等常用库,省去繁琐配置。

操作步骤如下:

  1. 进入 CSDN星图镜像广场 搜索Qwen3-1.7B
  2. 点击“启动实例”按钮,系统会自动分配GPU资源
  3. 实例启动后,点击“JupyterLab”进入开发环境

注意:首次使用建议选择 A10 或 T4 显卡(至少16G显存),确保训练过程不爆显存。

2.2 测试模型是否可调用

打开 Jupyter Notebook,运行以下代码验证模型服务正常:

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)

如果能看到类似“我是通义千问系列中的Qwen3-1.7B模型”的回复,说明环境就绪!


3. 数据准备:构建医学问答数据集

我们要让 Qwen3 学会像 DeepSeek R1 那样进行“先思考再回答”的推理式输出,因此需要准备带有think(思考过程)+ answer(最终答案)结构的数据。

3.1 下载并加载数据集

这里我们使用魔搭社区提供的delicate_medical_r1_data医疗对话数据集:

from modelscope.msdatasets import MsDataset dataset = MsDataset.load('krisfu/delicate_medical_r1_data')

该数据集包含2000+条医学领域对话样本,字段包括:

字段名含义说明
instruction任务指令
question用户提问
think模型思考过程(用于训练思维链能力)
answer最终回答内容
metrics质量评分

3.2 数据预处理:格式化输入输出

我们需要把原始数据转换成适合 SFT(监督微调)训练的格式。目标是让模型学会根据question输出think + answer的组合。

构造 prompt 模板如下:

你是一个专业的医疗助手,请按照以下格式回答问题: 思考过程: <此处为think> 回答: <此处为answer>

完整数据处理代码:

import json def process_sample(example): prompt = f"你是一个专业的医疗助手,请回答以下问题:\n\n问题:{example['question']}\n\n" completion = f"思考过程:\n{example['think']}\n\n回答:\n{example['answer']}" return {"text": prompt + completion} # 处理全量数据 train_data = [process_sample(ex) for ex in dataset["train"]] val_data = [process_sample(ex) for ex in dataset["validation"]] # 保存为jsonl文件 with open("train.jsonl", "w", encoding="utf-8") as f: for item in train_data: f.write(json.dumps(item, ensure_ascii=False) + "\n") with open("val.jsonl", "w", encoding="utf-8") as f: for item in val_data: f.write(json.dumps(item, ensure_ascii=False) + "\n") print("The dataset has been split successfully.")

执行完成后,你会得到两个文件:train.jsonlval.jsonl,可用于后续训练。


4. 配置 SwanLab 训练监控工具

训练过程中,我们需要实时查看 loss、learning rate、step 等指标变化。推荐使用轻量级可视化工具SwanLab

4.1 安装 SwanLab

pip install swanlab -i https://mirrors.cernet.edu.cn/pypi/web/simple

国内源安装更快,避免网络超时。

4.2 登录账号

前往 SwanLab官网 注册账号,获取 API Key。

然后在终端执行:

swanlab login

粘贴你的 API Key 即可完成登录,之后无需重复操作。

4.3 初始化实验记录

在训练脚本中加入以下代码:

import swanlab swanlab.init( project="qwen3-medical-finetune", config={ "model": "Qwen3-1.7B", "epochs": 3, "batch_size": 4, "learning_rate": 2e-5, "max_length": 512 }, description="使用LoRA对Qwen3-1.7B进行医学领域微调" )

这样就可以在网页端看到所有训练日志和图表了。


5. 加载 Qwen3-1.7B 模型

接下来我们将通过 ModelScope 下载模型,并用 HuggingFace Transformers 加载。

from transformers import AutoTokenizer, AutoModelForCausalLM import torch model_name = "qwen/Qwen3-1.7B" # 实际路径以modelscope为准 tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True )

提示:若出现 OOM 错误,可尝试添加low_cpu_mem_usage=True或改用load_in_4bit=True进行量化加载。


6. 全参数微调(可选)

理论上,全参微调效果最好,但对显存要求极高。Qwen3-1.7B 全参微调约需32GB显存,普通用户难以承受。

参考训练代码片段:

from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./qwen3-full-ft", per_device_train_batch_size=2, gradient_accumulation_steps=8, num_train_epochs=3, learning_rate=1e-5, fp16=True, logging_steps=10, save_steps=100, evaluation_strategy="steps", eval_steps=50, report_to="swanlab" ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, tokenizer=tokenizer ) trainer.train()

不建议在低于24G显存的设备上尝试此方式。


7. 参数高效微调:使用 LoRA

更现实的选择是LoRA(Low-Rank Adaptation),它只训练少量新增参数,大幅降低显存消耗(仅需 ~10G)。

7.1 安装 PEFT 工具包

pip install peft

7.2 构建 LoRA 模型

from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=64, # rank lora_alpha=16, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_dropout=0.1, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # 查看可训练参数比例

输出示例:

trainable params: 8,388,608 || all params: 1,700,000,000 || trainable%: 0.49%

仅训练不到0.5%的参数,却能达到接近全参微调的效果!

7.3 开始 LoRA 微调

复用上面的Trainer设置,只需替换模型即可:

trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, tokenizer=tokenizer, callbacks=[swanlab_callback] # 自动对接SwanLab ) trainer.train()

训练过程中可在 SwanLab 页面查看 loss 曲线、学习率变化等信息。


8. 推理测试:流式输出效果

训练完成后,我们可以加载微调后的模型进行推理测试。

from peft import PeftModel # 加载LoRA权重 model = PeftModel.from_pretrained(model, "./output/checkpoint-500") def predict_stream(question): prompt = f"你是一个专业的医疗助手,请回答以下问题:\n\n问题:{question}\n\n思考过程:\n" inputs = tokenizer(prompt, return_tensors="pt").to("cuda") stream_output = "" for token in model.generate(**inputs, max_new_tokens=512, streamer=None): text = tokenizer.decode(token, skip_special_tokens=True) stream_output += text print(text, end="", flush=True) return stream_output

测试示例:

predict_stream("头痛有哪些常见原因?该怎么用药?")

预期输出结构:

思考过程: 嗯,用户问的是头痛的常见原因有哪些,以及如何根据不同的原因选择合适的药物。首先,我需要回忆一下常见的头痛类型,比如紧张性头痛、偏头痛、丛集性头痛…… 回答: 头痛的常见原因主要包括紧张性头痛、偏头痛、丛集性头痛等。针对不同类型,治疗方法也不同……

9. 添加简单记忆功能

为了让模型具备多轮对话能力,我们可以维护一个messages列表来保存历史记录。

9.1 实现思路

  1. 创建全局messages列表,持续记录对话
  2. 每次用户提问时,将"role": "user"消息追加进去
  3. 模型回复后,将"role": "assistant"消息也追加进去
  4. 下次推理时传入完整上下文

9.2 代码实现

messages = [] def chat(question): global messages # 添加用户消息 messages.append({"role": "user", "content": question}) # 构造输入 full_prompt = "\n".join([f"{m['role']}:{m['content']}" for m in messages]) full_prompt += "\nassistant:" inputs = tokenizer(full_prompt, return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=512) response = tokenizer.decode(outputs[0], skip_special_tokens=True) # 提取纯回答部分 answer = response[len(full_prompt):] # 保存模型回复 messages.append({"role": "assistant", "content": answer}) return answer

现在你可以连续提问,模型会记住之前的对话内容,实现基础的记忆功能。


10. 总结

10.1 我们完成了什么?

本文带你完整走完了一次Qwen3-1.7B 的微调全流程

  • 在免费平台上启动镜像并调用模型
  • 准备医疗领域数据集,构建思维链训练样本
  • 使用 SwanLab 监控训练过程
  • 成功加载 Qwen3-1.7B 并进行 LoRA 高效微调
  • 实现流式推理与多轮对话记忆功能

整个过程无需高端硬件,也不依赖复杂部署,真正做到了“一步到位”。

10.2 给初学者的建议

  • 如果你是第一次做微调,强烈建议从LoRA入手,成本低、见效快
  • 数据质量比数量更重要,精心设计 prompt 格式能显著提升效果
  • 善用可视化工具(如 SwanLab),及时发现问题
  • 多尝试不同场景的数据(教育、客服、法律等),积累实战经验

下一步你可以尝试:

  • 将模型导出为 ONNX 或 GGUF 格式用于本地部署
  • 结合 LangChain 构建智能医疗问答应用
  • 尝试更大的 Qwen3 版本(如 7B、14B)做全参微调

大模型时代已经到来,掌握微调技术就是掌握了定制AI的能力。现在就开始动手吧!


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询