AI/LLM

Engram: LLM에 '기억의 서랍'을 달아주다

Tech코알라 2026. 1. 15. 10:10

들어가며: 언어 모델은 왜 비효율적일까?

 

여러분이 **"알렉산더 대왕"**이라는 단어를 처음 본다고 상상해보세요. 우리 뇌는 즉시 이 정보를 인식하고 관련 지식을 떠올립니다.

하지만 현재의 대규모 언어 모델(LLM)은 이런 간단한 작업을 위해 여러 레이어의 복잡한 계산을 거쳐야 합니다.

💡 비유: 전화번호부에서 번호를 찾는 대신, 매번 숫자를 하나씩 계산해서 맞춰보는 것과 같습니다.

 

DeepSeek-AI의 최신 연구 Engram은 바로 이 문제를 해결합니다.

논문 정보

  • 제목: Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models
  • 기관: DeepSeek-AI & Peking University
  • 발표: 2025년
  • 코드: GitHub
 

GitHub - deepseek-ai/Engram: Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models

Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models - deepseek-ai/Engram

github.com

 

핵심 아이디어: 계산과 기억의 분리 

 

언어 모델의 두 가지 임무

 

언어를 이해하고 생성하는 작업은 크게 두 가지로 나뉩니다:


작업 유형 예시 요구사항
동적 추론 "만약 A이고 B라면, C일 것이다" 복잡한 계산
정적 지식 "대한민국의 수도는 서울이다" 빠른 검색

기존 Transformer 모델은 이 두 가지를 모두 계산으로 처리했습니다.

질문: 정적 지식까지 매번 계산으로 "재구성"하는 건 낭비가 아닐까요?

 

Engram의 해법: 조건부 메모리

graph LR
    A[기존 Transformer] --> B[모든 것을 계산으로 해결]
    C[MoE] --> D[조건부 계산<br/>필요한 전문가만 활성화]
    E[Engram] --> F[조건부 메모리<br/>정적 지식은 직접 검색]
    
    style E fill:#4CAF50
    style F fill:#8BC34A

 

**MoE(Mixture-of-Experts)**가 "조건부 계산"으로 모델 용량을 확장했다면, Engram은 "조건부 메모리"라는 새로운 축을 추가합니다.

 

Engram의 작동 원리 

1) N-gram 기반 해싱 룩업

 

Engram은 고전적인 N-gram 모델의 현대화 버전입니다:

# 입력 시퀀스
input_text = "알렉산더 대왕"

# N-gram 추출
bigrams = ["알렉산더", "대왕"]
trigrams = ["알렉산더 대왕"]

# 해시 함수로 인덱스 계산
indices = [hash_function(ngram) for ngram in bigrams + trigrams]

# O(1) 시간에 임베딩 테이블에서 검색
embeddings = [embedding_table[idx] for idx in indices]

# 결합하여 메모리 벡터 생성
memory_vector = concatenate(embeddings)

핵심: O(1) 룩업 - 테이블 크기와 관계없이 일정한 시간에 검색 가능!

2) 똑똑한 토크나이저 압축

 

일반 토크나이저의 문제:

  • Apple ≠ apple ≠ ␣apple ≠ APPLE
  • 의미는 같지만 다른 토큰으로 취급

Engram의 해결책:

# 정규화 함수 (NFKC + 소문자화)
def normalize_token(token):
    token = token.lower()
    token = remove_whitespace(token)
    token = normalize_unicode(token)
    return token

# 압축 맵핑
compression_map = {
    'Apple': 'apple',
    '␣apple': 'apple', 
    'APPLE': 'apple',
    'ápple': 'apple'  # 악센트 제거
}

 

결과:

  • 어휘 크기 23% 감소
  • 메모리 활용 효율성 증대
  • 의미 밀도 향상

3) 컨텍스트 인식 게이팅

검색된 메모리가 항상 유용한 건 아닙니다. 해시 충돌이나 다의어 문제가 있을 수 있죠.

# 어텐션 기반 게이팅 메커니즘
def context_aware_gating(hidden_state, retrieved_memory):
    # Query: 현재 문맥 이해 상태
    query = RMSNorm(hidden_state)
    
    # Key/Value: 검색된 메모리
    key = W_K @ RMSNorm(retrieved_memory)
    value = W_V @ retrieved_memory
    
    # 유사도 계산
    similarity = (query @ key.T) / sqrt(d_model)
    gate_score = sigmoid(similarity)  # 0~1 사이 값
    
    # 문맥과 맞지 않으면 게이트를 닫음
    output = gate_score * value
    
    return output

