Files
frankenstallm/reports/2026-03-05_NEMOTRON_NANO_FEASIBILITY_STUDY.md
ModelHub XC d4abdb70fa 初始化项目,由ModelHub XC社区提供模型
Model: pathcosmos/frankenstallm
Source: Original Platform
2026-07-14 04:21:16 +08:00

505 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Nemotron-H 스타일 Hybrid Mamba-Transformer 3B 모델 구현 타당성 분석
> 작성일: 2026-03-05
> 목표: NVIDIA Nemotron 3 Nano / Nemotron-H 아키텍처를 참고하여 3B 규모 Hybrid Mamba-Transformer 모델을 from scratch로 학습 가능한지 상세 분석
---
## 1. Nemotron 3 Nano 아키텍처 요약
### 1.1 원본 Nemotron 3 Nano 30B-A3B 스펙
| 항목 | 값 |
|------|-----|
| **Architecture** | NemotronHForCausalLM (Hybrid Mamba-2 + Transformer + MoE) |
| **Total Params** | 31.6B |
| **Active Params** | 3.6B (embedding 포함) / 3.2B (embedding 제외) |
| **hidden_size** | 2,688 |
| **num_hidden_layers** | 52 |
| **num_attention_heads** | 32 |
| **num_key_value_heads** | 2 (GQA 16:1) |
| **head_dim** | 128 (attention) / 64 (mamba) |
| **intermediate_size** | 1,856 |
| **vocab_size** | 131,072 |
| **max_position_embeddings** | 262,144 (1M 확장 가능) |
| **rope_theta** | 10,000 |
### 1.2 Hybrid Layer Pattern
```
hybrid_override_pattern: "MEMEM*EMEMEM*EMEMEM*EMEMEM*EMEMEM*EMEMEMEM*EMEMEMEME"
```
| 기호 | 의미 | 개수 |
|------|------|------|
| **M** | Mamba-2 레이어 | 23개 |
| **E** | MoE (Expert FFN) 레이어 | 23개 |
| **\*** | Attention 레이어 | 6개 |
- 총 52개 레이어: Mamba-2(23) + MoE(23) + Attention(6)
- Attention은 ~11.5% 비율로 **고르게 분산**
- 패턴 핵심: Mamba → Expert → Mamba → Expert → ... → Attention(가끔)
### 1.3 MoE (Mixture of Experts) 구성
| 항목 | 값 |
|------|-----|
| n_routed_experts | 128 |
| n_shared_experts | 1 |
| num_experts_per_tok | 6 |
| moe_intermediate_size | 1,856 |
| shared_expert_intermediate_size | 3,712 |
| routing activation | Squared ReLU (`relu2`) |
| router | Learned MLP + Sigmoid gating |
| routed_scaling_factor | 2.5 |
### 1.4 Mamba-2 구성
| 항목 | 값 |
|------|-----|
| mamba_head_dim | 64 |
| mamba_num_heads | 64 |
| ssm_state_size | 128 |
| conv_kernel | 4 |
| expand | 2 |
| n_groups | 8 |
| activation | SiLU |
| chunk_size | 128 |
### 1.5 Nemotron-H 8B (Dense, 비MoE) 참고
| 항목 | 값 |
|------|-----|
| hidden_size | 4,096 |
| num_layers | 52 (24 Mamba-2 + 24 MLP + 4 Attention) |
| attention_heads | 32 |
| kv_heads | 8 |
| FFN dimension | 21,504 |
| mamba_d_state | 128 |
| mamba_head_dim | 64 |
| expand | 2 |
| conv_kernel | 4 |
| Total params | ~8B |
---
## 2. 3B 규모 Hybrid 모델 설계 (제안)
### 2.1 설계 원칙
Nemotron 3 Nano의 **MoE 방식** vs Nemotron-H의 **Dense 방식** 중 선택이 필요합니다.
#### Option A: Dense Hybrid (Nemotron-H 스타일, 권장)
- MoE 없이 Mamba-2 + Attention + SwiGLU 조합
- 구현 복잡도 낮음, 디버깅 용이
- 기존 코드 재활용 극대화
- 3B 규모에서 MoE의 이점이 제한적 (expert 수가 너무 적어짐)
#### Option B: Sparse MoE Hybrid (Nemotron 3 Nano 스타일)
- Mamba-2 + Attention + MoE 전체 구현
- 구현 복잡도 매우 높음 (MoE router, load balancing, expert parallelism)
- 3B active / 15-30B total 모델 → 학습 시간 대폭 증가
- 데이터 효율성에서 Dense 대비 불리 (소규모 데이터셋)
**결론: Option A (Dense Hybrid)를 권장합니다.**
### 2.2 제안 아키텍처: FRANKENSTALLM-H 3B
| 항목 | 값 | 근거 |
|------|-----|------|
| **hidden_size** | 2,688 | Nemotron 3 Nano와 동일, 64 배수 (Mamba 호환) |
| **num_layers** | 32 | 16 Mamba-2 + 14 MLP + 2 Attention |
| **attention_heads** | 32 | head_dim = 84 → 조정 필요 |
| **→ 수정: attention_heads** | **21** | head_dim = 128 (2688/21=128) |
| **→ 재수정: hidden_size** | **2,688****2,560** | 기존 3B와 동일, head_dim=80 유지 |
| **kv_heads** | 8 | GQA 4:1 (기존 유지) |
| **d_ffn** | 6,912 | 기존 3B와 동일 (SwiGLU) |
| **mamba_d_state** | 128 | Nemotron 표준 |
| **mamba_head_dim** | 64 | Nemotron 표준 |
| **mamba_num_heads** | 40 | 2560/64 = 40 |
| **mamba_expand** | 2 | Nemotron 표준 |
| **conv_kernel** | 4 | Nemotron 표준 |
| **vocab_size** | 64,000 | 기존 토크나이저 유지 |
| **max_seq_len** | 4,096 | 기존 유지 |
| **rope_theta** | 500,000 | 기존 유지 (attention 레이어만) |
### 2.3 Layer Pattern 설계
Nemotron-H 원칙: **~8% attention, 나머지 Mamba+FFN 교대**
32 레이어 기준:
```
Layer Pattern (M=Mamba-2, F=FFN/SwiGLU, A=Attention):
0: M 1: F 2: M 3: F
4: M 5: F 6: M 7: F
8: A 9: F 10: M 11: F ← Attention at layer 8
12: M 13: F 14: M 15: F
16: M 17: F 18: M 19: F
20: A 21: F 22: M 23: F ← Attention at layer 20
24: M 25: F 26: M 27: F
28: M 29: F 30: M 31: F
Pattern string: "MFMFMFMFAFMFMFMFMFMFAFMFMFMFMFMF"
```
- **Mamba-2 레이어**: 14개 (43.75%)
- **FFN (SwiGLU) 레이어**: 16개 (50%)
- **Attention 레이어**: 2개 (6.25%)
- Attention은 모델 중간/후반에 배치 (fine-grained reasoning 지점)
### 2.4 파라미터 추정
```
Embedding: 64,000 × 2,560 = 163.8M
Per Mamba-2 layer: ~3 × expand × d_model² = 3 × 2 × 2560² ≈ 39.3M × 14 = 550.5M
Per FFN layer: 3 × d_model × d_ffn = 3 × 2560 × 6912 ≈ 53.1M × 16 = 849.9M
Per Attention layer: QKV + Out ≈ (2560×2560 + 2×2560×640 + 2560×2560) ≈ 16.4M × 2 = 32.8M
Final RMSNorm: 2,560 ≈ 0.003M
LM Head (tied): 0
Total ≈ 163.8 + 550.5 + 849.9 + 32.8 + 0.003 ≈ 1,597M ≈ 1.6B
```
**문제**: 1.6B로 3B에 미달. 스케일 조정 필요.
### 2.5 수정 설계: 3B 달성
3B를 맞추기 위한 두 가지 방안:
#### 방안 1: 레이어 수 증가 (48 레이어)
```
Layers: 48 (22 Mamba-2 + 22 FFN + 4 Attention)
Pattern: "MFMFMFMFMFAFMFMFMFMFMFMFAFMFMFMFMFMFMFAFMFMFMFMFMFAFMF"
Mamba: 39.3M × 22 = 864.6M
FFN: 53.1M × 22 = 1,168.2M
Attention: 16.4M × 4 = 65.6M
Embedding: 163.8M
─────────────────────────────────
Total ≈ 2,262M ≈ 2.3B (아직 부족)
```
#### 방안 2: hidden_size 증가 (3,072) + 40 레이어 (최종 채택)
| 항목 | 값 |
|------|-----|
| **hidden_size** | 3,072 |
| **num_layers** | 40 |
| **attention_heads** | 24 (head_dim=128) |
| **kv_heads** | 8 (GQA 3:1) |
| **d_ffn** | 8,192 |
| **mamba_num_heads** | 48 (3072/64=48) |
| **Layer pattern** | 18 Mamba-2 + 19 FFN + 3 Attention |
```
Pattern (40 layers):
"MFMFMFMFMFMFAFMFMFMFMFMFMFAFMFMFMFMFMFMFAFMFMFMF"
(M×18, F×19, A×3)
Mamba: ~56.6M × 18 = 1,018.8M
FFN: ~75.5M × 19 = 1,434.5M
Attention: ~28.3M × 3 = 84.9M
Embedding: 64,000 × 3,072 = 196.6M
RMSNorm: ~0.25M
─────────────────────────────────
Total ≈ 2,735M ≈ 2.7B
```
**또는 d_ffn을 9,216으로 확대하면:**
```
FFN: ~84.9M × 19 = 1,613.1M
Total ≈ 2,913M ≈ 2.9B ✓ (거의 3B)
```
### 2.6 최종 제안 스펙: FRANKENSTALLM-H 3B
| 항목 | 값 | 비고 |
|------|-----|------|
| **hidden_size** | 3,072 | 기존 3B와 동일 |
| **num_layers** | 40 | 18M + 19F + 3A |
| **attention_heads** | 24 | head_dim=128 |
| **kv_heads** | 8 | GQA 3:1 |
| **d_ffn** | 9,216 | 3× d_model |
| **mamba_d_state** | 128 | Nemotron 표준 |
| **mamba_head_dim** | 64 | Nemotron 표준 |
| **mamba_num_heads** | 48 | 3072/64 |
| **mamba_expand** | 2 | Nemotron 표준 |
| **conv_kernel** | 4 | Nemotron 표준 |
| **chunk_size** | 128 | Nemotron 표준 |
| **n_groups** | 8 | Nemotron 표준 |
| **vocab_size** | 64,000 | 기존 토크나이저 |
| **max_seq_len** | 4,096 | 기존 유지 |
| **rope_theta** | 500,000 | Attention만 |
| **Total Params** | **~2.9B** | |
**Layer Pattern (40 layers):**
```
MFMFMFMFMFMF_A_FMFMFMFMFMFMF_A_FMFMFMFMFMFMF_A_FMF
정확한 패턴:
0:M 1:F 2:M 3:F 4:M 5:F 6:M 7:F 8:M 9:F 10:M 11:F
12:A 13:F
14:M 15:F 16:M 17:F 18:M 19:F 20:M 21:F 22:M 23:F
24:A 25:F
26:M 27:F 28:M 29:F 30:M 31:F 32:M 33:F 34:M 35:F
36:A 37:F
38:M 39:F
```
---
## 3. 구현 난이도 분석
### 3.1 필요한 코드 변경
| 구성요소 | 변경 내용 | 난이도 | 예상 시간 |
|----------|----------|--------|-----------|
| **model/config.py** | Mamba 관련 config 필드 추가 | 낮음 | 1시간 |
| **model/mamba2.py** (신규) | Mamba-2 레이어 구현 | **높음** | 4-8시간 |
| **model/transformer.py** | Hybrid block routing 추가 | 중간 | 2-3시간 |
| **model/layers.py** | MoE 미사용 시 변경 없음 | 없음 | 0 |
| **train/pretrain.py** | Mamba param group 분리 | 낮음 | 1시간 |
| **train/trainer.py** | FP8 + Mamba 호환 확인 | 중간 | 2시간 |
| **configs/hybrid_3b.yaml** | 새 config 작성 | 낮음 | 0.5시간 |
| **테스트 & 디버깅** | Forward/backward 검증 | 중간 | 4-6시간 |
**총 예상 구현 시간: 15-22시간 (코딩 + 디버깅)**
### 3.2 핵심 난이도: Mamba-2 레이어 구현
두 가지 접근법:
#### 접근법 A: `mamba-ssm` 패키지 사용 (권장)
```python
from mamba_ssm import Mamba2
class MambaBlock(nn.Module):
def __init__(self, config):
self.norm = RMSNorm(config.d_model)
self.mamba = Mamba2(
d_model=config.d_model,
d_state=config.mamba_d_state, # 128
d_conv=config.conv_kernel, # 4
expand=config.mamba_expand, # 2
headdim=config.mamba_head_dim, # 64
ngroups=config.n_groups, # 8
chunk_size=config.chunk_size, # 128
)
def forward(self, x):
return x + self.mamba(self.norm(x))
```
- **장점**: CUDA 최적화 커널 사용, 검증된 구현
- **단점**: mamba-ssm이 CUDA 13.1 + PyTorch nv25.12에서 컴파일되는지 확인 필요
- **호환성 확인 결과**: mamba-ssm 2.3.0은 CUDA 11.6+ 지원, PyTorch 1.12+ 요구. 우리 환경(CUDA 13.1, PT 2.10)과 이론적으로 호환. 단, 커스텀 빌드 PyTorch에서 C++ extension 컴파일 테스트 필요.
#### 접근법 B: 순수 PyTorch 구현
```python
class Mamba2Pure(nn.Module):
"""Mamba-2 SSD (State Space Duality) implementation in pure PyTorch"""
# ~100-200 lines
# 장점: 의존성 없음, 완전한 제어
# 단점: CUDA 커널 없어 ~3-5배 느림
```
- **장점**: 외부 의존성 없음, PyTorch 버전 무관
- **단점**: 성능 열화 (학습 속도 3-5배 감소)
### 3.3 FP8 호환성
| 구성요소 | FP8 지원 | 비고 |
|----------|---------|------|
| Attention (te.Linear) | ✅ | 기존과 동일 |
| FFN/SwiGLU (te.LayerNormMLP) | ✅ | 기존과 동일 |
| **Mamba-2 in_proj/out_proj** | ⚠️ 부분적 | nn.Linear → te.Linear 교체 가능하나 SSM 커널 자체는 bf16 |
| **Mamba-2 SSM 연산** | ❌ | 내부 scan은 fp32/bf16만 지원 |
**결론**: Mamba-2 레이어는 FP8 부분 적용 가능 (projection만). SSM 핵심 연산은 bf16 유지.
→ 전체 학습 속도 영향: Mamba 레이어가 전체의 ~45% → FP8 효율 ~55-70% 수준
### 3.4 DDP 호환성
| 항목 | 상태 |
|------|------|
| Mamba-2 + DDP | ✅ 호환 (standard nn.Module) |
| Gradient sync | ✅ 자동 (모든 parameter가 autograd 추적됨) |
| no_sync() | ✅ 호환 |
| DistributedSampler | ✅ 변경 없음 |
---
## 4. 학습 일정 추정
### 4.1 학습 시간 예측
기존 3B 순수 Transformer:
- 57,000 steps × 63시간 = 63시간
Hybrid 3B (Mamba + Attention):
- Mamba 레이어는 Transformer attention보다 빠름 (O(N) vs O(N²))
- 단, FP8 최적화 감소로 상쇄
- **예상: 55-70시간** (기존과 비슷하거나 약간 빠름)
### 4.2 3/9까지 완료 가능성 분석
**남은 시간**: 3/5 ~ 3/9 = **4일 (96시간)**
| 단계 | 예상 시간 | 누적 |
|------|----------|------|
| 1. mamba-ssm 설치 & 호환 테스트 | 2시간 | 2시간 |
| 2. 모델 아키텍처 구현 | 8시간 | 10시간 |
| 3. Forward/backward 테스트 | 4시간 | 14시간 |
| 4. Config 작성 & 학습 스크립트 수정 | 2시간 | 16시간 |
| 5. 짧은 학습 테스트 (1000 steps) | 3시간 | 19시간 |
| 6. **전체 학습 (57K steps)** | **55-70시간** | **74-89시간** |
| 7. 평가 | 3시간 | 77-92시간 |
**판정**: 96시간 내 **가능하지만 빠듯합니다**.
### 4.3 리스크 요인
| 리스크 | 영향 | 확률 | 대응 |
|--------|------|------|------|
| mamba-ssm CUDA 13.1 컴파일 실패 | 블로커 | 중간 | 순수 PyTorch fallback |
| 학습 불안정 (loss spike) | 시간 지연 | 중간 | LR 낮추기, warmup 늘리기 |
| FP8 + Mamba 충돌 | 성능 저하 | 낮음 | Mamba는 bf16만 사용 |
| VRAM OOM (Mamba state) | 블로커 | 낮음 | state_size 축소 |
| DDP gradient 이슈 | 블로커 | 매우 낮음 | standard nn.Module이므로 |
### 4.4 빠른 경로 (Aggressive Timeline)
구현 효율화를 위한 단축 방안:
1. **mamba-ssm 패키지 사용** → Mamba2 레이어 직접 구현 불필요 (8시간 → 2시간)
2. **서브에이전트 병렬 실행** → 모델 구현 + config + 테스트 스크립트 동시
3. **학습 steps 축소** → 57K → 40K (Chinchilla optimal 미달이지만 비교 가능)
4. **기존 데이터 재사용** → 3b_train.bin 그대로 사용
빠른 경로 기준:
```
구현: 10시간 → 학습: 50시간 → 평가: 3시간 = 63시간 (96시간 내 충분)
```
---
## 5. 기존 코드 대비 변경점 요약
### 5.1 변경이 필요한 파일
```
model/
├── config.py # LMConfig에 mamba 관련 필드 추가
├── mamba_block.py # 신규: Mamba-2 블록 래퍼
├── hybrid_block.py # 신규: 라우팅 레이어 (Mamba vs Attention vs FFN)
├── transformer.py # LLM 클래스에 hybrid 지원 추가
├── attention.py # 변경 없음
├── layers.py # 변경 없음
└── __init__.py # 새 모듈 export 추가
train/
├── pretrain.py # Mamba param group 분리
└── trainer.py # FP8 context에서 Mamba 레이어 제외 로직
configs/
└── hybrid_3b.yaml # 신규: Hybrid 3B 설정
```
### 5.2 변경하지 않는 파일
```
data/dataset.py # 데이터 파이프라인 동일
data/3b_train.bin # 학습 데이터 재사용
tokenizer/ # 토크나이저 동일
eval/ # 평가 파이프라인 동일
scripts/ # 런치 스크립트만 약간 수정
```
---
## 6. 기대 효과 vs 현재 모델
### 6.1 이론적 장점
| 항목 | 기존 (Pure Transformer) | Hybrid (Mamba + Attention) |
|------|------------------------|---------------------------|
| **추론 속도** | O(N²) attention | O(N) mamba + O(N²) 소수 attention |
| **메모리 (추론)** | KV cache grows linearly | Mamba: 고정 state, Attention: KV cache |
| **긴 문맥 처리** | 4K (가능하지만 비용↑) | 더 효율적 (Mamba의 linear scan) |
| **학습 속도** | 기준선 | 비슷하거나 약간 빠름 |
| **정확도** | 검증됨 (loss 1.466) | 동등 이상 (Nemotron-H 논문 근거) |
### 6.2 실험적 가치
- **최신 아키텍처 실험**: Hybrid Mamba-Transformer는 2025-2026년 최전선 연구
- **추론 효율성**: 동일 파라미터 대비 추론 2-3배 빠름 (Nemotron-H 논문)
- **비교 연구**: 동일 데이터/토크나이저로 Pure Transformer vs Hybrid 직접 비교 가능
---
## 7. 결론 및 권고
### ✅ 실행 가능 (Go)
**근거:**
1. **하드웨어 충분**: 8× B200, 1.47TB VRAM — 3B Hybrid 학습에 과잉 사양
2. **소프트웨어 호환**: transformers 5.2.0이 mamba2/nemotron_h 지원, mamba-ssm 설치 가능
3. **코드 재활용**: 기존 학습 인프라(DDP, trainer, data pipeline, eval) 90% 재사용
4. **시간 충분**: 4일(96시간) 내 구현(10h) + 학습(50-65h) + 평가(3h) 완료 가능
5. **리스크 관리**: 순수 PyTorch fallback으로 mamba-ssm 미호환 대응 가능
### ⚠️ 주의사항
1. **mamba-ssm 컴파일 테스트를 최우선** 실행 — 호환성 확인 후 본격 개발 시작
2. **Dense Hybrid (MoE 미포함)** 으로 진행 — 3B 규모에서 MoE는 과도한 복잡도
3. **학습 안정성 모니터링 강화** — Hybrid는 Mamba와 Attention 간 gradient scale 차이로 불안정 가능
4. **FP8은 Attention/FFN만 적용** — Mamba SSM 연산은 bf16 유지
### 📋 실행 순서
```
Phase 0: 환경 준비 (2시간)
└─ mamba-ssm + causal-conv1d 설치 및 호환성 테스트
Phase 1: 모델 구현 (8-10시간)
├─ [sonnet] model/mamba_block.py 구현
├─ [sonnet] model/config.py + transformer.py 수정
├─ [haiku] configs/hybrid_3b.yaml 작성
└─ [sonnet] train/ 스크립트 수정
Phase 2: 검증 (4시간)
├─ Forward/backward pass 테스트 (단일 GPU)
├─ DDP 8-GPU 호환 테스트
└─ 1000 steps 미니 학습 테스트
Phase 3: 전체 학습 (50-65시간)
└─ torchrun --nproc_per_node=8 train/pretrain.py --config configs/hybrid_3b.yaml
Phase 4: 평가 (3시간)
└─ PPL, 생성 품질, 벤치마크 → Pure Transformer 대비 비교
```
---
## 참고 자료
### 논문 & 기술 문서
- [Nemotron 3 Nano Technical Report](https://research.nvidia.com/labs/nemotron/files/NVIDIA-Nemotron-3-Nano-Technical-Report.pdf)
- [Nemotron-H: Hybrid Mamba-Transformer Models (arXiv:2504.03624)](https://arxiv.org/abs/2504.03624)
- [NVIDIA Nemotron 3 White Paper (arXiv:2512.20856)](https://arxiv.org/pdf/2512.20856)
- [Mamba-2: State Space Duality](https://tridao.me/blog/2024/mamba2-part1-model/)
### 모델 & 코드
- [Nemotron 3 Nano HuggingFace](https://huggingface.co/nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16)
- [Nemotron 3 Nano config.json](https://huggingface.co/nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8/blob/main/config.json)
- [state-spaces/mamba (공식 Mamba-2 구현)](https://github.com/state-spaces/mamba)
- [Nemotron 3 Nano HF Blog](https://huggingface.co/blog/nvidia/nemotron-3-nano-efficient-open-intelligent-models)
### 관련 하이브리드 모델
- [Jamba: Hybrid Transformer-Mamba (AI21)](https://arxiv.org/pdf/2403.19887)
- [IBM Granite 4.0-H (Dense Hybrid 3B)](https://www.ibm.com/new/announcements/ibm-granite-4-0-hyper-efficient-high-performance-hybrid-models)
- [Nemotron Nano 2 (arXiv:2508.14444)](https://arxiv.org/abs/2508.14444)