--- license: cc-by-4.0 language: - ko library_name: pytorch pipeline_tag: text-generation datasets: - psymon/Tiny-Ko-Stories - JosephLee/tiny-ko-stories-sft - JosephLee/tiny-ko-stories-feedback tags: - korean - children-stories - gpt - education - from-scratch - dpo --- # modu-llm: 한국어 어린이 이야기를 쓰는 작은 GPT 『모두의 LLM with 파이썬』(이영호)의 실습 모델 파일입니다. 책에서 처음부터 만든 약 609만 개 파라미터의 글자 단위 GPT를 한국어 어린이 이야기로 사전학습하고, 요청-이야기 짝으로 파인튜닝한 뒤, 선호 데이터 짝으로 한 번 더 학습(피드백 학습, DPO)했습니다. 실습 코드와 노트북: https://github.com/yhlee1627/modu-llm-v2 ## 파일 | 파일 | 내용 | 책에서 쓰는 곳 | |---|---|---| | `pretrain.pt` | 사전학습을 마친 모델과 옵티마이저 상태 (27,251번 학습) | 1~7장·13~14장의 이야기 LLM, 11·12장 | | `ckpt_step250.pt`, `ckpt_step1000.pt`, `ckpt_step3000.pt` | 사전학습 도중의 모델 (옵티마이저 없음) | 2장, 6장, 7장 놀이터 | | `sft.pt` | 요청-이야기 짝으로 파인튜닝한 모델과 옵티마이저 상태 (3,400번 학습) | 2장, 12장 | | `feedback.pt` | 파인튜닝 모델을 선호 데이터 짝으로 한 번 더 학습한 모델 (옵티마이저 없음) | 2장 | 각 파일은 `torch.save`로 저장한 딕셔너리이고 `cfg`(모델 설정), `model`(가중치), `optimizer`, `step`, `history`(손실 기록)를 담고 있습니다. `feedback.pt`의 `step`과 `history`는 출발점인 `sft.pt`의 값을 그대로 둔 것입니다. ## 모델 | 항목 | 값 | |---|---| | 구조 | GPT(디코더 전용 Transformer), 구조는 nanoGPT 참고 | | 토큰 | 글자 하나 = 토큰 하나. 고정 글자 사전 2,453자(자주 쓰는 한글 2,350자 + 영문·숫자·기호 + 이야기 끝 표시 `§`) | | 문맥 길이 | 384글자 | | 벡터 길이 / 헤드 / 층 | 256 / 4 / 6 | | 파라미터 | 6,091,157개 | ## 학습 **사전학습** (`pretrain.pt`) - 데이터: [Tiny-Ko-Stories](https://huggingface.co/datasets/psymon/Tiny-Ko-Stories) 앞쪽 이야기 200,000편(약 7,160만 글자), 90%는 학습용, 10%는 검증용 - Google Colab T4 GPU에서 30분(27,251번 학습), 배치 32, AdamW(학습률 5e-4), 반정밀도(float16 autocast) - 끝났을 때 손실: 학습 0.751, 검증 0.771 **파인튜닝** (`sft.pt`) - 데이터: [Tiny-Ko-Stories SFT](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft) 학습용 43,852쌍, 검증용 2,308쌍 - `pretrain.pt`에서 이어 학습, T4에서 5분, AdamW(학습률 1e-4) - 검증 손실이 가장 낮았던 3,400번째(검증 0.665)를 저장 **피드백 학습** (`feedback.pt`) - 데이터: [Tiny-Ko-Stories Feedback](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-feedback) 선호 데이터 920쌍. 사람이 하나하나 고르는 대신 규칙으로 더 좋은 답을 골랐습니다. 요청이 이야기 부탁이면 이야기가, 이야기가 아닌 질문이면 "그 질문의 답은 몰라요. …"라는 답이 더 좋은 답입니다. - `sft.pt`에서 시작해 DPO(beta 0.1)로 학습했습니다. 기준 모델은 `sft.pt`입니다. DPO만으로는 지어낸 이야기를 밀어내기만 하고 모른다는 답이 나오지 않아서, 더 좋은 답의 글자당 손실도 함께 줄였습니다(가중치 1.0). - AdamW(학습률 5e-5), 짝 16개씩 174번(데이터 세 바퀴), CPU에서 약 7분 - 학습 데이터에 없던 질문 8개를 세 번씩 물으면 24번 가운데 21번 모른다고 답하고, 이야기 부탁 5개를 세 번씩 하면 15번 모두 이야기를 씁니다. 요청-이야기 확인용 데이터의 손실은 0.645(파인튜닝)에서 0.657로 거의 같습니다. ## 쓰는 법 ```python %pip install -q git+https://github.com/yhlee1627/modu-llm-v2 from modu_llm import load_story_llm fb = load_story_llm("feedback") # "pretrain", "sft", "feedback", "step250" … fb.ask("대한민국의 수도는 어디야?", length=150) fb.ask("토끼가 나오는 짧은 이야기를 써 줘", length=150) ``` 부품을 직접 다루려면 다음처럼 불러옵니다. ```python from modu_llm import Vocab, load_checkpoint, get_file, generate, format_pair vocab = Vocab.build() model, _, step, _ = load_checkpoint(get_file("sft.pt"), "cpu") print(generate(model, vocab, format_pair("숲속에서 토끼 보리가 나오는 이야기를 들려줘"), max_new_tokens=300)) ``` `get_file`은 구글 드라이브나 현재 폴더에 같은 이름의 파일이 있으면 그것을 쓰고, 없으면 이 저장소에서 내려받습니다. ## 한계와 쓰임 - 교육용 모델입니다. LLM이 어떻게 움직이는지 배우려고 만든 것으로, 실제 서비스에 쓰기에는 알맞지 않습니다. - 어린이 이야기만 배웠습니다. 사전학습·파인튜닝 모델은 사실 질문, 계산, 영어 요청에도 어린이 이야기로 답합니다. 피드백 학습 모델은 이런 질문에 대개 모른다고 답하지만 늘 그렇지는 않고, 새 지식을 배운 것도 아닙니다. - 안전장치가 없습니다. 학습 데이터는 여러 AI 모델로 만든 합성 데이터이며, 원본 데이터 카드의 권장하지 않는 용도(사실 질의응답, 사람 검수 없이 어린이에게 직접 제공 등)가 이 모델에도 그대로 적용됩니다. - 사전에 없는 글자(자주 쓰지 않는 한글, 한자, 이모티콘 등)는 건너뜁니다. ## 라이선스와 출처 이 모델 파일들은 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)으로 공개합니다. 쓰거나 나눌 때는 이 저장소와 학습 데이터의 출처를 함께 밝혀 주세요. - 학습 데이터: Tiny-Ko-Stories (psymon), CC BY 4.0, https://huggingface.co/datasets/psymon/Tiny-Ko-Stories - 파인튜닝 데이터: Tiny-Ko-Stories SFT (JosephLee), CC BY 4.0, https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft - 선호 데이터: Tiny-Ko-Stories Feedback (JosephLee), CC BY 4.0, https://huggingface.co/datasets/JosephLee/tiny-ko-stories-feedback - 모델 구조 참고: nanoGPT (Andrej Karpathy), MIT, https://github.com/karpathy/nanoGPT - 실습 코드: https://github.com/yhlee1627/modu-llm-v2, MIT 출처 표기 예: ``` modu-llm (JosephLee), CC BY 4.0, https://huggingface.co/JosephLee/modu-llm — trained on Tiny-Ko-Stories (psymon), CC BY 4.0 ``` --- **English summary.** Model files for the Korean book *모두의 LLM with 파이썬* (Everyone's LLM with Python). A 6.1M-parameter character-level GPT trained from scratch on 200,000 Korean children's stories from [Tiny-Ko-Stories](https://huggingface.co/datasets/psymon/Tiny-Ko-Stories), fine-tuned on request–story pairs ([Tiny-Ko-Stories SFT](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft)), then trained with DPO on 920 rule-chosen preference pairs ([Tiny-Ko-Stories Feedback](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-feedback)) so that it declines non-story questions instead of making up a story. For education only. Licensed under CC BY 4.0; please credit this repository and the training data.