> 技术文档 > 【LoRA】怎么指定LoRAConfig的target_modules

【LoRA】怎么指定LoRAConfig的target_modules


前言

近期由于需要训练Qwen3 A3B 30B MoE模型,然而尝试过7张卡,在100step的时候爆显存了,而8张卡消耗太大,因此寻求一种能够减少显存的方法,经过查询可知,可以通过4bit的方式进行训练,也可以通过指定LoraConfig中的target_modules进行训练,而MoE中最重要的可动的地方就是router,因此查看能不能使用target_modules直接指定router进行训练,而不需要进入源码进行手动冻结,而目前很多框架都支持指定target_modules参数,因此,本文探索该方法训练MoE的router,并通过实战来详细介绍LoRaConfig的配置细节。

一、LoRA核心原理

LoRA(Low-Rank Adaptation)是一种参数高效微调方法,通过冻结原模型参数+训练低秩适配器的方式实现模型微调,相比全参数微调可减少**97%-99%**的可训练参数。

技术优势对比

方法 训练参数 显存消耗 模型保存 全参数微调 100% 高 完整模型 LoRA微调 1-3% 低 适配器 QLoRA微调 0.5-1% 极低 量化适配器

二、关键参数详解

1. LoraConfig核心参数

from peft import LoraConfigconfig = LoraConfig( r=8,  # 低秩矩阵的维度 lora_alpha=32, # 缩放因子 = alpha/r target_modules=[\"q_proj\", \"v_proj\"], # 需要适配的模块 lora_dropout=0.05, # 防止过拟合 bias=\"none\", # 偏置项处理方式 task_type=\"CAUSAL_LM\")

2. target_modules配置指南

通过以下代码查找目标模块:

from transformers import AutoModelForCausalLM, TrainingArgumentsfrom peft import LoraConfig, get_peft_modelimport bitsandbytesimport torch# 加载基础模型model = AutoModelForCausalLM.from_pretrained(\"Qwen3-30B-A3B\")# 查找所有线性层def find_all_linear_names(model): linear_classes = [torch.nn.Linear, bitsandbytes.nn.Linear4bit] target_modules = set() for name, module in model.named_modules(): if any([isinstance(module, cls) for cls in linear_classes]): parts = name.split(\'.\') target_modules.add(parts[-1]) return list(target_modules)print(find_all_linear_names(your_model)) # 输出示例: [\'q_proj\', \'k_proj\', \'v_proj\']

image.png

上面就是Qwen3-30B-A3B所有的linear 层

三、完整实践流程

1. 环境配置

pip install torch transformers peft accelerate bitsandbytes

2. 基础微调实现

from transformers import AutoModelForCausalLM, TrainingArgumentsfrom peft import LoraConfig, get_peft_model# 加载基础模型model = AutoModelForCausalLM.from_pretrained(\"meta-llama/Llama-2-7b-hf\")# 配置LoRA参数peft_config = LoraConfig( r=8, lora_alpha=32, target_modules=[\"q_proj\", \"v_proj\"], lora_dropout=0.05, bias=\"none\", task_type=\"CAUSAL_LM\")# 创建PEFT模型model = get_peft_model(model, peft_config)# 配置训练参数training_args = TrainingArguments( output_dir=\"./output\", learning_rate=3e-4, per_device_train_batch_size=4, num_train_epochs=3, logging_steps=100)# 开始训练trainer = Trainer( model=model, args=training_args, train_dataset=dataset)trainer.train()

四、进阶技巧

1. QLoRA实现(4-bit量化)

from transformers import BitsAndBytesConfigbnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type=\"nf4\", bnb_4bit_compute_dtype=torch.bfloat16)model = AutoModelForCausalLM.from_pretrained( \"meta-llama/Llama-2-7b-hf\", quantization_config=bnb_config)

2. 不同模型的target_modules配置

模型类型 推荐target_modules LLaMA q_proj, v_proj ChatGLM query_key_value BLOOM query_key_value GPT-NeoX query_key_value

五、常见问题解答

Q1:训练后如何保存/加载适配器?

# 保存适配器model.save_pretrained(\"./lora_adapters\")# 加载适配器from peft import PeftModelmodel = PeftModel.from_pretrained(base_model, \"./lora_adapters\")

Q2:如何选择r值?

  • 7B模型推荐r=8
  • 13B模型推荐r=16
  • 70B模型推荐r=64

更多技术细节参考:Hugging Face PEFT文档

五、Router层专项训练指南(通用版本)

1. 路由机制原理

在混合专家模型(MoE)架构中,router层负责将输入分配给不同的专家模块。通过LoRA微调router层可以:

  • 提升任务特定路由能力
  • 优化专家资源分配
  • 增强模型的多任务处理能力

2. 定位路由模块

def find_router_layers(model): router_patterns = [\"gate\", \"router\", \"moe\"] target_modules = [] for name, module in model.named_modules(): if any([p in name.lower() for p in router_patterns]): print(f\"Found router layer: {name}\") target_modules.append(name.split(\'.\')[-1]) return list(set(target_modules))# 示例输出:[\'gate_proj\', \'router\']

3. 专用配置示例

点击【LoRA】怎么指定LoRAConfig的target_modules查看全文