| 方法 | 显存需求 | 适合场景 |
|---|---|---|
| 全参数微调 (Full FT) | 非常高(≥80GB×多卡) | 不推荐个人 |
| LoRA | 低(24GB 可跑) | 最常用 |
| QLoRA | 极低(16–24GB) | 消费级显卡 |
| Prompt / Instruction Tuning | 低 | 轻量适配 |
conda create -n llama3 python=3.10
conda activate llama3pip install torch==2.1.2 transformers==4.41.0 accelerate peft bitsandbytes datasets sentencepiecehuggingface-cli download meta-llama/Meta-Llama-3-8B-Instruct{
"instruction": "将这句话翻译成英文",
"input": "今天天气很好",
"output": "The weather is nice today."
}或对话格式:
{
"messages": [
{"role": "user", "content": "你是谁?"},
{"role": "assistant", "content": "我是Llama 3微调模型"}
]
}from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
import bitsandbytes as bnb
model_id = "meta-llama/Meta-Llama-3-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
load_in_4bit=True,
bnb_4bit_compute_dtype="float16"
)lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj","v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_steps=10,
max_steps=200,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
output_dir="./llama3-lora"
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset
)
trainer.train()model.eval()
inputs = tokenizer("你好,你是谁?", return_tensors="pt").to("cuda")
out = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(out[0]))python -m peft merge_and_unload \
--adapter ./llama3-lora \
--base_model meta-llama/Meta-Llama-3-8B-Instruct \
--output ./llama3-merged| 配置 | 是否可行 |
|---|---|
| 3090 / 4090 (24G) | ✅ QLoRA |
| A100 40G | ✅ LoRA |
| A100 80G | ✅ 全参 |
trainer 不量化 → 爆显存eos_token → 不停止生成chat_template 效果更好messages 格式如果你愿意,我可以:
你打算用在什么场景?