2026/2/12 21:32:04
网站建设
项目流程
vuejs做视频网站,a00000网站建设丽丽,不知怎么入门,网页设计作业个人网站Qwen3-1.7B真实体验分享#xff0c;微调过程比想象中简单
1. 引言#xff1a;为什么选择Qwen3-1.7B做微调#xff1f;
最近在尝试用大模型做金融领域的问答任务时#xff0c;我一直在寻找一个轻量但足够聪明的模型。参数太大跑不动#xff0c;太小又答不准。直到我试了阿…Qwen3-1.7B真实体验分享微调过程比想象中简单1. 引言为什么选择Qwen3-1.7B做微调最近在尝试用大模型做金融领域的问答任务时我一直在寻找一个轻量但足够聪明的模型。参数太大跑不动太小又答不准。直到我试了阿里巴巴开源的Qwen3-1.7B发现它不仅推理速度快、显存占用低而且微调起来出乎意料地简单。很多人一听“微调”就觉得门槛高要调参、要优化、要一堆GPU资源。但这次我用的是Unsloth LoRA的组合整个流程从环境搭建到模型部署不到半天就跑通了。更关键的是——效果还不错本文就是我的一次真实实践记录重点不是讲理论而是带你一步步走完这个“看似复杂、实则轻松”的微调之旅。如果你也在找一款适合本地训练的小模型这篇内容应该能帮你少踩几个坑。2. 模型简介与镜像使用入门2.1 Qwen3系列到底是什么Qwen3千问3是阿里巴巴于2025年4月29日发布的新一代通义千问大语言模型系列覆盖了从0.6B 到 235B不同规模的密集模型和MoE架构。其中Qwen3-1.7B是一个小而精的版本适合在消费级显卡上进行推理甚至微调。支持长上下文最高可达32K tokens对金融、法律等需要长文本理解的任务很友好。开源且支持商用社区活跃文档齐全。2.2 如何快速启动并调用模型通过CSDN提供的预置镜像你可以一键部署Qwen3-1.7B并直接在Jupyter环境中运行代码。启动步骤在CSDN星图平台搜索Qwen3-1.7B镜像创建实例后自动进入Jupyter Notebook界面打开终端或新建Python文件即可开始操作使用LangChain调用模型示例from langchain_openai import ChatOpenAI import os chat_model ChatOpenAI( modelQwen3-1.7B, temperature0.5, base_urlhttps://gpu-pod69523bb78b8ef44ff14daa57-8000.web.gpu.csdn.net/v1, # 替换为你的实际地址 api_keyEMPTY, extra_body{ enable_thinking: True, return_reasoning: True, }, streamingTrue, ) response chat_model.invoke(你是谁) print(response)提示base_url中的IP和端口会因实例不同而变化请根据你当前Jupyter服务的实际URL替换。这个调用方式非常接近OpenAI风格迁移成本极低特别适合已有LangChain项目的朋友快速接入。3. 数据准备让模型学会“看材料答题”3.1 我们的目标场景本次微调的目标是让Qwen3-1.7B成为一个懂金融的AI助手能够根据一段背景资料回答专业问题比如财报分析、行业趋势判断等。所以我们的训练数据必须包含两个部分context已知信息question → answer问答对3.2 数据集来源与处理逻辑使用的数据来自公开知识库https://raw.githubusercontent.com/Steven-Luo/MasteringRAG/main/outputs/v1_1_20240811/question_answer.xlsx这是一个关于RAG应用的金融问答数据集包含训练集和测试集。我们只取dataset train且context非空的数据。数据预处理代码如下import pandas as pd from datasets import Dataset df pd.read_excel(https://raw.githubusercontent.com/Steven-Luo/MasteringRAG/main/outputs/v1_1_20240811/question_answer.xlsx) df df[df[context].notnull() (df[dataset] train)] def build_sample(row): prompt 你是一个金融分析师擅长根据所获取的信息片段对问题进行分析和推理。 你的任务是根据所获取的信息片段context/context之间的内容回答问题。 回答保持简洁不必重复问题不要添加描述性解释和与答案无关的任何内容。 已知信息 context {context} /context 问题 {question} 请回答 .replace({context}, row[context]).replace({question}, row[question]).strip() /no_think return prompt df[instruction] df.apply(build_sample, axis1) df[output] df[answer].apply(lambda x: think\n/think x) rag_dataset Dataset.from_pandas(df[[instruction, output]])3.3 构建对话格式输入Hugging Face的Transformer模型通常接受conversations格式的输入。我们需要把每条样本转成用户提问、AI回答的形式。def generate_conversation(examples): problems examples[instruction] solutions examples[output] conversations [] for problem, solution in zip(problems, solutions): conversations.append([ {role: user, content: problem}, {role: assistant, content: solution} ]) return {conversations: conversations} # 注意这里需要先加载tokenizer from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(/kaggle/working/Qwen3-1.7B, trust_remote_codeTrue) rag_dataset_conversation tokenizer.apply_chat_template( rag_dataset.map(generate_conversation, batchedTrue)[conversations], tokenizeFalse ) train_dataset Dataset.from_pandas(pd.DataFrame({text: rag_dataset_conversation})) train_dataset.name text这样处理后的数据样例如下[ { role: user, content: 你是一个金融分析师...\n请回答/no_think }, { role: assistant, content: think\n/think2023年全球经济增长动力持续回落... } ]关键点我们在instruction结尾加了/no_think是为了控制模型是否启用“思维链”模式。微调时关闭思考路径可以让输出更稳定。4. 环境配置与模型加载4.1 安装必要依赖包为了高效微调我们采用Unsloth工具库它能显著降低显存消耗并提升训练速度。!pip install --no-deps bitsandbytes accelerate xformers0.0.29.post3 peft trl0.15.2 triton cut_cross_entropy unsloth_zoo !pip install sentencepiece protobuf datasets3.4.1 huggingface_hub hf_transfer !pip install transformers4.51.3 !pip install --no-deps unsloth这些库的作用可以总结为包名作用transformersHugging Face核心模型框架unsloth加速LoRA微调节省30%显存peft参数高效微调LoRA支持trl基于强化学习的训练工具bitsandbytes4-bit量化支持accelerate分布式训练与混合精度xformers内存优化注意力机制4.2 下载基础模型!git clone https://huggingface.co/Qwen/Qwen3-1.7B确保模型路径正确后续加载时要用到。4.3 使用Unsloth加载模型并启用LoRAfrom unsloth import FastLanguageModel import torch model, tokenizer FastLanguageModel.from_pretrained( model_name/kaggle/working/Qwen3-1.7B, max_seq_length4096, load_in_4bitTrue, # 4-bit量化大幅降低显存占用 load_in_8bitFalse, full_finetuningFalse, # 当前使用LoRA ) # 配置LoRA参数 model FastLanguageModel.get_peft_model( model, r32, target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], lora_alpha32, lora_dropout0, biasnone, use_gradient_checkpointingunsloth, random_state3407, use_rsloraFalse, loftq_configNone, )说明r32表示LoRA秩数值越大拟合能力越强但也更耗显存。对于1.7B模型32是个平衡的选择。5. 开始微调SFTTrainer实战我们使用TRL库中的SFTTrainerSupervised Fine-Tuning Trainer来进行监督式微调。from trl import SFTTrainer, SFTConfig trainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasettrain_dataset, eval_datasetNone, argsSFTConfig( dataset_text_fieldtext, per_device_train_batch_size2, gradient_accumulation_steps4, # 等效batch size8 warmup_steps5, max_steps200, # 小步快跑避免过拟合 learning_rate2e-4, logging_steps1, optimadamw_8bit, weight_decay0.01, lr_scheduler_typecosine, seed3407, report_tonone, # 不连接WandB等平台 ) ) # 开始训练 trainer_stats trainer.train()训练过程观察要点显存占用约6.5GBRTX 3090环境下单步耗时约8秒Loss下降趋势平稳200步后趋于收敛没有出现OOM内存溢出错误建议如果显存不足可减小per_device_train_batch_size并增大gradient_accumulation_steps来维持总batch size。6. 保存与导出微调模型训练完成后我们要把模型保存下来以便后续推理或部署。6.1 本地保存LoRA权重model.save_pretrained(lora_model) tokenizer.save_pretrained(lora_model)这种方式只保存增量参数体积小约几十MB便于分享。6.2 合并并导出完整模型如果你想将LoRA权重合并进原模型生成一个可以直接加载的完整模型可以用version 1.0 model.save_pretrained_merged(fmodel_{version}, tokenizer, save_methodmerged_16bit)这会生成一个标准的Hugging Face格式模型目录包含config.jsonpytorch_model.bintokenizer_config.jsongeneration_config.json7. 推送到Hugging Face Hub为了让别人也能使用你的成果可以把模型推送到Hugging Face。try: model.push_to_hub_merged( repo_idfengn/qwen3, tokenizertokenizer, save_methodmerged_16bit, tokenhf_xsluThPMQflVpSyYBneEqQdXGGATmvPTWN ) print(成功推送合并模型) except Exception as e: print(f合并推送失败: {e}) print(尝试标准推送方法...) model.push_to_hub(fengn/qwen3, tokenhf_xsluThPMQflVpSyYBneEqQdXGGATmvPTWN) tokenizer.push_to_hub(fengn/qwen3, tokenhf_xsluThPMQflVpSyYBneEqQdXGGATmvPTWN) print(成功推送标准模型)注意记得替换为你自己的HF Token并确保仓库已创建。8. 推理测试看看模型学得怎么样最后一步加载我们微调好的模型做个简单的推理测试。import torch import gc from transformers import AutoModelForCausalLM, AutoTokenizer # 清理缓存 torch.cuda.empty_cache() gc.collect() device cuda if torch.cuda.is_available() else cpu print(f使用设备: {device}) model_path model_1.0 # 或者你保存的路径 tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16 if device cuda else torch.float32, trust_remote_codeTrue, low_cpu_mem_usageTrue ).to(device) def inference_with_context(context, question, model, tokenizer): input_text f 你是一个金融分析师擅长根据所获取的信息片段对问题进行分析和推理。 你的任务是根据所获取的信息片段context/context之间的内容回答问题。 回答保持简洁不必重复问题不要添加描述性解释和与答案无关的任何内容。 已知信息 context {context} /context 问题 {question} 请回答 inputs tokenizer(input_text, return_tensorspt).to(device) outputs model.generate(**inputs, max_new_tokens200, pad_token_idtokenizer.eos_token_id) response tokenizer.decode(outputs[0], skip_special_tokensTrue) return response.split(请回答)[-1].strip() # 测试案例 context1 某科技公司2023年第三季度财报显示 - 营业收入120亿元同比增长25% - 净利润18亿元同比增长30% - 研发投入15亿元占营收的12.5% - 现金流净流入8亿元 - 主要业务云计算服务、人工智能解决方案 question1 基于这些财务数据该公司的盈利能力和成长性如何 print( 测试1财务分析 ) print(f问题{question1}) answer1 inference_with_context(context1, question1, model, tokenizer) print(f模型回答{answer1})实际输出示例模型回答该公司盈利能力较强净利润率达15%且成长性良好营收和利润均实现两位数增长研发投入占比合理现金流健康具备可持续发展潜力。对比原始模型的回答明显更加聚焦、专业、结构清晰。9. 总结微调真的没那么难回顾整个流程你会发现环境配置Unsloth大大简化了安装和兼容性问题数据处理只要构造好 instruction output 的格式就能喂给模型训练过程200步就能看到明显提升不需要长时间迭代资源要求单张消费级显卡如3090/4090完全够用效果表现在垂直领域任务上微调后的模型远胜于原生模型给初学者的几点建议别怕动手微调不是专家专属现在工具链已经足够友好从小做起先跑通一个最小闭环再逐步优化善用LoRA避免全参数微调带来的资源压力关注数据质量比起模型大小干净、专业的训练数据更重要及时保存和测试每次改动后都做一次推理验证防止走偏获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。