Elice logo
  • 고객 사례

B200 GPU로 한국어 소형 파운데이션 모델 구축하기 ② - 학습·평가

Elice

2025. 11. 12.


이번 글에서는 1편에서 준비한 데이터셋을 학습시킬 모델의 구조와, 이를 B200 기반 멀티노드 환경에서 학습시키며 발생했던 문제 해결 과정, 그리고 초기 성능 평가 결과를 다루고자 합니다.
1편 다시보기


모델 구조 및 토크나이저

이번 실험의 목표는 거대한 모델을 만드는 것이 아니라 소형 모델에서도 사전학습 파이프라인이 안정적으로 동작하는지 확인하고 한국어 중심 데이터셋을 실제로 적용해보는 것이었습니다. 그래서 모델 아키텍처는 안정성과 재현성이 검증되어 있고, 학습 효율이 높은 구조를 우선했습니다.

모델 아키텍처 선택

Qwen3 0.6B를 기본으로 선택했습니다. SwiGLU, GQA, RoPE, RMSNorm 등 최근 모델 구조에서 공통으로 채택되는 요소들이 포함되어 있고, 소형 모델임에도 여러 공개 벤치마크에서 좋은 결과가 보고된 점을 고려했습니다.

또한 모델 가중치를 모두 초기화하여, 처음부터 저희 데이터셋을 학습시키는 방향으로 진행하였습니다. 이를 통해 사전학습과 같은 높은 부하에서의 B200 클러스터의 안정성과, 저희가 수집한 데이터셋의 품질, 그리고 학습 프레임워크의 효율성을 검증하고자 하였습니다.


토크나이저 선택

토크나이저는 학습 효율에 직접적인 영향을 주기 때문에 여러 공개 토크나이저를 먼저 비교했습니다. 기준은 한국어와 영어를 함께 처리하는 환경에서 얼마나 압축 효율이 안정적으로 유지되는가였습니다.

평가 결과 Midm-2.0 토크나이저가 영어와 한국어 모두에서 높은 평균 압축률을 보였고, 해당 모델에서 실제로 높은 한국어 및 영어 성능이 보고된 점을 고려해 이 토크나이저를 채택했습니다.

폭넓은 언어 지원이 필요한 경우 Llama 계열 토크나이저가 더 유리한 결과도 있었지만, 이번 프로젝트에서는 한국어·영어 이중언어 학습이라는 범위에 집중하는 것이 더 적절하다고 판단했습니다. 시작 단계에서 선택을 과도하게 확장하기보다는, 명확한 목표 범위 안에서 안정적으로 학습되는 환경을 갖추는 것이 우선이라고 보았습니다.

토크나이저 영어 압축률 한국어 압축률 영어-한국어 평균 압축률 일본어 압축률 중국어 압축률 베트남어 압축률 그 외 언어 압축률 다국어 평균 압축률
Midm-2.0 5.34 2.16 3.75 1.01 0.82 1.78 2.50 2.27
A.X-4.0 5.11 2.33 3.72 1.05 0.83 1.36 2.47 2.19
EXAONE-4.0 5.33 1.80 3.57 1.04 0.68 1.84 2.22 2.15
Llama 3.2 5.46 1.59 3.53 1.45 1.26 3.77 2.27 2.63
Qwen3 5.41 1.41 3.41 1.50 1.48 3.65 2.06 2.59
GLM-4.5 5.45 1.21 3.33 1.47 1.63 3.61 1.95 2.55

학습 인프라 및 멀티노드 환경

모델 성능의 핵심이 모델 아키텍처와 데이터라면, 학습 수행의 핵심은 수많은 노드를 성공적으로 관리하는 것입니다. 이번 프로젝트의 주요 목표 중 하나도 바로 이 부분이었습니다. 단일 노드 실험과 달리, 멀티노드 환경에서는 네트워크 설정, 파일 시스템, 컨테이너 실행 방식 등 작은 설정 차이에도 학습이 쉽게 중단될 수 있기 때문에 초기 안정화에 많은 시간을 썼습니다.


클러스터 환경 구성

학습은 엘리스 클라우드에 구축된 NVIDIA B200 GPU 120개(15노드)에서 진행했습니다. 모든 노드는 InfiniBand로 연결되어 있고, NVIDIA NeMo를 기반으로 Slurm을 통해 학습 작업을 관리했습니다.

학습 배포는 NeMo의 Slurm executor를 사용하였으며, 이를 위해 Slurm 클러스터에 enroot와 pyxis 플러그인을 설치했습니다. Ubuntu 24.04 환경에서는 권한 설정을 별도로 조정해야 했고, 모든 노드 설정을 일관되게 유지하기 위해 자동화 스크립트(Pyinfra)를 사용했습니다.


훈련 설정과 학습 안정화

이번 실험은 새로운 B200 환경에서 사전학습 파이프라인을 안정적으로 구축하는 데 목적이 있었기에, 이미 검증된 하이퍼파라미터 조합을 기반으로 안정적인 스타트 전략을 선택했습니다.

warm-up step을 2000으로 설정하고 BF16-Mixed precision을 사용했으며, sequence length 4,096, micro batch size 8 기준으로 15노드·120GPU 환경에서 global batch size가 960이 되도록 구성했습니다. Optimizer는 Distributed Fused Adam을 사용했습니다.