동작 방식:

  • gate_score ≈ 1: 메모리가 문맥과 잘 맞음 → 활용
  • gate_score ≈ 0: 메모리가 문맥과 안 맞음 → 억제

4) 전체 아키텍처

┌─────────────────────────────────────────┐
│         Input: "Alexander the Great"     │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│     Vocabulary Embedding (표준)          │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│   Transformer Block 1 (Attention + MoE) │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│   Transformer Block 2 + Engram ✨       │
│   ┌─────────────────────────────────┐   │
│   │ 1. N-gram 추출 & 해싱           │   │
│   │ 2. 임베딩 테이블 룩업           │   │
│   │ 3. 컨텍스트 게이팅              │   │
│   │ 4. 백본과 융합                  │   │
│   └─────────────────────────────────┘   │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│   Transformer Blocks 3-14               │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│   Transformer Block 15 + Engram ✨      │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│   Transformer Blocks 16-30              │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│         Output Logits                   │
└─────────────────────────────────────────┘

놀라운 실험 결과 

공정한 비교를 위한 설정

모델 총 파라미터 활성 파라미터 전문가 수 Engram
Dense-4B 4.1B 3.8B - -
MoE-27B 26.7B 3.8B 72 -
Engram-27B 26.7B 3.8B 55 5.7B
Engram-40B 39.5B 3.8B 55 18.5B

중요: 모두 동일한 계산 비용 (3.8B 활성 파라미터, 262B 토큰)!

결과 1: 지식 검색 (예상된 향상)

메모리 모듈이니 당연히 지식 태스크에서 강할 거라 예상했습니다:

벤치마크 MoE-27B Engram-27B 향상
MMLU 57.4 60.4 +3.0
CMMLU 57.9 61.9 +4.0
MMLU-Pro 28.3 30.1 +1.8
TriviaQA 48.8 50.7 +1.9

결과 2: 추론 능력

 

놀랍게도 추론 태스크에서 훨씬 더 큰 향상을 보였습니다:

벤치마크 MoE-27B Engram-27B 향상
BBH 50.9 55.9 +5.0 🔥
ARC-Challenge 70.1 73.8 +3.7 🔥
DROP 55.7 59.0 +3.3 🔥

 

코드/수학도 마찬가지

벤치마크 MoE-27B Engram-27B 향상
HumanEval 37.8 40.8 +3.0 🔥
MATH 28.3 30.7 +2.4 🔥
GSM8K 58.4 60.6 +2.2 🔥

🤔 의문: 왜 단순한 "메모리"가 복잡한 추론 능력까지 향상시킬까?

 

결과 3: 긴 컨텍스트 처리 (압도적!)

태스크 MoE-27B Engram-27B 향상
Multi-Query NIAH 84.2 97.0 +12.8 💥
Variable Tracking 77.0 89.0 +12.0 💥
Common Words Extraction 73.0 99.6 +26.6 💥

학습 곡선 비교

Validation Loss
    │
1.81│     ╱╲
    │    ╱  ╲  Dense-4B
    │   ╱    ╲
1.76│  ╱      ╲___________________
    │ ╱           MoE-27B
    │╱              ╲
1.71│                ╲____________  
    │                   Engram-27B ✨
1.66│                      ╲________
    │                         Engram-40B ✨
    └─────────────────────────────────▶
     0    50k   100k  150k  200k  262k
              Training Tokens

 

비밀의 메커니즘: "효과적인 깊이 증가" 

 

연구팀은 LogitLensCKA(Centered Kernel Alignment) 분석을 통해 Engram의 작동 원리를 파헤쳤습니다.


발견 1: 빠른 예측 수렴

 

LogitLens 분석: 각 레이어의 출력을 LM Head로 투영하여 최종 예측과의 차이를 측정

