LLM 학습에 필요한 GPU 자원과 학습 데이터량

Dense 모델과 MoE 모델의 요구사항 각각 비교 분석

by Dr Jenna

이 글은 대형 언어 모델의 Supervised Fine-tuning(SFT)을 고려할 때 Dense 모델과 MoE(Mixture of Experts) 모델 간의 차이점, 그리고 실무적인 설정 및 자원 산정 방법을 체계적으로 설명한다. 대상 모델은 각각 Qwen2.5-Coder-32B-Instruct와 Qwen3-Coder-30B-A3B-Instruct이며, SFT의 목적은 도메인 튜닝 및 정밀 성능 향상이다. 학습에는 Hugging Face Transformers, Accelerate, DeepSpeed Zero Stage 3, AdamW 등의 최적화된 구성 요소를 활용하고, A100 80GB GPU 8개가 탑재된 노드를 기준으로 자원 사용을 산정한다.



1. 모델별 SFT를 위한 하드웨어 자원 산정


Qwen2.5-Coder-32B-Instruct는 전형적인 Dense 모델로, 총 파라미터 수는 약 32B이다. BF16 기준으로 단일 파라미터는 2바이트를 차지하며, optimizer와 activation memory까지 고려하면 대략 다음과 같은 자원이 필요하다. 모델 파라미터 자체는 약 64GB, AdamW optimizer 상태는 파라미터의 4배 수준인 256GB, activation memory는 gradient checkpointing 여부에 따라 64448GB로 추산된다. 이를 감당하기 위해서는 최소한 6~8개의 A100 80GB GPU가 필요하며, DeepSpeed의 ZeRO Stage 3와 gradient checkpointing을 함께 사용하는 것이 필수적이다.

여기서 중요한 점은 DeepSpeed ZeRO Stage 3가 Optimizer state, Parameter, Gradient를 GPU 간에 나누어 저장하는 sharding 전략이라는 것이다. 하지만 이 상태에서는 여전히 GPU 내에서만 자원이 분산되며, CPU RAM이나 NVMe로의 이동은 발생하지 않는다. CPU 또는 디스크로 실제 메모리 offloading을 하려면 별도로 offload_optimizer=True, offload_param=True 등의 설정을 명시해야 한다. 즉, ZeRO Stage 3와 offloading은 별개의 기능이다.

또한 AdamW 옵티마이저의 메모리 요구량을 계산할 때 자주 하는 오해가 있다. 흔히 1st moment(momentum)와 2nd moment(variance)만 저장하므로 2배의 메모리가 필요하다고 생각할 수 있으나, mixed precision 학습에서는 fp32 master weights를 별도로 유지하기 때문에 총 optimizer 관련 상태는 최대 4배에 이를 수 있다. 보수적으로 계산할 경우 전체 파라미터 대비 3~4배의 optimizer 상태를 예상하는 것이 안전하다.

Qwen3-Coder-30B-A3B-Instruct는 Mixture of Experts 구조를 갖는 모델로, 총 파라미터 수는 30.5B이지만 총 128개의 expert 중 한 번의 forward pass에서 8개만 활성화되며, 이때 실제로 연산에 사용되는 파라미터 수는 약 3.3B 수준이다. 이로 인해 학습 시 자원 요구량은 Dense 모델에 비해 매우 낮다. BF16 기준으로 파라미터는 약 6.6GB, optimizer 상태는 약 26.4GB, activation은 gradient checkpointing을 적용했을 때 약 650GB 수준으로, Dense 모델 대비 훨씬 적다. 따라서 단일 노드에서도 8개 GPU로 충분히 학습이 가능하며, 더 많은 expert shard를 활용하거나 throughput을 높이기 위해 multi-node 환경도 고려할 수 있다.



2. Single Node와 Multi-node 학습 시의 고려 사항



Single Node에서는 일반적으로 torchrun의 --nproc_per_node 옵션만 지정하면 되며, 대부분의 통신은 NCCL 백엔드를 통해 자동으로 처리된다. 반면 Multi-node 환경에서는 추가적인 네트워크 및 환경 설정이 필요하다. 가장 중요한 설정은 MASTER_ADDR, MASTER_PORT, NODE_RANK, WORLD_SIZE 등의 분산 학습 관련 환경변수이다.

예를 들어 2개의 노드가 있고, 각각 8개의 GPU를 사용할 경우 다음과 같이 설정한다.

노드 이름 IP 주소 NODE_RANK WORLD_SIZE NPROC_PER_NODE

node-0 10.1.1.1 0 16 8
node-1 10.1.1.2 1 16 8


실행은 각 노드에서 별도의 쉘에서 아래처럼 실행한다(동시에 실행되도록 tmux/ssh 사용 권장).

node-0에서 실행

MASTER_ADDR=10.1.1.1 MASTER_PORT=23456 WORLD_SIZE=16 NODE_RANK=0
torchrun --nproc_per_node=8 --nnodes=2 --node_rank=0
--master_addr=10.1.1.1 --master_port=23456 train.py

node-1에서 실행

