사전 학습(Pretrain)부터 RLHF(PPO/GRPO)까지, 밑바닥부터 오픈 소스 LLM 개발하기
요약
본 기술 보고서는 밑바닥부터 LLM을 개발하는 과정을 다루며, VRAM 사용량을 최적화한 DeepSeek 아키텍처를 기반으로 합니다. 저자는 오픈 소스 생태계가 대기업의 개발 속도를 능가할 수 있다고 믿으며, 모든 최상위 1T 파라미터 모델에 필적하는 LLM을 구축하는 것을 목표로 하고 있습니다. 현재는 DOLMA/RedPajama 데이터셋을 활용하여 수학, 문학, 물리학 등 다양한 분야로 학습시키고 있으며, 향후 에이전트 앙상블 배포를 계획하고 있습니다.
핵심 포인트
- VRAM 최적화된 DeepSeek 아키텍처 기반의 LLM 개발 진행 중
- 오픈 소스 생태계가 상업 기업을 능가할 수 있다는 비전을 제시
- DOLMA/RedPajama 데이터셋으로 다중 분야 학습 및 에이전트 앙상블 배포 계획
- Chinchilla 최적화 원칙을 따르며, bfloat16 정밀도를 사용함
- 현재까지의 사실적 정확성 테스트 결과는 33.3%로 나타남
안녕하세요, 저는 밑바닥부터 LLM을 만드는 작업을 해오고 있습니다. 이 모델은 VRAM 사용량을 대폭 줄여 최적화된(GUM+muon) DeepSeek 아키텍처를 기반으로 합니다.
현재 사용 중인 JSON 스키마는 현재 진행 중인 사전 학습(Pretraining) 내용을 충분히 보여줄 것입니다.
저는 6000 Pro 600W 2개를 보유하고 있습니다.
64개의 전문가(Experts)를 가진 7B 파라미터 모델을 테스트 중입니다... 현재 단일 GPU에서 100% 처리량(Throughput)으로 실행 중입니다 (가장 어려운 부분이었으며, 약 80GB VRAM 학습 중입니다). (전문가 수를 줄이면 VRAM 사용량을 실질적으로 줄일 수 있겠지만... 저는 지금 한계까지 밀어붙이고 있습니다!)
저의 주요 목표는 단순히 오픈 소스 개발이 대기업의 개발 속도를 훨씬 앞지를 것이라는 점입니다. 저는 누군가가 이것을 사용하여 모든 최상위 1T 파라미터 모델을 이길 수 있는 LLM을 밑바닥부터 구축할 수 있다고 믿습니다. 저의 목표는 누구나 사용할 수 있는 학습된 모델의 대규모 데이터베이스를 만드는 것입니다. 미래에는 지원 기능으로서 오픈 소스 개발자로부터 모델을 임대하는 방식도 고려하고 있습니다. 말이 너무 길어졌으니 기술 보고서(Technical report)를 확인해 주세요.
제가 DOLMA/RedPajama를 사용하고 있기 때문에, 데이터 분할(Data split)을 통해 수학, 문학, 물리학 등에 능숙하도록 학습시킨 뒤, 이들을 에이전트(Agents)로 앙상블 배포할 수 있습니다. (현재는 비교할 단일 모델이 없기 때문에 이는 향후 할 일(Todo) 목록에 있습니다.)
이것은 또한 Chinchilla 최적(Chinchilla optimal)을 따르고 있습니다! DeepMind에 감사드립니다!
모두 bfloat16을 사용하며, 만약 당신이 미래에서 왔고 bf16 속도로 fp32를 수행할 수 있는 GPU를 가지고 있다면 fp16 또는 fp32를 사용하도록 구성할 수 있습니다!
네, 이 과정 동안 여러 번 정신을 놓기도 했지만, 결국 작동하는 무언가를 만들어냈습니다!
현재 15,000 스텝(Steps) 진행 중입니다.
======================================================================
[사실적 정확성 테스트 (FACTUAL ACCURACY TEST)] 14000 스텝
======================================================================
프롬프트(Prompt): "The capital of France is"
출력(Output): "the city of Nice.
France may also refer to:
France (surname)
France (surname)
France (or Republ..." [정확함 (CORRECT)]
프롬프트(Prompt): "The capital of Japan is"
출력(Output): "the capital of the autonomous prefecture of Hokkaido.
어원학적 분석 (Etymology)
The name of Hokkaido is derived fro..." [예상값: Tokyo]
프롬프트(Prompt): "def fibonacci(n):
"""Return the nth Fibonacci ..."""
출력(Output): """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
프롬프트(Prompt): "import torch
import torch.nn as nn
class Transfor..."
출력(Output): "// InverterBlock
// s2, s2, s3
// A_1, A_2, A_3, A_4, A_5, A_6
// A1, A2, A3, A4, A5
// A1, A2, A3, ..."
프롬프트(Prompt): "The theory of relativity states that"
출력(Output): "the speed of light varies with the speed of the observer. This is a constant, since the speed of lig..."
프롬프트(Prompt): "In machine learning, gradient descent is used to"
출력(Output): "perform a gradient descent, where the gradient is calculated via a local gradient. The gradient eval..."
프롬프트(Prompt): "Question: What is 2 + 2?
Answer:"
출력(Output): "2 + 2
Author: PCR
Date Submitted: 2nd April 2013
Pp: 200-201
Exercise: Exercise 2.0
2 + 1 = 2 +..." [예상값: 4]
프롬프트(Prompt): "Question: Explain the concept of recursion.
Answer..."
출력(Output): "In programming, a function or sequence of operations is a function that can transform a variable to ..."
사실적 정확성 (FACTUAL ACCURACY): 1/3 = 33.3%
[SMBench] 14000 스텝 -- 1/5: 다중 규칙 추론 (Multi-Rule Reasoning)
.
.
.
아키텍처를 정의하는 JSON 구조
"experiment_name": "deepseek_v3_7b_lowvram",
"output_dir": "*******",
"seed": 420,
"model": {
"num_layers": 24,
"vocab_size": 50304,
"norm_type": "rmsnorm",
"norm_eps": 1e-06,
"tie_word_embeddings": false,
"init_method_std": 0.006,
"first_k_dense_replace": 8,
"dense_layer_interval": 1,
"paper_compliant": false,
"mla": {
"d_model": 1408,
"d_latent": 352,
"num_heads": 22,
"num_kv_heads": 2,
"max_context_length": 4096,
"use_flash_mla": false,
.
.
.
},
"moe": {
"num_experts": 64,
"num_experts_per_token": 4,
"expert_intermediate_size": 1536,
"expert_dim": 1536,
"dropout": 0.0,
"num_shared_experts": 1,
.
.
.
.
}
},
"fusions": {
"use_fused_expert_ffn": true,
"use_te_fused_topk": false,
"use_te_fused_permute": false,
"use_fused_softmax": true,
"fused_softmax_in_fp32": true,
"use_group_limited_topk": true,
.
.
.
},
"memory_optimization": {
"use_galore": false,
"galore_rank": 256,
"galore_update_proj_gap": 500,
"galore_scale": 1.0,
.
.
.
},
"training": {
"device": "cuda",
"global_batch_size": 256,
"micro_batch_size": 4,
"gradient_accumulation_steps": 64,
"seq_length": 1024,
"max_batch_seq_multiplier": 1.25,
"tokens_per_parameter_ratio": 40.0,
"total_training_tokens": 280000000000,
"learning_rate": 0.00042,
"min_learning_rate": 4.2e-05,
"lr_preset": "deepseek_v3",
.
.
.
},
"data": {
"use_multi_source": true,
"sources": [
{
"name": "redpajama",
"type": "dolma",
"subset": "dolma_v1_6_redpajama",
"weight": 0.45,
"description": "RedPajama - CommonCrawl과 유사한 다양한 웹/코드/도서"
},
{
"name": "stack",
"type": "dolma",
"subset": "dolma_v1_6_stack",
"weight": 0.25,
.
.
.
],
"cache_dir": "",
"sanitization": {
"enabled": true,
"target_language": "en",
"min_language_confidence": 0.9,
"min_article_length": 100,
.
.
.
},
"preprocessing": {
"num_workers": 8,
"shuffle": true,
"shuffle_seed": 42,
.
.
.
},
"max_articles": null,
"focus_historical": false,
"boost_hiroshima_content": false
},
"distributed": {
"backend": "nccl",
"launcher": "single_gpu",
"tensor_parallel_size": 1,
"pipeline_parallel_size": 1,
"expert_parallel_size": 1,
"data_parallel_size": 1,
"zero_stage": 2,
"zero_offload": true,
"overlap_grad_reduce": true,
"overlap_param_gather": true,
"deepspeed": {
"enabled": false
}
},
"checkpointing": {
"save_interval": 1000,
"save_total_limit": 3,
"resume_from_checkpoint": null,
"checkpoint_format": "pytorch",
"save_optimizer_states": true
},
"logging": {
"log_level": "INFO",
"log_interval": 100,
"tensorboard_dir": "",
"wandb": {
"enabled": false
},
"tensorboard": {
"enabled": true
}
},
"validation": {
"enabled": true,
"eval_interval": 1000,
"eval_samples": 500,
"metrics": [
"loss",
"perplexity"
],
"patience": 300,
"early_stopping": false
},
"profiling": {
"trace_nvtx": false
},
"gpu_optimization": {
"cuda_graphs": true,
"torch_compile": true,
"flash_attention": true,
"fused_kernels": true,
"autocast_dtype": "bfloat16"
},
"test_prompts": {
"enabled": true,
그래서 저는 기본적으로 조사할 수 있는 모든 최적화 기법을 지구상에 존재하는 것들 전부 다 쏟아부었습니다. 심지어 sm120 Blackwell 아키텍처를 위해 저만의 FlashMLA를 직접 구축하려고 시도했으나, 추론(inference)은 작동하게 만들었음에도 불구하고 처참하게 실패했습니다... 역방향(backwards)은 타일링(tiling) 문제 때문에 불가능했는데, 결과적으로 Aeten torch 백엔드와 같거나 오히려 더 나쁜 수준이었습니다......
하지만 현재로서는 작동하고 있으며, 스텝(step)당 20초가 소요됩니다.
예시:
Training: 1%|█ | 14609/1000000 [53:18:23<5533:28:53, 23.37s/step, loss=2.1507, mtp=1.9643, ent=4.12, util=100.0%, imbal=0.26, lr=4.20e-04, tok=2.23B]
결론을 말씀드리자면,
결국 커뮤니티로부터 받게 될 비난을 최소화하기 위해, 100% 완벽하게 작동할 때까지는 이것을 오픈 소스(open source)로 공개하는 것이 정말 두렵습니다.
제가 가진 유일한 논쟁점은 이 방식을 사용하여 학습된 모든 모델이 공개되기를 원한다는 것입니다. 누군가가 이익을 위해 오픈 소스로 공개하지 않고 사유화하는 것을 원치 않습니다. 따라서 저는 이 방식으로 학습될 수 있는 최대한 많은 모델을 원하기 때문에, 어떻게 이 문제를 해결할지 주변에 물어보고 방법을 찾아내야 합니다. 저는 이미 적절한 설정을 염두에 두고 있는 누군가가 분명히 존재하며, 그가 최고 성능의 모델을 뛰어넘을 것이라고 믿기 때문입니다. 이것이 제가 이 작업을 수행한 주요 이유입니다. 제가 '그' 모델을 만들 수는 없다는 것을 알지만, 분명히 어딘가에 SOTA(State-of-the-Art, 최첨단) 모델을 학습시킬 수 있는 천재가 있다는 것은 확실히 알고 있습니다.
비난과 제가 혼자서는 도저히 해결할 수 없는 문제들이 두렵기 때문에, 공개하기 전에 정리해야 할 것들이 아주 많습니다!
관심이 있으시다면, 제가 이 리포지토리(repo)를 공개한다는 게시물을 올릴 때마다 제 계정을 주기적으로 확인해 주세요! 아니면 제 GitHub를 확인하는 것이 더 쉬울 것 같네요. 하하.
https://github.com/IISuperluminaLII
잘 모르겠네요.. 이것을 어떻게 적절하게 공개할지, 그리고 이 코드를 사용할 경우 모든 safetensors나 체크포인트 (checkpoints)를 오픈 소스로 공개하는 것을 엄격한 규칙으로 만들지에 대해 피드백을 환영합니다... 적절한 도구만 주어진다면, SOTA (State-of-the-Art) 수준의 성능에 근접할 수 있는 10B-50B 파라미터 (parameter) 규모의 모델 앙상블 모델 세트를 진정으로 구축할 수 있는 누군가가 어딘가에 있을 것이라고 믿습니다!! 사람들이 항상 말하듯, 분할 정복 (divide and conquer) 인 것이죠.
벌써 내용이 너무 길어졌네요, 제가 할 수 있는 만큼 모든 것을 쏟아부었습니다. 어떤 의견이든 환영합니다, 비난이라도 좋습니다! 결국 완벽한 오픈 소스 모델을 만들어낼 이름 모를 누군가에게 이 도구를 전달할 수 있도록, 제가 무엇을 수정해야 할지 알려주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기