KL Divergence (작을수록 좋음)
    │
 10 │ MoE ●─────●
    │      ╲     ╲
  8 │       ●     ●
    │        ╲     ╲
  6 │         ●     ●───●
    │          ╲         ╲
  4 │           ●         ●─●
    │  Engram   ╲           ╲
  2 │   ✨──●────●───●       ●
    │       ╲     ╲   ╲       ╲
  0 │        ●────●───●───●───●
    └─────────────────────────────▶
     0   5   10  15  20  25  30
            Layer Index

의미: Engram 모델은 초기 레이어에서 KL divergence가 훨씬 빠르게 감소 → 더 빠르게 확신 있는 표현을 생성

 

발견 2: 레이어 정렬의 이동

 

CKA 분석: 서로 다른 모델의 레이어 간 표현 유사도 측정

MoE Layers
     ↑
  30 │ ░░░░░░░░░░░░░░░░░░░░░░░░
     │ ░░░░░░░░░░░░░░░░░░░░░░░░
  25 │ ░░░░░░░░░░░░░░░░░░░░░░░░
     │ ░░░░░░░░░░▓▓▓▓▓▓░░░░░░░
  20 │ ░░░░░░░▓▓▓▓▓▓▓▓▓▓░░░░░
     │ ░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░
  15 │ ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░  ← 대각선이 위로 이동!
     │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░
  10 │ ▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░
     │ ▓▓▓▓▓▓░░░░░░░░░░░░░░░░
   5 │ ▓▓░░░░░░░░░░░░░░░░░░░░
     │ ░░░░░░░░░░░░░░░░░░░░░░
   0 └─────────────────────────▶
     0  5  10 15 20 25 30
        Engram Layers

▓ = 높은 유사도  ░ = 낮은 유사도
핵심 발견:
Engram Layer 5 ≈ MoE Layer 12
Engram Layer 10 ≈ MoE Layer 18
Engram Layer 15 ≈ MoE Layer 22

Engram이 "더 깊은" 네트워크처럼 작동!

 

왜 이런 일이 발생할까?

 

기존 LLM의 문제점

Input: "Diana, Princess of Wales"

Layer 1-2: "Diana" 토큰 인식
   ↓ (계산 소비)
Layer 3: "Princess" 추가
   ↓ (계산 소비)  
Layer 4: "Princess of Wales" 조합
   ↓ (계산 소비)
Layer 5: "of Wales" 정제
   ↓ (계산 소비)
Layer 6: 최종적으로 "Diana, Princess of Wales" 엔티티 완성
   ↓
... 이제 진짜 추론 시작 가능

문제: 귀중한 레이어를 단순 패턴 조합에 소비 → 추론에 쓸 “유효 깊이”가 줄어듦

 

Engram의 해결책

Input: "Diana, Princess of Wales"

Layer 1: 표준 어텐션
   ↓
Layer 2 + Engram:
   ├─ 백본: 기본 처리
   └─ Engram: "Diana, Princess of Wales" 직접 룩업! ⚡
   
   → 즉시 엔티티 인식 완료
   ↓
Layer 3-30: 전부 진짜 추론에 사용 가능! 🎯

결과

  • 초기 레이어 해방
  • 모든 깊이를 진짜 추론에 투입
  • 효과적인 네트워크 깊이” 증가

💡 핵심 통찰: 이것이 추론 능력이 더 크게 향상된 이유!

 

어텐션 용량 해방

 

로컬 의존성을 Engram이 처리하니까:

기존 Attention:
├─ 로컬 패턴 (30%) → "the", "of", "in" 같은 연결
├─ 중거리 의존성 (40%)
└─ 전역 컨텍스트 (30%)

Engram + Attention:
├─ 로컬 패턴 (0%) → Engram이 처리! ✨
├─ 중거리 의존성 (40%)
└─ 전역 컨텍스트 (60%) ← 2배 증가! 🚀

그래서 긴 컨텍스트 태스크에서 성능이 압도적으로 상승.

 

U자형 스케일링 법칙

 

연구팀의 질문:

💬 “고정된 파라미터 예산이 있을 때, MoE와 Engram에 각각 얼마나 할당해야 할까?”

 

할당 비율 실험

 

할당 비율 ρ 정의:

  • ρ = 100%: 순수 MoE (모든 비활성 파라미터를 전문가로)
  • ρ = 0%: 순수 Engram (모든 비활성 파라미터를 메모리로)

결과: U자형 곡선!

Validation Loss
      │
