문서·실습자료
f84c042 기준입니다.
사전학습 모델을 가져와 데이터를 가공하고, 모델의 행동을 바꾸고, 그 결과를 평가하는 실습 모음입니다. README에 따르면 상하이교통대학교의 자연어처리·AI 안전 관련 강의 자료에서 확장한 무료 교육 프로젝트입니다. 범위는 API 호출에 머물지 않고 모델 가중치 수정, 생성 확률 제어, 보상을 통한 정책 학습까지 내려갑니다.
이 저장소에서 배울 핵심은 “모델을 호출하는 법”을 넘어 “무엇을 학습시키고 무엇으로 성공을 판단할지 정하는 법”입니다.
1번 실험대에서는 문장을 분류하고, 4번에서는 수학 풀이를 따라 배우게 하며, 7번에서는 다음 단어 선택에 비트를 담습니다. 11번에서는 좋은 점수를 받는 방향으로 문장 생성을 바꿉니다.
실험대마다 장비와 재료가 다릅니다. 한 번의 설치로 모든 실험이 연결되는 구조는 아니므로, 처음에는 한 장을 골라 입력과 출력부터 설명할 수 있게 되는 것이 좋습니다.
| 장 | 실제 구현의 중심 | 먼저 던질 질문 |
|---|---|---|
| 4장 · 수학 추론 | tokenize(), Trainer, vLLM | 문제와 풀이 중 어느 토큰에 학습 손실을 계산할까? |
| 7장 · 텍스트 은닉 | Huffman, FLC, 생성 루프 | 다음 토큰 하나에 몇 비트를 담을 수 있을까? |
| 9장 · GUI 에이전트 | JSON을 대화·이미지 학습 형식으로 변환 | 화면과 행동 정답을 어떻게 짝지을까? |
| 11장 · PPO | build_dataset(), 보상 계산, step() | 점수가 높아지면 사람이 원하는 행동도 좋아질까? |
실행 셀이 없는 장도 읽을 가치가 있습니다. 3장은 EasyEdit, 5장은 X-SIR, 8장은 NExT-GPT처럼 별도 프로젝트를 따라가며 개념을 연결합니다. 다만 그 외부 프로젝트의 구현을 이 저장소가 직접 포함한다고 이해하면 안 됩니다.
원시 데이터 → 토큰 또는 대화 형식 → 모델 입력 → 학습 목표 → 생성 결과 → 평가 점수. 이 여섯 단계를 한 장에서 끝까지 설명하면, 다른 모델과 도구로 옮겨 가도 남는 지식을 얻은 것입니다.
2026-10-23 GitHub Trending의 Jupyter Notebook 일간 1위이며, 같은 날 GitHub 기준 스타 57,287개, 포크 6,847개입니다. 이 숫자는 누적 관심의 크기를 보여 줍니다. 하루 동안 얻은 스타 수나 추천 유입 경로를 뜻하지는 않습니다.
최근 push는 2025-10-10입니다. 따라서 분석일의 인기를 “오늘 공개된 신기능”으로 설명할 근거는 없습니다. 다음 세 가지는 README의 범위와 실제 자료 구성에서 읽을 수 있는 교육적 매력에 대한 해석입니다.
이 프로젝트는 모델 제공 서비스와 직접 경쟁하는 제품이라기보다 교재입니다. 초보자의 선택에 도움이 되도록 학습 방식별 장점과 부담을 비교하면 다음과 같습니다.
| 학습 방식 | 주로 얻는 것 | 이 교재의 상대적 장점·부담 |
|---|---|---|
| API 사용법 중심 강의 | 요청·응답과 앱 연결 | 가중치·확률·보상까지 내려갈 수 있음. 대신 GPU 실험이 무거움 |
| 라이브러리 공식 문서 | 개별 API의 정확한 규격 | 여러 기술을 하나의 학습 여정으로 연결. 세부 규격은 공식 문서로 보완해야 함 |
| 논문만 읽는 공부 | 방법의 가정과 수학적 근거 | 데이터 가공과 평가 코드를 볼 수 있음. 원 논문의 모든 실험을 재현하지는 않음 |
| 단일 학습 도구 실습 | 설정 파일로 빠르게 학습 | 4·7·11장에서 내부 흐름을 직접 읽음. 통합 환경은 따로 구성해야 함 |
이 교재의 강점은 최신 도구를 모두 갖춘 데 있지 않고, 서로 다른 실험의 입력·목표·평가를 비교할 수 있는 데 있습니다.
README는 무료 교육 자료라고 소개하며, 2025-06-06 업데이트에서 수학 추론·GUI 에이전트·정렬·텍스트 은닉 등의 보강을 알립니다. 화웨이 Ascend 기반의 별도 교육 과정도 연결하지만, 해당 전체 개발 과정이 이 저장소에 구현되어 있는 것은 아닙니다.
요리책에 레시피와 완성 사진이 풍부해도 모든 재료가 책 안에 들어 있지는 않습니다. 외부 모델·데이터·학습 도구가 여기서의 재료입니다. 재료의 버전과 위치까지 확인해야 같은 실험을 시도할 수 있습니다.
무료로 읽을 수 있다는 설명과 별개로, 커밋 f84c042에는 라이선스 파일이 없습니다.
배포나 재사용 허용 범위를 특정 오픈소스 라이선스로 단정하지 않아야 합니다.
HTTP 서버나 데이터베이스를 가진 웹 애플리케이션은 아닙니다.
계산의 중심은 Python, PyTorch, Hugging Face 라이브러리이며, 모델·데이터는 외부에서 가져옵니다.
package.json, Cargo.toml, pyproject.toml, go.mod는 없습니다.
| 층 | 기술 | 실제 역할과 근거 |
|---|---|---|
| 텐서·가중치 | PyTorch | 4장 BF16 모델 로딩, 7장 확률 계산·토큰 결합, 11장 보상 텐서 |
| 모델·학습 | Transformers | AutoTokenizer, AutoModelForCausalLM, Trainer |
| 데이터 변환 | Datasets | 4장의 filter()·map(), 11장의 IMDB 전처리 |
| 일괄 추론 | vLLM | 4장의 LLM·SamplingParams로 수학 응답 생성 |
| 강화학습 | TRL | 11장의 값 추정 헤드 모델, 참조 모델, PPOTrainer |
| 기록·시각화 | Matplotlib·TensorBoard·wandb | 길이 분포, 학습 로그, PPO 통계 기록 |
documents/chapter11/requirements.txt의 활성 항목은 아래 여섯 개입니다.
이를 전체 장의 공통 환경으로 확대 해석하면 안 됩니다.
같은 파일의 LLaMA-Factory 설치 항목은 주석 처리되어 있습니다.
torch==2.6.0
tqdm==4.67.1
pandas==2.2.3
transformers==4.51.3
datasets==3.5.0
trl==0.9.4
위 버전은 파일에 적힌 값입니다. 11장에서 직접 가져오는 wandb는 명시되지 않았고,
Jupyter 실행 환경도 이 파일이 별도로 고정하지 않습니다.
간접 의존성이 우연히 설치해 주는 상황과 명시적인 환경 계약을 구분해야 합니다.
| 위치 | 확인되는 버전 | 해석 |
|---|---|---|
| 1장 README | Python 3.9 안내, 배포 예시 Transformers 4.30.2·Torch 2.0.0 | 본문 예시이며 독립된 환경 파일은 아님 |
| 4장 저장 출력 | Transformers 4.52.3·Torch 2.7.0+cu126·Datasets 3.6.0 | 저장 당시의 출력 기록이며 설치 제약이 아님 |
| 4장 코드 | antlr4-python3-runtime==4.11.0 | 노트북에 설치 명령이 있지만 채점 모듈 전체를 제공하지는 않음 |
| 8장 README | Python 3.8·PyTorch 1.13.1·CUDA 11.6 | 외부 NExT-GPT 실습 환경에 대한 안내 |
| 11장 환경 파일 | Transformers 4.51.3·TRL 0.9.4 등 | 이 장의 명시 버전. 최신 API와 혼용하지 않기 |
4장 노트북은 print("VLLM version:", transformers.__version__)를 사용합니다.
따라서 저장 출력의 “VLLM version: 4.52.3”은 vLLM 버전의 근거가 아닙니다.
해당 패키지의 실제 버전은 별도로 확인해야 합니다.
읽기 화면은 Jupyter Notebook입니다. 1장은 Gradio Spaces 배포를 설명하지만,
그 예시의 app.py와 분류 프로젝트는 저장소에 들어 있지 않습니다.
9장의 llamafactory-cli webchat도 외부 LLaMA-Factory의 기능입니다.
React·Vue 앱이나 자체 웹 프론트엔드의 소스는 없습니다.
Dockerfile, 통합 설치 스크립트, .github/workflows CI 설정은 없습니다.
9장 설명에는 DeepSpeed ZeRO-3 설정 경로와 분산 실행 명령이 나오지만 해당 설정 파일은 외부 도구 쪽 경로입니다.
4장의 torch_compile=True 역시 Python 패키지 빌드가 아니라 모델 계산 최적화 옵션입니다.
“Python 프로젝트”라는 이름보다 장별 의존성·모델 경로·CUDA 요구를 먼저 보세요. 오래된 예시와 다른 장의 버전을 하나의 환경에 섞으면, 개념 학습보다 의존성 충돌에 시간을 쓰기 쉽습니다.
구조의 중심은 요청을 받는 서버가 아니라 데이터가 변하는 순서입니다. 아래의 화살표는 실험 안에서의 흐름을 뜻합니다. 장 사이에 자동으로 파일을 넘겨 주는 통합 실행기는 없습니다.
documents/chapter4/sft_math.ipynb의 tokenize(example)가 가장 좋은 출발점입니다.
먼저 final_answer.isdigit()로 답이 숫자 문자열인 샘플만 고릅니다.
그다음 문제와 r1_solution_1을 대화로 묶고 토큰 ID와 정답 배열을 만듭니다.
# 4장 tokenize()의 핵심
question = example["question"]
r1_solution = example["r1_solution_1"]
message = [
{"role": "user", "content": question},
{"role": "assistant", "content": f"<think>\n{r1_solution}\n"},
]
result = qwen_tokenizer.apply_chat_template(
message, add_generation_prompt=False,
tokenize=True, return_dict=True,
)
result["length"] = len(result["input_ids"])
result["labels"] = result["input_ids"].copy()
isdigit()는 수학적 정답 여부를 검사하지 않습니다.
"42"는 통과하지만 "-3", "1/2", "3.14"는 제외됩니다.
따라서 편리한 필터 하나가 학습할 문제의 분포도 바꿉니다.
이후에는 전체 대화 길이가 4096 미만인 샘플만 남깁니다.
labels는 학습에서 맞혀야 할 토큰 ID입니다.
이 코드처럼 입력 전체를 복사하면 문제·역할 표시·풀이의 실제 토큰이 모두 학습 대상에 들어갑니다.
답변만 학습하려면 사용자 부분을 보통 -100으로 표시해 손실 계산에서 제외합니다.
패딩 제외와 사용자 입력 제외는 서로 다른 작업입니다.여기서는 DeepSeek-R1의 풀이 텍스트를 정답 예제로 삼는 SFT 형태의 증류를 합니다.
교사 모델의 전체 확률 분포를 직접 맞추거나, 실행 중 교사에게 새 답을 요청하는 구조는 아닙니다.
r1_solution_1 하나를 사용한다는 점도 데이터 선택의 일부입니다.
| 설정 | 실제 값 | 초보자가 읽을 의미 |
|---|---|---|
| 수치 형식 | torch.bfloat16, bf16=True | 가중치 로딩·학습에서 BF16 사용 |
| 한 번의 배치 | per_device_train_batch_size=4 | 장치당 한 번에 처리할 예제 수 |
| 기울기 누적 | gradient_accumulation_steps=16 | 장치 하나라면 업데이트당 예제 수는 기본적으로 64개 |
| 학습량 | 3 epochs · learning_rate=1e-6 | 학습 데이터를 세 번 돌며 작은 폭으로 수정 |
| 평가·저장 | eval_strategy="no" · 100단계마다 저장 | 학습 도중 검증 성능으로 최적 모델을 고르지 않음 |
| 메모리·속도 | torch_compile=True · 체크포인팅 꺼짐 | 최적화와 메모리 절약은 다른 설정 |
| 재현 설정 | seed=42 · data_seed=42 | 난수 설정은 있지만 모든 환경 차이를 없애지는 않음 |
유효 배치는 일반적인 데이터 병렬 학습에서 “장치당 배치 × 누적 횟수 × 데이터 병렬 장치 수”로 계산합니다.
단, device_map="auto"로 가중치를 여러 장치에 나누는 것 자체를 데이터 병렬 장치 수로 세면 안 됩니다.
이 노트북에는 LoRA 어댑터를 붙이거나 일부 레이어만 학습하도록 동결하는 코드가 없습니다.
학습 결과는 ./checkpoints/final_model에 저장하고 vLLM으로 다시 읽습니다.
추론은 tensor_parallel_size=1, max_model_len=4096,
temperature=0, max_tokens=3700입니다.
입력과 출력의 합이 컨텍스트 예산에 들어오는지도 확인해야 합니다.
extract_answer()로 최종 답을 뽑고 math_equal()로 정답과 비교하지만,
두 함수의 원본인 openmathinst_utils는 저장소에 없습니다.
저장된 정확도 0.452는 당시 노트북의 출력 기록입니다.
같은 설정의 사전 모델 점수가 없어 이 숫자만으로 향상 폭을 계산할 수는 없습니다.
평가 숫자를 읽기 전에 어떤 샘플을 버렸고, 어느 토큰을 학습했으며, 무엇을 정답으로 셌는지부터 확인해야 합니다.
documents/chapter7/llm_stega.ipynb의
generate_text_with_steganography()는 다음 토큰 확률을 만든 뒤 handle(next_token_probs)에 넘깁니다.
Huffman과 FLC는 모두 __call__()을 구현해 같은 자리에 들어갑니다.
이것이 선택 규칙을 바꿔 끼우는 전략 패턴입니다.
# 7장 생성 루프의 핵심
outputs = model(stega_output)
next_token_logits = outputs.logits[:, -1, :]
next_token_probs = F.softmax(next_token_logits, dim=-1)
bit_word_index = handle(next_token_probs)
stega_output = torch.cat(
[stega_output, bit_word_index.unsqueeze(1)], dim=1
)
FLC(k=2)는 확률이 높은 네 토큰에 00, 01, 10, 11을 대응시킵니다.
Huffman(k=4)는 상위 네 후보의 확률로 트리를 만들고, 확률에 따라 길이가 달라질 수 있는 비트 부호를 붙입니다.
두 클래스에서 k의 뜻이 다르다는 점을 놓치기 쉽습니다.
createHuffmanTree()는 작은 빈도의 노드 둘을 반복해서 합치고,
huffmanEncoding()은 부모 방향을 따라 부호를 만듭니다.
각 클래스의 extract()는 같은 확률과 선택 토큰으로 해당 부호를 되찾습니다.
문장 전체를 받아 끝까지 복원하는 독립적인 디코더까지 완성된 것은 아닙니다.
“맛있다”, “훌륭하다”처럼 다음에 올 수 있는 단어 후보에 서로 다른 번호표를 붙이는 셈입니다. 보내고 싶은 비트에 맞는 번호표의 단어를 골라도 문장은 계속 이어집니다. 받는 쪽은 같은 모델·문맥·후보 정렬로 번호표를 재구성해야 합니다.
경계 조건도 공부할 만합니다. 루프는 비트가 완전히 비었는지만 검사하므로 남은 비트가 부호보다 짧으면 선택 변수가 정해지지 않을 수 있습니다.
종료 토큰 검사는 일반 비교 문장의 next_token을 사용합니다.
따라서 은닉 문장 자체의 종료 정책과 구분해야 합니다.
추론 루프에 torch.no_grad() 또는 torch.inference_mode() 문맥도 없습니다.
documents/chapter11/RLHF.ipynb의 build_dataset()은
IMDB 리뷰 중 200자를 넘는 것을 골라, 길이 샘플러로 짧은 시작 부분을 만듭니다.
collator()는 길이가 다른 토큰 배열을 목록으로 묶습니다.
GPT-2 학습 모델과 참조 모델을 각각 로딩하고 DistilBERT 분류기를 별도로 둡니다.
# 11장 보상 계산과 정책 업데이트의 핵심
texts = [q + r for q, r in zip(batch["query"], batch["response"])]
pipe_outputs = sentiment_pipe(texts, **sent_kwargs)
positive_scores = [
item["score"]
for output in pipe_outputs
for item in output
if item["label"] == "POSITIVE"
]
rewards = [torch.tensor(score) for score in positive_scores]
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
ppo_trainer.log_stats(stats, batch, rewards)
sent_kwargs의 function_to_apply="none" 때문에 보상은 정규화된 확률이 아니라
긍정 클래스의 원시 점수인 로짓입니다. 저장된 예시에도 음수 점수가 등장합니다.
PPOConfig의 학습률은 1.41e-5입니다.
참조 모델은 원래 정책에서 얼마나 벗어나는지 비교하는 기준입니다. PPO와 KL 제어의 세부 계산은 이 파일에 직접 구현하지 않고 TRL에 맡깁니다. 이후 16개 샘플에서 학습 전후 보상의 평균·중앙값을 비교하지만, 학습 데이터에서 뽑은 사례 비교를 독립된 테스트 성능으로 읽으면 안 됩니다.
11장은 RLHF의 학습 구조를 설명하지만, 이 실험에서 매 단계 사람이 선호를 새로 평가하지는 않습니다. 이미 학습된 감정 분류기가 보상을 줍니다. 높은 보상은 그 분류기를 만족했다는 뜻이며, 사실성·유용성·일반적인 안전성을 동시에 입증하지 않습니다.
documents/chapter9/GUIagent.ipynb의 유일한 실행 셀은
task, previous_actions, image_path, osatlas_action, score를 읽어
messages와 images로 묶습니다.
변환 결과는 “사용자 지시+화면”과 “행동+점수”의 학습 쌍입니다.
파일을 여는 두 open('')의 경로는 비어 있습니다.
설명 셀의 학습 YAML 예시에서 model_name_or_path·output_dir도 빈칸입니다.
완성된 GUI 실행 엔진이 아니라, 외부 LLaMA-Factory에 전달할 데이터를 준비하는 예제입니다.
실제 화면 클릭의 성공률과 모델이 출력한 자기 점수는 따로 검증해야 합니다.
documents/는 강의 내용과 실습의 중심이고,
각 장의 assets/·figs/는 설명 그림과 화면 캡처입니다.
pics/는 프로젝트 소개용입니다. 모델 가중치나 학습 데이터 디렉토리는 포함되어 있지 않습니다.
| 노트북 | 실행 셀 | 실행 셀 소스 줄 |
|---|---|---|
4장 sft_math.ipynb | 27개 | 155줄 |
7장 llm_stega.ipynb | 3개 | 189줄 |
9장 GUIagent.ipynb | 1개 | 94줄 |
11장 RLHF.ipynb | 16개 | 196줄 |
| 나머지 7개 | 0개 | 0줄 · 설명 셀 안에 코드 예시 존재 |
| 합계 | 47개 | 634줄 |
집계는 .git을 제외한 105개 파일 기준입니다.
노트북 JSON을 읽어 cell_type="code"인 셀의 source를 줄 단위로 셌으며,
주석·빈 줄도 포함했습니다. 이 중 한 줄은 !pip 셸 명령이므로 Python 중심 약 633줄과 셸 명령 1줄입니다.
독립된 .py, JavaScript, Go, Rust 소스 파일은 없습니다.
별도로 Markdown 파일은 12개·2,495줄, 노트북의 설명 셀은 79개·1,672줄입니다. 노트북 JSON 자체의 4,597줄에는 메타데이터와 저장 출력이 포함되므로 코드 줄 수와 합치면 안 됩니다. PDF는 11개이며, 이미지까지 포함한 파일 크기는 약 97.6MiB입니다.
8장 README의 슬라이드 링크는 documents/chapter6/mllms.pdf,
9장은 documents/chapter8/GUIagent.pdf, 10장은 documents/chapter7/agents.pdf를 가리킵니다.
실제 파일은 각각 documents/chapter8/mllms.pdf,
documents/chapter9/GUIagent.pdf, documents/chapter10/dive-into-safety.pdf입니다.
안내문 속 train.py나 gen.py를 못 찾았을 때는 먼저 외부 프로젝트 경로인지 확인하세요.
1장의 분류 스크립트, 5장의 생성·탐지 코드, 8장의 NExT-GPT 디렉토리 트리는 이 저장소의 실제 파일 목록과 다릅니다.
4장의 apply_chat_template()는 역할이 있는 대화를 모델이 기대하는 문자열·토큰 형식으로 바꿉니다.
tokenize=False일 때의 문자열과 tokenize=True일 때의 토큰 배열을 나란히 읽어 보세요.
모델마다 대화 구분자가 다르므로 단순히 텍스트를 이어 붙이는 것과는 다릅니다.
작은 실습: 질문 하나에 답변을 붙인 학습 형식과, 질문만 넣고 생성을 시작하는 추론 형식을 비교합니다.
4장에서 추론 시 사용하는 add_generation_prompt=True와 추가 <think>가 어느 위치에 들어가는지 표시하세요.
이 표시는 모델의 텍스트 형식이며, 논리적 정답을 보장하는 장치는 아닙니다.
7장의 모델 출력 로짓은 보통 [배치, 현재 길이, 어휘 수] 형태입니다.
outputs.logits[:, -1, :]로 마지막 위치만 고르면 [배치, 어휘 수]가 됩니다.
softmax(..., dim=-1)는 그 어휘 축에서 확률로 바꾸고 topk()는 후보를 줄입니다.
# 개념 예시: 실제 모델 없이 후보 네 개의 확률만 생각하기
후보 토큰 = [A, B, C, D]
확률 = [0.4, 0.3, 0.2, 0.1]
FLC 부호 = [00, 01, 10, 11]
비트 10을 넣으려면 C 선택
다음 위치에서는 새 문맥으로 확률과 부호표를 다시 계산
작은 실습: unsqueeze(1) 전후의 모양을 적어 보세요.
선택 토큰 [1]이 [1, 1]이 되어야 기존 토큰 배열의 길이 축에 이어 붙일 수 있습니다.
문법을 외우는 것보다 차원의 의미를 따라가는 연습입니다.
2장의 설명 셀에는 sample_sync_call()과 sample_sync_call_streaming() 예시가 있습니다.
같은 질문도 전체 응답을 한 번에 받거나 스트림을 순회하며 표시할 수 있습니다.
예시의 head_idx가 어떤 중복 출력을 막으려는지 읽어 보세요.
동기 호출 예시에는 주석·조건문이 한 줄에 붙은 서식 문제가 있습니다. 그대로 실행 가능한 함수라고 가정하지 말고 상태 코드 확인→성공 출력→실패 처리 순서로 다시 써 보는 편이 좋습니다. 모델의 품질 실험과 네트워크 오류 처리는 별도의 문제입니다.
3장 설명의 BaseEditor.edit()는 prompts·target_new·subject 등을 받습니다.
locality_inputs는 편집과 무관한 질문의 기존 답이 유지되는지 확인하기 위한 입력입니다.
ROME·MEMIT의 내부 구현은 외부 EasyEdit에 있습니다.
작은 실습: 가상의 인물·도시로 수정 대상 하나, 바꿔 말한 질문 둘, 무관한 질문 셋을 만드세요. “수정 성공”, “표현이 달라도 유지”, “주변 지식 보존” 세 열로 결과표를 설계합니다. 원하는 답 하나가 바뀌는 것만으로 좋은 편집이라고 결론 내리지 않는 연습입니다.
5장은 외부 X-SIR의 생성·탐지·평가 명령을 설명하고,
예시 결과로 AUC와 TPR@FPR를 제시합니다.
생성 문장을 잘 찾는 능력과 사람이 쓴 글을 잘못 지목하지 않는 능력을 함께 봐야 합니다.
안내의 높은 예시 점수가 다른 언어·번역·문서 길이에서도 그대로 유지된다는 뜻은 아닙니다.
6장의 공격 평가와 10장의 R-Judge도 “무엇을 실패로 정의했는가”가 중요합니다.
10장은 행동 기록에 대한 위험 설명과 safe/unsafe 판정을 구분합니다.
설명이 그럴듯해도 마지막 이진 판정은 틀릴 수 있다는 예시가 나옵니다.
8장 README 기준 NExT-GPT는 입력 인코더·언어 모델·출력 생성기 사이를 투영층으로 연결하고, 단계별 정렬과 지시 학습을 설명합니다. 해당 구성의 실제 모델 구현은 외부 저장소에 있습니다. 여기서는 입력 특징을 어떤 공통 표현으로 바꾸는지 읽는 것이 첫 목표입니다.
9장에서는 이미지 파일 경로가 images 목록에, 행동 문자열이 assistant 답변에 들어갑니다.
작은 실습: 이미지 개수·경로·행동 좌표·점수 범위를 검증하는 규칙을 정하세요.
“화면을 넣었다”와 “그 화면에 맞는 행동을 넣었다”는 서로 다른 데이터 품질 조건입니다.
도구를 바꾸어도 남는 실력은 입력 형식, 텐서 모양, 학습 목표, 평가 오류를 스스로 설명하는 능력입니다.
| 할 일 | 요구 또는 보고된 장비 | 근거와 해석 |
|---|---|---|
| 자료 읽기·JSON 검사 | 일반 CPU 컴퓨터 | HTML·PDF·노트북 소스 읽기는 모델을 로딩하지 않음 |
| 7장 GPT-2 예제 | CPU 분기 있음 · CUDA 선택 | 코드의 torch.cuda.is_available()로 장치 결정. CPU 속도 보장은 없음 |
| 4장 수학 SFT | README: GPU 메모리 최소 40GB · 디스크 최소 50GB 여유 | 노트북 설명의 실험 장비는 단일 A100 80GB |
| 9장 GUI 전체 학습 | README: A100 80GB 최소 3장 | 명령 예시는 GPU 0~7을 노출. 최소 안내와 예시 구성은 다름 |
| 11장 PPO | README: A800-SXM4-80GB 한 장 | 보고된 사용량 10,097MiB · 35분 19초. 보편적인 최소 사양은 아님 |
| 외부 API 실습 | 네트워크·해당 서비스 계정 | 로컬 GPU 대신 외부 호출 필요. 모델 제공 여부·요금은 별도 확인 |
7장 README는 Python 3.8 이상과 모델 약 500MB를 안내합니다. 이는 모델 파일의 대략적인 안내이며 실행 중 메모리·캐시·패키지까지 합친 전체 요구량은 아닙니다. CPU 경로가 있다고 다른 장도 CPU에서 그대로 학습할 수 있는 것은 아닙니다.
약 15억 개 가중치를 BF16의 2바이트로만 계산하면 가중치 자체는 대략 3GB입니다. 하지만 학습에는 기울기, 옵티마이저 상태, 중간 활성값, 임시 버퍼가 더 필요합니다. 길이 4096의 예제 여러 개를 다루는 비용도 모델 파일 크기에는 나타나지 않습니다.
모델 파일은 식당의 조리 도구 상자입니다. 학습하려면 재료를 펼칠 작업대, 중간 요리, 기록장도 필요합니다. 상자가 작다는 이유만으로 좁은 책상에서 같은 규모의 요리를 할 수 있는 것은 아닙니다.
필요한 GPU 메모리는 모델 이름 하나가 아니라 학습 방식·문맥 길이·배치·수치 형식의 조합으로 결정됩니다.
gradient_checkpointing=True는 일부 계산을 다시 하여 메모리를 줄이는 방향입니다. 속도와 맞바꿉니다.이 변경들이 특정 GPU에서 성공한다는 보장은 없습니다. 4장은 CUDA 장치 조회·BF16·vLLM을 사용하며, Mac의 MPS나 Windows에서 같은 흐름이 검증되었다는 근거는 없습니다. 모델 학습까지 갈 때는 해당 라이브러리 버전의 지원 환경을 먼저 대조해야 합니다.
노트북 셀 분류, 필터 통과 여부, 비트와 후보 토큰의 대응, GUI 데이터 스키마 검사는 모델 없이도 공부할 수 있습니다. 먼저 데이터 흐름을 이해한 뒤, 필요할 때 장별로 계산 자원을 정하는 편이 효율적입니다.
입력: documents/ 아래 노트북 11개.
할 일: 표준 라이브러리 json으로 파일을 읽고 실행·설명 셀 개수를 출력합니다.
완료 기준: 전체 실행 셀 47개, 실행 셀이 있는 노트북 4개를 확인하고, 실행 셀 0개인 파일에서 설명 속 코드 블록 하나를 찾아 차이를 설명합니다.
# 저장소 루트에서 읽기만 하는 독립적인 검사 예시
import json
from pathlib import Path
for path in sorted(Path("documents").glob("chapter*/*.ipynb")):
notebook = json.loads(path.read_text(encoding="utf-8"))
cells = notebook["cells"]
code = [c for c in cells if c["cell_type"] == "code"]
lines = sum(len("".join(c["source"]).splitlines()) for c in code)
print(path, "실행 셀:", len(code), "소스 줄:", lines)
입력: 확률 [0.4, 0.3, 0.2, 0.1], 후보 A~D, 비트 0110.
FLC에서 두 비트씩 대응시키면 B와 C를 고릅니다. 선택 토큰에서 다시 비트를 복원하세요.
완료 기준: 원래 비트와 복원 비트가 같고, 비트가 한 개만 남았을 때 오류·패딩·종료 중 어떤 정책을 쓸지 문서화합니다. 후보 확률이 같은 경우의 정렬 규칙도 한 줄로 정하세요.
읽을 소스: 7장 FLC.__call__(), FLC.extract().
이것은 원리 이해용 작은 예이며 통신 보안이나 암호화를 보장하는 실험이 아닙니다.
입력: 정답 문자열 "7", "-7", "0.5", "1/2"와
토큰 목록 [101, 102, 201, 202]. 앞 두 토큰을 질문, 뒤 두 토큰을 답변으로 정합니다.
할 일: 4장의 필터로 남는 답을 기록하고, 전체 정답 배열과
[-100, -100, 201, 202]를 비교합니다. 실제 손실의 토큰 이동 처리까지 추적하면 더 좋습니다.
완료 기준: 필터가 배제한 답 유형과 학습 대상 위치를 표로 제출합니다. 마스크 변경은 원래 코드의 재현이 아니라 비교 실험용 수정임을 구분하세요.
입력: 가상 화면 세 개와 행동 정답 세 개.
9장의 messages·images 형식으로 변환하되 개인 화면이나 실제 계정 정보는 사용하지 않습니다.
할 일: 이미지 경로 누락, 화면 밖 좌표, 1~5 범위를 벗어난 점수, 비어 있는 행동 문자열을 각각 하나씩 만들어 검사기가 찾아내게 합니다.
완료 기준: 정상 샘플은 통과하고 각 오류에는 이유가 나옵니다. 학습에 쓰는 자기 점수가 실제 작업 성공률과 다른 이유를 두 문장으로 설명하세요.
입력: 11장의 정책·참조 모델 구성을 기준으로 한 평가 계획. 학습에 쓰지 않은 리뷰 시작 부분을 따로 고정하고, 길이와 생성 난수 조건을 맞춥니다.
할 일: 긍정 로짓 외에 문장 완결성, 같은 구절 반복, 사람이 평가한 자연스러움을 기록합니다. 생성 길이의 상한을 LengthSampler(4, 16)으로 정한 응답에서 결론을 어디까지 낼 수 있을지도 검토합니다.
완료 기준: 학습 전후 표와 실패 예시 5개, 보상은 높지만 문장이 나빠진 사례의 유무를 남깁니다. GPU가 없으면 가상 출력으로 채점표와 데이터 분리 계획까지 완성해도 됩니다.
좋은 실습 결과물은 “돌아갔다”는 캡처보다, 입력·변경 변수·비교 기준·실패 사례가 남은 기록입니다.
처음부터 모든 장을 실행하려고 하기보다, 매주 설명할 수 있는 결과물을 하나씩 만드세요. 아래는 초보자를 위한 권장 순서입니다. 장 번호 순서와 다르며, 첫 3주는 GPU 없이 진행할 수 있습니다.
| 주차 | 공부할 내용·소스 | 남길 결과물 |
|---|---|---|
| 1주 | Python 목록·딕셔너리·JSON·파일 읽기. 노트북 셀 종류 구분 | 11개 노트북 셀 지도와 장별 입출력 한 줄 요약 |
| 2주 | 토큰화·대화 템플릿·Datasets의 map/filter. 4장 tokenize() |
숫자 답 필터의 통과·탈락 표와 학습/추론 형식 비교 |
| 3주 | 텐서 축·softmax·top-k·부호화. 7장 FLC·Huffman |
작은 확률표로 비트 왕복, 남은 비트와 동률 처리 규칙 |
| 4주 | 역전파·손실 마스킹·배치·누적·BF16. 4장 TrainingArguments |
학습 설정 해설과 전체 토큰/답변 토큰 학습 비교 설계 |
| 5주 | 생성 길이·탐욕 선택·답 추출·수학 동치. 4장 vLLM·평가 코드 | 모델 오답과 답 추출 실패를 구분한 사례집 |
| 6주 | 국소성·탐지 임계값·오탐·누락. 3장 지식 편집과 5장 워터마크 | 무관한 질문 보존표와 탐지기의 혼동행렬 |
| 7주 | 멀티모달 입력·데이터 스키마·행동 정답. 8·9장 | 가상 GUI 데이터와 경로·좌표·점수 검사 규칙 |
| 8주 | 정책·보상·참조 모델·KL·PPO. 11장과 10장 위험 판단 | 보상과 사람 평가를 나란히 둔 비교 보고서 |
학습을 실제로 수행하는 4주차 이후에는 장비와 의존성 준비가 추가됩니다. 실행이 어렵다면 먼저 코드의 각 줄이 바꾸는 데이터를 표로 적고, 외부 보조 모듈·모델·데이터가 필요한 지점을 표시하는 것까지 진행하세요.
진도는 실행한 노트북 수보다, 새 모델에서도 같은 실험 질문을 세우고 평가할 수 있는지로 판단하는 편이 좋습니다.
수학 문제집의 답을 외우기보다 풀이를 설명하는 것과 같습니다. “이 필터를 빼면 무엇이 달라질까?”, “보상을 바꾸면 어떤 행동을 배울까?”에 예상과 근거를 말할 수 있으면 다음 장으로 넘어가세요.
| 용어 | 쉬운 설명 |
|---|---|
| 노트북 셀 | 문서 안의 작은 단위. 설명 셀은 읽는 글이고 실행 셀은 커널에 보낼 코드입니다. |
| 커널 | 노트북 코드를 실제로 실행하며 변수·모델 같은 상태를 기억하는 프로세스입니다. |
| 사전학습 모델 | 많은 데이터로 미리 학습한 모델. 이 교재는 이를 불러와 수정하거나 사용합니다. |
| 토큰·토크나이저 | 문장을 잘게 나눈 단위와 그 변환기. 토큰 하나가 반드시 단어 하나인 것은 아닙니다. |
| 대화 템플릿 | user·assistant와 본문을 모델이 기대하는 구분자·순서로 배열하는 규칙입니다. |
| SFT | 입력과 모범 답변을 보여 주며 그 답변을 생성하도록 가중치를 조정하는 학습입니다. |
| 증류 | 큰 모델 등의 결과를 작은 모델의 학습 재료로 쓰는 방법. 4장은 풀이 텍스트를 사용합니다. |
| 손실·마스킹 | 예측이 정답과 다른 정도를 재는 값과, 특정 위치를 그 계산에서 제외하는 처리입니다. |
| BF16 | 16비트 수치 형식. 메모리를 줄이는 데 쓰며 지원 하드웨어와 연산 조건을 확인해야 합니다. |
| 기울기 누적 | 작은 배치 여러 번의 기울기를 모아 가중치를 한 번 갱신하는 방법입니다. |
| 체크포인트 | 학습 도중 또는 끝에서 저장하는 모델 등의 상태. 체크포인팅 메모리 기법과는 맥락이 다릅니다. |
| 컨텍스트 길이 | 모델이 한 번의 시퀀스에서 다루는 토큰 예산. 생성 시 입력과 출력 길이를 함께 봅니다. |
| 로짓·softmax | 확률로 바꾸기 전의 원시 점수와, 점수들을 합이 1인 확률로 바꾸는 함수입니다. |
| 탐욕 선택 | 매 위치에서 가장 높은 점수의 토큰을 고르는 방식. 답의 정확성을 보장하지는 않습니다. |
| 허프먼 부호·FLC | 후보 확률에 따라 비트 부호 길이가 달라질 수 있는 방식과 고정 길이 비트 부호를 쓰는 방식입니다. |
| 텍스트 은닉 | 생성 문장의 토큰 선택에 별도 비트를 담는 기술. 암호화와는 목적·보장이 다릅니다. |
| 워터마크 | 생성 방식의 흔적을 통계적으로 탐지할 수 있게 만드는 표시. 임의의 비트 전달과 구분합니다. |
| 지식 편집·국소성 | 특정 답을 바꾸는 작업과, 그 과정에서 무관한 답을 얼마나 보존하는지 보는 성질입니다. |
| TPR·FPR | 찾아야 할 대상을 제대로 찾은 비율과, 대상이 아닌 것을 잘못 지목한 비율입니다. |
| 정책·보상 | 어떤 토큰·행동을 선택할지 정하는 모델과, 그 선택에 주는 학습용 점수입니다. |
| 값 추정 헤드 | 앞으로 받을 보상 등을 추정하도록 모델에 덧붙이는 출력 부분입니다. |
| 참조 모델·KL | 원래 정책과 비교하는 기준 모델과, 두 확률 분포의 차이를 재는 척도입니다. |
| PPO·RLHF | PPO는 정책을 갱신하는 강화학습 방법이고, RLHF는 인간 피드백으로 선호를 반영하는 학습 접근입니다. |
| 보상 편법 | 원하는 품질 대신 채점기의 허점을 만족해 높은 보상만 얻는 현상입니다. |
| GUI 에이전트 | 화면과 지시를 바탕으로 클릭·입력 등의 행동을 선택하는 시스템입니다. |
| ZeRO-3 | 모델 파라미터·기울기·옵티마이저 상태를 여러 장치에 나누는 분산 학습 방식입니다. |
같은 단어가 다른 문맥에서 쓰일 수 있습니다. 특히 7장 k는 FLC에서는 비트 수,
Huffman에서는 후보 수입니다. 함수의 인자를 보기 전에 해당 클래스에서 무엇을 뜻하는지 확인하세요.
| 항목 | 내용 |
|---|---|
| 선정 위치 | GitHub Trending Jupyter Notebook Daily #1 · 2026-10-23 |
| 스타 / 포크 | 57,287 / 6,847 · 2026-10-23 GitHub 기준 |
| 생성일 | 2024-04-08 |
| 최신 릴리스 | v1 · 2025-06-12. README 배지의 v0.1.0 표기와 구분 |
| 최근 push | 2025-10-10 · 분석일 당일 업데이트로 해석하지 않기 |
| 최근 커밋 | f84c042 · 2025-10-10 · Update README.md |
| 주 언어 | GitHub 분류: Jupyter Notebook. 실행 셀은 Python 중심 |
| 코드 규모 | 실행 셀 47개·634줄: Python 중심 약 633줄 + 셸 명령 1줄. 주석·빈 줄 포함 |
| 문서 규모 | 노트북 11개, Markdown 12개·2,495줄, PDF 11개 |
| 파일 규모 | 105개·약 97.6MiB. .git 제외, 모델·데이터 미포함 |
| 실행 구조 | 실행 셀 포함 노트북 4개. 통합 패키지·Dockerfile·CI·테스트 파일 없음 |
| 라이선스 | GitHub 기준 없음. 커밋 f84c042에도 라이선스 파일 없음 |
GitHub 수치는 2026-10-23 기준이며, 파일·셀·줄 수는 커밋 f84c042의 내용을 센 값입니다.
① 곧바로 재현되는 통합 환경은 아닙니다. 장별 버전이 다르고, 4장의 채점 보조 모듈과 여러 외부 프로젝트 파일은 별도 준비가 필요합니다. 9장의 파일·모델·출력 경로도 비어 있습니다. 저장 출력은 새 환경에서의 실행 성공 증거가 아닙니다.
② 실험 결과의 의미는 제한적입니다. 수학 정확도 0.452는 저장된 단일 결과이며, PPO의 감정 보상 상승은 일반적인 안전성 향상과 다릅니다. 4장에는 학습 중 검증이 없고, 11장의 전후 비교는 독립된 테스트 분할이 아닙니다.
③ 자원 요구가 장마다 크게 다릅니다. 읽기와 데이터 검사는 가볍지만, 원래 규모의 수학·GUI 학습은 큰 GPU 메모리를 요구합니다. 외부 모델·데이터·API·도구의 이용 조건과 지원 버전도 각각 확인해야 합니다.
④ 읽을 수 있다는 사실만으로 재사용 조건이 정해지지는 않습니다. 명시된 저장소 라이선스가 없습니다. 무료 교육 자료라는 README 설명을 특정 배포·수정 허용 조건으로 대신 읽지 마세요.
⑤ 안전 장은 위험한 행동의 평가 자료입니다. 기록 속 민감정보 전송·시스템 손상 사례를 실제 행동으로 재현할 필요는 없습니다. 가상 기록에서 위험을 찾고 판정 기준을 비교하는 방식으로도 핵심을 배울 수 있습니다.