大语言模型(LLM)是参数量十亿级以上的 Transformer 模型,靠海量无标注文本预训练获得语言、常识和推理能力。它和传统 NLP 模型的分水岭在三点:参数量差两三个数量级、训练数据从标注转向无标注、能力从单任务专用转向零样本/少样本泛化。这篇把架构、训练、微调、部署四块串起来讲,重点落在能动手验证的 LoRA 微调上。
为什么主流模型都用 Decoder-only
GPT 系列、LLaMA、ChatGLM、Qwen 这几条主流产品线全部采用 Transformer decoder-only 架构:砍掉编码器,只留解码器,自回归地逐 token 生成文本。每个解码器层含两个子层——掩码多头自注意力(前瞻掩码保证生成时看不到未来 token)和前馈网络;每个子层配残差连接与层归一化,撑住深层堆叠的训练稳定性。
一个常见误读要先纠正:性能不是参数量的线性函数。GPT-1 的 1.17 亿参数到 GPT-3 的 1750 亿,能力跃升背后是数据质量、架构优化和训练策略的共同作用,堆参数只是其中一维。另外 LLaMA-2 这类模型权重需要向 Meta 申请许可后才能下载,直接 from_pretrained 拉公开仓库会 403,很多教程对此只字不提。
预训练阶段做的是自回归语言建模:给定前文预测下一个 token,最小化负对数似然。这一步吃算力、吃数据,普通开发者的正确姿势是直接用开源预训练模型,把精力放在微调和落地。
LoRA 微调:训练千分之一的参数
全参数微调 7B 模型对个人和中小团队都不现实。LoRA 的思路是在注意力层旁挂一对低秩矩阵,只训练这部分新增参数,效果逼近全参数微调。
pip install transformers datasets peft accelerate torch bitsandbytes
数据用中文指令集,格式化成"指令/输入/输出"三段式,最长 512 token 截断:
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model, TaskType
import torch
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8, lora_alpha=32, lora_dropout=0.1,
target_modules=["q_proj", "v_proj"],
bias="none", inference_mode=False,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
load_in_4bit=True, device_map="auto", torch_dtype=torch.float16,
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
四个动手细节,每一个都可能让你卡半天:
load_in_4bit=True依赖 bitsandbytes,漏装会在加载时报错而不是安静降级;显存不够时优先降 batch size 加梯度累积,而不是砍训练轮数。- 训练完执行
print_trainable_parameters(),可训练参数占比通常不到 1%——这个数字就是 LoRA 省算力的直接证据,占比异常偏大说明 target_modules 配错了。 - 版本坑:transformers 新版把
evaluation_strategy改名为eval_strategy,老教程的参数名在新环境直接 TypeError;Trainer(tokenizer=...)也已让位于processing_class。报参数错误先查这两处。 - 推理加载要两段式:先加载基座模型,再用
PeftModel.from_pretrained挂 adapter 目录,顺序反了或路径错了都会静默回退成未微调的原始模型——生成结果和基座一模一样时,第一个该查的就是这里。
训练侧常规配置:batch 4、梯度累积 4、学习率 2e-4、3 个 epoch、fp16 混合精度,按 epoch 存档和评估。
部署形态与优化方向
落地分四条路:本地直接加载(开发测试)、FastAPI 服务化(HTTP 接口多客户端调用)、云端 GPU 实例配容器化弹性扩容、边缘侧量化压缩后进嵌入式设备。性能优化三板斧:INT4/INT8 量化压显存提速度;蒸馏把大模型知识压进小模型;vLLM、TensorRT-LLM 这类推理框架用 PagedAttention 技术拉吞吐。
选型判断一句话:先看任务瓶颈在显存、延迟还是吞吐,再对应选量化、蒸馏或推理框架,别三个一起上——每层优化都有精度代价,叠满之后效果退化很难归因。

评论0