1.745 │           ╱─────╲
      │          ╱       ╲
1.735 │         ╱         ╲ Pure MoE (ρ=100%)
      │        ╱           ╲
1.725 │       ╱             ╲
      │      │               │
1.715 │     │  최적점 ⭐      │
      │    │   ρ≈75-80%      │
1.705 │   │                  │
      │  ╱                    ╲
1.695 │ ╱                      ╲
      └────────────────────────────▶
       0%  20  40  60  80  100%
          Engram ← ρ → MoE
          
━━━ 2e20 FLOPs
─ ─ 6e20 FLOPs
     
할당 비율 특징 문제점
ρ = 100% (순수 MoE) 최대 계산 능력 / 동적 추론 강함 ❌ 정적 지식을 비효율적으로 계산으로 재구성
ρ = 0% (순수 Engram) 최대 메모리 용량 / 지식 검색 강함 ❌ 동적 추론 능력 부족 (메모리로 계산 대체 불가)
ρ ≈ 75–80% (최적 혼합) ⭐ MoE 75% + Engram 25% ✅ 최적 성능

 

의미: 두 메커니즘이 구조적으로 상호보완적이라는 증거. 단순 합이 아니라 비선형 시너지.

# 수식으로 표현하면
Performance = f(Computation, Memory)

# 단순 합이 아니라 시너지!
Performance != alpha * MoE + beta * Engram
Performance = synergy(MoE, Engram)  # 비선형 관계

 

무한 메모리 실험 

 

두 번째 질문: “계산 비용은 고정하고 메모리만 늘리면?”

 

실험 설정

  • 고정: 3B MoE 백본, 100B 토큰 학습
  • 변수: Engram 슬롯 수 (258K → 10M)

결과: 로그-선형 스케일링

 

Validation Loss
      │
1.81  │ ●
      │  ╲
1.80  │   ●
      │    ╲  OverEncoding (기존 방법)
1.79  │     ●
      │      ╲
1.78  │       ●─────●
      │              ╲
1.77  │        Engram ✨╲
      │                  ●
1.76  │                   ╲
      │                    ●
1.75  │                     ╲
      │                      ●
1.74  │                       ╲
      │                        ●
      └──────────────────────────▶
        10⁵  10⁶  10⁷  10⁸
        Embedding Slots (로그 스케일)
Loss = a - b × log(Memory_Size)

a ≈ 1.81 (상한)
b ≈ 0.01 (스케일링 계수)

 

의미

  1. 예측 가능한 스케일링
  2. 추가 계산 불필요(FLOPs 고정)
  3. 같은 메모리로 OverEncoding보다 효율적

시스템 효율성: 현실 세계 배포 

⚠️ 이론적으로 좋아도 실전에서 느리면 무용지물.

 

문제: GPU 메모리 제약

예시: 100B 파라미터 임베딩 테이블
= 100B × 2 bytes (FP16) = 200GB

NVIDIA H100 GPU HBM = 80GB
→ 테이블이 GPU에 안 들어감! 💥

 

 

해결책: 결정론적 프리페칭

 

MoE vs Engram의 근본 차이:

단계 MoE Engram
1. 입력 토큰 시퀀스 토큰 시퀀스
2. 처리 여러 레이어 계산 필요 ⏳ 즉시 N-gram 추출 ⚡
3. 인덱스 은닉 상태 기반 라우팅 → 런타임에만 결정 ❌ 해시 함수로 인덱스 계산 → 사전 결정 ✅
4. 로드 동적 로드(예측 불가) 프리페칭 가능 🚀

 

구현 전략

 

학습 시 (Training)

┌──────────┐   ┌──────────┐   ┌──────────┐
│  GPU 0   │   │  GPU 1   │   │  GPU 2   │
│          │   │          │   │          │
│ Table    │   │ Table    │   │ Table    │
│ Shard 0  │   │ Shard 1  │   │ Shard 2  │
└────┬─────┘   └────┬─────┘   └────┬─────┘
     │              │              │
     └──────────────┼──────────────┘
                    │
              All-to-All 통신
                    │
          ┌─────────▼─────────┐
          │  필요한 임베딩만   │
          │  각 GPU로 수집    │
          └───────────────────┘

 

추론 시 (Inference)

