← 返回首页
🧠

LLaMA系列模型详解

📂 llm ⏱ 3 min 511 words

--- title: "LLaMA系列模型详解" description: "深入了解LLaMA模型家族的设计理念、架构特点和开源生态" tags: ["LLaMA", "Meta", "开源模型", "大语言模型"] category: "llm" icon: "🧠"

LLaMA系列模型详解

LLaMA简介

LLaMA(Large Language Model Meta AI)是Meta开发的开源大语言模型系列。自2023年发布以来,LLaMA已成为最具影响力的开源LLM之一,推动了整个开源社区的发展。

LLaMA的核心贡献:

LLaMA架构

核心设计

from transformers import LlamaConfig, LlamaModel, LlamaForCausalLM

# LLaMA-2配置
config = LlamaConfig(
    hidden_size=4096,
    intermediate_size=11008,
    num_hidden_layers=32,
    num_attention_heads=32,
    num_key_value_heads=32,  # GQA
    max_position_embeddings=4096,
    rms_norm_eps=1e-6,
    vocab_size=32000,
    rope_theta=10000.0,
    attention_bias=False
)

# 创建模型
model = LlamaForCausalLM(config)
print(f"参数量: {sum(p.numel() for p in model.parameters())/1e9:.1f}B")

关键创新

# 1. RMSNorm(替代LayerNorm)
class RMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.eps = eps
    
    def forward(self, x):
        rms = torch.sqrt(torch.mean(x ** 2, dim=-1, keepdim=True) + self.eps)
        return self.weight * (x / rms)

# 2. SwiGLU激活函数
class SwiGLU(nn.Module):
    def __init__(self, hidden_size, intermediate_size):
        super().__init__()
        self.gate_proj = nn.Linear(hidden_size, intermediate_size, bias=False)
        self.up_proj = nn.Linear(hidden_size, intermediate_size, bias=False)
        self.down_proj = nn.Linear(intermediate_size, hidden_size, bias=False)
    
    def forward(self, x):
        gate = F.silu(self.gate_proj(x))
        return self.down_proj(gate * self.up_proj(x))

# 3. RoPE(旋转位置编码)
class RotaryPositionEmbedding:
    def __init__(self, dim, max_seq_len=4096):
        self.dim = dim
        self.max_seq_len = max_seq_len
        inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2).float() / dim))
        self.inv_freq = inv_freq
    
    def forward(self, x, seq_len):
        t = torch.arange(seq_len, dtype=self.inv_freq.dtype)
        freqs = torch.einsum('i,j->ij', t, self.inv_freq)
        emb = torch.cat((freqs, freqs), dim=-1)
        return emb

LLaMA系列版本

LLaMA-1

# LLaMA-1规格
llama1_configs = {
    "7B": {"hidden_size": 4096, "layers": 32, "heads": 32},
    "13B": {"hidden_size": 5120, "layers": 40, "heads": 40},
    "33B": {"hidden_size": 6656, "layers": 60, "heads": 52},
    "65B": {"hidden_size": 8192, "layers": 80, "heads": 64}
}

# 特点:
# - 首个真正开放的大模型(权重开放)
# - 在基准测试上超过GPT-3
# - 训练数据:1.4万亿token

LLaMA-2

# LLaMA-2改进
llama2_improvements = {
    "训练数据": "2万亿token(40%增加)",
    "上下文长度": "4096(与LLaMA-1相同)",
    "GQA": "使用分组查询注意力",
    "RLHF": "经过RLHF对齐"
}

# LLaMA-2规格
llama2_configs = {
    "7B": {"params": "7B", "context": 4096},
    "13B": {"params": "13B", "context": 4096},
    "70B": {"params": "70B", "context": 4096},
    "Chat": "经过Chat微调的版本"
}

LLaMA-3

# LLaMA-3改进
llama3_improvements = {
    "训练数据": "15万亿token(大幅增加)",
    "词汇表": "128K(从32K扩展)",
    "上下文长度": "8K(标准版)/ 128K(长上下文版)",
    "GQA": "所有模型都使用GQA"
}

# LLaMA-3规格
llama3_configs = {
    "8B": {"hidden": 4096, "layers": 32, "heads": 32, "kv_heads": 8},
    "70B": {"hidden": 8192, "layers": 80, "heads": 64, "kv_heads": 8},
    "405B": {"hidden": 16384, "layers": 126, "heads": 128, "kv_heads": 8}
}

使用LLaMA

加载模型

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

# 加载LLaMA-3
model_name = "meta-llama/Meta-Llama-3-8B-Instruct"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
    attn_implementation="flash_attention_2"
)

# 推理
messages = [
    {"role": "system", "content": "你是一个有帮助的助手"},
    {"role": "user", "content": "什么是机器学习?"}
]

inputs = tokenizer.apply_chat_template(
    messages,
    return_tensors="pt"
).to(model.device)

outputs = model.generate(inputs, max_new_tokens=256)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

使用vLLM部署

from vllm import LLM, SamplingParams

# vLLM部署LLaMA
llm = LLM(
    model="meta-llama/Meta-Llama-3-8B-Instruct",
    tensor_parallel_size=1,
    max_model_len=8192,
    gpu_memory_utilization=0.9
)

sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=512
)

prompts = ["什么是深度学习?", "解释神经网络"]
outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(output.outputs[0].text)

微调LLaMA

LoRA微调

from peft import LoraConfig, get_peft_model
from transformers import TrainingArguments, Trainer

# LoRA配置
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

# 加载和配置模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B")
model = get_peft_model(model, lora_config)

# 训练
training_args = TrainingArguments(
    output_dir="./llama-finetuned",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    learning_rate=2e-4,
    fp16=True,
    optim="paged_adamw_8bit"
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset
)

trainer.train()

LLaMA生态

主要衍生模型

# LLaMA生态
ecosystem = {
    "通用助手": [
        "Alpaca (Stanford)",
        "Vicuna",
        "WizardLM"
    ],
    "代码": [
        "CodeLlama",
        "DeepSeek-Coder",
        "CodeFuse"
    ],
    "数学": [
        "MetaMath",
        "WizardMath"
    ],
    "中文": [
        "Chinese-LLaMA",
        "Linly",
        "Firefly"
    ],
    "多模态": [
        "LLaVA",
        "MiniGPT-4",
        "InstructBLIP"
    ]
}

性能对比

# LLaMA-3 vs 竞品
comparison = {
    "LLaMA-3-8B": {
        "MMLU": "68.4",
        "HumanEval": "62.2",
        "优势": "开源、高效、社区活跃"
    },
    "Mistral-7B": {
        "MMLU": "62.5",
        "HumanEval": "30.5",
        "优势": "高效、Sliding Window Attention"
    },
    "Qwen-7B": {
        "MMLU": "74.2",
        "HumanEval": "64.6",
        "优势": "中文优化、多模态"
    }
}

最佳实践

  1. 选择合适的版本:根据硬件和任务选择模型大小
  2. 使用量化:INT4/INT8量化降低部署成本
  3. 应用对齐:使用Chat版本或进行RLHF训练
  4. 优化推理:使用vLLM或TensorRT-LLM加速
  5. 持续更新:关注LLaMA新版本发布

LLaMA系列通过开源和持续创新,已成为LLM领域最重要的模型家族之一。