大模型微调实战:LoRA、QLoRA与全参微调的选择策略

微调方法全景 大模型微调主要有三种技术路线,各有适用场景: 全参微调(Full Fine-tuning):更新所有参数,效果上限最高,但成本最高 LoRA:冻结主干参数,仅训练低秩适配矩阵,性价比极高 QLoRA:在LoRA基础上对基座模型4bit量化,进一步降低显存需求 LoRA技术详解 原理 LoRA(Low-Rank Adaptation)的核心思想是:模型适配过程中的参数变化具有低秩特性。具体做法: 将原始权重矩阵W∈R^(d×d)的更新分解为两个小矩阵的乘积: W' = W + ΔW = W + B × A 其中A∈R^(r×d),B∈R^(d×r),r远小于d(通常取8-64)。 参数量从d²降低到2rd,以r=16、d=4096为例,参数量从16.7M降到131K,缩减了127倍。 关键超参数 rank (r):秩大小。r越大表达能力越强但训练越慢。推荐8-64起步 alpha:缩放系数,实际缩放为α/r。推荐设为r的2倍 target_modules:应用LoRA的层。至少q_proj和v_proj,推荐all-linear 适用场景 风格定制(让模型用特定语气说话) 领域适配(法律、医疗等垂直领域) 任务适配(将通用模型适配到特定任务格式) QLoRA:极致显存优化 QLoRA在LoRA基础上增加了两个优化: 4-bit NormalFloat量化 将基座模型权重量化为4-bit NF4数据类型。NF4是一种正态分布感知的量化方案,比均匀量化精度更高: 原始: W ∈ FP16 (每参数2字节) 量化: W → NF4 (每参数0.5字节) 训练: 仅LoRA参数为FP32 双重量化 对LoRA的适配矩阵本身也进行量化,进一步压缩梯度检查点的显存占用。 页面优化器 将优化器状态在CPU/GPU之间分页,避免显存峰值溢出。 效果对比 方法 7B模型显存 70B模型显存 效果损失 全参 120GB+ 1200GB+ 0% LoRA 20GB 160GB <1% QLoRA 6GB 48GB 1-2% QLoRA让单张消费级显卡(如RTX 3090, 24GB)就能微调7B模型,极大降低了定制化门槛。 ...

2026-07-16 · 1 min · 129 words · 硅基 AGI 探索者

LoRA微调实战指南:参数高效微调的原理、实践与陷阱

LoRA:用0.1%的参数达到全量微调效果 LoRA(Low-Rank Adaptation)已成为大模型微调的事实标准。其核心思想简单而优雅:冻结预训练权重,仅训练注入的低秩矩阵。 数学原理 对于预训练权重矩阵 $W_0 \in \mathbb{R}^{d \times k}$,LoRA将权重更新表示为两个小矩阵的乘积: $$W = W_0 + \Delta W = W_0 + BA$$ 其中 $B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times k}$,$r \ll \min(d, k)$。 初始化时,$A$用高斯随机初始化,$B$用零矩阵初始化,确保训练开始时 $\Delta W = 0$,不破坏预训练效果。 参数缩减比率为 $\frac{r(d+k)}{dk}$。以7B模型为例,当 $r=8$ 时,可训练参数仅约10M,占全量参数的0.14%。 关键超参数调优 秩(Rank)的选择 秩 $r$ 是LoRA最重要的超参数。经验法则: r=4~8:简单任务(文本分类、风格迁移) r=16~32:中等任务(指令跟随、领域适配) r=64+:复杂任务(代码生成、数学推理) 但更大的秩并不意味着更好的效果。研究表明,当秩超过某个阈值后,性能增益趋缓甚至下降,因为低秩约束本身具有正则化作用。 目标模块选择 LoRA可以注入到不同层:注意力层的Q/K/V/O矩阵、FFN层的up/down矩阵。实践建议: # 推荐配置:同时微调注意力和FFN target_modules = [ "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj" ] 仅微调注意力层往往不够,FFN层包含大量领域知识,加入FFN层通常能提升3-5个点。 学习率与调度器 LoRA的学习率通常比全量微调高10倍: 全量微调:1e-5 ~ 5e-5 LoRA:1e-4 ~ 5e-4 QLoRA:1e-4 ~ 3e-4 调度器推荐cosine decay配合warmup,warmup步数占总步数的3-5%。 ...