┌─────────────────────────────────────┐
│         Host Memory (DRAM)          │
│   100B Parameter Table (200GB)      │
│                                     │
│   ┌──────────┐  ┌──────────┐       │
│   │ Frequent │  │   Rare   │       │
│   │Embeddings│  │Embeddings│       │
│   └─────┬────┘  └────┬─────┘       │
└─────────┼────────────┼─────────────┘
          │            │
    PCIe  │   Async    │  PCIe
    Fast  │  Prefetch  │  Slow
          │            │
┌─────────▼────────────▼─────────────┐
│         GPU (HBM 80GB)              │
│                                     │
│  Time: T=0                          │
│  ┌──────────────┐                  │
│  │  Block 1     │ ← 계산 중         │
│  └──────────────┘                  │
│                                     │
│  ┌──────────────┐                  │
│  │  Block 2     │ ← 다음 블록       │
│  │  + Engram    │ ← 임베딩 프리페치! │
│  └──────────────┘                  │
│                                     │
│  Time: T=1                          │
│  ┌──────────────┐                  │
│  │  Block 2     │ ← 계산 중         │
│  │  + Engram    │ ← 이미 준비됨! ✅  │
│  └──────────────┘                  │
└─────────────────────────────────────┘

핵심: Block 1 계산 동안 Block 2 임베딩을 미리 가져옴!
 

실험 결과 (오프로드 + 처리량)

 

100B 파라미터 테이블을 호스트 DRAM에 오프로드

모델 기준 처리량 (tok/s) +Engram 처리량 (tok/s) 오버헤드
Dense-4B 9,031.62 8,858.28 1.9%
Dense-8B 6,315.52 6,140.02 2.8%

🎉 결론: 100B 파라미터를 추가해도 처리량 감소가 3% 미만


다층 캐시 계층 (Multi-Level Cache)

 

N-gram은 자연스럽게 Zipfian 분포를 따릅니다:

Frequency
    │
10⁶ │ ●
    │ ●
10⁵ │ ●●
    │ ●●●
10⁴ │ ●●●●
    │ ●●●●●●
10³ │ ●●●●●●●●
    │ ●●●●●●●●●●●●
10² │ ●●●●●●●●●●●●●●●●●
    │ ●●●●●●●●●●●●●●●●●●●●●
10¹ │ ●●●●●●●●●●●●●●●●●●●●●●●●●●●
    └─────────────────────────────────▶
      1   10   100  1K   10K  100K
               N-gram Rank

80%의 접근이 상위 20%의 N-gram에 집중!
class MultiLevelCache:
    def __init__(self):
        self.l1_cache = GPUCache(size="1GB", speed="fast")
        self.l2_cache = DRAMCache(size="100GB", speed="medium")
        self.l3_storage = SSDStorage(size="1TB", speed="slow")

    def get_embedding(self, ngram_id):
        # L1 체크 (GPU HBM)
        if ngram_id in self.l1_cache:
            return self.l1_cache[ngram_id]  # ~10ns

        # L2 체크 (Host DRAM)
        if ngram_id in self.l2_cache:
            emb = self.l2_cache[ngram_id]  # ~100ns
            self.l1_cache.put(ngram_id, emb)
            return emb

        # L3 로드 (SSD)
        emb = self.l3_storage[ngram_id]  # ~10μs
        self.l2_cache.put(ngram_id, emb)
        self.l1_cache.put(ngram_id, emb)
        return emb

 

구조 분석과 설계 선택 

 

어디에 Engram을 넣을까?

 

레이어 1~12 sweep 실험 결과:

Validation Loss
      │
1.83  │●
      │ ╲
1.81  │  ●
      │   ╲
1.79  │    ●
      │     ╲
1.77  │      ╲___⭐ Layer 2 (최적!)
      │          ●──●
1.75  │              ╲
      │               ●──●
1.73  │                   ╲
      │                    ●──●
      └────────────────────────────▶
       1  2  3  4  5  6  7  8  9  10 11 12
                Layer Index

 

레이어 장점 단점
Layer 1 (너무 이르게) 초기에 로컬 패턴 처리
깊이 절약 최대
❌ 게이팅 문맥 부족
❌ 브랜치 분화 미흡
Layer 2 (최적) ⭐ ✅ 1회 어텐션으로 충분한 문맥
✅ 여전히 조기 개입
-
Layer 10+ (너무 늦게) 풍부한 문맥
정교한 게이팅
❌ 이미 깊이를 낭비
❌ 효과 감소

 

