모델 카드: 개편판 장 번호, 피드백 학습 모델(feedback.pt) 추가
Browse files
README.md
CHANGED
|
@@ -7,29 +7,32 @@ pipeline_tag: text-generation
|
|
| 7 |
datasets:
|
| 8 |
- psymon/Tiny-Ko-Stories
|
| 9 |
- JosephLee/tiny-ko-stories-sft
|
|
|
|
| 10 |
tags:
|
| 11 |
- korean
|
| 12 |
- children-stories
|
| 13 |
- gpt
|
| 14 |
- education
|
| 15 |
- from-scratch
|
|
|
|
| 16 |
---
|
| 17 |
|
| 18 |
# modu-llm: 한국어 어린이 이야기를 쓰는 작은 GPT
|
| 19 |
|
| 20 |
-
『모두의 LLM with 파이썬』(이영호)의 실습
|
| 21 |
|
| 22 |
-
실습 코드와 노트북: https://github.com/yhlee1627/modu-llm
|
| 23 |
|
| 24 |
## 파일
|
| 25 |
|
| 26 |
| 파일 | 내용 | 책에서 쓰는 곳 |
|
| 27 |
|---|---|---|
|
| 28 |
-
| `pretrain.pt` | 사전학습을 마친 모델과 옵티마이저 상태 (27,251
|
| 29 |
-
| `ckpt_step250.pt`, `ckpt_step1000.pt`, `ckpt_step3000.pt` | 사전학습 도중의 모델 (옵티마이저 없음) |
|
| 30 |
-
| `sft.pt` | 요청-이야기
|
|
|
|
| 31 |
|
| 32 |
-
각 파일은 `torch.save`로 저장한 딕셔너리이고 `cfg`(모델 설정), `model`(가중치), `optimizer`, `step`, `history`(손실 기록)를 담고 있습니다.
|
| 33 |
|
| 34 |
## 모델
|
| 35 |
|
|
@@ -45,27 +48,40 @@ tags:
|
|
| 45 |
|
| 46 |
**사전학습** (`pretrain.pt`)
|
| 47 |
- 데이터: [Tiny-Ko-Stories](https://huggingface.co/datasets/psymon/Tiny-Ko-Stories) 앞쪽 이야기 200,000편(약 7,160만 글자), 90%는 학습용, 10%는 검증용
|
| 48 |
-
- Google Colab T4 GPU에서 30분(27,251
|
| 49 |
- 끝났을 때 손실: 학습 0.751, 검증 0.771
|
| 50 |
|
| 51 |
**파인튜닝** (`sft.pt`)
|
| 52 |
- 데이터: [Tiny-Ko-Stories SFT](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft) 학습용 43,852쌍, 검증용 2,308쌍
|
| 53 |
- `pretrain.pt`에서 이어 학습, T4에서 5분, AdamW(학습률 1e-4)
|
| 54 |
-
- 검증 손실이 가장 낮았던 3,400
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
|
| 56 |
## 쓰는 법
|
| 57 |
|
| 58 |
```python
|
| 59 |
-
%pip install -q git+https://github.com/yhlee1627/modu-llm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
|
|
|
|
|
|
|
|
|
| 61 |
from modu_llm import Vocab, load_checkpoint, get_file, generate, format_pair
|
| 62 |
|
| 63 |
vocab = Vocab.build()
|
| 64 |
model, _, step, _ = load_checkpoint(get_file("sft.pt"), "cpu")
|
| 65 |
-
model
|
| 66 |
-
|
| 67 |
-
question = format_pair("숲속에서 토끼 보리가 나오는 이야기를 들려줘")
|
| 68 |
-
print(generate(model, vocab, question, max_new_tokens=400, top_k=20))
|
| 69 |
```
|
| 70 |
|
| 71 |
`get_file`은 구글 드라이브나 현재 폴더에 같은 이름의 파일이 있으면 그것을 쓰고, 없으면 이 저장소에서 내려받습니다.
|
|
@@ -73,18 +89,19 @@ print(generate(model, vocab, question, max_new_tokens=400, top_k=20))
|
|
| 73 |
## 한계와 쓰임
|
| 74 |
|
| 75 |
- 교육용 모델입니다. LLM이 어떻게 움직이는지 배우려고 만든 것으로, 실제 서비스에 쓰기에는 알맞지 않습니다.
|
| 76 |
-
- 어린이 이야기만 배웠습니다. 사실 질문, 계산, 영어 요청에도 어린이 이야기로 답
|
| 77 |
- 안전장치가 없습니다. 학습 데이터는 여러 AI 모델로 만든 합성 데이터이며, 원본 데이터 카드의 권장하지 않는 용도(사실 질의응답, 사람 검수 없이 어린이에게 직접 제공 등)가 이 모델에도 그대로 적용됩니다.
|
| 78 |
- 사전에 없는 글자(자주 쓰지 않는 한글, 한자, 이모티콘 등)는 건너뜁니다.
|
| 79 |
|
| 80 |
## 라이선스와 출처
|
| 81 |
|
| 82 |
-
이
|
| 83 |
|
| 84 |
- 학습 데이터: Tiny-Ko-Stories (psymon), CC BY 4.0, https://huggingface.co/datasets/psymon/Tiny-Ko-Stories
|
| 85 |
- 파인튜닝 데이터: Tiny-Ko-Stories SFT (JosephLee), CC BY 4.0, https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft
|
|
|
|
| 86 |
- 모델 구조 참고: nanoGPT (Andrej Karpathy), MIT, https://github.com/karpathy/nanoGPT
|
| 87 |
-
- 실습 코드: https://github.com/yhlee1627/modu-llm, MIT
|
| 88 |
|
| 89 |
출처 표기 예:
|
| 90 |
|
|
@@ -95,4 +112,4 @@ modu-llm (JosephLee), CC BY 4.0, https://huggingface.co/JosephLee/modu-llm
|
|
| 95 |
|
| 96 |
---
|
| 97 |
|
| 98 |
-
**English summary.**
|
|
|
|
| 7 |
datasets:
|
| 8 |
- psymon/Tiny-Ko-Stories
|
| 9 |
- JosephLee/tiny-ko-stories-sft
|
| 10 |
+
- JosephLee/tiny-ko-stories-feedback
|
| 11 |
tags:
|
| 12 |
- korean
|
| 13 |
- children-stories
|
| 14 |
- gpt
|
| 15 |
- education
|
| 16 |
- from-scratch
|
| 17 |
+
- dpo
|
| 18 |
---
|
| 19 |
|
| 20 |
# modu-llm: 한국어 어린이 이야기를 쓰는 작은 GPT
|
| 21 |
|
| 22 |
+
『모두의 LLM with 파이썬』(이영호)의 실습 모델 파일입니다. 책에서 처음부터 만든 약 609만 개 파라미터의 글자 단위 GPT를 한국어 어린이 이야기로 사전학습하고, 요청-이야기 짝으로 파인튜닝한 뒤, 선호 데이터 짝으로 한 번 더 학습(피드백 학습, DPO)했습니다.
|
| 23 |
|
| 24 |
+
실습 코드와 노트북: https://github.com/yhlee1627/modu-llm-v2
|
| 25 |
|
| 26 |
## 파일
|
| 27 |
|
| 28 |
| 파일 | 내용 | 책에서 쓰는 곳 |
|
| 29 |
|---|---|---|
|
| 30 |
+
| `pretrain.pt` | 사전학습을 마친 모델과 옵티마이저 상태 (27,251번 학습) | 1~7장·13~14장의 이야기 LLM, 11·12장 |
|
| 31 |
+
| `ckpt_step250.pt`, `ckpt_step1000.pt`, `ckpt_step3000.pt` | 사전학습 도중의 모델 (옵티마이저 없음) | 2장, 6장, 7장 놀이터 |
|
| 32 |
+
| `sft.pt` | 요청-이야기 짝으로 파인튜닝한 모델과 옵티마이저 상태 (3,400번 학습) | 2장, 12장 |
|
| 33 |
+
| `feedback.pt` | 파인튜닝 모델을 선호 데이터 짝으로 한 번 더 학습한 모델 (옵티마이저 없음) | 2장 |
|
| 34 |
|
| 35 |
+
각 파일은 `torch.save`로 저장한 딕셔너리이고 `cfg`(모델 설정), `model`(가중치), `optimizer`, `step`, `history`(손실 기록)를 담고 있습니다. `feedback.pt`의 `step`과 `history`는 출발점인 `sft.pt`의 값을 그대로 둔 것입니다.
|
| 36 |
|
| 37 |
## 모델
|
| 38 |
|
|
|
|
| 48 |
|
| 49 |
**사전학습** (`pretrain.pt`)
|
| 50 |
- 데이터: [Tiny-Ko-Stories](https://huggingface.co/datasets/psymon/Tiny-Ko-Stories) 앞쪽 이야기 200,000편(약 7,160만 글자), 90%는 학습용, 10%는 검증용
|
| 51 |
+
- Google Colab T4 GPU에서 30분(27,251번 학습), 배치 32, AdamW(학습률 5e-4), 반정밀도(float16 autocast)
|
| 52 |
- 끝났을 때 손실: 학습 0.751, 검증 0.771
|
| 53 |
|
| 54 |
**파인튜닝** (`sft.pt`)
|
| 55 |
- 데이터: [Tiny-Ko-Stories SFT](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft) 학습용 43,852쌍, 검증용 2,308쌍
|
| 56 |
- `pretrain.pt`에서 이어 학습, T4에서 5분, AdamW(학습률 1e-4)
|
| 57 |
+
- 검증 손실이 가장 낮았던 3,400번째(검증 0.665)를 저장
|
| 58 |
+
|
| 59 |
+
**피드백 학습** (`feedback.pt`)
|
| 60 |
+
- 데이터: [Tiny-Ko-Stories Feedback](https://huggingface.co/datasets/JosephLee/tiny-ko-stories-feedback) 선호 데이터 920쌍. 사람이 하나하나 고르는 대신 규칙으로 더 좋은 답을 골랐습니다. 요청이 이야기 부탁이면 이야기가, 이야기가 아닌 질문이면 "그 질문의 답은 몰라요. …"라는 답이 더 좋은 답입니다.
|
| 61 |
+
- `sft.pt`에서 시작해 DPO(beta 0.1)로 학습했습니다. 기준 모델은 `sft.pt`입니다. DPO만으로는 지어낸 이야기를 밀어내기만 하고 모른다는 답이 나오지 않아서, 더 좋은 답의 글자당 손실도 함께 줄였습니다(가중치 1.0).
|
| 62 |
+
- AdamW(학습률 5e-5), 짝 16개씩 174번(데이터 세 바퀴), CPU에서 약 7분
|
| 63 |
+
- 학습 데이터에 없던 질문 8개를 세 번씩 물으면 24번 가운데 21번 모른다고 답하고, 이야기 부탁 5개를 세 번씩 하면 15번 모두 이야기를 씁니다. 요청-이야기 확인용 데이터의 손실은 0.645(파인튜닝)에서 0.657로 거의 같습니다.
|
| 64 |
|
| 65 |
## 쓰는 법
|
| 66 |
|
| 67 |
```python
|
| 68 |
+
%pip install -q git+https://github.com/yhlee1627/modu-llm-v2
|
| 69 |
+
|
| 70 |
+
from modu_llm import load_story_llm
|
| 71 |
+
|
| 72 |
+
fb = load_story_llm("feedback") # "pretrain", "sft", "feedback", "step250" …
|
| 73 |
+
fb.ask("대한민국의 수도는 어디야?", length=150)
|
| 74 |
+
fb.ask("토끼가 나오는 짧은 이야기를 써 줘", length=150)
|
| 75 |
+
```
|
| 76 |
|
| 77 |
+
부품을 직접 다루려면 다음처럼 불러옵니다.
|
| 78 |
+
|
| 79 |
+
```python
|
| 80 |
from modu_llm import Vocab, load_checkpoint, get_file, generate, format_pair
|
| 81 |
|
| 82 |
vocab = Vocab.build()
|
| 83 |
model, _, step, _ = load_checkpoint(get_file("sft.pt"), "cpu")
|
| 84 |
+
print(generate(model, vocab, format_pair("숲속에서 토끼 보리가 나오는 이야기를 들려줘"), max_new_tokens=300))
|
|
|
|
|
|
|
|
|
|
| 85 |
```
|
| 86 |
|
| 87 |
`get_file`은 구글 드라이브나 현재 폴더에 같은 이름의 파일이 있으면 그것을 쓰고, 없으면 이 저장소에서 내려받습니다.
|
|
|
|
| 89 |
## 한계와 쓰임
|
| 90 |
|
| 91 |
- 교육용 모델입니다. LLM이 어떻게 움직이는지 배우려고 만든 것으로, 실제 서비스에 쓰기에는 알맞지 않습니다.
|
| 92 |
+
- 어린이 이야기만 배웠습니다. 사전학습·파인튜닝 모델은 사실 질문, 계산, 영어 요청에도 어린이 이야기로 답합니다. 피드백 학습 모델은 이런 질문에 대개 모른다고 답하지만 늘 그렇지는 않고, 새 지식을 배운 것도 아닙니다.
|
| 93 |
- 안전장치가 없습니다. 학습 데이터는 여러 AI 모델로 만든 합성 데이터이며, 원본 데이터 카드의 권장하지 않는 용도(사실 질의응답, 사람 검수 없이 어린이에게 직접 제공 등)가 이 모델에도 그대로 적용됩니다.
|
| 94 |
- 사전에 없는 글자(자주 쓰지 않는 한글, 한자, 이모티콘 등)는 건너뜁니다.
|
| 95 |
|
| 96 |
## 라이선스와 출처
|
| 97 |
|
| 98 |
+
이 모델 파일들은 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)으로 공개합니다. 쓰거나 나눌 때는 이 저장소와 학습 데이터의 출처를 함께 밝혀 주세요.
|
| 99 |
|
| 100 |
- 학습 데이터: Tiny-Ko-Stories (psymon), CC BY 4.0, https://huggingface.co/datasets/psymon/Tiny-Ko-Stories
|
| 101 |
- 파인튜닝 데이터: Tiny-Ko-Stories SFT (JosephLee), CC BY 4.0, https://huggingface.co/datasets/JosephLee/tiny-ko-stories-sft
|
| 102 |
+
- 선호 데이터: Tiny-Ko-Stories Feedback (JosephLee), CC BY 4.0, https://huggingface.co/datasets/JosephLee/tiny-ko-stories-feedback
|
| 103 |
- 모델 구조 참고: nanoGPT (Andrej Karpathy), MIT, https://github.com/karpathy/nanoGPT
|
| 104 |
+
- 실습 코드: https://github.com/yhlee1627/modu-llm-v2, MIT
|
| 105 |
|
| 106 |
출처 표기 예:
|
| 107 |
|
|
|
|
| 112 |
|
| 113 |
---
|
| 114 |
|
| 115 |
+
**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.
|