ChatGPT의 순수 수동 복제본으로 비용은 100달러이고 코드 줄 수는 8,000개입니다!
테슬라의 전 AI 디렉터이자 OpenAI의 창립 멤버이며, 교육 분야에서 풀타임으로 일하겠다고 발표한 AI 전문가인 안드레이 카르파티가 오랫동안 아무 말도 하지 않다가, 마침내, 마침내, 마침내 새로운 수업을 가르치게 됐습니다!
저자는 새로운 작품인 나노챗을 가장 "미친" 작품 중 하나이자 자기만족적인 작품으로 묘사합니다.
이는 최소한의 종속성을 갖춘 단일 코드 베이스로 ChatGPT의 간단한 버전을 구현하여 처음부터 구축한 최소한의 풀스택 학습/추론 파이프라인입니다.
클라우드 GPU 서버를 시작하고 스크립트를 실행하면 ChatGPT와 비슷한 웹 인터페이스에서 훈련한 대규모 언어 모델과 통신하는 데 최대 4시간이 걸립니다 .
전체 프로젝트는 약 8,000줄의 코드로 구성되어 있으며 다음 기능을 구현할 수 있습니다.
새로운 Rust 언어 기반 토크나이저 훈련
FineWeb 데이터세트에서 Transformer 아키텍처를 사용하여 대규모 언어 모델을 사전 학습하고 여러 지표를 사용하여 CORE 점수를 평가합니다.
Midtrain은 SmolTalk 사용자 지원 대화 데이터 세트, 객관식 질문 데이터 세트, 도구 사용 데이터 세트에서 수행됩니다.
SFT(지시 미세 조정)를 수행하고 World Knowledge Multiple Choice Questions 데이터 세트(ARC-E/C), Mathematics 데이터 세트(GSM8K) 및 Code 데이터 세트(HumanEval)에 대한 대화 모델의 성능을 평가합니다.
GSM8K 데이터 세트에서 "GRPO" 알고리즘을 사용하여 모델의 선택적 강화 학습(RL) 훈련
추론 엔진에서 효율적인 모델 추론을 구현하고, KV 캐싱, 간단한 사전 채우기/디코딩 프로세스, 도구 사용(가벼운 샌드박스 환경에서 Python 인터프리터)을 지원하고, CLI 또는 ChatGPT와 유사한 WebUI를 통해 모델과 상호 작용합니다.
전체 학습 및 추론 과정을 요약하고 "게임화" 프레젠테이션(점수, 진행 상황 등의 형태로 결과를 시각적으로 표시)을 추가하는 단일 마크다운 보고서 카드를 생성합니다.
기본 대화를 수행하고, 스토리 시를 만들고, 간단한 질문에 답할 수 있는 단순화된 ChatGPT 모델을 훈련하고 복제하는 데 드는 총 비용은 약 100달러(8×H100에서 4시간 동안 훈련)에 불과합니다 .
전반적인 성과 지표는 다음과 같습니다.
약 12시간의 학습 후, 이 모델의 CORE 지표 성능은 GPT-2를 능가할 수 있습니다.
비용을 약 1,000달러로 더 늘리면(훈련 시간은 약 41.6시간) 모델 성능이 크게 향상되고 간단한 수학/코딩 문제와 롱(Long) 문제를 풀 수 있습니다.
구체적인 예를 들자면, 24시간의 학습 후, 깊이가 30인 모델은 MMLU 데이터 세트에서 40점 이상, ARC-Easy 데이터 세트에서 70점 이상, GSM8K 데이터 세트에서 20점 이상의 점수를 얻을 수 있습니다(GPT-3 Small 125M의 해시레이트 소비량과 동일, GPT-3의 천분의 일).
카파시는 자신의 목표는 이 완전한 "강력한 기준" 기술 스택을 통일되고, 최소화되고, 읽기 쉽고, 수정 가능하고, 배포하기 쉬운 코드 기반으로 통합하는 것이라고 말했습니다.
Nanochat은 LLM101n 과정(아직 개발 중)의 마무리 프로젝트가 될 것입니다 .
nanoGPT처럼 연구 도구 프레임 나 벤치마킹 도구로 발전할 잠재력이 있다고 생각합니다. 이 프로젝트는 아직 완전히 최적화되지는 않았지만(실제로 개선의 여지가 대량), 전반적인 프레임 GitHub에 공개할 만큼 완성도가 높으며, 이후 모든 모듈 커뮤니티를 통해 더욱 최적화될 수 있습니다.
새 작품을 기다리던 네티즌들은 열광했습니다. 프로젝트가 공개되자마자 GitHub 별점은 4,800개로 치솟았습니다.
멋지네요! 이 프로젝트를 한 번 진행해 보고 나면 이력서에 "머신러닝(ML) 엔지니어"라고 적으면 되겠네요!
슈안 큐, 당신이 공개하는 것은 단순한 코드가 아니라 이해할 수 있는 지혜, 폭발적인 가치입니다.
Kapasi는 댓글에서 nanochat의 기본 아키텍처가 Llama와 유사하지만 더 단순하며, modded-nanoGPT의 디자인 일부를 차용했다고 설명했습니다. 전반적인 목표는 이 규모의 모델을 위한 견고한 인프라를 구축하는 것입니다.
그리고 이 프로젝트는 기본적으로 전부 손으로 쓴 것 입니다.
Claude나 Codex 같은 에이전트를 사용해 보려고 했지만, 결과는 끔찍했고 거의 도움이 되지 않았습니다. 아마도 이 저장소의 구조가 훈련 데이터 분포와 달라서 "일치"하지 못했기 때문일 것입니다.
더 이상 미루지 말고 나노챗을 시작하는 방법에 대한 자세한 가이드를 소개합니다.
100달러로 만들 수 있는 최고의 ChatGPT
저는 Lambda GPU Cloud에서 시간당 약 24달러의 비용이 드는 8카드 H100 서버를 시작했기 때문에 시간과 경쟁해야 했습니다.
환경 설정
프로젝트를 복제합니다.
목표는 100달러로 최고 수준의 ChatGPT 모델을 훈련하는 것인데, 이를 "스피드런"이라고 합니다. speedrun.sh 스크립트는 새로운 서버에서 처음부터 끝까지 실행되도록 설계되었습니다.
하지만 카파시는 각 단계를 단계별로 설명합니다.
먼저, 이슈 uv 프로젝트 관리자가 설치되어 있는지 확인하세요. uv를 설치하고 .venv 디렉터리에 새 가상 환경을 만든 후 모든 종속성을 가져온 후 환경을 활성화하세요. 이렇게 하면 python을 입력할 때 시스템 자체의 Python 대신 가상 환경의 Python을 사용하게 됩니다.
다음으로, 커스텀 Rust 토크나이저를 컴파일할 수 있도록 Rust/Cargo를 설치해야 합니다. 새로운/커스텀 토크나이저를 도입하는 것은 다소 번거롭지만, 안타깝게도 Kapathy는 초기 minbpe 프로젝트의 Python 버전이 너무 느리고, huggingface 토크나이저가 너무 복잡하고 이해하기 어렵다고 생각했습니다.
따라서 우리는 학습을 위해 특별히 새로운 단어 분할기를 만들었고(Python 버전과의 일관성을 테스트했습니다), 추론 과정에서 효율성을 보장하기 위해 OpenAI의 tiktoken을 계속 사용할 것입니다.
이제 토크나이저를 컴파일해 보겠습니다.
단어 분할기 훈련
다음으로, 다음을 위해 사전 학습 데이터를 얻어야 합니다. 1) 단어 분할기를 학습합니다. 2) 모델을 사전 학습합니다.
사전 학습 데이터는 대량 의 웹 페이지의 텍스트 콘텐츠입니다 . 여기서는 FineWeb-EDU 데이터셋을 사용합니다.
일반적으로 huggingface datasets.load_dataset()을 직접 사용할 수 있지만 Karpathy는 이 기능이 너무 복잡하고 무거워서 간단한 로직을 가리는 것을 좋아하지 않으므로 전체 데이터 세트를 간단하고 완전히 섞은 샤드로 다시 패키징하여 원하는 대로 쉽고 효율적으로 액세스할 수 있도록 했고, sample-100B 버전을 karpathy/fineweb-edu-100b-shuffle로 다시 업로드했습니다.
이 페이지에서는 데이터 세트의 샘플 텍스트를 미리 볼 수도 있습니다. 각 샤드는 약 0.25M 문자로 구성된 간단한 Parquet 파일로, gzip 형식으로 압축하면 약 100MB의 디스크 공간을 차지합니다. 총 1,822개의 샤드가 있지만, 깊이 20인 모델을 학습하는 데는 240개만 필요합니다.
이제 모든 데이터를 다운로드해 볼까요? 약 24GB 정도 되는데, 클라우드 서버에서는 보통 꽤 빠른 편입니다.
기본적으로 이 모든 것은 ~/.cache/nanochat 디렉토리에 다운로드됩니다.
다운로드가 완료되면 토크나이저(문자열과 기호 코드북 간 변환을 담당하는 토크나이저) 훈련을 시작합니다. 기본적으로 훈련 어휘 크기는 2¹⁶ = 65,536개 토큰(적당한 숫자)이며, 일부 토큰은 나중에 채팅 모드에서 사용하기 위해 특수 토큰으로 예약되어 있습니다. 훈련 세트에는 2B개의 문자가 포함되어 있으며, 훈련에는 약 1분밖에 걸리지 않습니다.
학습 알고리즘은 OpenAI의 알고리즘과 정확히 동일합니다(정규식 분할, 바이트 단위 BPE). 자세한 내용은 Kapathy의 토큰화 기술 관련 영상을 참조하세요.
훈련이 완료되면 토크나이저를 평가할 수 있습니다.
평가 결과 약 4.8의 압축률을 달성했습니다(즉, 원본 텍스트의 평균 4.8자가 1개의 토큰으로 압축되었습니다). GPT-2 및 GPT-4 단어 분할기와의 비교 결과도 확인할 수 있습니다.
GPT-2(토큰 50,257개)와 비교했을 때 텍스트 전체 압축률이 더 높고 수학적 내용에서는 약간 뒤떨어집니다.
GPT-4와 비교했을 때 성능이 뛰어나지는 않지만, GPT-4의 더 많은 어휘(100,277개 토큰)를 고려하는 것이 중요합니다. GPT-4는 특히 다국어 처리에서 우수하며(FineWeb 데이터셋이 영어 콘텐츠에 집중되어 있다는 점을 고려하면 당연한 결과입니다), 코딩과 수학에서도 탁월한 성능을 보입니다.
이러한 사실에도 불구하고 어휘가 더 적더라도 FineWeb 데이터 세트에서 GPT-4보다 약간 더 나은 성능을 보였습니다 . 이는 우리가 학습시킨 데이터 세트이므로 토크나이저는 해당 문서 분포에 완벽하게 적합합니다(예: 영어 텍스트를 압축하는 데 더 유리할 수 있음).
사전 훈련
사전 훈련을 시작하기 전에 Kapathy에서 " eval bundle "이라고 부르는 또 다른 파일을 다운로드해야 합니다.
사전 학습 중에 스크립트는 CORE 지표를 주기적으로 평가합니다. 자세한 내용은 DCLM 논문에서 확인할 수 있지만, 기본적으로 CORE 지표는 대량 의 자동완성 데이터세트에서 모델이 얼마나 잘 작동하는지 측정하는 데 유용한 표준화된 일반 지표입니다.
이러한 데이터 세트에는 HellaSwag, jeopardy, bigbench QA wikidata, ARC-Easy/Challenge, copa, commonsense qa, piqa,lamada, winograd, boolq 등(총 22개)이 포함됩니다.
평가 패키지를 다운로드하고 압축을 풀고, 평가 패키지 디렉토리를 기본 디렉토리 ~/.cache/nanochat/eval_bundle에 넣습니다.
(선택 사항이지만) 하나 더 설정을 하는 것이 좋습니다.
훈련 중에 아름다운 차트를 볼 수 있도록 wandb를 구성하세요. uv는 이미 wandb를 설치했지만, 여전히 계정을 만들고 로그인해야 합니다.
이제 사전 학습을 시작할 수 있습니다! 이 부분은 가장 연산 집약적인 부분입니다. 시퀀스의 다음 토큰을 예측하여 인터넷 웹페이지 텍스트를 압축하는 대규모 언어 모델(LLM)을 학습합니다. 이 과정에서 대규모 언어 모델은 세상에 대한 대량 지식을 습득합니다.
여기서는 scripts/base_train.py 스크립트를 사용하여 8개의 GPU에서 학습을 시작합니다. 20개 레이어의 Transformer를 학습합니다. 기본적으로 각 GPU는 각 순방향/역방향 패스 동안 행당 2048개의 토큰으로 32개 행의 데이터를 처리합니다. 따라서 옵티마이저 단계당 총 32 × 2048 = 2¹⁹ = 524,288, 즉 ≈ 0.5M 토큰이 사용됩니다.
이미 wandb를 설정했다면 --run=speedrun을 추가하여(모든 교육 스크립트가 이 매개변수를 지원함) 실행 이름을 설정하고 관련 데이터를 기록할 수 있습니다.
훈련을 시작하면 다음과 비슷한 출력이 표시됩니다(간결성을 위해 대량 내용이 생략되었습니다).
보시다시피 이 트랜스포머는 1,280개의 채널과 10개의 어텐션 헤드를 가지고 있으며, 각 헤드의 dim은 128입니다. 약 5억 6천만 개의 매개변수를 가지고 있습니다. 친칠라 스케일링 법칙을 준수하려면 5억 6천만 × 20 ≈ 11.2B 개의 토큰을 학습에 사용해야 합니다.
최적화 프로그램의 각 단계에서 524,288개의 토큰을 처리하므로 이는 11.2B/0.5M ≈ 21,400번의 반복을 의미합니다.
토큰당 추정 FLOP 수를 토큰 총 수로 곱하면 이 모델의 계산 비용은 약 4e19 FLOP라는 것을 알 수 있습니다.
더 큰 모델은 더 작은 학습률을 선호하므로 학습률은 자동으로 1/sqrt(dim)으로 조정됩니다.
행렬 최적화에는 Muon을 사용하고, 임베딩 및 디임베딩 최적화에는 AdamW를 사용합니다. 이 모델에는 다른 학습 가능한 매개변수(예: 바이어스, rmsnorm 매개변수 등)가 없습니다. 학습 프로세스는 주기적으로 "검증 세트 bpb"를 보고하는데, 이는 검증 데이터셋의 바이트당 비트 수입니다.
바이트당 비트는 일반적인 크로스 엔트로피 손실보다 더 나은 지표입니다. 토큰당 바이트 수로 토큰당 손실을 더욱 정규화하여 지표를 토크나이저와 독립적으로 만들기 때문입니다.
따라서 어휘가 작은 토크나이저를 사용하든, 어휘가 큰 토크나이저를 사용하든 이 값은 비슷한 반면, 원시 교차 엔트로피 손실은 그렇지 않습니다.
각 단계는 약 0.5초가 걸리고, lrm은 학습률 감소 배수(훈련이 끝나갈 무렵 선형적으로 0으로 감소)이며, 보고된 MFU(모델 플롭 활용도)는 거의 절반에 가까워 매우 좋은 것으로 보이는데, 이는 사용 가능한 bfloat16 컴퓨팅 파워를 최대한 활용한다는 것을 의미합니다.
이제 4e19 FLOP의 계산이 완료될 때까지 약 3시간 정도 기다리세요 . wandb 그래프에서 다음과 같은 내용이 표시되어야 합니다.
시간이 지남에 따라 bpb가 감소하는데, 이는 좋은 신호입니다 (모델이 다음 토큰을 더 정확하게 예측하고 있음을 나타냅니다). 또한, CORE 점수도 상승 있습니다.
이러한 대략적인 측정 항목 외에도 모델을 보다 포괄적으로 평가할 수 있습니다.
훈련 세트/검증 세트의 bpb가 약 0.81에 도달했고, CORE 지수가 0.22로 상승 볼 수 있습니다.
비교를 위해 평가 패키지에는 GPT-2 모델의 CORE 점수가 포함되어 있습니다. 구체적으로, CORE 점수 0.22는 GPT-2 large(0.21)보다 약간 높지만, GPT-2 xl(즉, "표준" GPT-2인 0.26)보다는 약간 낮습니다.
이 시점에서 모델은 고급 자동완성 도구처럼 작동하므로, 몇 가지 프롬프트를 실행하여 모델에 저장된 지식을 파악할 수 있습니다. base_loss.py 파일은 이러한 프롬프트를 실행합니다. 이러한 프롬프트에는 다음이 포함됩니다.
완성된 텍스트는 다음과 같습니다.
따라서 이 모델은 파리가 프랑스의 수도이고, Au는 금을 의미하며, 토요일은 금요일 다음이고, "차가움"은 "더움"의 반대말이며, 심지어 우리 태양계의 행성도 알고 있습니다.
하지만 하늘의 색깔에 대해서는 아직 확신이 없으며, 간단한 수학 문제를 푸는 데도 어려움을 겪습니다.
학습 비용이 72달러인 모델에 비하면 그리 나쁘지 않은 결과입니다. 추론 과정은 효율적인 추론을 위해 KV 캐싱을 활용하는 커스텀 Engine 클래스를 사용하며, 사전 입력과 디코딩이라는 두 가지 일반적인 추론 단계만 구현합니다.
Engine 클래스는 GSM8K 데이터세트(나중에 자세히 설명)를 사용하여 학습할 때 유용한 도구(예: Python 인터프리터)의 사용도 지원합니다.
중간 훈련
다음은 중간 단계의 학습으로, smol-SmolTalk 데이터 세트에서 모델을 더욱 세부적으로 조정합니다.
알고리즘은 사전 학습과 정확히 동일하지만, 데이터셋이 대화 콘텐츠가 되었고, 모델은 다중 턴 대화 구조를 구축하는 데 사용되는 새로운 특수 토큰 에 적응합니다. 이제 각 대화는 OpenAI Harmony 채팅 형식을 대략적으로 따라 다음과 같습니다.
<|example|>과 같이 표시된 토큰은 OpenAI 특수 토큰 형식을 따르는 특수 토큰입니다. 이 토큰은 중간 학습 단계에서 모델의 다양한 적응에 매우 유용합니다 .
이 모델은 다중 턴 대화와 관련된 특수 토큰을 학습합니다(기본 모델 사전 학습에는 존재하지 않는 문서를 구분하는 데 사용되는 <|bos|> 토큰 제외).
이 모델은 인터넷 문서의 데이터 분포보다는 대화의 데이터 분포에 맞춰 조정됩니다.
모델이 롱(Long) 가르치는 것은 매우 중요했습니다. 왜냐하면 그렇게 작은 규모의 무작위 인터넷 데이터로는 이 문제를 학습할 수 없기 때문입니다. 구체적으로, 모델은 몇 가지 선택지를 몇 개의 글자(예: ABCD)와 연관시키고 정답을 출력하는 법을 배워야 했습니다. 이는 MMLU 보조 학습 세트에서 10만 개의 객관식 문제를 혼합하여 달성했습니다. 문제는 모델에 관련 지식이 부족하다는 것이 아니라, 객관식 문제의 작동 방식을 이해하지 못하고 그 지식을 표현할 수 없다는 것입니다. MMLU와 같은 많은 일반적인 모델 평가에서 객관식 문제를 사용하기 때문에 이 점이 중요합니다.
모델에 다양한 도구를 사용하도록 학습시킬 수 있습니다. 이 글에서는 Python 명령어를 특수 토큰 <|python_start|>와 <|python_end|> 사이에 넣어 Python 인터프리터를 사용하도록 모델에 학습시키겠습니다. 이는 나중에 GSM8K 문제를 해결할 때 유용합니다.
훈련 중간에 훈련할 수 있는 다른 적응 방법도 많이 있습니다. 예를 들어 맥락 길이 확장(아직 탐구하지 않음) 등이 있습니다.
기본 중기 훈련 혼합 데이터는 다음과 같습니다.
그러면 다음과 같이 시작하세요.
이 실행은 약 8분밖에 걸리지 않으며, 약 3시간의 사전 훈련 시간보다 훨씬 짧습니다. 이제 이 모델은 사용자 질문에 답변하는 어시스턴트 역할을 할 수 있는 실제 채팅 모델이므로, 다음과 같이 평가할 수 있습니다.
이 단계에서는 모델에 대해 다음과 같은 결과가 얻어졌습니다.
다음을 볼 수 있습니다:
세계 지식: 처음 세 문항(ARC-E/C와 MMLU)은 다양한 영역에서 모델의 세계 지식을 측정하는 객관식 시험입니다. 네 가지 선택지(A, B, C, D)가 있으므로 무작위 추측의 정확도는 약 25%입니다. 따라서 모델은 이미 무작위 추측보다 더 나은 성능을 보입니다. (이렇게 작은 모델에서는 객관식 문제가 상당히 어렵습니다.)
수학: GSM8K는 초등학교 수준의 수학 문제입니다. 모델이 실제 수치형 답을 작성해야 하기 때문에 이 문제의 기본 성능은 0%입니다. 하지만 문제의 2%만 해결하여 아직 성능이 좋지 않습니다.
코드: HumanEval은 Python 코딩 벤치마크입니다. 다시 말해, 무작위 벤치마크 성능은 0%입니다.
ChatCORE: Kapathy가 기본 모델에 대한 CORE 점수 평가 방식을 재현하고 이를 채팅 모델로 확장하려는 시도입니다. 구체적으로, 기본 성능을 위의 모든 지표에서 빼서 0에서 1 사이의 점수를 산출합니다(예: 무작위 모델은 MMLU에서 25%가 아닌 0점을 받습니다). 그리고 모든 작업의 평균을 보고합니다. 현재 모델의 강점을 요약하는 단일 숫자를 제공합니다.
이러한 평가는 아직 완전히 완료되지 않았으며, 측정할 수 있지만 아직 측정되지 않은 측면이 많이 있습니다.
이 단계를 보여주는 훌륭한 차트는 없지만, 다른 더 큰 모델의 이전 중간 열차 운행에서 가져온 예를 들어보겠습니다. 미세 조정 운행 중에 이러한 지표가 어떻게 상승 하는지 아이디어를 제공해 드리겠습니다.
감독된 미세 조정
중간 교육 후에는 지도식 미세 조정(SFT) 단계가 이어집니다.
이는 대화 데이터에 대한 미세 조정의 추가 라운드이며, 이상적으로는 가장 높은 품질의 좋은 데이터를 신중하게 선택해야 합니다 . 또한 여기서 안전 교육(예: 부적절한 요청을 거부하도록 도우미를 교육)도 실시합니다.
저희 모델은 아직 하늘의 색깔조차 정확히 알지 못하기 때문에 생물학적 위험 같은 문제에 관해서는 현재로서는 안전할 것으로 보입니다. 여기서 발생하는 도메인 적응 중 하나는 SFT가 행을 늘리고 패딩하여 테스트에 사용된 형식을 모방하는 것입니다.
즉, 이전처럼 학습 효율을 위해 예제를 긴 행으로 무작위로 연결하지 않아도 됩니다. 이러한 도메인 불일치를 해결하는 것은 또 다른 작은 "조임쇠" 개선입니다. SFT를 실행하고 다음을 다시 평가해 보겠습니다.
이 프로세스를 실행하는 데는 약 7분밖에 걸리지 않으며 모든 지표에서 약간의 개선이 보일 것입니다.
마침내 우리는 사용자로서 모델과 대화할 수 있게 됐습니다!
중간고사 이후에는 실제로 대화가 가능하지만, 지금은 더 좋아질 것입니다. 터미널 창(방법 1)이나 웹 인터페이스(방법 2)를 통해 대화할 수 있습니다.
chat_web 스크립트는 FastAPI를 사용하여 Engine 서비스를 제공합니다. Lambda 등에서 올바르게 액세스하려면 노드의 공용 IP 주소 다음에 포트 번호를 입력하세요(예: http://209.20.xxx.xxx:8000/).
다음과 같은 내용이면 좋을 것 같습니다.
물리학이나 시 경연대회에서 당장 우승할 수는 없겠지만, 그렇게 적은 예산으로 이런 성과를 냈다는 건 꽤 멋진 일이고, 프로젝트가 아직 완벽하지 않아요 .
강화 학습
"스피드 러닝"의 마지막 단계는 강화 학습입니다.
인간의 피드백을 기반으로 한 강화 학습(RLHF)은 성능을 몇 퍼센트 포인트 향상시키고 샘플링 주기 자체에서 발생하는 환각, 무한 루프 등 많은 모델 결함을 완화할 수 있는 좋은 방법입니다.
하지만 저희 규모에서는 이러한 사항들이 주요 고려 사항은 아닙니다. 그럼에도 불구하고, 지금까지 사용한 모든 데이터셋 중에서 GSM8K만이 명확하고 객관적인 보상 함수(수학 문제의 정답)를 가지고 있습니다.
따라서 샘플링과 학습을 번갈아 수행하는 간단한 강화 학습 주기를 통해 답변에 대한 성능을 직접 개선하기 위해 RL(/GRPO) 스크립트를 실행할 수 있습니다.
강화 학습 과정에서 모델은 학습 세트의 모든 GSM8K 문제를 탐색하고 완료 상태를 샘플링합니다. 그런 다음 샘플링된 결과에 보상을 제공하고, 높은 보상을 받는 샘플을 학습합니다.
우리는 매우 단순화된 GRPO 훈련 루프를 사용합니다. 예를 들어, 신뢰 영역은 사용하지 않고(참조 모델과 KL 정규화를 무시하고), 온폴리시를 사용하고(PPO의 비율 + 클리핑을 무시하고), GAPO 스타일 정규화를 사용하고(시퀀스 수준 정규화가 아닌 토큰 수준 정규화를 기반으로 하고), 이점 함수는 평균에 따른 간단한 보상 변화입니다(표준 편차로 나누어 z-점수 정규화를 무시함).
그 결과, REINFORCE 알고리즘과 더 유사해 보이지만, 보상 우세도를 계산하기 위해 GR("그룹 상대") 요소를 유지합니다. 이 접근법은 현재 작업의 규모와 단순성을 고려했을 때 상당히 효과적입니다. 자세한 내용은 스크립트를 참조하세요.
현재 강화 학습은 기본적으로 주석 처리되어 있는데, 아직 제대로 조정되지 않았고 완전하고 일반적인 RLHF가 없기 때문입니다.
강화 학습은 GSM8K에서만 수행되므로, -a 플래그를 사용하여 평가 대상을 GSM8K로 제한합니다. 강화 학습은 빨대로 감독 신호를 끌어내는 것과 같으므로, 이 과정은 상당한 시간 동안 실행됩니다.
예를 들어, 기본 설정으로 약 1.5시간 동안 실행한 결과는 다음과 같습니다.
점수
카파티가 마지막으로 지적한 것은 프로젝트 폴더에 있는 report.md 파일입니다. 이 파일에는 실행에 대한 자세한 정보와 마지막에 보기 좋은 요약 표가 포함되어 있습니다.
문자 수: 333,989
라인: 8,304
파일: 44
토큰(대략): 83,497
종속성(uv.lock 라인): 2,004
총 소요시간: 3시간 51분
강화 학습(RL)에 대한 지원이 제한적이기 때문에 총 시간 계산에서 제외되었다는 점에 유의해야 합니다. 지도 학습 미세 조정(SFT) 단계까지의 전체 프로세스는 3시간 51분이 소요되었으며, 총 비용은 (3 + 51 / 60) × 24 = 92.4달러였습니다. (강화 학습을 포함하면 총 시간은 5시간에 가까워집니다.)
아이스크림을 살 돈도 8달러나 남았어요.
이제 당신의 차례입니다
나노챗을 사용하면 모든 부분을 조정할 수 있습니다.
토크나이저 변경, 임의 데이터 수정, 하이퍼파라미터 조정, 최적화 프로세스 개선 등 다양한 아이디어를 시도해 볼 수 있습니다. 더 큰 모델을 학습시키는 것도 좋은 방법입니다. 이 저장소는 이러한 작업을 쉽게 수행할 수 있도록 구성되어 있습니다.
--depth 매개변수를 사용하여 레이어 수를 변경하기만 하면, 다른 모든 관련 설정은 이 매개변수를 기반으로 복잡도 단일 조정처럼 자동으로 조정됩니다. 예를 들어, 채널 수가 증가하고, 학습률이 그에 따라 조정되는 등 다양한 작업이 수행됩니다.
원칙적으로 깊이만 변경하면 나노챗 모델의 "미니 패밀리" 전체를 탐색할 수 있습니다. 더 큰 깊이를 사용하고 더 오래 기다리면 이론적으로 훨씬 더 나은 결과를 얻을 수 있습니다.
base_train.py의 사전 학습 단계에서 depth 매개변수를 전달해야 합니다. 예를 들어, CORE 지수가 약 0.25이고 성능이 GPT-2에 가까운 모델을 얻으려면 depth=26이 좋은 선택입니다.
하지만 더 큰 모델을 학습할 때는 장치의 최대 배치 크기를 조정해야 합니다(예: 32에서 16으로).
코드는 이러한 변화를 감지하고 자동으로 보정하며, 목표 배치 크기인 0.5M에 도달하기 위해 두 번의 그래디언트 누적 사이클을 거칩니다. 깊이가 30인 모델을 학습하려면 설정을 추가로 줄여야 합니다.
등등. 코드를 읽어보세요. Kapathy는 최대한 읽기 쉽게 작성하고 주석을 추가하여 코드를 깔끔하고 이해하기 쉽게 만들었습니다.
물론, 모든 콘텐츠를 패키징하여 좋아하는 대규모 언어 모델에 대해 질문할 수도 있고, 더 간단하게는 Devin/Cognition의 DeepWiki를 사용하여 이 코드 저장소에 대해 질문할 수도 있습니다. 코드 저장소의 URL을 github.com에서 deepwiki.com으로 변경하기만 하면 됩니다. 예를 들어 nanochat DeepWiki처럼요.
그게 다입니다. 프로세스의 모든 부분을 조정하고 다시 실행하여 즐기세요!
교육에 주력하는 AI 분야 인기 전문가
카파티는 작년 2월에 OpenAI에 합류하고 회사를 떠나기 전에는 Tesla에서 AI 부문을 총괄했습니다.
그는 AI 커뮤니티 전체에서 엄청난 인기를 누리고 있는데, 그 인기의 상당 부분은 그의 강의에서 나옵니다.
그는 자신의 초기 블로그 텍스트 공유와 일련의 Youtube 비디오 튜토리얼을 포함하여, Fei-Fei Li와 협업하여 스탠포드 대학 최초의 딥 러닝 과정 CS231n "합성곱 신경망과 시각 인식"을 개설했습니다.
오늘날 많은 학자와 기업가들이 그와 함께 경력을 시작했습니다.
카파시의 교육에 대한 열정은 그가 학생들에게 루빅큐브를 온라인으로 푸는 방법을 가르쳤던 학생 시절로 거슬러 올라갑니다.
작년 7월, OpenAI에서 사임한 카파티는 갑자기 자신의 스타트업을 발표하고 새로운 AI 전문 학교인 유레카 랩스 를 설립했습니다.
AI 네이티브를 어떻게 이해할 수 있을까?
파인만과 함께 고품질의 자료를 공부하는 것을 상상해보세요. 파인만은 모든 단계에서 1:1로 여러분을 안내할 것입니다.
불행히도, 우리가 모든 분야에서 파인만과 같은 스승을 찾을 수 있다 하더라도, 그 분이 지구상의 80억 인구를 직접 가르칠 수는 없을 것입니다.
하지만 AI는 할 수 있습니다. AI는 무한한 인내심을 가지고 있으며 전 세계 모든 언어에 능통합니다.
따라서 카파시는 공통 플랫폼에서 전체 과정을 운영할 수 있는 "교사 + 인공지능의 공생"을 만들고자 합니다.
우리가 성공한다면 누구나 무엇이든 더 쉽게 배울 수 있게 되고, 교육 자체의 범위와 정도도 확대될 것입니다.
유레카 랩스의 첫 번째 제품은 첫 번째 과정인 LLM101n이기도 합니다.
ChatGPT와 유사한 대규모 스토리 생성 모델과 이를 지원하는 웹 애플리케이션을 구축하는 방법을 단계별로 안내해 드리겠습니다.
GitHub 저장소: https://github.com/karpathy/nanochat
자세한 가이드: https://github.com/karpathy/nanochat/discussions/1
참고 링크: https://x.com/karpathy/status/1977755427569111362
본 기사는 WeChat 공개 계정 "Quantum Bit" 에서 발췌하였으며, 저자는 Xifeng이고, 36Kr.의 출판 허가를 받았습니다.