다층 배치의 이점

  • 단일 레이어(1.6B 메모리를 Layer 2에만): Loss = 1.770
  • 다층 배치(1.6B를 Layer 2 + 6에 분산): Loss = 1.768 (더 좋음)

이유

  • Layer 2: 조기 개입 + 로컬 패턴
  • Layer 6: 풍부한 문맥 + 정교한 게이팅
    추가로 시스템 관점에서 프리페치 윈도우도 확보됨.

중요한 컴포넌트 (Ablation)

Component               │ Loss without it  │ Impact
────────────────────────┼──────────────────┼────────
Reference (full)        │ 1.768           │ -
────────────────────────┼──────────────────┼────────
❌ Multi-branch          │ 1.773 (+0.005)  │ 🔥 High
❌ Context gating        │ 1.778 (+0.010)  │ 🔥 High
❌ Token compression     │ 1.775 (+0.007)  │ 🔥 High
────────────────────────┼──────────────────┼────────
❌ Short conv            │ 1.769 (+0.001)  │ 💚 Low
❌ 4-gram (add)          │ 1.770 (+0.002)  │ 💚 Low
# ❌ 단일 게이팅
output = gate(hidden) * memory

# ✅ 브랜치별 게이팅
for branch in branches:
    output[branch] = gate[branch](hidden[branch]) * memory
# ❌ 단순 평균
output = (hidden + memory) / 2

# ✅ 어텐션 기반 게이팅 (개념 표현)
output = attention(hidden, memory) * memory

 

실제 사례: 게이팅 시각화

 

영어 예시 1

<bos> Only Alexander the Great could tame the horse Bucephalus.

게이팅 활성화 (빨간색 = 강함):
      ████  ███  █████
<bos> Only Alexander the Great could tame the horse Bucephalus.

 

  • Alexander + the + Great 조합에서 강하게 활성화
  • Engram이 “Alexander the Great” 엔티티를 구문 단위로 인식

영어 예시 2

<bos> By the way, I am a fan of the Milky Way.

게이팅 활성화:
   ███ ███                  ███  █████ ███
<bos> By the way, I am a fan of the Milky Way.

 

 

  • “By the way” (관용 표현) 강하게 활성화
  • “the Milky Way” (엔티티) 강하게 활성화
  • 같은 “the Way”라도 문맥에 따라 반응이 달라짐

중국어 예시 1

<bos> 中国四大发明包括:造纸术、指南针、火药和印刷术。

게이팅 활성화:
     ████████
<bos> 中国四大发明包括:造纸术、指南针、火药和印刷术。
      (Four Great Inventions)

 

 

중국어 예시 2

<bos> 东汉末年名医张仲景,因其卓越的贡献被后世尊称为'医圣'...

게이팅 활성화:
              ██████
<bos> 东汉末年名医张仲景,因其卓越的贡献被后世尊称为'医圣'...
              (Zhang Zhongjing)

 

게이팅 점수 분포

Gate Score Distribution
    │
100%│                    ▁▂
    │              ▃▅▇███████▅▃
 80%│         ▂▅███████████████▅▂
    │      ▃▅██████████████████████▃
 60%│   ▂▅██████████████████████████▅▂
    │  ▅███████████████████████████████▅
 40%│▃███████████████████████████████████▃
    │████████████████████████████████████
 20%│████████████████████████████████████
    │████████████████████████████████████
  0%│████████████████████████████████████
    └───────────────────────────────────▶
    Common  Function  Entities  Idioms
    Words    Words

    낮음 ← Gate Activation → 높음

 

더 깊은 분석: 민감도 실험

🧪 “Engram을 완전히 꺼버리면 어떻게 될까?”

 

실험 설정 (Post-hoc Ablation)

  1. 학습: Engram 포함 정상 학습
  2. 추론: Engram_output = 0
  3. 평가: 각 태스크 성능 측정

주의: 학습-추론 불일치로 노이즈 가능 → 극단적인 태스크 중심으로 해석

 

결과: 기능적 이분법

Retained Performance (%)
    │