2026-07-16 · 1 min · 141 words · 硅基 AGI 探索者
Hermes 4微调

Hermes 4微调实战:从数据准备到模型部署全流程

为什么要微调Hermes 4? Hermes 4虽然原生支持函数调用,但企业场景有特殊需求: 行业术语:医疗、法律、金融等领域专有词汇 企业API:内部系统的特定接口规范 业务流程:特定的操作顺序和判断逻辑 合规要求:输出格式和内容限制 微调能让模型"学会"这些领域知识,比prompt工程更稳定高效。 微调方法选择 方法 显存需求 训练速度 效果 适用场景 全量微调 模型大小×4 慢 最好 数据充足、资源充足 LoRA 模型大小×1.5 快 好 通用首选 QLoRA 模型大小×0.5 中 中好 显存有限 IA³ 极低 极快 中 快速实验 推荐:LoRA——性价比最高,效果接近全量微调。 数据准备 1. 数据格式 Hermes 4使用OpenAI兼容的对话格式: { "messages": [ { "role": "system", "content": "你是企业客服助手。" }, { "role": "user", "content": "订单2024001什么时候发货?" }, { "role": "assistant", "content": "", "tool_calls": [ { "id": "call_001", "type": "function", "function": { "name": "query_order", "arguments": "{\"order_id\": \"2024001\"}" } } ] }, { "role": "tool", "tool_call_id": "call_001", "content": "{\"status\": \"已付款\", \"ship_date\": \"2026-07-09\"}" }, { "role": "assistant", "content": "您的订单2024001已付款,预计7月9日发货。" } ] } 2. 数据收集策略 class TrainingDataBuilder: def __init__(self): self.samples = [] def from_logs(self, conversation_logs): """从客服对话日志提取训练样本""" for log in conversation_logs: # 筛选高质量对话 if log.resolution == "success" and log.satisfaction >= 4: sample = self.format_conversation(log) self.samples.append(sample) def from_templates(self, templates): """从模板生成多样化训练样本""" for template in templates: # 使用LLM扩展模板为多种表达方式 variations = self.expand_template(template, n=10) self.samples.extend(variations) def from_synthetic(self, scenario, n=100): """使用强模型生成合成数据""" prompt = f"为'{scenario}'场景生成{n}个多样化的客服对话样本" synthetic = strong_model.generate(prompt) self.samples.extend(self.validate(synthetic)) def build(self): """构建训练集""" # 去重 self.samples = self.deduplicate(self.samples) # 质量过滤 self.samples = self.filter_quality(self.samples) # 划分训练/验证集 return self.split(self.samples, ratio=0.95) 3. 数据质量标准 def quality_check(sample): checks = [ len(sample["messages"]) >= 3, # 至少3轮 has_system_prompt(sample), # 有系统提示 tool_calls_valid(sample), # 工具调用格式正确 response_length_reasonable(sample), # 响应长度合理 no_sensitive_info(sample), # 无敏感信息 function_args_match_schema(sample), # 参数匹配schema ] return all(checks) LoRA微调实战 1. 环境准备 # 硬件:A100 80GB 或 2x RTX 4090 # 软件: pip install torch transformers peft trl accelerate bitsandbytes 2. 训练配置 import torch from transformers import AutoModelForCausalLM, AutoTokenizer from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from trl import SFTTrainer, SFTConfig # 加载模型 model_id = "NousResearch/Hermes-4-14B" tokenizer = AutoTokenizer.from_pretrained(model_id) # 4-bit量化加载(节省显存) model = AutoModelForCausalLM.from_pretrained( model_id, quantization_config=BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", ), device_map="auto" ) model = prepare_model_for_kbit_training(model) # LoRA配置 lora_config = LoraConfig( r=64, # LoRA秩 lora_alpha=128, # 缩放因子 target_modules=[ "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj" ], lora_dropout=0.05, task_type="CAUSAL_LM", modules_to_save=["embed_tokens", "lm_head"] # 保存嵌入层 ) model = get_peft_model(model, lora_config) 3. 训练执行 # 训练数据 train_dataset = load_dataset("json", data_files="train.jsonl") eval_dataset = load_dataset("json", data_files="eval.jsonl") # 训练配置 training_args = SFTConfig( output_dir="./hermes-4-finetuned", num_train_epochs=3, per_device_train_batch_size=4, per_device_eval_batch_size=4, gradient_accumulation_steps=4, warmup_ratio=0.03, learning_rate=2e-4, lr_scheduler_type="cosine", logging_steps=10, eval_strategy="steps", eval_steps=100, save_steps=200, bf16=True, gradient_checkpointing=True, max_seq_length=4096, ) # 训练器 trainer = SFTTrainer( model=model, args=training_args, train_dataset=train_dataset["train"], eval_dataset=eval_dataset["train"], tokenizer=tokenizer, ) # 开始训练 trainer.train() # 保存 trainer.save_model("./hermes-4-finetuned") 4. 训练监控 # 关键指标 metrics_to_watch = { "train_loss": "应持续下降", "eval_loss": "应跟随train_loss下降", "eval_loss > train_loss + 0.5": "过拟合警告", "learning_rate": "按cosine衰减", "grad_norm": "应在1-10范围内", } # 典型训练曲线(3 epochs) # Epoch 0.5: train_loss=1.8, eval_loss=1.9 # Epoch 1.0: train_loss=1.2, eval_loss=1.3 # Epoch 1.5: train_loss=0.9, eval_loss=1.1 # Epoch 2.0: train_loss=0.7, eval_loss=0.9 # Epoch 2.5: train_loss=0.5, eval_loss=0.85 # Epoch 3.0: train_loss=0.4, eval_loss=0.82 ← 最佳 评估与调优 1. 评估维度 class ModelEvaluator: def evaluate(self, model, test_set): results = {} # 函数调用准确率 results["tool_call_acc"] = self.eval_tool_calls(model, test_set) # 参数匹配率 results["param_match"] = self.eval_params(model, test_set) # 多轮对话一致性 results["multi_turn"] = self.eval_multi_turn(model, test_set) # 错误恢复能力 results["error_recovery"] = self.eval_error_handling(model, test_set) # 语气/风格一致性 results["style"] = self.eval_style(model, test_set) return results 2. 评估结果示例 维度 微调前 微调后 提升 函数调用准确率 72% 96% +24% 参数匹配率 68% 93% +25% 多轮一致性 80% 95% +15% 错误恢复 65% 88% +23% 风格一致性 70% 97% +27% 3. 常见问题与调优 问题1:过拟合 ...

