
Google Colab만으로 LLM을 만든다! 0.5B 사이즈의 LLM을 풀 스크래치(Full Scratch)로 만드는 교재
요약
Google Colab 환경에서 0.5B 사이즈의 LLM을 처음부터 구현해 볼 수 있는 교재 'EveryonesLLM'이 공개되었습니다. 데이터 로더부터 인스트럭션 튜닝까지의 전 과정을 심플하게 구현하여 학습자가 환경 구축의 어려움 없이 모델 제작의 재미를 느낄 수 있도록 설계되었습니다.
핵심 포인트
- Google Colab만으로 LLM의 전 과정을 구현 가능
- 데이터 로더, 어텐션, 트랜스포머 블록 등 핵심 요소 직접 구현
- 복잡한 환경 구축 없이 모델 제작의 핵심 원리에 집중
- PyTorch 경험자라면 고등학생 수준의 수학 지식으로도 학습 가능
Google Colab만으로, 0.5B 사이즈의 LLM/SLM을 풀 스크래치(Full Scratch)로 만드는 교재 EveryonesLLM을 공개했습니다.
처음 뵙겠습니다, EveryonesLLM의 메인 저자인 혼고 하야토(Hayato Hongo)입니다.
현재는 도쿄대학 공학부에 소속되어 있습니다.
GitHub는 여기입니다.
이 기사에서는 EveryonesLLM이 어떤 교재인지, 왜 만들었는지, 어디를 중요하게 설계했는지를 쓰겠습니다.
EveryonesLLM은 Google Colab만으로 LLM을 0부터 만들기 위한 교재입니다.
단순히 "LLM을 사용하는" 것이 아니라, 데이터 로더(Data Loader), 임베딩(Embedding), 어텐션(Attention), 트랜스포머 블록(Transformer Block), 학습 루프(Training Loop), 사전 학습(Pre-training), 인스트럭션 튜닝(Instruction Tuning)까지 순서대로 구현해 나갑니다.
최종적으로는 상당히 작다고는 해도, 직접 만든 모델이 대화와 같은 응답을 돌려주는 단계까지 가는 것을 목표로 하고 있습니다.
이 교재에서 중요하게 생각한 것은 다음 세 가지입니다.
- Google Colab만으로 완결될 것
- 가급적 환경 구축으로 고생하지 않을 것
- LLM의 "재미있는 부분"에 집중할 수 있을 것
LLM을 만드는 교재나 기사는 세상에 많이 있습니다. 다만, 막상 직접 해보려고 하면 강력한 GPU가 필요하거나, 클라우드 서버에 SSH로 접속해야 하거나, 환경 구축에서 꽤 많은 시간을 빼앗기곤 합니다.
물론 환경 구축도 중요합니다. 하지만 처음 LLM을 배우는 사람에게는 그 부분이 가장 재미있는 지점은 아니라고 생각합니다.
제가 만들고 싶었던 것은, Colab을 열고 노트북을 위에서부터 순서대로 읽으며 실행해 나가면, LLM이 조금씩 형태를 갖춰가는 교재입니다.
1년 전쯤에는 적어도 "0.5B 사이즈 정도의 LLM을, 3B tokens 정도로 학습시켜서 어느 정도 제대로 대화할 수 있게 만드는 것"은 개인이 Google Colab만으로 하기에는 상당히 어렵다고 생각했습니다.
하지만 미래에는 Colab에도 더 좋은 GPU가 탑재될 것이고, 계산 환경도 조금씩 간편해질 것이라고 생각했습니다.
그렇게 되었을 때,
Google Colab만으로 어느 정도 제대로 대화할 수 있는 LLM을 만들 수 있는 교재가 있다면 재미있겠다
라고 생각하여 EveryonesLLM을 만들기 시작했습니다.
저 자신도 프로그래밍을 전혀 못 하던 시절에 ChatGPT를 만나 "이것을 나도 직접 만들어보고 싶다"라고 생각했습니다.
하지만 거기서부터 실제로 배우려고 하니 상당히 힘들었습니다.
힘들었던 이유의 대부분은 LLM 그 자체라기보다 환경 구축이나 주변 지식이었습니다. GPU 환경, 클라우드, 라이브러리, 설정, 정체 모를 에러들. 게다가 AI라는 이름이 붙어 있지만 실체는 고전적인 통계 강의에 꽤 많은 시간을 소비하기도 했습니다.
물론 그러한 지식도 중요합니다. 다만, LLM에 감동한 사람이 처음에 경험하고 싶은 것은 그것이 아닐 것입니다.
저는 고등학생이라도 LLM을 사용하며 감동했던 사람이, 이번에는 "직접 LLM을 만들어 감동하는" 경험을 만들어주고 싶었습니다.
현재의 주요 대상자는 PyTorch로 MLP를 구현해 본 적이 있는 분들입니다.
따라서 PyTorch 자체를 완전히 처음 접하는 분은 우선 PyTorch 사용법을 익힐 필요가 있습니다.
다만, 최종적으로는 프로그래밍 미경험자인 고등학생이라도 진행할 수 있는 교재로 만들고 싶습니다.
그렇기 때문에 구현은 가급적 심플하게 하고 있습니다. 수식도 나쁜 의미로 지루해지지 않는 범위 내에서 최대한 쉽게 만들었습니다.
행렬의 내적 등 최소한으로 필요한 것을 제외하면, 가급적 고교 수학으로 이해할 수 있도록 한다는 방침입니다.
EveryonesLLM의 모델은 기본적으로 dense한 decoder-only Transformer입니다.
최근의 대규모 언어 모델(LLM)에서 사용되는 테크닉을 전부 때려 넣지는 않았습니다.
오히려 상당히 덜어냈습니다.
예를 들어, EveryonesLLM에는 다음과 같은 것들은 들어있지 않습니다.
- KV Cache
- RoPE
- FlashAttention
- GQA
- SwiGLU
활성화 함수(Activation Function)도 매우 소박하게 ReLU를 사용하고 있습니다. GELU조차 아닙니다.
최근의 LLM 구현을 자주 보는 분들에게는 상당히 간단한 구현으로 보일 것입니다.
이것은 태만함이 아니라 교재로서의 의도입니다.
LLM을 만드는 데 있어 최신 테크닉을 전부 이해해야만 진행할 수 있는 구성으로 만들고 싶지 않았습니다.
예를 들어 RoPE는 매우 중요한 기술이지만, 제대로 이해하려고 하면 푸리에 급수(Fourier series) 등의 지식도 얽히게 됩니다. 이는 고등학생이나 초학자에게는 상당히 무거운 주제입니다.
물론 성능을 극한으로 끌어올리려면 도입해야 할 기술은 많이 있습니다. 다만, 처음에 LLM을 배우는 단계에서는 미세한 성능 개선을 위해 복잡성을 늘리기보다, "Transformer의 본질적인 흐름을 이해할 수 있는 것"이 더 중요하다고 생각합니다.
반면에, 상대 위치 임베딩 (Relative Position Embedding)은 포함했습니다.
이는 구현이 비교적 단순한 데 비해, 성능에 미치는 영향이 상당히 크다고 느꼈기 때문입니다.
즉, EveryonesLLM의 방침은 다음과 같습니다.
GPT에 가까운 기본 구조를 유지하면서, 초학자에게 이해 부담이 큰 것은 가능한 한 덜어낸다.
단, 효과가 크고 교재로서도 다루기 쉬운 것은 넣는다.
참고한 것으로는 nanoGPT나 MiniMind가 있습니다. 다만, 그것들을 그대로 크게 만드는 것이 아니라, 교육용으로 상당히 간략화하는 방향으로 만들고 있습니다.
EveryonesLLM에서는 Chapter 00부터 순서대로 진행하며 LLM의 구성 요소를 조금씩 구현해 나갑니다.
대략적인 흐름은 다음과 같습니다.
- 데이터 로더 (Data Loader) 만들기
- Token Embedding 만들기
- Position Embedding 만들기
- LayerNorm 만들기
- Attention 만들기
- Multi-Head Attention 만들기
- Feed Forward 만들기
- Transformer Block 조립하기
- Trainer 만들기
- GPU로 학습하기
- 학습률 (Learning Rate) 및 Scaling Law 다루기
- TinyStories로 학습하기
- 상대 위치 임베딩 넣기
- Checkpoint 다루기
- 대규모 웹 데이터로 사전 학습 (Pretraining) 하기
- 인스트럭션 튜닝 (Instruction Tuning) 하기
최종적으로는 Chapter 29에서 Instruction Tuning까지 진행합니다.
비용은 대략 3,000엔 정도입니다.
Colab 크레딧으로 치면 300 크레딧입니다.
실제로 대화할 수 있는 모델을 이 비용으로 만들 수 있는 것은
그야말로 Google Colab 덕분입니다.
EveryonesLLM에서 가장 체험해 주었으면 하는 것은,
"LLM은 완전한 블랙박스가 아니라, 내 손으로 조금씩 조립할 수 있는 것이구나"
라는 감각입니다.
ChatGPT와 같은 모델을 보면 매우 먼 존재처럼 느껴집니다.
하지만 Token Embedding을 만들고, Attention을 작성하고, Transformer Block을 쌓고, Trainer를 만들고, 데이터를 흘려보내다 보면 조금씩 "모델"이 형태를 갖추어 갑니다.
처음에는 의미를 알 수 없는 문자열만 내뱉던 모델이, 학습이 진행됨에 따라 조금씩 문장다운 것을 내뱉기 시작합니다.
여기에 Instruction Tuning을 하면 대화가 가능해집니다.
이 체험은 상당히 흥미롭습니다.
LLM을 "사용"하는 것뿐만 아니라, "만드는" 쪽으로 돌아서면 AI를 보는 눈이 상당히 달라질 것이라고 생각합니다.
최근의 LLM 구현에는 성능을 높이기 위한 기법들이 많이 들어가 있습니다.
그 자체는 훌륭한 일입니다.
다만, 초학자가 갑자기 그것들을 전부 이해하려고 하면 상당히 힘듭니다.
RoPE, FlashAttention, GQA, SwiGLU, KV Cache, 분산 학습 (Distributed Training), 데이터셋 정제, 평가, 추론 가속화…….
모두 중요합니다. 하지만 전부 처음부터 넣으면 무엇이 본질인지 보기 어려워집니다.
EveryonesLLM에서는 의도적으로 많은 것들을 덜어냈습니다.
그 대신,
- 입력 토큰이 Embedding이 된다
- Attention으로 문맥을 섞는다
- Transformer Block을 쌓는다
- Loss를 낮춘다
- 문장 생성이 조금씩 변한다
라는 흐름을 가능한 한 명확하게 만들었습니다.
우선은 이곳을 체험해 주셨으면 합니다.
최신 테크닉을 배우는 것은 그 이후에 해도 충분하다고 생각합니다.
지금은 PyTorch 초보자를 주요 대상으로 하고 있지만, 장기적으로는 프로그래밍 경험이 없는 고등학생이라도 진행할 수 있도록 만들고 싶습니다.
이를 위해 설명 추가, 도표 추가, 에러 대응, 더욱 친절한 도입 등을 진행할 예정입니다.
또한, 교재로서는 아직 개선할 수 있는 부분이 많이 있습니다.
"이 부분이 이해하기 어렵다"
"이 Chapter에서 막혔다"
"이런 설명이 있으면 좋겠다"
등이 있다면 꼭 Issues를 통해 알려주세요.
EveryonesLLM은 LLM을 사용하여 감동을 받은 사람이, 이번에는 LLM을 직접 만들어 보며 감동하기 위한 교재입니다.
저 자신도 ChatGPT를 만나고 "이것을 만들어 보고 싶다"라고 생각한 것에서 시작되었습니다.
그 과정에서 꽤 많은 시행착오를 겪었습니다. 환경 구축 (Environment Setup)으로 고생하거나, 무엇을 배워야 할지 몰라 방황하는 등 불필요한 고생도 많이 했습니다.
그렇기에 앞으로 배우게 될 분들은 가능한 한 빨리 LLM의 재미있는 부분에 도달하기를 바라고 있습니다.
Google Colab을 여는 것만으로, LLM을 0부터 만든다.
그런 경험을 가능한 한 많은 사람에게 전달할 수 있다면 기쁘겠습니다.
리포지토리 (Repository)는 여기입니다.
이 튜토리얼 (Tutorial)은 Andrej Karpathy 님의 nanoGPT와 jingyaogong 님의 Minimind를 베이스로 하고 있습니다. 인스트럭션 튜닝 (Instruction Tuning)에 대해서는 Sebastian Raschka 님의 저서 Build a Large Language Model (From Scratch)를 참고했습니다. 비전 LLM (Vision LLM)에 대해서는 LLaVA를 참고했습니다.
이 자리를 빌려 진심으로 감사드립니다.
본 프로젝트 「EveryonesLLM」은 주식회사 NTT DATA MSE 님의 지원 아래, 학생 단체 「도쿄대 AI 연구회」에 의한 OSS 프로젝트로서 완성되었습니다.
본 교재의 개발에 있어 따뜻한 지원과 협력을 해주신 주식회사 NTT DATA MSE 님께 진심으로 감사의 말씀을 드립니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기