100%│     93%   89%   84%   81%
    │██   ██    ██    ██    ██
 80%│██   ██    ██    ██    ██   76%   72%
    │██   ██    ██    ██    ██   ██    ██
 60%│██   ██    ██    ██    ██   ██    ██   58%
    │██   ██    ██    ██    ██   ██    ██   ██
 40%│██   ██    ██    ██    ██   ██    ██   ██   44%   44%   29%
    │██   ██    ██    ██    ██   ██    ██   ██   ██    ██    ██
 20%│██   ██    ██    ██    ██   ██    ██   ██   ██    ██    ██
    │██   ██    ██    ██    ██   ██    ██   ██   ██    ██    ██
  0%└──┴───┴────┴────┴────┴────┴────┴────┴────┴────┴─────────
     C3 RACE DROP ARC- Hella BBH  MMLU Human MATH Trivia PopQA
       Mid       Chal Swag            Eval      QA

    독해     상식추론    지식추론  코드/수학   사실지식
    ────────────────────────────────────────────────▶
    높은 보존                              낮은 보존

 

태스크 유형 보존율 해석
독해 (C3, RACE) 81–93% ✅ 문맥이 주어져 백본 어텐션으로 충분, Engram은 보조
상식 추론 (HellaSwag, ARC) 75–85% 일부 상식 필요, Engram이 추가 향상
지식 추론 (BBH, MMLU) 58–78% ⚠️ 지식+추론 혼합, Engram 역할 증가
코드/수학 (HumanEval, MATH) 62–76% ⚠️ 공식/패턴 기억에 기여, 논리는 백본도 수행
사실 지식 (TriviaQA, PopQA) 29–44% ❌ Engram이 주 저장소, 백본만으론 부족

 

핵심 통찰: Engram의 이중 역할

  1. 주 저장소(Primary Storage): 사실 지식 질문은 Engram 의존도 매우 큼
  2. 보조 증폭기(Auxiliary Amplifier): 독해/추론은 백본이 충분하되 Engram이 추가 향상

실무 적용 가이드 

 

언제 Engram을 사용해야 할까? (권장)

상황 이유 예상 효과
지식 집약 도메인(의료/법률/과학) 사실 지식 저장 필요 MMLU +3~4점
긴 컨텍스트(32k+ 토큰) 어텐션 용량 해방 NIAH +13점 수준
제한된 GPU + 풍부한 호스트 메모리 오프로딩 효율 오버헤드 <3%
프로덕션(낮은 지연 중요) 결정론적 프리페칭 가능 예측 가능한 성능
다국어 모델 언어별 패턴 저장 언어 전반 개선

 

주의 상황

상황 이유 대안
극소형 모델(<1B) 오버헤드가 상대적으로 큼 순수 Dense/MoE
느린 메모리(네트워크 저장소) 지연 증가 로컬 DRAM/SSD 필요
즉시 배포(추가 학습 불가) 처음부터 학습 필요 사전학습 모델 사용
실시간 업데이트가 핵심 정적 메모리 한계 비파라메트릭 메모리(RAG류)

 

구현 체크리스트

 

단계 1: 아키텍처 설계 

# 1. 백본 선택
backbone = "MoE"  # 또는 Dense
num_experts = 72
active_experts = 6

# 2. 할당 비율 결정
allocation_ratio = 0.75  # MoE 75%, Engram 25%

# 3. Engram 크기 계산 (개념 예시)
total_params = 27e9
active_params = 3.8e9
sparse_params = total_params - active_params

moe_params = sparse_params * allocation_ratio
engram_params = sparse_params * (1 - allocation_ratio)

print(f"MoE experts: {int(num_experts * allocation_ratio)}")
print(f"Engram params: {engram_params / 1e9:.1f}B")

 

예시 출력:

MoE experts: 54
Engram params: 5.7B

 

단계 2: Engram 설정

engram_config = {
    # N-gram 설정
    "ngram_orders": [2, 3],  # 2-gram, 3-gram
    "num_heads": 8,          # 멀티헤드 해싱

    # 임베딩 설정
    "embedding_dim": 1280,   # 백본 dim의 50%
    "vocab_compression": True,  # 토크나이저 압축

    # 레이어 배치
    "layers": [2, 15],       # 조기 + 중기

    # 통합 방식
    "integration": "multi_branch",  # mHC
    "conv_kernel": 4,
    "conv_dilation": 3,

    # 학습 설정
    "optimizer": "adam",     # 임베딩은 Adam
    "lr_multiplier": 5.0,    # 백본의 5배 LR
    "weight_decay": 0.0      # 임베딩 decay 없음
}

 