학습 초반에는 예상치 못한 병목을 마주했습니다. 먼저 대량의 데이터를 처리하는 과정에서 NCCL 타임아웃이 발생해 학습이 멈추는 현상이 반복되어 TORCH_NCCL_HEARTBEAT_TIMEOUT_SEC 조정으로 해결했습니다. 이어 스텝당 20~30초가 걸리는 속도 저하가 나타났고, 처음에는 공유 스토리지(NFS) 병목을 의심했습니다. 1T 데이터셋을 전체 노드의 NVMe로 직접 복제하고 비공유 디렉토리를 지원하도록 NeMo 이미지를 수정 및 배포했으나, 속도는 개선되지 않았습니다.

학습 과정을 하나씩 분리해 검증한 결과 원인은 앞서 조정했던 NCCL heartbeat timeout 설정이었습니다. 해당 값을 최적화하고 NVIDIA NeMo 튜닝 가이드를 적용한 후에는 GPU당 4,096 토큰을 약 0.45초에 처리하며 단일 노드와 유사한 수준의 성능을 확보했습니다. 약 30배 속도 개선이 이뤄졌고, 엘리스의 B200 클러스터가 분산 학습 환경에서도 추가적인 병목 없이 안정적으로 스케일링이 가능하다는 점을 확인했습니다.


성능 평가

본래 목표했던 데이터셋의 크기는 2T token, 학습 기간은 2 Epoch이었으나 제한된 시간 내에 학습을 진행하기 위해 각각 1T, 0.5 Epoch만을 수행했습니다. 이는 계획된 학습의 1/8 수준으로, 이번 평가는 한국어와 영어 양쪽에서 최소한의 이해 능력을 갖추고 있는지 확인하는 방향으로 진행했습니다.

일관적이고 재현 가능한 평가를 위해 lm-evaluation-harness를 사용했고, HAERAE, KMMLU, MMLU에서 0-shot과 5-shot 조건을 함께 측정했습니다.

이번 실험의 목적을 고려하면, 초기 모델이 안정적으로 작동하는 상태까지 도달한 것에 의미를 두고 있습니다.

Models Setting HAERAE KMMLU MMLU
Ours 0-Shot 0.1897 0.1706 0.2516
5-Shot 0.2053 0.2157 0.2770
Qwen3-0.6B-Base 0-Shot 0.3483 0.2286 0.5024
5-Shot 0.3932 0.2887 0.5247
42dot_LLM-PLM-1.3B 0-Shot 0.1769 0.2986 0.2569
5-Shot 0.1916 0.2985 0.2630
Qwen2.5-0.5B 0-Shot 0.3236 0.2163 0.4736
5-Shot 0.3208 0.3195 0.4760
Qwen2-0.5B 0-Shot 0.2053 0.2225 0.4395
5-Shot 0.2291 0.2781 0.4419
Qwen1.5-0.5B 0-Shot 0.1916 0.2396 0.3818
5-Shot 0.2227 0.1558 0.3851
Llama-3.2-1B 0-Shot 0.2218 0.2994 0.3699
5-Shot 0.2026 0.2554 0.3123
gemma-3-1b-pt 0-Shot 0.2108 0.2998 0.2498
5-Shot 0.2035 0.2583 0.2607
gemma-3-270m 0-Shot 0.1870 0.2341 0.2636
5-Shot 0.2016 0.2875 0.2667

사용 방법 예시

저희가 학습한 모델은 transformers 라이브러리를 통해 쉽게 로드하고 사용할 수 있습니다.

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = "eliceai/eliceai-0.6B-Base"
device = "cuda" if torch.cuda.is_available() else "cpu"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto").to(device)

prompt = "대한민국의 수도는"
model_inputs = tokenizer(prompt, return_tensors="pt").to(device)

generated_ids = model.generate(**model_inputs, max_new_tokens=100)
output_text = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
print(output_text)

출력 예시

대한민국의 수도는 서울이다. 서울은 대한민국의 중심 도시로서, 대한민국의 정치, 경제, 문화, 교육 등 모든 분야에서 중요한 역할을 하고 있다. 서울은 대한민국의 역사와 문화를 대표하는 도시로서, 대한민국의 발전과 번영에


마무리 및 다음 계획

이번 프로젝트에서는 엘리스의 새로운 B200 클러스터를 활용하여, 한국어 중심 LLM을 학습하기 위한 기본 토대와 운영 경험을 쌓아보았습니다. 데이터 준비와 품질 필터링, 분산 학습 안정화, 병목 해결까지 사전학습 파이프라인을 구성하는 데 필요한 핵심 단계를 실제로 경험하며 검증할 수 있었습니다.

다음 단계에서는 데이터 규모를 확장하고 multi-stage pre-training을 적용할 예정입니다. 더 긴 문맥을 처리할 수 있는 학습 구조로 확장한 뒤, SFT와 RL단계를 거쳐 대화형 모델이나 임베딩 모델로 발전시키는 방향도 함께 검토하고 있습니다. 이후에는 이번에 구축한 구조를 더 큰 모델에 적용해보는 것도 목표입니다.

짧은 기간의 실험이었지만,한국어 파운데이션 모델을 직접 학습하면서 얻은 시행착오와 경험이 앞으로의 실험을 더 빠르게 만드는 기반이 될 것입니다.



엘리스클라우드는 이번 프로젝트에서 사용한 것과 동일한 B200 기반 학습 환경을 제공하고 있습니다.

아시아 최초 수랭식 데이터센터에서 B200 클러스터를 활용해 다양한 연구나 모델 개발을 시도해보고 싶다면, 엘리스클라우드로 문의 주세요. 연구 협업 제안도 언제든 환영합니다.

  • #테크 블로그
아시아 최초 수랭식 B200 클러스터를 이용해보세요.
문의하기
Show list