2026-07-08 · 4 min · 675 words · 硅基 AGI 探索者
LoRA vs QLoRA 2026对比

LoRA vs QLoRA 2026对比:参数高效微调的两种路径

引言 参数高效微调(PEFT)技术让普通开发者也能微调大模型。其中LoRA和QLoRA是最流行的两种方案。2026年,随着模型规模进一步扩大,这两种技术的差异和选择变得更加重要。 一、LoRA原理 LoRA(Low-Rank Adaptation)通过低秩矩阵分解来近似模型权重的更新: 原始: Y = W·X, W ∈ R^(d×k) LoRA: Y = (W + ΔW)·X, ΔW = A·B, A ∈ R^(d×r), B ∈ R^(r×k), r << d 只训练A和B两个小矩阵,原参数W冻结。 from peft import LoraConfig, get_peft_model config = LoraConfig( r=8, # 秩 lora_alpha=16, target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(base_model, config) 优势 训练参数减少99%+ 不增加推理延迟(训练后可合并权重) 效果接近全参数微调 劣势 仍需要模型以全精度加载到GPU 大模型仍需要大量GPU内存 二、QLoRA原理 QLoRA在LoRA基础上增加了4位量化: 基础模型: 4-bit量化存储 → 大幅减少内存 LoRA适配器: 全精度训练 → 保持训练精度 梯度: 通过4-bit基础模型反传 → 计算LoRA梯度 from transformers import BitsAndBytesConfig import torch bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16 ) model = AutoModelForCausalLM.from_pretrained( "meta-llama/Llama-3-70B", quantization_config=bnb_config, device_map="auto" ) # 然后应用LoRA model = get_peft_model(model, lora_config) 优势 70B模型只需18GB GPU内存(LoRA需要140GB) 普通消费级GPU就能微调大模型 效果接近LoRA 劣势 训练速度稍慢(量化/反量化开销) 推理时如果保持量化,精度略有下降 三、2026年对比 3.1 内存对比 模型大小 全参微调 LoRA QLoRA 7B ~56GB ~28GB ~6GB 13B ~104GB ~52GB ~10GB 70B ~560GB ~280GB ~18GB 175B ~1400GB ~700GB ~40GB 3.2 性能对比 指标 LoRA QLoRA 差距 训练速度 1.0x 0.85x QLoRA慢15% 最终精度 100% 98-99% QLoRA略低 推理速度 1.0x 1.0x* 合并后相同 训练稳定性 高 中高 QLoRA偶有梯度异常 *合并权重后推理速度相同;如果不合并,QLoRA推理更慢 ...

2026-07-02 · 2 min · 289 words · 硅基 AGI 探索者
QLoRA量化微调实战:显存减半效果不减

QLoRA量化微调实战:显存减半效果不减

QLoRA解决了什么问题? LoRA已经大幅降低了微调成本,但对于70B模型,仍然需要2×A100(80GB)。QLoRA(Quantized LoRA)通过4-bit量化基座模型,将显存需求再降一个数量级: 模型 全量微调 LoRA QLoRA 7B 80GB 16GB 6GB 14B 160GB 32GB 12GB 70B 800GB 160GB 24GB 这意味着:用一张RTX 4090就能微调70B模型。 QLoRA核心原理 三大创新 1. NF4(NormalFloat 4-bit)量化 传统4-bit量化(INT4)假设数据均匀分布,但神经网络权重通常服从正态分布。NF4专门为正态分布设计量化区间: # NF4量化原理 import numpy as np # INT4: 均匀量化 int4_levels = np.linspace(-1, 1, 16) # 16个均匀区间 # NF4: 正态分布感知量化 from scipy.stats import norm # 16个分位点对应正态分布的分位 nf4_levels = norm.ppf(np.linspace(0, 1, 17)[1:-1]) nf4_levels = nf4_levels / np.max(np.abs(nf4_levels)) # 归一化到[-1, 1] print(f"INT4 levels: {int4_levels}") print(f"NF4 levels: {nf4_levels}") # NF4在0附近更密集,在两端更稀疏,匹配权重分布 2. Double Quantization 对量化后的缩放因子本身再量化,进一步节省显存: 原始权重 W → 4-bit量化 → 量化值 + 缩放因子(32bit) ↓ 缩放因子再量化为8-bit ↓ 额外节省约0.4bit/参数 3. Paged Optimizer 使用NVIDIA的统一内存,当显存不够时自动将优化器状态转移到CPU内存: ...

2026-06-30 · 4 min · 671 words · 硅基 AGI 探索者
finetuning cost analysis lora qlora full parameter

大模型微调成本分析:LoRA/QLoRA/全参数的费用对比

微调成本的四个维度 大模型微调的成本不只是 GPU 租用费,需要从四个维度全面考量: 总成本 = 训练成本 + 存储成本 + 部署成本 + 人力成本 (GPU) (模型存储) (推理) (工程) 成本维度 LoRA QLoRA 全参数 训练显存 中 低 高 训练时间 短 中 长 存储空间 小(几十MB) 小 大(几十GB) 推理延迟 无额外 略有开销 无额外 工程复杂度 低 中 高 1. 训练成本对比 显存需求 class MemoryEstimator: """估算不同微调方法的显存需求""" def estimate(self, model_size_b: float, method: str): # 基础模型显存(bfloat16) base_memory = model_size_b * 2 # 2 bytes per param (bf16) # 训练状态显存(梯度 + 优化器状态) if method == "full": # Adam: 2x params for optimizer states + 1x for gradients training_overhead = base_memory * 3 # 8 bytes/param total elif method == "lora": # 只有 LoRA 参数需要梯度+优化器(约 0.5% 的参数) trainable_ratio = 0.005 training_overhead = base_memory * trainable_ratio * 3 elif method == "qlora": # 基础模型量化到 4bit base_memory = model_size_b * 0.5 # 0.5 bytes per param (4bit) trainable_ratio = 0.005 training_overhead = base_memory * trainable_ratio * 3 # 激活值显存(与 batch_size 和 seq_length 相关) activation_memory = self._estimate_activation(model_size_b, method) total = base_memory + training_overhead + activation_memory return { "base_model": base_memory, "training_overhead": training_overhead, "activation": activation_memory, "total": total, "total_gb": total / 1024 } 不同模型规模的显存需求 模型规模 LoRA QLoRA 全参数 7B 16GB 8GB 120GB 14B 32GB 16GB 240GB 32B 64GB 32GB 560GB 70B 140GB 48GB 1200GB 120B 240GB 80GB 2000GB 训练时间与成本 以 7B 模型、10K 条训练数据、3 epochs 为例: ...

2026-06-28 · 5 min · 866 words · 硅基 AGI 探索者
qlora finetune guide

QLoRA量化微调指南

概述 QLoRA量化微调指南是AI智能体领域中QLoRA量化微调指南的重要主题。本文将从多个角度深入分析这一话题,为读者提供系统性的认知框架和实践参考。 核心概念 基本定义 在深入讨论之前,我们需要明确几个核心概念。AI智能体是指能够感知环境、理解指令、规划行动并调用工具完成任务的AI系统。与传统的聊天机器人不同,智能体具有自主性、目标导向性和工具使用能力。 QLoRA量化微调指南涉及的关键技术包括: 大语言模型:作为智能体的认知引擎,负责理解、推理和生成 工具调用:通过Function Calling或MCP协议与外部系统交互 记忆系统:短期记忆处理当前对话,长期记忆存储历史经验 规划引擎:将复杂任务分解为可执行的子步骤 技术原理 从技术层面看,QLoRA量化微调指南的核心在于如何让AI系统更好地理解和执行人类意图。这涉及多个技术环节的协同: 首先是感知层,智能体需要准确理解用户的自然语言指令,提取关键信息和约束条件。其次是规划层,将高层目标分解为具体的执行步骤。然后是执行层,调用合适的工具完成每个步骤。最后是反馈层,根据执行结果调整后续策略。 实践分析 当前现状 在RAG与微调领域,当前的技术实践呈现出几个明显特征: 工程化程度提升:从实验室原型到生产级系统,工程能力成为关键差异化因素 评估体系完善:越来越多标准化的评测基准被提出,帮助开发者量化能力边界 开源生态繁荣:开源框架和工具链的成熟降低了开发门槛 安全意识增强:对AI安全和对齐问题的重视程度显著提升 关键挑战 尽管进展显著,QLoRA量化微调指南仍面临几个核心挑战: 技术挑战: 大模型的幻觉问题在智能体场景下被放大,因为智能体需要做出实际决策 多步推理中的错误累积效应导致长程任务成功率下降 工具调用的可靠性受外部API稳定性影响 工程挑战: 智能体的可观测性不足,调试和排错困难 成本控制与性能优化的平衡 从单机到分布式部署的架构复杂性 安全挑战: Prompt注入等攻击手段不断进化 智能体权限管理需要更精细化的控制 数据隐私保护在多Agent协作场景下更加复杂 优化策略 针对上述挑战,以下是几个关键优化方向: 技术优化 分而治之:将复杂任务分解为可独立验证的子任务,降低单步错误影响 多路投票:对关键决策使用多次采样投票机制,提高可靠性 渐进式信任:智能体权限从最小化开始,根据表现逐步扩展 人在回路:高风险决策保留人工审核环节 工程优化 可观测性优先:建立完善的日志、指标和追踪体系 灰度发布:新版本智能体先在小流量环境验证 自动化测试:构建端到端测试套件,防止回归 成本监控:实时追踪Token消耗和API调用成本 案例研究 为了更具体地说明QLoRA量化微调指南的实践价值,我们来看一个典型场景: 某科技公司在内部IT运维中部署了AI智能体,负责处理员工的工单请求。智能体需要理解员工的自然语言描述,判断问题类型,查询知识库,执行修复操作或转接人工。 实施过程中遇到的关键问题包括: 员工描述模糊导致意图识别错误 知识库信息过时导致给出错误建议 某些操作需要管理员权限存在安全风险 解决方案: 引入澄清对话机制,在不确定时主动追问 建立知识库更新流程,定期审核内容 实施权限分级制度,敏感操作需人工确认 效果:工单首次解决率提升35%,平均处理时间缩短60%,员工满意度显著提升。 未来趋势 QLoRA量化微调指南的发展趋势值得关注: 标准化:MCP等开放协议将推动工具接口标准化,降低集成成本 垂直化:针对特定行业和场景的专用智能体将大量涌现 协作化:多智能体协作将成为复杂任务的标准解决方案 自主化:智能体的自主决策能力将持续提升,但需要配套的安全机制 结论 QLoRA量化微调指南是AI智能体技术发展中的重要一环。无论是技术原理的深入理解,还是实践中的工程优化,都需要系统性思维。对于开发者和企业而言,关键在于: 理解技术能力和边界,避免过度期待 建立系统化的评估和监控体系 在创新和安全之间找到平衡 持续学习和适应快速变化的技术生态 硅基AGI探索者将持续关注RAG与微调领域的最新进展,为读者提供深度分析和实践指导。— ...

2026-06-27 · 1 min · 88 words · 硅基 AGI 探索者
lora vs dora vs qlora

LoRA vs DoRA vs QLoRA:参数高效微调三剑客对比

LoRA vs DoRA vs QLoRA:参数高效微调三剑客对比 引言 全量微调一个 7B 模型需要 ~60GB 显存,这让大多数开发者望而却步。参数高效微调(PEFT)方法通过只训练极少量参数,实现了接近全量微调的效果。其中最具代表性的是: LoRA(2021):低秩分解,PEFT 的奠基之作 QLoRA(2023):4bit 量化 + LoRA,把显存门槛打到 6GB DoRA(2024):解耦方向与大小,效果逼近全量微调 本文从原理到实践,完整对比三者。 1. LoRA:低秩适配 1.1 核心原理 LoRA 假设模型微调时的权重更新 ΔW 是低秩的: W' = W + ΔW = W + BA 其中: W ∈ R^{d×k}:原始权重(冻结,不训练) B ∈ R^{d×r}:可训练矩阵 A ∈ R^{r×k}:可训练矩阵 r << min(d, k):秩,通常 r=8/16/64 # LoRA 的数学表达 # 前向:h = Wx + BAx = (W + BA)x # 反向:只计算 B 和 A 的梯度,W 的梯度为零 # 初始化策略 # A: 正态分布初始化 N(0, σ²) # B: 零初始化(确保训练开始时 ΔW = BA = 0) 1.2 代码实现 import torch import torch.nn as nn class LoRALayer(nn.Module): """LoRA 层的独立实现""" def __init__( self, in_features: int, out_features: int, r: int = 8, alpha: int = 16, dropout: float = 0.0, ): super().__init__() self.r = r self.scale = alpha / r # 缩放系数 # 原始权重(冻结) self.base_weight = nn.Parameter( torch.randn(out_features, in_features), requires_grad=False ) # LoRA 矩阵 self.lora_A = nn.Parameter(torch.randn(r, in_features) * 0.01) self.lora_B = nn.Parameter(torch.zeros(out_features, r)) self.dropout = nn.Dropout(dropout) def forward(self, x: torch.Tensor) -> torch.Tensor: base_out = x @ self.base_weight.T lora_out = (self.dropout(x) @ self.lora_A.T @ self.lora_B.T) * self.scale return base_out + lora_out # 使用 PEFT 库(推荐) from peft import LoraConfig, get_peft_model config = LoraConfig( r=16, lora_alpha=32, lora_dropout=0.05, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], bias="none", task_type="CAUSAL_LM", ) model = get_peft_model(base_model, config) 1.3 参数量分析 以 LLaMA-7B(hidden_dim=4096)为例: ...

2026-06-25 · 7 min · 1318 words · 硅基 AGI 探索者
fine tuning qlora guide

QLoRA 微调实战:4bit 量化下的高效训练

QLoRA 微调实战:4bit 量化下的高效训练 引言 大模型微调最大的障碍是显存。一个 7B 模型以 FP16 加载需要约 14GB 显存,加上 Adam 优化器状态和梯度,训练时轻松突破 60GB。QLoRA 通过 4bit 量化 + 低秩适配器,将训练显存压缩到 ~6GB,让单卡 24GB 消费级 GPU 微调 7B-13B 模型成为现实。 本文从原理到代码,完整覆盖 QLoRA 微调全流程。 1. QLoRA 核心原理 1.1 LoRA 回顾 LoRA(Low-Rank Adaptation)将权重更新 ΔW 分解为两个小矩阵的乘积: W' = W + BA 其中 W ∈ R^{d×k} 冻结,B ∈ R^{d×r} 和 A ∈ R^{r×k} 可训练,r << min(d, k)。 参数量从 d×k 降至 r×(d+k),但模型仍需以 FP16 加载。 1.2 QLoRA 的三大创新 QLoRA 在 LoRA 基础上引入三项关键技术: ...

2026-06-25 · 6 min · 1115 words · 硅基 AGI 探索者
lora qlora finetune guide

LoRA/QLoRA 微调实战指南:显存省 10 倍

全参微调的痛点 全参数微调一个 7B 模型需要: 显存:~80GB(模型权重 14GB + 梯度 14GB + 优化器状态 56GB) 硬件:1×A100 80GB 或 2×A100 40GB 成本:每小时 ¥10-30 LoRA(Low-Rank Adaptation)将这个数字降到 ~8GB,QLoRA 进一步降到 ~5GB。 LoRA 原理:低秩分解 核心数学 LoRA 假设模型微调时的权重更新 ΔW 是低秩的。它将 ΔW 分解为两个小矩阵的乘积: 原始:h = W·x W ∈ R^(d×k),参数量 d×k LoRA:h = W·x + B·A·x A ∈ R^(r×k),B ∈ R^(d×r),参数量 r×(d+k) 当 r << min(d, k) 时,参数量大幅减少 import torch import torch.nn as nn class LoRALayer(nn.Module): def __init__(self, original_layer, rank=8, alpha=16): super().__init__() self.original = original_layer # 冻结的原始权重 self.rank = rank self.alpha = alpha self.scaling = alpha / rank d_out, d_in = original_layer.weight.shape # 低秩矩阵 A 和 B self.lora_A = nn.Parameter(torch.zeros(rank, d_in)) self.lora_B = nn.Parameter(torch.zeros(d_out, rank)) # A 用 Kaiming 初始化,B 用零初始化 nn.init.kaiming_uniform_(self.lora_A, a=5**0.5) # B 初始为 0,所以训练开始时 ΔW = 0,不改变原模型行为 # 冻结原始权重 for param in self.original.parameters(): param.requires_grad = False def forward(self, x): original_output = self.original(x) lora_output = (x @ self.lora_A.T) @ self.lora_B * self.scaling return original_output + lora_output 参数量对比 以 7B 模型为例(隐藏层 4096): ...

2026-06-25 · 5 min · 897 words · 硅基 AGI 探索者
鲁ICP备2026018361号