단계 3: 시스템 최적화

# 학습 시
training_config = {
    "sharding": "expert_parallel + engram_parallel",
    "communication": "all_to_all",
    "gradient_accumulation": True
}

# 추론 시
inference_config = {
    "offloading": {
        "enabled": True,
        "target": "host_memory",
        "prefetch_layers": 1  # 1레이어 앞서 프리페치
    },
    "caching": {
        "l1_gpu": "1GB",
        "l2_dram": "100GB",
        "l3_ssd": "1TB"
    },
    "batch_optimization": {
        "batch_size": 32,
        "sequence_length": 4096
    }
}

 

성능 벤치마킹(측정 항목)

metrics = {
    # 모델 품질
    "perplexity": measure_ppl(model, test_data),
    "downstream_tasks": evaluate_benchmarks(model),

    # 시스템 효율
    "throughput_tokens_per_sec": measure_throughput(model),
    "latency_p50_ms": measure_latency(model, percentile=50),
    "latency_p99_ms": measure_latency(model, percentile=99),

    # 메모리
    "gpu_memory_peak_gb": measure_peak_memory(model),
    "host_memory_used_gb": measure_host_memory(model),

    # 통신
    "prefetch_hit_rate": measure_cache_hits(model),
    "communication_overhead_pct": measure_comm_overhead(model)
}

 

목표 벤치마크

Target Performance:
✅ Perplexity: ≤ MoE baseline
✅ MMLU: +2~4 points
✅ BBH: +3~5 points
✅ Throughput degradation: <5%
✅ P99 latency increase: <10%
✅ Prefetch hit rate: >90%

 

일반적인 문제 해결

 

문제 1: 성능 향상 미미 

# 체크리스트
checks = {
    "할당 비율": "ρ가 최적값(75-80%)인가?",
    "레이어 배치": "너무 깊거나 얕지 않은가?",
    "학습률": "임베딩 LR이 충분히 높은가? (5x)",
    "토크나이저": "압축이 활성화되었는가?",
    "게이팅": "Context-aware 게이팅 사용하는가?"
}

# 예시 해결
if allocation_ratio > 0.9:
    allocation_ratio = 0.75  # MoE 과다

layers = [2, 15]  # 너무 깊으면 조정 (예시)

 

문제 2: 추론 속도 느림

# 예시 해결
config.prefetch = True
config.prefetch_layers = 1

l1_cache_size = "1GB"
batch_size = 32

 

문제 3: 메모리 부족 (CUDA OOM)

# 예시 해결
offloading_enabled = True
offload_target = "host_memory"

precision = "fp16"  # 또는 fp8
gradient_accumulation_steps = 4
 

결론: 패러다임의 전환

 

Engram은 단순 “성능 개선 트릭”이 아니라, 모델링 패러다임의 축을 하나 더 여는 접근처럼 보입니다.

 

핵심 통찰

 

1) 구조적 분리의 힘

Language Modeling
    │
    ├─ 동적 추론 → MoE (조건부 계산)
    │   • 논리적 사고
    │   • 맥락 이해
    │   • 창의적 생성
    │
    └─ 정적 지식 → Engram (조건부 메모리) ✨
        • 사실 기억
        • 패턴 인식
        • 엔티티 검색

 

2) 예상 밖의 시너지

기대: Engram → 지식 +3점
현실: Engram → 지식 +3점, 추론 +5점! 🤯

정적 지식 오프로드
  ↓
초기 레이어 해방
  ↓
효과적인 깊이 증가
  ↓
추론 능력 향상

 

3) 스케일링 법칙

  • U자형 최적 배분: MoE 75–80% / Engram 20–25%
  • 로그-선형 메모리 확장: 메모리 증가가 예측 가능한 성능 향상으로 이어짐

4) 시스템 설계의 중요성

  • 프리페칭, 오프로딩, 다층 캐시가 있어야 “좋은 아이디어”가 “빠른 제품”이 됨

공식 리소스