Skip to main content

LLaMA 계열 — 오픈소스 LLM의 진화

GPT 계열이 API 기반의 비공개 모델로 발전한 반면, Meta의 LLaMA를 시작으로 오픈소스 LLM 생태계가 급격히 성장했습니다. 이 문서에서는 LLaMA 시리즈와 그에 영향을 받은 주요 오픈소스 모델들의 아키텍처 혁신을 분석합니다.

핵심 아이디어

오픈소스 LLM은 GPT 계열과 같은 디코더 전용(decoder-only) Transformer 구조를 기반으로 하되, 다음과 같은 아키텍처 개선을 적용합니다.
기술목적적용 모델
RoPE (Rotary Position Embedding)상대 위치 인코딩, 외삽(extrapolation) 가능LLaMA, Mistral, Qwen
SwiGLU더 효과적인 활성화 함수LLaMA, Mistral, Qwen
RMSNorm학습 안정성 + 효율성LLaMA, Mistral, Qwen
GQA (Grouped-Query Attention)추론 효율성 (KV 캐시 절약)LLaMA 2, Mistral, Qwen
Sliding Window Attention긴 시퀀스 효율적 처리Mistral

동작 방식: 주요 아키텍처 혁신

RoPE (Rotary Position Embedding)

기존의 학습 가능한 위치 임베딩(BERT, GPT)이나 사인/코사인 위치 인코딩(Transformer 원본)과 달리, RoPE는 쿼리와 키 벡터에 **회전 변환(rotation)**을 적용하여 상대 위치 정보를 인코딩합니다. f(q,m)=RΘ,mq,f(k,n)=RΘ,nkf(q, m) = R_{\Theta,m} \cdot q, \quad f(k, n) = R_{\Theta,n} \cdot k 여기서 RΘ,mR_{\Theta,m}은 위치 mm에 대한 회전 행렬이고, Θ\Theta는 주파수 파라미터입니다. 핵심 성질: 위치 mm의 쿼리와 위치 nn의 키 사이의 어텐션은 **상대 거리 mnm - n**에만 의존합니다. f(q,m)Tf(k,n)=g(q,k,mn)f(q, m)^T f(k, n) = g(q, k, m - n)
import torch

def rotary_embedding(dim, max_seq_len=2048, base=10000):
    """RoPE 회전 행렬을 생성합니다."""
    # 주파수 계산
    inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim))
    # 위치 인덱스
    positions = torch.arange(max_seq_len).float()
    # 외적: (seq_len, dim/2) 크기의 각도 행렬
    angles = torch.einsum("i,j->ij", positions, inv_freq)
    # cos, sin 값 (dim 차원으로 확장)
    cos = angles.cos()  # (seq_len, dim/2)
    sin = angles.sin()  # (seq_len, dim/2)
    return cos, sin

def apply_rope(x, cos, sin):
    """쿼리 또는 키에 RoPE를 적용합니다."""
    # x shape: (batch, seq_len, heads, dim)
    d = x.shape[-1] // 2
    x1, x2 = x[..., :d], x[..., d:]
    # 회전 적용
    rotated = torch.cat([
        x1 * cos - x2 * sin,  # 실수부
        x2 * cos + x1 * sin,  # 허수부
    ], dim=-1)
    return rotated

SwiGLU 활성화 함수

LLaMA는 기존 Transformer의 ReLU FFN 대신 SwiGLU를 사용합니다. SwiGLU(x)=Swish(xW1)(xW2)\text{SwiGLU}(x) = \text{Swish}(xW_1) \otimes (xW_2) 여기서 Swish(x)=xσ(x)\text{Swish}(x) = x \cdot \sigma(x)이고, \otimes는 요소별 곱셈입니다.
import torch.nn as nn
import torch.nn.functional as F

class SwiGLU(nn.Module):
    """SwiGLU 활성화 함수를 포함한 FFN 레이어입니다."""
    def __init__(self, hidden_dim, intermediate_dim):
        super().__init__()
        self.w1 = nn.Linear(hidden_dim, intermediate_dim, bias=False)
        self.w2 = nn.Linear(intermediate_dim, hidden_dim, bias=False)
        self.w3 = nn.Linear(hidden_dim, intermediate_dim, bias=False)

    def forward(self, x):
        # SwiGLU: Swish(xW1) * (xW3), 결과를 W2로 투사
        return self.w2(F.silu(self.w1(x)) * self.w3(x))

GQA (Grouped-Query Attention)

표준 Multi-Head Attention(MHA)에서는 각 Head가 독립적인 Q, K, V를 가집니다. GQA는 여러 Query Head가 하나의 Key-Value Head를 공유하여 KV 캐시 메모리를 절약합니다.
방식KV Head 수KV 캐시성능
MHA= Q Head 수최대최고
GQAQ Head / 그룹 수중간MHA에 근접
MQA1최소약간 하락

모델별 상세 비교

LLaMA (Meta, 2023.02)

Meta가 공개한 최초의 대규모 오픈소스 LLM입니다. “작은 모델을 더 많은 데이터로 학습하면 큰 모델과 비슷한 성능을 달성할 수 있다”는 Chinchilla Scaling Law를 따릅니다.
모델파라미터학습 토큰컨텍스트특징
LLaMA 7B7B1T2,048가장 효율적
LLaMA 13B13B1T2,048GPT-3 175B와 비슷
LLaMA 33B33B1.4T2,048
LLaMA 65B65B1.4T2,048Chinchilla에 근접

LLaMA 2 (Meta, 2023.07)