MASTER_ADDR=10.1.1.1 MASTER_PORT=23456 WORLD_SIZE=16 NODE_RANK=1
torchrun --nproc_per_node=8 --nnodes=2 --node_rank=1
--master_addr=10.1.1.1 --master_port=23456 train.py

한 노드에서 모든 노드를 한 번에 구동하고 싶다면 런처 스크립트로 ssh를 사용해 원격 실행하거나, SLURM/DeepSpeed 런처/Accelerate 멀티노드 설정을 사용한다. 예를 들어 DeepSpeed 런처는 hostfile을 지원한다.

deepspeed 멀티노드 (hostfile 사용)

hostfile 내용 예시

node-0 slots=8

node-1 slots=8

deepseed --hostfile=hostfile --num_nodes=2 --num_gpus=8 train.py

또는 Hugging Face Accelerate를 사용해 accelerate config로 멀티노드 설정을 작성한 뒤 accelerate launch --num_processes 16 --num_machines 2 --machine_rank {0|1} --main_process_ip 10.1.1.1 --main_process_port 23456 train.py 형태로 각 노드에서 실행한다.

멀티 노드에서 학습 중간 결과를 저장하려면 output_dir이 모든 노드에서 공유되는 파일 시스템(NFS, Lustre 등)에 위치해야 하며, DeepSpeed config에서도 ZeRO Stage 3를 설정하고 offload_optimizer 옵션은 가능한 GPU에 유지하는 것이 좋다. 통신 병목이나 GPU 실패에 대비해 checkpoint를 주기적으로 저장하는 것도 중요하다.

3. 학습 데이터 크기와 Epoch 설정



Supervised Fine-tuning의 데이터 양은 모델의 크기(실제 학습에 참여하는 파라미터 수), 튜닝 목적, 데이터 품질에 따라 달라진다. 취소선 문제가 생기지 않도록 범위 표기는 물결표(~) 대신 ‘–’ 또는 ‘to’를 사용한다. 실무 기준 권장 규칙은 다음과 같다.

경량 Instruction SFT: 파라미터 1B당 30M–100M tokens

도메인 적응/정밀 SFT: 파라미터 1B당 100M–300M tokens


이 규칙을 모델별로 적용하면 다음과 같다.

모델 학습에 참여하는 파라미터 수 권장 Token 수(Instruction) 권장 Token 수(정밀)

Qwen2.5-Coder-32B (Dense) 32B 0.96B–3.2B 3.2B–9.6B
Qwen3-Coder-30B-A3B (MoE) 3.3B (activated) 0.10B–0.33B 0.33B–1.0B


샘플 수 환산은 평균 512 tokens/sample 가정 시 다음과 같다.

Token 수 대략적 샘플 수 (@512/sample)

0.1B 약 0.2M samples
0.33B 약 0.65M samples
1.0B 약 2.0M samples
3.2B 약 6.25M samples
9.6B 약 18.75M samples


Epoch 수는 데이터 볼륨과 중복도에 따라 조정한다. 데이터가 적거나 고품질(instruction curated)일수록 3–5 epochs가 유리하며, 데이터가 크고 다양하면 1–2 epochs로도 충분하다. Oversampling으로 과적합 징후가 보이면 Early Stopping과 Regularization(예: label smoothing 0.05–0.1)을 함께 고려한다.

4. 학습 구성 요소 및 설정 설명



항목 설정

Optimizer AdamW
Scheduler Cosine decay with warmup
Mixed Precision bf16=True
Gradient Accumulation 2 ~ 8
Per-device Batch Size 1 ~ 2
DeepSpeed ZeRO Stage 3, optimizer offloading은 상황에 따라 선택
Gradient Checkpointing True
Loss Function Cross Entropy Loss (Token-level)
Evaluation Metrics Execution Accuracy, Exact Match Accuracy
Activation Function GELU


7. 마무리 정리



Qwen2.5-Coder-32B-Instruct는 Dense 모델로 모든 파라미터가 한 번에 활성화되기 때문에 하드웨어 자원 소모가 크고, gradient checkpointing 없이 학습하는 것은 사실상 어렵다. 반면 Qwen3-Coder-30B-A3B-Instruct는 MoE 구조로 전체 파라미터 수는 크지만 한 번의 연산에서 활성화되는 파라미터 수는 3.3B 수준으로 상대적으로 가볍다. 따라서 학습 시 자원 효율성이 높고, 동일한 자원으로 더 큰 표현력을 가진 모델을 다룰 수 있다는 장점이 있다.

Dense 모델은 구현이 단순하고 인프라 요구사항이 비교적 낮지만, MoE 모델은 expert shard, load balancing, routing latency 등 더 복잡한 고려사항이 존재한다. 학습 전에는 데이터 양뿐 아니라 자원 구성과 네트워크 환경까지 종합적으로 고려해야 하며, DeepSpeed 설정과 파일 시스템 공유 여부 등 실무적인 준비도 철저히 필요하다. 이러한 요소들을 사전에 잘 설계하면, 대규모 언어 모델의 SFT를 보다 효율적으로 수행할 수 있다.


keyword
작가의 이전글Python 알고리즘 유형 및 대표 문제 총정리