DeepSeek-V3 Technical Report 정리
논문 DeepSeek-V3 Technical Report를 읽고 주요 contribution 내용과 개인적으로 꼭 기억할 내용을 요약하여 정리해본다.
1. Introduction
Open Source 모델, DeepSeek 시리즈, LLaMA 시리즈, Qwen 시리즈, Mistral 시리즈 등 오픈소스 모델과 비공개 소스 모델들과의 격차를 줄이기 위해 노력중
- 본 논문에서는 오픈소스 모델을 더욱 확장하기 위해 모델 크기 확장 (Scale up)하고 , Mixture-of-Experts를 도입한다.
- Deepseek V3는 총 6710억(671B)개의 파라미터를 가지고 있으며, 그 중 370억(37B) 개가 각 토큰에 대해 활성화 된다.
성능 향상도 중요하지만, 모델 성능과 경제적인 비용을 동시에 추구하고 있다.
- 이를 위해 아키텍쳐 적으로,
- 효율적인 추론을 위해 Multi-head Latent Attention (MLA) 구조를 채택하고
- 비용 효율적인 학습을 위해 DeepSeekMoE 구조를 채택하고 있다.
- 이 두가지 아키텍처는 이미 DeepSeek V2에서 검증 되었음
- 여기에 두 가지 추가 전략을 도입해 V3가 나옴
- Auxiliary Loss (보조 손실)이 없는 부하 분산 전략 (Auxiliary-loss-free load balancing)을 적용 - 부하 분산을 유도하는 과정에서 발생할 수 있는 모델 성능 저하를 최소화 하는 것을 목표로함
- (추가설명) 일반적으로 MoE에서는 모든 Expert들의 작업을 고르게 분배하기 위해 보조 손실을 추가하지만, 이로 인해 성능 저하 현상이 있었다. V3에서는 이러한 보조 손실 없이도 부하 분산을 달성하려는 새로운 전략을 시도하는 것
- Multi-token 예측을 학습 목표로 사용 - 여러 벤치마크에서 전반적인 성능 향상 관측
- (추가설명) 한 번에 하나의 다음 단어를 예측하는 방식이 아니라, 여러 개의 토큰을 동시에 예측하도록 학습시키는 방식. 이 방법을 통해 더 빠르고 정확한 문장 생성을 가능하게 하며, 결국 전체적인 성능 향상 (벤치마크 비교)에 기여
- Auxiliary Loss (보조 손실)이 없는 부하 분산 전략 (Auxiliary-loss-free load balancing)을 적용 - 부하 분산을 유도하는 과정에서 발생할 수 있는 모델 성능 저하를 최소화 하는 것을 목표로함
효율적인 학습을 위해, FP8 mixed precision training을 수행하고, 학습 프레임워크 전반에 걸쳐 최적화를 수행
- low -precision training은 효율적인 학습을 위해 좋은 해결책으로 뜨고 있으며, 이는 하드웨어 성능 향상과 밀접한 관련이 있음
- V3에서는 FP8 mixed precision 학습 프레임워크를 도입하였고, 이를 초거대 모델에 처음으로 적용하여 그 효율성을 입증하였음.
- FP8 연산 및 저장을 지원함으로써, 이는 학습 속도를 향상시키고, 적은양의 GPU 메모리를 사용하여 학습을 시키는데 성공하였음
- (추가설명) FP8, FP16, BF16은 부동소수점(Floating Point) 숫자를 표현하는 방식이다. CS 내용이지만, 간단하게 설명하면
- FP 16
- FP 16의 구성은 이와 같다. 1비트 부호 + 5비트 지수 + 10비트 가수 = 총 16비트 - 가수 (소수 부분을 뜻하는거에요)
- 기존의 FP32에 비해 표현할 수 있는 수의 범위가 작다. 수의 범위가 작게 되면, 정밀도(precision)가 낮다고 표현하는데 이는 매우 작은 수나 매우 큰 수를 정확하게 표현할 수 없다는 뜻이다. 이런 것을 underflow (매우 작은수) / overflow(매우 큰수)현상이라고 한다.
- BF 16 (brain float 16)
- 구성 : 1비트 부호 + 8비트 지수 + 7 비트 가수 = 총 16비트
- 구글에서 개발했는데, 뉴럴 네트워크 학습 목적으로 만든 새로운 자료형이다. 목적은 지수 비트의 수를 키워서 수의 표현범위가 FP32와 동일하게 만드려고 하는 것이다.
- 기존의 FP 16에 비해 같은 비트수를 사용하면서도, 수의 범위는 FP32와 같은 숫자를 표현하기 때문에 더 좋은 표현력을 가지고 있음.
- 단점으로는 가수가 적어서 정밀도는 FP16에 비해 낮다고 생각할 수 있지만 실제 사용상에는 큰 문제가 없음
- FP 8
- 1비트 부호 + 4비트 지수 + 3비트 가수
- 당연히 수의 범위가 작지만 메모리는 적게 차지하는 장점이 있지만, 뉴럴네트워크에서 해당 숫자로 표현하면 너무 잃어버리는 정보가 많이 있음
- 그래서 이 논문 V3가 주장하는 것은 FP8로 학습시켜도 충분하게 표현할 수 있는 방법을 제시하는 것임.
- FP 16
- (추가설명) FP8, FP16, BF16은 부동소수점(Floating Point) 숫자를 표현하는 방식이다. CS 내용이지만, 간단하게 설명하면
사전 학습(pre-training) 14.8조(14.8T)개의 고품질, 다양성 있는 토큰들로 학습시켰음
- 사전학습 과정은 매우 안정적이었음 : 복구불가능한 loss spike (손실 급증), roll back 할 상황이 없었음
- 그 다음엔 V3의 context 길이를 두 단계에 걸쳐 확장하는 작업을 수행했음
- 1단계 : 최대 context 길이를 32000(32K) 토큰까지 확장
- 2단계 : 이를 128000토큰(128K)까지 더 확장하였음
- 이후 V3 base 모델을 기반으로 post-training (후속 학습)을 수행.
- 지도 학습 기반의 미세조정 (Supervised Fine Tuning, SFT)
- 강화 학습 (Reinforcement Learning, RL)
- distiliation
- 이 Post-training은 모델을 인간의 선호 (human preferences)에 더 잘 맞추고, 모델의 잠재력을 더욱 끌어내기 위함
- 후속 학습 단계에서는 DeepSeek R1 시리즈 모델로부터 추론 능력 (reasoning capability)을 distillation하였고, 동시에 모델의 정확도와 생성되는 응답 길이 사이의 균형을 유지할 수 있게하였다.
- (추가설명) context length extension 이란 context 길이는 모델이 한 번에 처리할 수 있는 텍스트 길이를 의미. 예를 들어 GPT 2,3는 2000~4000 token 길이이고, GPT-4 Turbo는 128000(128K). (확인필요) V3에서 128K까지 확장했다는 것은 매우 긴 문서를 한 번에 처리할 수 있다는 뜻
- (추가설명) Post-training SFT란 정답이 있는 데이터를 기반으로 정확한 응답을 생성하도록 미세 조정 학습. 보통 RL 이라고 하면, RLHF 를 의미했는데 여기서는 다른 의미일 수도 있음 (더 읽어봐야함)
- (추가설명) Distillation 큰 모델을 선생님으로 두고 선생님의 답을 따라하도록 작은 모델이 학습하는 방법
V3 base 모델은 오픈소스 모델 중 벤치마크 성능이 가장 뛰어났으며, 코드와 수학 분야에서 특히 좋은 성능을 보였음
- V3 chat 버전 역시 다른 오픈소스 모델보다 뛰어난 성능을 보임
- GPT-4o, Claude 3.5 Sonnet과 견줄 수 있는 성능, open-ended 벤치마크에서 비슷한 성능
Deepseek V3는 학습 비용면에서 경제적임을 강조.
- 사전학습 (pre-training) 단계에서, V3를 1조 (1T) 토큰을 학습시키는 데 18만(180K) 시간의 H800 GPU 시간이 필요했음
- 이는 2048개의 H800 GPU 클러스터 기준 3.7일 만임
- 결과적으로 전체 사전 학습은 두 달도 안걸리게 완료되었으며, 총 266만 4천 (2.664M) GPU 시간이 소요
context length extension에는 11만 9천 (119K) GPU 시간,
post-training에는 5천(5K) GPU 시간이 걸림
최종적으로 V3를 학습에 소요된 총 시간은 278만 8천 (2.788M) GPU 시간
H800 GPU 임대 비용이 시간당 $2로 가정하면, 전체 학습 비용은 약 557만 6천 달러 ($5.576M)
- 이 비용은 V3 학습만 포함된 것이며, 아키텍처, 알고리즘, 데이터에 대한 연구, 실험에 드는 비용은 포함되지 않음
이후 다룰 내용
- 먼저, DeepSeek-V3 모델 아키텍처에 대한 상세한 설명을 제시합니다 (2장).
- 이어서, 우리의 인프라 구조를 소개합니다. 이에는 컴퓨팅 클러스터, 학습 프레임워크, FP8 학습 지원, 추론 배포 전략, 그리고 미래 하드웨어 설계에 대한 제안이 포함됩니다.
- 다음으로, 우리의 사전 학습 과정을 설명합니다.
여기에는 학습 데이터 구성, 하이퍼파라미터 설정, 긴 문맥 처리 기법(long-context extension techniques), 관련 평가 및 논의가 포함됩니다 (4장). - 그 다음으로는, 후속 학습(post-training)에 관한 설명이 이어집니다.
지도 미세조정(SFT), 강화 학습(RL), 그에 따른 평가 및 논의가 포함됩니다 (5장). - 마지막으로, 우리는 본 연구를 정리(conclude)하고,
DeepSeek-V3의 현재 한계점에 대해 논의하며, 향후 연구를 위한 방향을 제안합니다 (6장).
2. Architecture
- DeepSeek-V3 기본 아키텍처 소개
- 효율적인 Inference를 위한 Multi-head Latent Attention (MLA)
- 경제적인 Training을 위한 DeepSeekMoE
- 학습 목표(objective) : Multi-Token Prediction - 이거 해봤더니 모델 성능이 향상되더라
- 그 외의 설정과 구조는 V2를 따름
2.1 Basic Architecture
- V3 기본 unit은 여전히 Transformer 구조를 쌓아 올린 것
- 다시 한번 정리하지만, MLA와 DeepSeekMoE는 V2에서 검증이 되었음, V2와 비교했을 때 한 가지 예외적인 차이점은 DeepSeekMoE에서 auxiliary-loss-free (보조 손실이 없는) 부하 분산 전략을 새롭게 도입하여, load balance를 맞추는 과정에서 발생할 수 있는 성능 저하를 완화하고자 하였음
2.1.1 Multi-Head Latent Attention
DeepSeek-V3는 attention 구조로 MLA(Multi-head Latent Attention) 아키텍처를 채택합니다.
• $d$는 임베딩 차원(embedding dimension),
• $n_h$는 attention head의 개수,
• $d_h$는 각 head당 차원,
• $h_t \in \mathbb{R}^d$는 해당 attention layer에서 t번째 토큰의 입력 벡터를 나타냅니다.
MLA의 핵심은 attention key와 value를 위한 저차원(low-rank) joint compression, 추론 시 Key-Value(KV) 캐시 사용량을 줄이는 데 목적이 있습니다
$$ \begin{aligned} c_{t}^{kv} = W^{DKV}h_{t} \ [k_{t,1}^{c};k_{t,2}^{c};…;k_{t,n_{h}}^{c}]=k_{t}^{c}=W^{UK}c_{t}^{KV}, \ k_{t}^{R} = RoPE(W^{KR}h_{t}), \ k_{t,i} = [k_{t,i}^{C};k_{t}^{R}], \ [v_{t,1}^{C}; v_{t,2}^{C};…;v_{t, n_{h}}^{C}] = v_{t}^{C} = W^{UV}c_{t}^{KV} \end{aligned} $$
• 여기서 $c_t^{KV} \in \mathbb{R}^{d_c}$는 key와 value의 압축된 잠재 벡터(latent vector)입니다.
$d_c$는 KV 압축 차원이며, $d_h \cdot n_h$보다 훨씬 작습니다 ($d_c \ll d_h n_h$).
• $W^{DKV} \in \mathbb{R}^{d_c \times d}$는 입력 벡터 $h_t$를 저차원으로 압축하는 다운 프로젝션 행렬입니다.
• $W^{UK}, W^{UV} \in \mathbb{R}^{d_h n_h \times d_c}$는 각각 압축된 벡터를 다시 키와 밸류로 복원하는 업 프로젝션 행렬입니다.
• $W^{KR} \in \mathbb{R}^{d_h^R \times d}$는 RoPE용 decoupled key를 생성하는 데 사용되는 행렬입니다.
• $\text{RoPE}(\cdot)$는 Rotary Positional Embedding을 적용하는 연산입니다.
• $[\cdot ; \cdot]$은 벡터 합치는 것(concatenation)을 의미합니다.
중요한 점: MLA에서는 파란색 박스로 강조된 벡터($c_t^{KV}$와 $k_t^R$)만을 생성 중에 캐시(cache)하면 되므로, 기존 MHA보다 캐시 메모리를 획기적으로 절감하면서도 유사한 성능을 유지할 수 있습니다.
MLA구조에서 Query에 적용되는 저차원 압축 (low-rank) compression 방식과 그 수식을 설명하는 부분이다. Attention Query에 대해서도 V3에서는 low-rank compression을 수행하며 이는 학습 중 활성화되는 메모리 (activation memeory)를 줄일 수 있다.
$$\begin{aligned} c_{t}^{Q} = W^{DQ}h_{t} \ [q_{t, 1}^{C};q_{t,2}^{C};…;q_{t,n_{h}}^{R}] = q_{t}^{C}=W^{UQ}c_{t}^{Q},\ [q_{t, 1}^{R}; q_{t, 2}^{R};…; q_{t, n_{h}}^{R}] = q_{t}^{R}=RoPE(W^{QR}c_{t}^{Q}), \ q_{t,i}=[q_{t,i}^{C}; q_{t,i}^{R}] \end{aligned}$$
• 여기서 $c_t^Q \in \mathbb{R}^{d_c{\prime}}$는 Query를 위한 압축된 잠재 벡터(latent vector)입니다.
• $d_c{\prime} \ll d_h \cdot n_h$는 Query 압축 차원을 나타내며, 전체 Query 차원보다 훨씬 작습니다.
• $W^{DQ} \in \mathbb{R}^{d_c{\prime} \times d}, W^{UQ} \in \mathbb{R}^{d_h n_h \times d_c{\prime}}$는 각각 Query용 다운 프로젝션 및 업 프로젝션 행렬입니다.
• $W^{QR} \in \mathbb{R}^{d_h^R n_h \times d_c{\prime}}$는 RoPE를 적용할 decoupled Query를 생성하는 행렬입니다.
(추가설명)
- 1단계 : 압축 (down-projection)
- $c_t^Q = W^{DQ} h_t$
- 입력 벡터 $h_t \in \mathbb{R}^d$를 Query 전용의 저차원 공간 $d_c{\prime}$로 압축합니다.
- 목적: 메모리 절약 및 연산 효율 향상
- 2단계 : Query 벡터 생성
- $q_t^C = W^{UQ} c_t^Q$
- 압축된 latent vector $c_t^Q$를 통해 Query vector를 복원(업 프로젝션)합니다.
- 생성된 $q_t^C \in \mathbb{R}^{d_h \cdot n_h}$는 head별 Query 컴포넌트로 나뉩니다
- $q_t^C = [q_{t,1}^C; q_{t,2}^C; \ldots; q_{t,n_h}^C]$
- 3단계 : RoPE를 적용을 위한 Query 생성
- $q_t^R = \text{RoPE}(W^{QR} c_t^Q)$
- 위치 정보를 부여하기 위해, 같은 $c_t^Q$에 별도 행렬 $W^{QR}$을 적용하고,
- 결과에 RoPE(Rotary Positional Embedding)을 적용하여 위치 정보를 포함한 Query $q_t^R$ 생성
- 마찬가지로 head별로 나눌 수 있음:
- $q_t^R = [q_{t,1}^R; q_{t,2}^R; \ldots; q_{t,n_h}^R]$
- 4단계 : 최종 Query 구성
- $q_{t,i} = [q_{t,i}^C; q_{t,i}^R]$
- 각 head의 최종 Query는 내용 기반 컴포넌트 $q_{t,i}^C$와
- 위치 정보 컴포넌트 $q_{t,i}^R$를 결합(concatenation)한 벡터입니다.
- 정리하면, 기존 Transformer은 $h_{t}$로 부터 Query, key, value를 직접 만들지만
- MLA에서는 이를 압축하고 복원함으로써 1. 학습 중 메모리 사용량을 줄이고, 2. 효율적 계산 구조를 유지한다. 특히 Query까지 압축하는 것은 Training에 중점을 둔 최적화 과정이고, Key, Value 캐싱은 Inference 효율성 향상에 중점이 있다.
(추가설명) - RoPE란?
- 2023년 Zhipu AI에서 발표한 논문으로 ROPEformer: Enhanced Transformer with Rotary Position Embedding 이라는 논문에서 처음 등장
- transoformer에서 positional embedding 방법 중 하나면서, 사실상 표준이 된 방식
- original transformer에서는 absolute positional embedding (위치 벡터 자체)를 더하는 방식이었는데 이 보다 연산적으로 유리한 측면이 있으며 위치를 표현하는데 좀더 정교하다는 장점이 있음
- 가장 핵심은 벡터의 각 차원에 위치 정보인 회전행렬 (rotation matrix)로 주입하는 것이다.
- 다시 쉽게 말하면, 위치에 따라 임베딩 벡터를 살짝씩 회전시켜서 상대적인 거리 정보를 간접적으로 표현할 수 있도록 하는 것이다.
- $$\begin{aligned} x_{t,2i}^{\text{RoPE}} &= x_{2i} \cos(\theta_i t) - x_{2i+1} \sin(\theta_i t) \ x_{t,2i+1}^{\text{RoPE}} &= x_{2i} \sin(\theta_i t) + x_{2i+1} \cos(\theta_i t) \end{aligned}$$
- 더 자세한 내용은 여기 참조
2.1.2. DeepSeekMoE with Auxiliary-Loss-Free Load Balancing
DeepSeekMoE의 기본 아키텍처
V3는 FFN(Feed-Forward-Networks)에 대해 DeepSeekMoE 아키텍처를 채택하였다. 기존의 MoE 구조인 GShard와 비교했을 때 DeepSeekMoE는 세분화된 전문가(finer-grained experts)를 사용하고 일부 전문가들은 공유 전문가(shared experts)로 독립적으로 구분하여 사용한다.
토큰 $t$에 대한 FFN 입력을 $u_{t}$ (입력 임베딩)라 할 때, FFN의 출력 $h_{t}^{‘}$는 다음과 같이 계산된다.
$$h^{‘}{t} = u{t} + \Sigma_{i=1}^{N_{s}}FFN_{i}^{(s)}(u_{t}) +
\Sigma_{i=1}^{N_{r}}g_{i, t}FFN_{i}^{(r)}(u_{t})$$
- $h_{t}^{‘}$ : 최종 FFN 출력
- $u_{t}$ : 입력 임베딩
- $FFN_{i}^{(s)}$ : 공유 전문가 (shared expert)
- $FFN_{i}^{r}$ : routed 전문가
- $g_{i, t}$ : routed 전문가 $i$의 게이팅 값 (gating value) - weight 이라고 생각
- (추가 수식 설명) 원래 입력 + 모든 공유 전문가의 출력 + 라우팅 된 전문가의 출력의 가중합
$$g_{i, t} = \frac{g_{i, t}^{‘}}{\Sigma_{j=1}^{N_{r}}g_{j, t}^{‘}}$$ - (추가 수식 설명) 임시 게이팅 점수 / 정규화된 최종 게이팅 값
$$g_{i, t}^{‘} = s_{i, t}, \quad s_{i, t} \in Topk({s_{j, t}|1 \leq N_{r}, K_{r}}), \quad 0 \quad otherwise$$
- $s_{i,t}$: 토큰 $t$와 전문가 $i$의 친화도(affinity score)
- $Topk(⋅,K_{r})$: 가장 상위 $K_r$개의 전문가만 선택
- (추가 수식 설명) 즉 상위 $K_r$개의 expert만 선택해 $g_{i, t}^{‘}=s_{i,t}$ 이고 나머지는 0
$s_{i, t} = Sigmoid(u_{t}^{T}e_{i})$
- $e_{i}$ : 라우팅 expert $i$의 중심 벡터 (centroid vector)
- $u_{t}^{T}e_{i}$ : 토큰과 expert 간의 내적 (=유사도)
- Sigmoid는 결과를 0 ~ 1 범위로 조절
- (추가 수식 설명) Affinity score s는 입력 벡터와 expert vector 간의 유사도를 sigmoid로 변환한 값
여기서,
- $N_{s}$와 $N_{r}$은 각각 공유 전문가와 라우팅 전문가의 갯수를 나타낸다.
- $FFN_{i}^{(s)}(\cdot)$ 와 $FFN_{i}^{(r)}(\cdot)$ 은 i 번째 공유전문가와 i 번째 라우팅 전문가
- $K_{r}$은 활성화되는 라우팅 전문가의 수를 의미
- $Topk(\cdot, K)$는 토큰 $t$에 대해 계산된 모든 친화도 중에서 상위 $K$개의 점수로 이루어진 집합을 의미
Auxiliary-Loss-Free Load Balancing
- MoE 모델에서 Expert 부하 balancing이 불균형해지면, routing collapse (라우팅 붕괴)가 발생하여 expert가 병렬 처리 할 때 계산 효율성이 저하되게 된다.
- 기존의 해결책으로는 auxiliary loss (보조 손실)에 의존하여 이러한 불균형을 방지하였었다. 그러나 보조 손실이 너무 커지면 모델의 본래 성능을 저해할 수 있다. V3에서는 성능과 부하 balancing사이에 더 나은 대안을 위해 보조 손실 없는 부하 분산 전략을 새롭게 제안한다. 구체적으로 각 expert 마다 bias (편향) 항 $b_{i}$를 도입하여, 이 $b_{i}$를 각 전문가의 친화도 점수 $s_{i, t}$에 더한 뒤 상위 Top-K 라우팅을 결정한다.
- $$g_{i, t}^{‘} = s_{i, t}, \quad s_{i, t}+b_{i} \in Topk({s_{j, t}+b_{j}|1 \leq j \leq N_{r}}, K_{r}), \quad 0 \quad otherwise$$
- $s_{i,t}$: 토큰 $t$과 expert $i$의 affinity score (기존과 동일)
- $b_{i}$ : expert $i$에 대한 bias term (편향값) : 이 값은 학습 과정에서 동적으로 업데이트 됨
- $g_{i, t}^{‘}$ : 임시 게이팅 점수 (Top-K) 선택시 사용
→ 즉, 편항이 적용된 친화도 $s_{i,t} + b_{i}$를 기준으로 Top-K expert를 선택하되, 선택된 이후 실제 게이팅 값은 원래의 $s_{i,t}$를 사용.결국 $b_{i}$는 routing 용도에만 결정을 미치고 실제 weighted sum에서는 사용되지 않음
(추가 설명) bias (편향) term $b_{i}$의 업데이트 방식
- 각 훈련 스텝마다 전체 배치에서 expert 부하를 모니터링함
- 특정 expert가 과부하 (overloaded) 상태라면 → $b_{i}$를 감소
- 특정 expert가 과소활용 (underloaded) 상태라면 → $b_{i}$를 증가
- 즉 이를 수식으로 표현하면,
- $$\begin{aligned} b_{i} ← b_{i} - γ, if \quad overloaded\ b_{i} ← b_{i} + γ, if \quad underload \end{aligned}$$
- γ : bias update speed 라는 하이퍼파라미터이다.
DeepSeek-V3 Technical Report 정리
https://emjayahn.github.io/2025/03/24/DeepSeek-V3-Technical-Report-정리/