개선 사항LLaMA 1LLaMA 2
학습 데이터1~1.4T 토큰2T 토큰 (40% 증가)
컨텍스트2,0484,096 (2배)
AttentionMHAGQA (70B 모델)
라이선스연구용상업용 허용
RLHF없음LLaMA 2-Chat (RLHF 적용)

LLaMA 3 / 3.1 (Meta, 2024)

항목LLaMA 2LLaMA 3LLaMA 3.1
최대 파라미터70B70B405B
학습 토큰2T15T15T+
컨텍스트4,0968,192128,000
어휘 크기32,000128,256128,256
GQA70B만전 모델전 모델
멀티모달없음없음비전 + 코드

Mistral (Mistral AI, 2023.09)

프랑스 스타트업 Mistral AI가 공개한 모델로, 작은 크기에서 놀라운 효율성을 보여줍니다.
항목Mistral 7BMixtral 8x7B
파라미터7.3B46.7B (활성 12.9B)
아키텍처Dense TransformerMixture of Experts (MoE)
컨텍스트32,76832,768
AttentionGQA + Sliding WindowGQA + Sliding Window
성능LLaMA 2 13B 초과LLaMA 2 70B와 비슷

Sliding Window Attention (SWA)

Mistral의 핵심 혁신 중 하나입니다. 각 토큰이 전체 시퀀스가 아닌 고정 크기 윈도우 내의 토큰만 직접 참조합니다. 윈도우 크기가 WW이고 레이어 수가 LL이면, 이론적으로 W×LW \times L 거리의 토큰 정보가 전달됩니다. Mistral 7B의 경우 W=4096W=4096, L=32L=32이므로 약 131,072 토큰의 정보를 간접적으로 참조할 수 있습니다.

Qwen (Alibaba, 2023~)

Alibaba Cloud가 공개한 모델로, 중국어와 영어 모두에서 우수한 성능을 보입니다.
항목Qwen 1.5Qwen 2Qwen 2.5
최대 파라미터110B72B72B
컨텍스트32,768128,000128,000
다국어중영 중심29개 언어29개 언어+
코딩기본Qwen2-CoderQwen2.5-Coder
수학기본개선Qwen2.5-Math

종합 비교 테이블

모델파라미터컨텍스트라이선스핵심 혁신
LLaMA 1 (7/13/33/65B)7~65B2,048연구용RoPE, SwiGLU, RMSNorm
LLaMA 2 (7/13/70B)7~70B4,096상업용GQA, RLHF Chat
LLaMA 3.1 (8/70/405B)8~405B128K상업용15T 토큰, 128K vocab
Mistral 7B7.3B32KApache 2.0SWA, Rolling Buffer
Mixtral 8x7B46.7B (12.9B active)32KApache 2.0Sparse MoE
Qwen 2.5 (0.5~72B)0.5~72B128KApache 2.0다국어, 코드, 수학 특화

구현: 오픈소스 LLM 추론

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# Mistral 7B 로드 (예시 - 실제 실행 시 GPU 필요)
model_name = "mistralai/Mistral-7B-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,  # 메모리 절약을 위한 FP16
    device_map="auto",          # 자동 디바이스 할당
)

# 텍스트 생성
prompt = "Explain the concept of attention mechanism in transformers:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=200,
        temperature=0.7,
        top_p=0.9,
        do_sample=True,
    )

response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

양자화를 활용한 경량 추론

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

# 4-bit 양자화 설정
quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",           # NormalFloat4 양자화
    bnb_4bit_compute_dtype=torch.float16,  # 연산은 FP16
    bnb_4bit_use_double_quant=True,        # 이중 양자화
)

# 양자화된 모델 로드 (메모리 약 75% 절약)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=quantization_config,
    device_map="auto",
)

# 이후 추론 방법은 동일
RoPE의 장점은 세 가지입니다. 1) 상대 위치: 절대 위치가 아닌 토큰 간 상대 거리를 인코딩하여 위치 일반화가 우수합니다. 2) 외삽 가능: 학습 시 사용한 길이보다 긴 시퀀스에도 적용할 수 있습니다 (NTK-aware scaling 등의 기법과 결합). 3) 추가 파라미터 없음: 수학적 변환이므로 학습 가능한 파라미터가 불필요합니다.
MoE는 여러 개의 전문가 네트워크(Expert) 중 일부만 선택적으로 활성화하는 구조입니다. Mixtral 8x7B의 경우 8개 FFN 전문가 중 토큰당 2개만 활성화합니다. 총 파라미터는 46.7B이지만 추론 시 활성 파라미터는 12.9B에 불과하여, 큰 모델의 성능을 작은 연산 비용으로 달성합니다. Router 네트워크가 각 토큰을 적합한 전문가에게 라우팅합니다.
라이선스에 따라 다릅니다. LLaMA 2/3는 Meta의 커뮤니티 라이선스로, 월 활성 사용자 7억 이하의 서비스에서 상업 이용이 가능합니다. Mistral과 Qwen 2.5는 Apache 2.0 라이선스로, 제한 없이 상업 이용이 가능합니다. 각 모델의 라이선스를 반드시 확인해야 합니다.

참고 논문

논문저자연도핵심 기여
LLaMA: Open and Efficient Foundation Language ModelsTouvron et al.2023오픈소스 LLM, RoPE+SwiGLU+RMSNorm
Llama 2: Open Foundation and Fine-Tuned Chat ModelsTouvron et al.2023GQA, RLHF Chat, 상업용 라이선스
Mistral 7BJiang et al.2023Sliding Window Attention, 효율성
Mixtral of ExpertsJiang et al.2024Sparse MoE
RoFormer: Enhanced Transformer with Rotary Position EmbeddingSu et al.2021RoPE