我看了一份很适合入门的微调开源教程github.com/R6410418/Jackrong-llm-finetuning-guideackrong-llm-finetuning-guide它的定位很明确面向初学者和开发者把大模型微调从“听起来很贵的技术活”拆成一条可以在 Kaggle / Colab 上复现的工程管线Jackrong LLM 微调教程项目总览仓库里已经给出了 Qwen3.5 9B 的 Kaggle SFT notebook主线是Kaggle 环境 - Unsloth 加载 Qwen3.5 9B - 4-bit 节省显存 - LoRA / PEFT 微调 - 多源数据清洗 - qwen3-thinking 模板 - response-only SFT - 保存 LoRA / 合并 16-bit / 导出 GGUF先说结论如果你第一次做开源模型微调我建议从 Qwen3.5 9B 入手原因有三个第一9B 这个尺寸刚刚好它比 4B 更有表达能力又比 27B、35B 轻很多Kaggle 这种免费或低成本云环境还有折腾空间第二Qwen3.5 本身很强官方模型卡显示Qwen3.5 9B 是 9B 参数、32 层、4096 hidden size原生上下文长度 262,144 tokens对长文本、代码、推理、多语言场景都比较友好第三Unsloth 已经把训练门槛压低了Unsloth 文档明确支持 Qwen3.5 家族微调包括 0.8B、2B、4B、9B、27B、35B-A3B、122B-A10B 等型号对个人开发者来说这类工具链的价值很直接少踩环境坑少爆显存快点看到 loss 往下走这里也要提前说一个最新版文档里的提醒Unsloth 当前不推荐在 Qwen3.5 上做 QLoRA / 4-bit 训练原因是量化差异偏高如果你有足够显存优先考虑 bf16 LoRA本文拆的是 Jackrong Kaggle notebook 的可复现路线它为了压低 Kaggle 资源门槛使用了 4-bit 加载适合学习链路严肃实验建议把 bf16 LoRA 也纳入对照组这个教程到底教什么Jackrong 这个仓库的核心价值是把微调流程变成了一套“可跑的教材”它包含几类东西多语言 README中文、英文、韩文、日文都有训练 notebookQwen3.5 9B、Qwopus3.5 27B、Qwopus3.5 35B、Llama3.2-R1 GRPO高保真蒸馏数据集仓库里列了 24 个数据集覆盖推理、数学、代码、多轮对话、写作反馈等方向训练后导出LoRA 保存、16-bit 合并、GGUF 量化上传这套教程的目标很朴素让你从浏览器打开 notebook 开始一路看到训练、保存、发布如果你是第一次做微调最难的地方通常不在某一个 API而在“每一步为什么这么做”这份教程最值得借鉴的地方也在它的数据处理部分第一步准备 Kaggle 环境和密钥Qwen3.5 9B 的 notebook 先让你在 Kaggle Secrets 里准备两个密钥WANDB_API_KEYHF_TOKENWANDB_API_KEY用来登录 Weights Biases记录训练日志、loss 曲线、实验参数HF_TOKEN用来登录 Hugging Face后面如果你要上传 LoRA、合并模型或 GGUF 文件就会用到这里有个很重要的习惯不要把 API Key 直接写进 notebook教程里用的是 Kaggle Secretsfrom kaggle_secrets import UserSecretsClientuser_secrets UserSecretsClient()secret_value_0 user_secrets.get_secret(WANDB_API_KEY)import wandbwandb.login(keysecret_value_0)这一步看起来小实战里很关键很多初学者第一次上传 notebook就把 token 一起传到了公开平台这个坑很低级也很疼第二步安装 Unsloth、Transformers 和 TRL教程里的安装逻辑会区分 Colab 和普通环境Kaggle 里直接装 Unsloth!pip install unsloth!pip install transformers5.3.0!pip install --no-deps trl0.22.2这几个包分别管不同层unsloth负责高效加载模型、4-bit、LoRA、训练优化transformers负责模型、tokenizer、推理和底层兼容trl负责 SFTTrainer 这类训练封装版本最好跟 notebook 保持一致大模型训练环境最怕“差一点能跑”尤其是 transformers、trl、bitsandbytes、accelerate 这几类包一旦版本互相打架报错会非常玄学第三步加载 Qwen3.5 9B教程使用 Unsloth 的FastLanguageModel.from_pretrained加载模型from unsloth import FastLanguageModelimport torchmodel, tokenizer FastLanguageModel.from_pretrained( model_nameunsloth/Qwen3.5-9B, max_seq_length16384, load_in_4bitTrue, load_in_8bitFalse, full_finetuningFalse,)这里有几个参数要看懂model_nameunsloth/Qwen3.5-9B使用 Unsloth 适配过的 Qwen3.5 9B 权重方便后续训练notebook 原文里 namespace 写成了UnslothHugging Face 页面上的规范写法是小写unsloth建议读者按规范写max_seq_length16384训练上下文设置成 16KQwen3.5 9B 的官方上下文更长但训练时上下文越长显存和时间开销越大16K 是一个比较务实的起点load_in_4bitTrue按 Jackrong notebook 的路线用 4-bit 加载模型以降低显存占用需要注意Unsloth 当前文档对 Qwen3.5 的 QLoRA / 4-bit 训练给了谨慎提醒如果显存够优先试 bf16 LoRAfull_finetuningFalse采用 LoRA 这种参数高效微调路线全参微调对显存、存储、训练稳定性都更挑剔入门阶段先用 LoRA 更稳一句话概括这一步是在告诉机器“我想用省显存的方式把 Qwen3.5 9B 先请进来”第四步加 LoRA 适配器LoRA 的本质是冻结大部分原始权重只训练一小部分低秩矩阵这样训练更轻保存也更轻教程里给的核心参数是r 64lora_alpha 64lora_dropout 0bias noneuse_gradient_checkpointing unslothrandom_state 3407目标模块覆盖注意力和 MLPtarget_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, out_proj,]我在本地读 notebook 时发现一个细节LoRA 那个 cell 的括号和缩进疑似有误直接运行可能会报语法错误读者照着跑的时候可以改成下面这种结构model FastLanguageModel.get_peft_model( model, r64, target_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, out_proj, ], lora_alpha64, lora_dropout0, biasnone, use_gradient_checkpointingunsloth, random_state3407, use_rsloraFalse, loftq_configNone,)如果你对显存没把握可以把r从 64 降到 32 或 16rank 越高适配能力通常越强显存和训练时间也会跟着涨第五步数据处理才是微调的命门很多人做微调第一反应是调参数实际上微调里最影响结果的通常是数据这个教程的数据处理值得仔细看Qwen3.5 9B notebook 里用了两类数据Jackrong/Competitive-Programming-python-blend抽样 700 条stepfun-ai/Step-3.5-Flash-SFT抽样 100000 条第一类数据偏代码、算法、推理它本身是一个混合 SFT 数据集主要围绕 Python 竞赛编程也混入少量 C、SWE、推理聊天数据第二类数据规模更大是主训练数据来源notebook 里为了适配 Kaggle 临时存储会随机抽取 5 个 JSON 文件再从中清洗样本数据处理流程大概是这样加载原始数据 - 随机抽样 - 统一 conversations 格式 - 移除 system message - 规范 user / assistant 角色 - 合并连续同角色消息 - 确保 user 和 assistant 交替 - 强制 assistant 输出含 think.../think - 套用 qwen3-thinking chat template - 合并两个数据集 - shuffle - 按 text 去重 - 过滤超过 16K tokens 的样本这里最有意思的是think.../think教程会把 assistant 输出统一成think推理过程/think最终答案如果原始输出里已经有 think block就抽取并规范如果没有就补一个空的 think block这一步的目的是让模型学会一种稳定的“先组织思路再输出答案”的格式Jackrong 的 Neo 模型卡也提到训练时用了 response-only masking并把 assistant 的think作为响应起点这对推理模型很重要你希望模型变强训练数据里就要有稳定的行为结构数据格式乱模型学到的风格也会乱第六步套用 qwen3-thinking 模板notebook 里使用的是from unsloth.chat_templates import get_chat_templatetokenizer get_chat_template( tokenizer, chat_templateqwen3-thinking,)然后将 conversations 转成最终训练文本def formatting_prompts_func(examples): convos examples[conversations] texts [ tokenizer.apply_chat_template( convo, tokenizeFalse, add_generation_promptFalse, ) for convo in convos ] return {text: texts}这一步很容易被忽略模型训练看到的并非你脑子里的 JSON 结构它看到的是 token 序列chat template 决定了user、assistant、特殊标记、生成提示怎么拼在一起微调 Qwen3.5 这种带 thinking 风格的模型模板最好保持一致模板乱了模型轻则输出格式漂移重则训练目标和推理格式对不上第七步用 SFTTrainer 开始训练教程使用 TRL 的SFTTrainerfrom trl import SFTTrainer, SFTConfigtrainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasetdataset, eval_datasetNone, argsSFTConfig( dataset_text_fieldtext, per_device_train_batch_size6, gradient_accumulation_steps6, warmup_ratio0.04, num_train_epochs2, learning_rate2e-4, logging_steps1, optimadamw_8bit, weight_decay0.001, lr_scheduler_typelinear, seed3407, save_steps100, save_total_limit1, save_strategysteps, report_towandb, output_dir/kaggle/working/, ),)这里最值得关注的是有效 batchper_device_train_batch_size 6gradient_accumulation_steps 6有效 batch 约等于 36在显存有限的情况下梯度累积非常好用它不会一次塞进 36 条样本会分 6 次前向和反向累积梯度后再更新学习率2e-4对 LoRA SFT 来说属于常见起点教程里也备注了长训练可以降到2e-5如果你训练的是高质量小数据学习率太大容易把模型风格带偏第八步只训练 assistant 的回答教程里还有一个很关键的步骤from unsloth.chat_templates import train_on_responses_onlytrainer train_on_responses_only( trainer, instruction_part|im_start|user\n, response_part|im_start|assistant\nthink,)这一步叫 response-only training简单讲训练时只让模型为 assistant 部分承担 lossuser prompt 部分会被 mask 掉为什么这么做因为我们希望模型学会“如何回答”而用户输入只是条件把用户输入也纳入 loss很多时候会浪费训练信号还可能让模型学习复读 prompt尤其是对指令微调来说response-only masking 是很实用的工程习惯第九步训练、保存、上传开始训练trainer.train()如果中断可以从 checkpoint 恢复trainer.train(resume_from_checkpointTrue)保存 LoRAmodel.save_pretrained(qwen_lora)tokenizer.save_pretrained(qwen_lora)合并 16-bit 并上传 Hugging Facemodel.push_to_hub_merged( repo_id, tokenizer, save_methodmerged_16bit, tokenhf_token,)导出 GGUFmodel.push_to_hub_gguf( repo_id, tokenizer, quantization_method[q4_k_m], tokenhf_token,)这里教程给了一个很现实的提醒Kaggle 临时存储空间有限实际可用大约 92GB导出全套 GGUF 量化文件时空间可能不够更稳的方式是先在 Kaggle 上传合并后的 16-bit 模型再去 Colab 或本地更大磁盘环境里做 GGUF 全量导出实战避坑清单第一Qwen3.5 的 4-bit 训练要谨慎Jackrong notebook 为了让 Kaggle 环境更容易跑起来采用了load_in_4bitTrue但 Unsloth 最新微调文档提醒Qwen3.5 模型不推荐 QLoRA / 4-bit 训练原因是量化差异偏高如果你只是学习完整链路可以先复现 notebook如果你要做严肃模型迭代建议优先准备能跑 bf16 LoRA 的环境并把 4-bit 结果当成低成本实验组第二仓库里的大数据文件可能受 Git LFS 配额影响我本地 clone 时普通 clone 在一个 LFS 数据文件上失败原因是仓库 LFS budget 超限解决方式是跳过 LFS smudgeGIT_LFS_SKIP_SMUDGE1 git clone https://github.com/R6410418/Jackrong-llm-finetuning-guide.git这样文档、notebook、README 都能拿到真正训练时数据可以从 Hugging Face Hub 拉第三数据质量比数据量更重要教程里的 Qwen3.5-reasoning-700x 数据卡也提醒蒸馏数据可能含少量计算错误或逻辑问题训练前建议抽样检查尤其是数学、代码、金融、医学这类高敏场景第四16K 上下文是务实选择Qwen3.5 9B 官方上下文很长但微调阶段直接拉满上下文显存和训练时间都会急剧上升先用 16K 跑通流程再根据业务调整会舒服很多第五LoRA rank 别一上来就拉满r64可以作为教程复现参数你如果只是做风格、格式、轻量领域适配r16或r32往往也值得试第六推理能力和格式服从之间会有取舍Jackrong 的 Qwen3.5-9B-Neo 模型卡里提到这一版更强调结构化推理IFEval 指令跟随指标有回落这个提醒很真诚也很适合写进自己的实验记录里这是 Neo 模型卡里给出的 LM Eval Harness 截图之一重点看它把微调前后结果摆在一起便于读者理解“提升”和“回落”都要记录Jackrong Qwen3.5-9B-Neo LM Eval Harness 截图第七GGUF 量化参数里不要带尾随空格notebook 里的 GGUF 导出 cell 写的是quantization_method[q4_k_m ]字符串末尾多了一个空格建议改成quantization_method[q4_k_m]和 Unsloth 文档中的q4_k_m写法保持一致谁适合照着这套教程学我建议这几类人重点看想第一次完整跑通 SFT 的开发者想训练一个数学、代码、逻辑推理小模型的团队想理解think格式、response-only training、chat template 的同学想把模型发布成 Hugging Face / GGUF / Ollama 可用形态的玩家如果你的目标是生产级模型这份教程更像起点你还需要补上评测集、A/B 测试、安全过滤、数据授权审查、训练日志复盘、推理参数调优但作为入门教材它已经把最难的那条链路铺好了最后微调这件事真正有意思的地方在于你开始从“调用模型的人”变成“改造模型的人”Qwen3.5 9B 这种模型对个人开发者很友好它足够强也足够轻再加上 Unsloth、Kaggle、Hugging Face 这些工具门槛已经低到可以动手试我的建议很简单先别想着训练一个全能模型先选一个清晰任务比如Python 算法题解中文长文总结企业内部 FAQ专业术语问答固定格式报告生成准备一批高质量样本按教程里的思路清洗成统一 conversations 格式套上 qwen3-thinking 模板跑一次 LoRA SFT训练完成后拿同一批测试题做对比base Qwen3.5 9Bvs你的 LoRA / merged model只要你能清楚看到“哪里变好了哪里变差了”这次微调就有价值大模型时代最好的学习方式依然很朴素读代码跑实验看结果改数据再来一轮这条路真的可以从一个 Kaggle notebook 开始学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
普通开发者也能微调 Qwen3.5 9B:Kaggle + Unsloth + LoRA 全流程拆解
发布时间:2026/5/16 23:08:32
我看了一份很适合入门的微调开源教程github.com/R6410418/Jackrong-llm-finetuning-guideackrong-llm-finetuning-guide它的定位很明确面向初学者和开发者把大模型微调从“听起来很贵的技术活”拆成一条可以在 Kaggle / Colab 上复现的工程管线Jackrong LLM 微调教程项目总览仓库里已经给出了 Qwen3.5 9B 的 Kaggle SFT notebook主线是Kaggle 环境 - Unsloth 加载 Qwen3.5 9B - 4-bit 节省显存 - LoRA / PEFT 微调 - 多源数据清洗 - qwen3-thinking 模板 - response-only SFT - 保存 LoRA / 合并 16-bit / 导出 GGUF先说结论如果你第一次做开源模型微调我建议从 Qwen3.5 9B 入手原因有三个第一9B 这个尺寸刚刚好它比 4B 更有表达能力又比 27B、35B 轻很多Kaggle 这种免费或低成本云环境还有折腾空间第二Qwen3.5 本身很强官方模型卡显示Qwen3.5 9B 是 9B 参数、32 层、4096 hidden size原生上下文长度 262,144 tokens对长文本、代码、推理、多语言场景都比较友好第三Unsloth 已经把训练门槛压低了Unsloth 文档明确支持 Qwen3.5 家族微调包括 0.8B、2B、4B、9B、27B、35B-A3B、122B-A10B 等型号对个人开发者来说这类工具链的价值很直接少踩环境坑少爆显存快点看到 loss 往下走这里也要提前说一个最新版文档里的提醒Unsloth 当前不推荐在 Qwen3.5 上做 QLoRA / 4-bit 训练原因是量化差异偏高如果你有足够显存优先考虑 bf16 LoRA本文拆的是 Jackrong Kaggle notebook 的可复现路线它为了压低 Kaggle 资源门槛使用了 4-bit 加载适合学习链路严肃实验建议把 bf16 LoRA 也纳入对照组这个教程到底教什么Jackrong 这个仓库的核心价值是把微调流程变成了一套“可跑的教材”它包含几类东西多语言 README中文、英文、韩文、日文都有训练 notebookQwen3.5 9B、Qwopus3.5 27B、Qwopus3.5 35B、Llama3.2-R1 GRPO高保真蒸馏数据集仓库里列了 24 个数据集覆盖推理、数学、代码、多轮对话、写作反馈等方向训练后导出LoRA 保存、16-bit 合并、GGUF 量化上传这套教程的目标很朴素让你从浏览器打开 notebook 开始一路看到训练、保存、发布如果你是第一次做微调最难的地方通常不在某一个 API而在“每一步为什么这么做”这份教程最值得借鉴的地方也在它的数据处理部分第一步准备 Kaggle 环境和密钥Qwen3.5 9B 的 notebook 先让你在 Kaggle Secrets 里准备两个密钥WANDB_API_KEYHF_TOKENWANDB_API_KEY用来登录 Weights Biases记录训练日志、loss 曲线、实验参数HF_TOKEN用来登录 Hugging Face后面如果你要上传 LoRA、合并模型或 GGUF 文件就会用到这里有个很重要的习惯不要把 API Key 直接写进 notebook教程里用的是 Kaggle Secretsfrom kaggle_secrets import UserSecretsClientuser_secrets UserSecretsClient()secret_value_0 user_secrets.get_secret(WANDB_API_KEY)import wandbwandb.login(keysecret_value_0)这一步看起来小实战里很关键很多初学者第一次上传 notebook就把 token 一起传到了公开平台这个坑很低级也很疼第二步安装 Unsloth、Transformers 和 TRL教程里的安装逻辑会区分 Colab 和普通环境Kaggle 里直接装 Unsloth!pip install unsloth!pip install transformers5.3.0!pip install --no-deps trl0.22.2这几个包分别管不同层unsloth负责高效加载模型、4-bit、LoRA、训练优化transformers负责模型、tokenizer、推理和底层兼容trl负责 SFTTrainer 这类训练封装版本最好跟 notebook 保持一致大模型训练环境最怕“差一点能跑”尤其是 transformers、trl、bitsandbytes、accelerate 这几类包一旦版本互相打架报错会非常玄学第三步加载 Qwen3.5 9B教程使用 Unsloth 的FastLanguageModel.from_pretrained加载模型from unsloth import FastLanguageModelimport torchmodel, tokenizer FastLanguageModel.from_pretrained( model_nameunsloth/Qwen3.5-9B, max_seq_length16384, load_in_4bitTrue, load_in_8bitFalse, full_finetuningFalse,)这里有几个参数要看懂model_nameunsloth/Qwen3.5-9B使用 Unsloth 适配过的 Qwen3.5 9B 权重方便后续训练notebook 原文里 namespace 写成了UnslothHugging Face 页面上的规范写法是小写unsloth建议读者按规范写max_seq_length16384训练上下文设置成 16KQwen3.5 9B 的官方上下文更长但训练时上下文越长显存和时间开销越大16K 是一个比较务实的起点load_in_4bitTrue按 Jackrong notebook 的路线用 4-bit 加载模型以降低显存占用需要注意Unsloth 当前文档对 Qwen3.5 的 QLoRA / 4-bit 训练给了谨慎提醒如果显存够优先试 bf16 LoRAfull_finetuningFalse采用 LoRA 这种参数高效微调路线全参微调对显存、存储、训练稳定性都更挑剔入门阶段先用 LoRA 更稳一句话概括这一步是在告诉机器“我想用省显存的方式把 Qwen3.5 9B 先请进来”第四步加 LoRA 适配器LoRA 的本质是冻结大部分原始权重只训练一小部分低秩矩阵这样训练更轻保存也更轻教程里给的核心参数是r 64lora_alpha 64lora_dropout 0bias noneuse_gradient_checkpointing unslothrandom_state 3407目标模块覆盖注意力和 MLPtarget_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, out_proj,]我在本地读 notebook 时发现一个细节LoRA 那个 cell 的括号和缩进疑似有误直接运行可能会报语法错误读者照着跑的时候可以改成下面这种结构model FastLanguageModel.get_peft_model( model, r64, target_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, out_proj, ], lora_alpha64, lora_dropout0, biasnone, use_gradient_checkpointingunsloth, random_state3407, use_rsloraFalse, loftq_configNone,)如果你对显存没把握可以把r从 64 降到 32 或 16rank 越高适配能力通常越强显存和训练时间也会跟着涨第五步数据处理才是微调的命门很多人做微调第一反应是调参数实际上微调里最影响结果的通常是数据这个教程的数据处理值得仔细看Qwen3.5 9B notebook 里用了两类数据Jackrong/Competitive-Programming-python-blend抽样 700 条stepfun-ai/Step-3.5-Flash-SFT抽样 100000 条第一类数据偏代码、算法、推理它本身是一个混合 SFT 数据集主要围绕 Python 竞赛编程也混入少量 C、SWE、推理聊天数据第二类数据规模更大是主训练数据来源notebook 里为了适配 Kaggle 临时存储会随机抽取 5 个 JSON 文件再从中清洗样本数据处理流程大概是这样加载原始数据 - 随机抽样 - 统一 conversations 格式 - 移除 system message - 规范 user / assistant 角色 - 合并连续同角色消息 - 确保 user 和 assistant 交替 - 强制 assistant 输出含 think.../think - 套用 qwen3-thinking chat template - 合并两个数据集 - shuffle - 按 text 去重 - 过滤超过 16K tokens 的样本这里最有意思的是think.../think教程会把 assistant 输出统一成think推理过程/think最终答案如果原始输出里已经有 think block就抽取并规范如果没有就补一个空的 think block这一步的目的是让模型学会一种稳定的“先组织思路再输出答案”的格式Jackrong 的 Neo 模型卡也提到训练时用了 response-only masking并把 assistant 的think作为响应起点这对推理模型很重要你希望模型变强训练数据里就要有稳定的行为结构数据格式乱模型学到的风格也会乱第六步套用 qwen3-thinking 模板notebook 里使用的是from unsloth.chat_templates import get_chat_templatetokenizer get_chat_template( tokenizer, chat_templateqwen3-thinking,)然后将 conversations 转成最终训练文本def formatting_prompts_func(examples): convos examples[conversations] texts [ tokenizer.apply_chat_template( convo, tokenizeFalse, add_generation_promptFalse, ) for convo in convos ] return {text: texts}这一步很容易被忽略模型训练看到的并非你脑子里的 JSON 结构它看到的是 token 序列chat template 决定了user、assistant、特殊标记、生成提示怎么拼在一起微调 Qwen3.5 这种带 thinking 风格的模型模板最好保持一致模板乱了模型轻则输出格式漂移重则训练目标和推理格式对不上第七步用 SFTTrainer 开始训练教程使用 TRL 的SFTTrainerfrom trl import SFTTrainer, SFTConfigtrainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasetdataset, eval_datasetNone, argsSFTConfig( dataset_text_fieldtext, per_device_train_batch_size6, gradient_accumulation_steps6, warmup_ratio0.04, num_train_epochs2, learning_rate2e-4, logging_steps1, optimadamw_8bit, weight_decay0.001, lr_scheduler_typelinear, seed3407, save_steps100, save_total_limit1, save_strategysteps, report_towandb, output_dir/kaggle/working/, ),)这里最值得关注的是有效 batchper_device_train_batch_size 6gradient_accumulation_steps 6有效 batch 约等于 36在显存有限的情况下梯度累积非常好用它不会一次塞进 36 条样本会分 6 次前向和反向累积梯度后再更新学习率2e-4对 LoRA SFT 来说属于常见起点教程里也备注了长训练可以降到2e-5如果你训练的是高质量小数据学习率太大容易把模型风格带偏第八步只训练 assistant 的回答教程里还有一个很关键的步骤from unsloth.chat_templates import train_on_responses_onlytrainer train_on_responses_only( trainer, instruction_part|im_start|user\n, response_part|im_start|assistant\nthink,)这一步叫 response-only training简单讲训练时只让模型为 assistant 部分承担 lossuser prompt 部分会被 mask 掉为什么这么做因为我们希望模型学会“如何回答”而用户输入只是条件把用户输入也纳入 loss很多时候会浪费训练信号还可能让模型学习复读 prompt尤其是对指令微调来说response-only masking 是很实用的工程习惯第九步训练、保存、上传开始训练trainer.train()如果中断可以从 checkpoint 恢复trainer.train(resume_from_checkpointTrue)保存 LoRAmodel.save_pretrained(qwen_lora)tokenizer.save_pretrained(qwen_lora)合并 16-bit 并上传 Hugging Facemodel.push_to_hub_merged( repo_id, tokenizer, save_methodmerged_16bit, tokenhf_token,)导出 GGUFmodel.push_to_hub_gguf( repo_id, tokenizer, quantization_method[q4_k_m], tokenhf_token,)这里教程给了一个很现实的提醒Kaggle 临时存储空间有限实际可用大约 92GB导出全套 GGUF 量化文件时空间可能不够更稳的方式是先在 Kaggle 上传合并后的 16-bit 模型再去 Colab 或本地更大磁盘环境里做 GGUF 全量导出实战避坑清单第一Qwen3.5 的 4-bit 训练要谨慎Jackrong notebook 为了让 Kaggle 环境更容易跑起来采用了load_in_4bitTrue但 Unsloth 最新微调文档提醒Qwen3.5 模型不推荐 QLoRA / 4-bit 训练原因是量化差异偏高如果你只是学习完整链路可以先复现 notebook如果你要做严肃模型迭代建议优先准备能跑 bf16 LoRA 的环境并把 4-bit 结果当成低成本实验组第二仓库里的大数据文件可能受 Git LFS 配额影响我本地 clone 时普通 clone 在一个 LFS 数据文件上失败原因是仓库 LFS budget 超限解决方式是跳过 LFS smudgeGIT_LFS_SKIP_SMUDGE1 git clone https://github.com/R6410418/Jackrong-llm-finetuning-guide.git这样文档、notebook、README 都能拿到真正训练时数据可以从 Hugging Face Hub 拉第三数据质量比数据量更重要教程里的 Qwen3.5-reasoning-700x 数据卡也提醒蒸馏数据可能含少量计算错误或逻辑问题训练前建议抽样检查尤其是数学、代码、金融、医学这类高敏场景第四16K 上下文是务实选择Qwen3.5 9B 官方上下文很长但微调阶段直接拉满上下文显存和训练时间都会急剧上升先用 16K 跑通流程再根据业务调整会舒服很多第五LoRA rank 别一上来就拉满r64可以作为教程复现参数你如果只是做风格、格式、轻量领域适配r16或r32往往也值得试第六推理能力和格式服从之间会有取舍Jackrong 的 Qwen3.5-9B-Neo 模型卡里提到这一版更强调结构化推理IFEval 指令跟随指标有回落这个提醒很真诚也很适合写进自己的实验记录里这是 Neo 模型卡里给出的 LM Eval Harness 截图之一重点看它把微调前后结果摆在一起便于读者理解“提升”和“回落”都要记录Jackrong Qwen3.5-9B-Neo LM Eval Harness 截图第七GGUF 量化参数里不要带尾随空格notebook 里的 GGUF 导出 cell 写的是quantization_method[q4_k_m ]字符串末尾多了一个空格建议改成quantization_method[q4_k_m]和 Unsloth 文档中的q4_k_m写法保持一致谁适合照着这套教程学我建议这几类人重点看想第一次完整跑通 SFT 的开发者想训练一个数学、代码、逻辑推理小模型的团队想理解think格式、response-only training、chat template 的同学想把模型发布成 Hugging Face / GGUF / Ollama 可用形态的玩家如果你的目标是生产级模型这份教程更像起点你还需要补上评测集、A/B 测试、安全过滤、数据授权审查、训练日志复盘、推理参数调优但作为入门教材它已经把最难的那条链路铺好了最后微调这件事真正有意思的地方在于你开始从“调用模型的人”变成“改造模型的人”Qwen3.5 9B 这种模型对个人开发者很友好它足够强也足够轻再加上 Unsloth、Kaggle、Hugging Face 这些工具门槛已经低到可以动手试我的建议很简单先别想着训练一个全能模型先选一个清晰任务比如Python 算法题解中文长文总结企业内部 FAQ专业术语问答固定格式报告生成准备一批高质量样本按教程里的思路清洗成统一 conversations 格式套上 qwen3-thinking 模板跑一次 LoRA SFT训练完成后拿同一批测试题做对比base Qwen3.5 9Bvs你的 LoRA / merged model只要你能清楚看到“哪里变好了哪里变差了”这次微调就有价值大模型时代最好的学习方式依然很朴素读代码跑实验看结果改数据再来一轮这条路真的可以从一个 Kaggle notebook 开始学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】