다키클라우드코리아
경력근거: 모델 학습, 평가, 실험 관리, 체크포인트 관리 및 배포까지 연결되는 End-to-End 학습 플랫폼을 개발합니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
“모델 학습, 평가, 실험 관리, 체크포인트 관리 및 배포까지 연결되는 End-to-End 학습 플랫폼을 개발합니다.” 와 “다중 실험, 하이퍼파라미터 탐색, 자동 평가 및 재현 가능한 학습 파이프라인을 설계합니다.” 가 AI Native Training Platform 에서 이 자리가 맡는 일이고, “데이터 오염, 평가 데이터 누수, 중복 및 라이선스 문제” 를 살피는 일도 같은 자리에 들어 있습니다. 하이퍼파라미터 탐색이 쌓은 체크포인트가 같은 플랫폼 안에서 배포로 넘어가므로, 넘기기 직전에 오염·하락·흔들림·반복을 판정하는 화면이 그 흐름의 한 칸으로 들어갑니다. 자격요건의 “모델 성능을 객관적으로 측정하고 실험 결과를 분석하여 개선 방향을 도출할 수 있는 분” 에 맞춰, 이 화면은 목표 점수 하나 대신 기준 모델 점수와 같은 설정의 seed 별 점수를 체크포인트 옆에 세웁니다. 이 포트폴리오는 소형 오픈 모델을 직접 LoRA 학습·평가하고 학습 데이터와 평가셋을 13-gram 해시로 견줘 체크포인트마다 배포 판정을 내는 구현을 보여줍니다. 수십 노드 분산 학습 운영과 고객사 업무별 평가셋 설계 전문성은 주장하지 않습니다.
주요업무 3번이 학습·평가·실험 관리·체크포인트 관리·배포를 잇는 End-to-End 학습 플랫폼과, 모델 연구 결과를 추론 플랫폼으로 넘기는 학습·배포 워크플로를 적습니다. 체크포인트가 배포로 넘어가는 자리가 플랫폼 안에 있으니, 넘기기 직전에 그 체크포인트를 판정하는 화면이 흐름의 한 칸이 됩니다. 3주차에는 배포 후보를 vLLM 엔드포인트로 띄워 오프라인 점수와 견줍니다.
주요업무 4번은 공개 데이터와 자체 생성 데이터로 학습 데이터셋을 꾸리는 일, 합성 데이터와 자동 검증 파이프라인을 만드는 일, 데이터 오염·평가 데이터 누수·중복을 살피는 일을 나란히 둡니다. 이 편은 위키백과 문단으로 합성 QA 를 직접 만들어 평가 문단과 겹친 데이터와 두 번 들어간 샘플을 실제로 생기게 한 뒤, 13-gram 해시로 체크포인트마다 그 비율을 셉니다.
주요업무에 다중 실험·하이퍼파라미터 탐색·자동 평가·재현 가능한 학습 파이프라인이 있고, 함께하고 싶은 사람으로 정확한 벤치마크와 재현 가능한 실험으로 성능을 말하는 사람을 꼽으며, 자격요건에 SFT·PEFT·LoRA 파인튜닝 경험이 있습니다. 이 편은 LoRA 설정 여섯 개를 seed 1·7·42 로 직접 돌리고, 같은 설정의 seed 별 점수 차와 기준 모델 대비 하락을 목표 점수 옆에 세웁니다.
다키클라우드의 AI Native Training Platform 은 모델 학습, 평가, 실험 관리, 체크포인트 관리, 배포를 한 플랫폼에서 잇습니다. 이 관리자 페이지는 하이퍼파라미터 탐색으로 쌓인 체크포인트마다 네 가지를 계산합니다: 평가 문항이 학습 데이터와 13-gram 으로 겹친 비율, 벤치마크별로 기준 모델보다 떨어진 점수, 같은 설정을 seed 만 바꿔 돌린 체크포인트끼리의 점수 차, 학습 샘플이 반복된 비율입니다. 하이퍼파라미터 탐색 작업이 끝나면 고객사 AI 팀의 모델 담당자가 먼저 이 페이지를 열어 걸린 체크포인트를 펼치고, 어느 평가 문항이 어느 학습 데이터와 겹쳤는지, 같은 설정의 어느 seed 가 몇 점이었는지 읽은 뒤 배포 후보 묶음을 팀장에게 올립니다. 팀장은 목표 벤치마크 순위가 아니라 그 묶음에서 추론 엔드포인트에 올릴 체크포인트 하나를 정합니다.
다키클라우드 학습 플랫폼(AI Native Training Platform)으로 자사 문서와 공개 데이터를 섞어 도메인 모델을 파인튜닝하는 고객사 AI 팀의 모델 담당자와 팀장. 하이퍼파라미터 탐색으로 체크포인트가 한 번에 수십 개 쌓이는데, 목표 벤치마크 점수만 보고 고르면 평가셋 오염·다른 능력의 퇴행·재현 실패를 배포 뒤에야 안다. 플랫폼 콘솔의 판정 화면을 함께 보고 추론 엔드포인트로 올릴 체크포인트를 정한다
목표 벤치마크 순위로 배포할 체크포인트를 고르면 점수가 왜 올랐는지 보지 않게 됩니다. 평가 문단과 같은 글이 학습 데이터에 들어간 체크포인트가 1위가 되고, lr 과 LoRA r 을 키운 설정은 seed 운이 좋았던 한 번이 상위에 오르며, epoch 를 늘린 설정은 목표 점수를 올리는 사이 GSM8K 같은 다른 능력을 잃습니다. 이 셋과 학습 샘플 반복은 학습 데이터 해시, 기준 모델 점수, 같은 config_hash 의 다른 seed 점수를 체크포인트 옆에 나란히 놓아야 드러나는데, 실험 목록은 체크포인트마다 목표 점수 하나만 보여줍니다. 체크포인트마다 네 조건을 계산해 판정 하나로 보여주면, 팀장은 1위 체크포인트가 왜 걸렸는지 읽고 실제로 올려도 되는 체크포인트를 고릅니다.
GPU 한 장(24GB)에서 Qwen2.5-0.5B·1.5B-Instruct 를 설정 여섯 개와 seed 1·7·42 로 LoRA 학습해 체크포인트 10개를 만들고, lm-evaluation-harness 로 KoBEST-BoolQ 와 GSM8K 를 잽니다. 학습 데이터 네 개와 평가셋 두 개는 어절 13개 단위 해시 표로 바꿉니다. 모델 담당자와 팀장이 Streamlit 관리자 페이지에서 학습 작업을 고르면 체크포인트가 다섯 판정으로 나뉘고, 펼치면 겹친 평가 문항과 그 학습 데이터, 기준 모델 대비 차이, 같은 설정의 seed 별 점수를 읽습니다.
겹침 14·15문항, 하락 1.9·2.0점, 흔들림 3.0·3.1점, 반복 5.00·5.01%처럼 기준값 바로 앞뒤 사례와 사유가 둘 이상 겹친 체크포인트로 판정 테스트 36건을 pytest 로 매번 돌립니다. 평가셋 오염으로 걸린 체크포인트는 겹친 46문항을 뺀 KoBEST-BoolQ 1,358문항으로 다시 재서, 팀장이 원래 점수 옆에서 깨끗한 문항만의 점수를 읽습니다.
체크포인트가 저장되면 단일 GPU 노드 k3s 의 Kubernetes Job 이 평가, 해시 대조, 판정을 돌려 화면에 올립니다. 배포 후보 체크포인트는 LoRA 를 병합해 vLLM 의 OpenAI 호환 엔드포인트로 띄우고, 같은 평가셋을 엔드포인트로 다시 돌려 오프라인 점수와 0.5점 안에서 맞는지 화면에 남깁니다.
모델 담당자가 학습 작업 하나를 고르면 체크포인트 10개가 배포 후보 3개, 평가셋 오염 1개, 기준 모델 대비 하락 3개, seed 간 흔들림 2개, 학습 샘플 반복 1개로 나뉩니다. Qwen2.5-0.5B 체크포인트를 목표 점수 순으로 세우면 위의 다섯(75.1·72.3·71.2·69.8·69.4)이 모두 걸리고 여섯째 68.0 이 배포 후보로 남습니다.
체크포인트를 펼치면 겹친 평가 문항 수와 그 문항이 겹친 학습 데이터, 벤치마크별 기준 모델 대비 차이, 같은 설정의 seed 별 점수, 반복 샘플 비율을 읽습니다. GSM8K 가 1.9점 낮은 체크포인트는 배포 후보에 남고 2.0점 낮은 같은 설정의 seed 7 체크포인트는 걸리며, koalpaca-v1.1a-8k 에서 온 9문항 겹침(0.64%)은 판정에 들지 않고 펼침 메모로 남습니다.
score 칸에 'N/A' 같은 글자가 든 줄, lm-evaluation-harness 출력 그대로 0~1 비율(0.712)로 적힌 score, 쉼표로 이은 문자열로 온 train_dataset_ids, 16자리 16진수가 아닌 해시, benchmark 는 kobest_boolq 인데 eval_set_id 가 gsm8k-test 인 줄, config_hash 가 같은데 lr·lora_r·epochs 가 다른 체크포인트, 해시 표에 없는 데이터셋을 가리키는 train_dataset_ids, 기준 모델 점수가 없는 벤치마크까지 8종을 넣어도 화면이 멈추지 않습니다. 판정하지 못한 체크포인트는 묶음 위 확인 칸에 ckpt_id 와 이유로 뜹니다.
기준값 바로 앞뒤 사례와 사유가 둘 이상 겹친 체크포인트로 만든 판정 테스트 36건의 통과 수를 화면 위에 띄웁니다. 단, 체크포인트를 제가 학습하고 정답과 기준값도 제가 정한 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 결과는 제가 만든 소형 체크포인트와 제가 정한 기준값으로 낸 자가채점이며, 이 판정이 배포 뒤 업무 질문에서 성능이 안 나오는 모델을 실제로 걸러 내는지는 고객사 AI 팀의 체크포인트와 배포 뒤 평가 기록이 있어야 측정됩니다. 이 포트폴리오는 그 측정을 바로 돌릴 수 있는 상태로 만듭니다.
판정 테스트 36건이 다 맞아도, 제가 정한 기준값 넷(겹침 1%, 하락 2점, 흔들림 3점, 반복 5%)을 코드로 옮겼다는 것과 그 값이 고객사에 맞는지는 별개입니다. 네 값은 Qwen2.5-0.5B·1.5B 를 seed 셋으로 돌려 본 점수 폭에서 정한 자가채점 기준이라, 7B 이상 모델이나 고객사 업무 평가셋에서는 seed 간 점수 폭과 견딜 수 있는 하락이 달라 고객사 AI 팀의 배포 기록으로 다시 정해야 합니다.
깨끗한 데이터로만 학습하면 체크포인트가 전부 배포 후보로 나와 판정이 보여줄 것이 없습니다. 평가 문단과 같은 출처의 위키백과 문단으로 만든 합성 QA, 같은 문단을 프롬프트만 바꿔 다시 돌린 합성 배치, lr 3e-4·LoRA r 64 설정, 3 epoch 설정을 일부러 학습해 네 사유가 실제 학습에서 나오게 하고, 기준값 바로 앞뒤 사례는 판정 테스트로 따로 만듭니다.
13-gram 겹침은 글자 그대로 옮긴 문장만 잡습니다. 평가 문단을 바꿔 쓴 합성 QA 나 번역된 문항은 겹침 0 으로 나오므로 0 이 오염 없음을 뜻하지 않고, 뜻이 같은 문장까지 보려면 임베딩 유사도 검사가 따로 필요합니다.
seed 셋으로 잰 점수 차는 표본이 작아 3점 기준을 운으로 넘나들 수 있습니다. 같은 설정을 몇 번 돌려야 판정이 안정되는지는 GPU 예산을 보고 정할 도입 단계 과제로 둡니다.
실제 고객사 학습 데이터는 수십만 샘플을 넘고 평가셋도 그 회사 업무 질문입니다. 13-gram 해시 전체를 메모리 집합으로 올리는 지금 방식은 2만 샘플 규모까지이고, 그 규모를 넘으면 해시를 정렬해 병합하거나 Bloom filter 로 바꾸는 일이 먼저입니다.
이 편이 보여주는 기술은 소형 오픈 모델의 LoRA 학습, lm-evaluation-harness 평가, 13-gram 해시 대조를 배포 판정 하나로 잇는 구현입니다. 멀티 노드 분산 학습과 GPU 스케줄러 운영 경험은 주장하지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
AI Native Training Platform 의 실험 목록에서 내려받는 체크포인트 표를 본뜬 것으로, 지원자가 GPU 한 장에서 직접 LoRA 학습한 결과로 채웁니다. config_hash 는 기준 모델·학습 데이터·lr·LoRA r·epoch 를 해시한 값이라 seed 만 다른 체크포인트끼리 같습니다. 인라인 샘플은 설정 여섯 개와 체크포인트 10개의 예시 값이고, seed 셋으로 돌린 설정, 한 번만 돌린 설정, 합성 데이터 두 배치를 같이 넣은 설정이 섞여 있습니다.
| ckpt_id | run_id | base_model | config_hash | seed | lr | lora_r | epochs | train_dataset_ids |
|---|---|---|---|---|---|---|---|---|
| ckpt-q05-lr1e4-r16-wikiqa1-s42 | run-1009-01 | Qwen2.5-0.5B-Instruct | cfg-3f9a02c1 | 42 | 0 | 16 | 1 | ["koalpaca-v1.1a-8k","kowiki-qa-synth-v1"] |
| ckpt-q05-lr1e4-r16-wikiqa2-s1 | run-1009-02 | Qwen2.5-0.5B-Instruct | cfg-7d14e8b0 | 1 | 0 | 16 | 1 | ["koalpaca-v1.1a-8k","kowiki-qa-synth-v2"] |
| ckpt-q05-lr1e4-r16-wikiqa2-s42 | run-1009-03 | Qwen2.5-0.5B-Instruct | cfg-7d14e8b0 | 42 | 0 | 16 | 1 | ["koalpaca-v1.1a-8k","kowiki-qa-synth-v2"] |
| ckpt-q05-lr3e4-r64-wikiqa2-s1 | run-1010-01 | Qwen2.5-0.5B-Instruct | cfg-a62c5f17 | 1 | 0 | 64 | 1 | ["koalpaca-v1.1a-8k","kowiki-qa-synth-v2"] |
| ckpt-q05-lr3e4-r64-wikiqa2-s7 | run-1010-02 | Qwen2.5-0.5B-Instruct | cfg-a62c5f17 | 7 | 0 | 64 | 1 | ["koalpaca-v1.1a-8k","kowiki-qa-synth-v2"] |
아래 JSON Schema 에 맞는 체크포인트 행을 더 만들어 주세요. {"type":"object","properties":{"ckpt_id":{"type":"string","description":"체크포인트 이름입니다. 기준 모델·lr·LoRA r·학습 데이터·seed 를 이어 적었습니다"},"run_id":{"type":"string","description":"학습 작업 번호입니다. 작업 하나가 마지막 체크포인트 하나를 남깁니다"},"base_model":{"type":"string","description":"LoRA 를 적용한 기준 모델 이름이고 base_scores.base_model 과 같은 표기입니다"},"config_hash":{"type":"string","description":"base_model·train_dataset_ids·lr·lora_r·epochs 를 해시한 앞 8자리에 cfg- 를 앞에 둔 값입니다. seed 는 넣지 않아 seed 만 다른 체크포인트끼리 같습니다"},"seed":{"type":"integer","minimum":0},"lr":{"type":"number","exclusiveMinimum":0},"lora_r":{"type":"integer","minimum":1},"epochs":{"type":"integer","minimum":1},"train_dataset_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"학습에 넣은 데이터셋 id 이고 sample_hashes.dataset_id 와 같은 표기입니다"}},"required":["ckpt_id","run_id","base_model","config_hash","seed","lr","lora_r","epochs","train_dataset_ids"]} 쉬운 데이터만 만들지 말고 다음을 일부러 섞어 주세요: (1) base_model·train_dataset_ids·lr·lora_r·epochs 가 모두 같고 seed 만 다른 체크포인트 2~3개 묶음(config_hash 가 같습니다), (2) seed 를 한 번만 돌린 설정, (3) train_dataset_ids 에 같은 문단에서 만든 합성 데이터 두 배치를 같이 넣은 설정, (4) 평가셋 문단과 같은 출처 문단으로 만든 합성 데이터를 넣은 설정, (5) lr 을 3e-4 이상으로 올리거나 lora_r 을 64 로 키운 설정. config_hash 는 seed 를 뺀 학습 설정이 모두 같을 때만 같게 두고, 같은 ckpt_id 로 eval_results 행을 벤치마크마다 하나씩 만드세요. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"ckpt_id":{"type":"string","description":"체크포인트 이름입니다. 기준 모델·lr·LoRA r·학습 데이터·seed 를 이어 적었습니다"},"run_id":{"type":"string","description":"학습 작업 번호입니다. 작업 하나가 마지막 체크포인트 하나를 남깁니다"},"base_model":{"type":"string","description":"LoRA 를 적용한 기준 모델 이름이고 base_scores.base_model 과 같은 표기입니다"},"config_hash":{"type":"string","description":"base_model·train_dataset_ids·lr·lora_r·epochs 를 해시한 앞 8자리에 cfg- 를 앞에 둔 값입니다. seed 는 넣지 않아 seed 만 다른 체크포인트끼리 같습니다"},"seed":{"type":"integer","minimum":0},"lr":{"type":"number","exclusiveMinimum":0},"lora_r":{"type":"integer","minimum":1},"epochs":{"type":"integer","minimum":1},"train_dataset_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"학습에 넣은 데이터셋 id 이고 sample_hashes.dataset_id 와 같은 표기입니다"}},"required":["ckpt_id","run_id","base_model","config_hash","seed","lr","lora_r","epochs","train_dataset_ids"]}lm-evaluation-harness 로 체크포인트마다 KoBEST-BoolQ(목표 벤치마크, 0-shot)와 GSM8K(5-shot)를 잰 정확도(%)입니다. 지원자가 직접 재서 채우는 표이고 인라인 값은 예시입니다. 목표 점수가 가장 높은 체크포인트가 평가 문단과 겹친 합성 데이터에서 나오고, lr 3e-4·LoRA r 64 설정은 seed 에 따라 KoBEST-BoolQ 가 64.1~72.3 으로 벌어지며, GSM8K 가 기준 모델보다 1.9점과 2.0점 낮은 두 체크포인트가 같은 설정 안에 있습니다.
| ckpt_id | benchmark | eval_set_id | score |
|---|---|---|---|
| ckpt-q05-lr1e4-r16-wikiqa1-s42 | kobest_boolq | kobest_boolq-test | 75.1 |
| ckpt-q05-lr1e4-r16-wikiqa1-s42 | gsm8k | gsm8k-test | 40.7 |
| ckpt-q05-lr1e4-r16-wikiqa2-s1 | kobest_boolq | kobest_boolq-test | 67.2 |
| ckpt-q05-lr1e4-r16-wikiqa2-s1 | gsm8k | gsm8k-test | 40.9 |
| ckpt-q05-lr1e4-r16-wikiqa2-s42 | kobest_boolq | kobest_boolq-test | 68 |
아래 JSON Schema 에 맞는 평가 결과 행을 더 만들어 주세요. {"type":"object","properties":{"ckpt_id":{"type":"string"},"benchmark":{"type":"string","description":"lm-evaluation-harness 의 task 이름입니다. kobest_boolq 는 목표 벤치마크(0-shot), gsm8k 는 지킬 벤치마크(5-shot)입니다"},"eval_set_id":{"type":"string","description":"점수를 잰 평가셋 id 이고 sample_hashes.dataset_id 와 같은 표기입니다"},"score":{"type":"number","minimum":0,"maximum":100,"description":"정확도(%)이고 소수 첫째 자리까지 적습니다"}},"required":["ckpt_id","benchmark","eval_set_id","score"]} 쉬운 데이터만 만들지 말고 다음을 일부러 섞어 주세요: (1) kobest_boolq 는 기준 모델보다 크게 오르는데 gsm8k 가 기준 모델보다 2점 넘게 떨어진 체크포인트, (2) 기준 모델과의 차이가 정확히 1.9점과 2.0점인 체크포인트, (3) 같은 config_hash 의 seed 별 점수 차가 3.0점과 3.1점인 묶음, (4) 학습 데이터에 평가셋 문항이 섞여 목표 점수만 유독 높은 체크포인트. score 는 0~100 사이 소수 첫째 자리까지 적고, benchmark 와 eval_set_id 는 kobest_boolq·kobest_boolq-test, gsm8k·gsm8k-test 짝을 지키세요. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"ckpt_id":{"type":"string"},"benchmark":{"type":"string","description":"lm-evaluation-harness 의 task 이름입니다. kobest_boolq 는 목표 벤치마크(0-shot), gsm8k 는 지킬 벤치마크(5-shot)입니다"},"eval_set_id":{"type":"string","description":"점수를 잰 평가셋 id 이고 sample_hashes.dataset_id 와 같은 표기입니다"},"score":{"type":"number","minimum":0,"maximum":100,"description":"정확도(%)이고 소수 첫째 자리까지 적습니다"}},"required":["ckpt_id","benchmark","eval_set_id","score"]}eval_results 와 같은 lm-evaluation-harness 설정으로 잰 기준 모델 다섯의 점수이고, 지원자가 직접 재서 채웁니다. 플랫폼에서 파인튜닝 출발점으로 고를 수 있는 모델을 미리 재 둔 기준표라 체크포인트가 쓰지 않은 기준 모델의 줄도 있습니다.
| base_model | benchmark | eval_set_id | score |
|---|---|---|---|
| Qwen2.5-0.5B-Instruct | kobest_boolq | kobest_boolq-test | 58.4 |
| Qwen2.5-0.5B-Instruct | gsm8k | gsm8k-test | 41.8 |
| Qwen2.5-1.5B-Instruct | kobest_boolq | kobest_boolq-test | 71.5 |
| Qwen2.5-1.5B-Instruct | gsm8k | gsm8k-test | 64.1 |
| Llama-3.2-1B-Instruct | kobest_boolq | kobest_boolq-test | 54.1 |
아래 JSON Schema 에 맞는 기준 모델 점수 행을 더 만들어 주세요. {"type":"object","properties":{"base_model":{"type":"string"},"benchmark":{"type":"string"},"eval_set_id":{"type":"string"},"score":{"type":"number","minimum":0,"maximum":100,"description":"LoRA 를 적용하지 않은 기준 모델을 eval_results 와 같은 평가 설정으로 잰 정확도(%)입니다"}},"required":["base_model","benchmark","eval_set_id","score"]} 기준 모델마다 kobest_boolq 와 gsm8k 두 줄을 만드세요. 쉬운 데이터만 만들지 말고 다음을 일부러 섞어 주세요: (1) 체크포인트가 아직 쓰지 않은 기준 모델, (2) 한국어 벤치마크는 높지만 gsm8k 는 낮은 모델처럼 두 벤치마크 순위가 엇갈리는 모델. score 는 eval_results 와 같은 평가 설정으로 잰 값이라 소수 첫째 자리까지 적습니다. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"base_model":{"type":"string"},"benchmark":{"type":"string"},"eval_set_id":{"type":"string"},"score":{"type":"number","minimum":0,"maximum":100,"description":"LoRA 를 적용하지 않은 기준 모델을 eval_results 와 같은 평가 설정으로 잰 정확도(%)입니다"}},"required":["base_model","benchmark","eval_set_id","score"]}학습 데이터 네 개(koalpaca-v1.1a-8k, kowiki-qa-synth-v1·v2·b2)와 평가셋 두 개의 샘플마다 본문 해시와 13-gram 해시를 담은 표이고, 지원자가 해시 작성기로 직접 만듭니다. 인라인 샘플은 표의 일부(13행)이고 지면 때문에 샘플마다 13-gram 해시를 서너 개만 실었습니다. 실제 표는 KoBEST-BoolQ 1,404문항, GSM8K 1,319문항, 학습 샘플 20,365개를 모두 담고, 문항 수·겹친 문항 수·반복 샘플 수는 표 전체에서 센 값이라 출력의 evidence 에 agg 로 적습니다. 평가 문항과 13-gram 을 같이 가진 합성 샘플, 합성 배치 둘에 같은 text_hash 로 들어간 샘플, 공개 데이터 안에서 같은 text_hash 가 두 번 나온 샘플, 어절이 13개보다 적은 샘플이 들어 있습니다.
| dataset_id | sample_id | text_hash | ngram13_hashes |
|---|---|---|---|
| kobest_boolq-test | kobest_boolq-test-0187 | c1658a31805d3354 | ["e4f2345c21166ee7","eb71a9fdf860eb60","1f3abf09b0d4acb9","878f193a4f42e841"] |
| kobest_boolq-test | kobest_boolq-test-1022 | 8dfec04574e27334 | ["06a0a59b982c2ce0","a6cc97213b5e793b","35f9878c5972670e"] |
| kobest_boolq-test | kobest_boolq-test-0544 | 528b1ae112bc9732 | ["7cd94f515ae31ad3","1216c1a799690668","e1871bf1dff1a823"] |
| gsm8k-test | gsm8k-test-0091 | d7436bf90a1aa53c | ["1976becf3870b16b","9785c735754e1898","91af9b4c2171f250"] |
| kowiki-qa-synth-v1 | kowiki-qa-synth-v1-01733 | 60d5ce33e187a715 | ["87c478695aca878d","eb71a9fdf860eb60","1f3abf09b0d4acb9","52768c7bbe35b3da"] |
아래 JSON Schema 에 맞는 샘플 해시 행을 더 만들어 주세요. {"type":"object","properties":{"dataset_id":{"type":"string","description":"학습 데이터셋 id 또는 평가셋 id 입니다"},"sample_id":{"type":"string","description":"데이터셋 id 에 원본 순번을 이은 샘플 번호입니다"},"text_hash":{"type":"string","pattern":"^[0-9a-f]{16}$","description":"본문을 NFC 로 맞추고 공백을 하나로 줄인 뒤 xxh64 로 해시한 16자리입니다. 학습 샘플은 지시문과 응답을, 평가 문항은 문단과 질문을 이어 적은 본문입니다"},"ngram13_hashes":{"type":"array","items":{"type":"string","pattern":"^[0-9a-f]{16}$"},"description":"같은 본문을 공백으로 나눈 어절 13개씩 한 칸씩 밀며 xxh64 로 해시한 목록입니다. 어절이 13개보다 적으면 빈 목록입니다"}},"required":["dataset_id","sample_id","text_hash","ngram13_hashes"]} text_hash 와 ngram13_hashes 의 각 값은 16자리 소문자 16진수입니다. 쉬운 데이터만 만들지 말고 다음을 일부러 섞어 주세요: (1) 평가셋 문항과 13-gram 해시를 한두 개 같이 가진 합성 학습 샘플, (2) 서로 다른 학습 데이터셋에서 text_hash 가 같은 샘플 쌍, (3) 같은 데이터셋 안에서 text_hash 가 같은 샘플 쌍, (4) 공개 학습 데이터 샘플이 평가 문항과 13-gram 하나를 같이 가진 경우, (5) 어절이 13개보다 적어 ngram13_hashes 가 빈 목록인 짧은 샘플. 같은 text_hash 를 가진 행은 ngram13_hashes 도 같아야 합니다. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"dataset_id":{"type":"string","description":"학습 데이터셋 id 또는 평가셋 id 입니다"},"sample_id":{"type":"string","description":"데이터셋 id 에 원본 순번을 이은 샘플 번호입니다"},"text_hash":{"type":"string","pattern":"^[0-9a-f]{16}$","description":"본문을 NFC 로 맞추고 공백을 하나로 줄인 뒤 xxh64 로 해시한 16자리입니다. 학습 샘플은 지시문과 응답을, 평가 문항은 문단과 질문을 이어 적은 본문입니다"},"ngram13_hashes":{"type":"array","items":{"type":"string","pattern":"^[0-9a-f]{16}$"},"description":"같은 본문을 공백으로 나눈 어절 13개씩 한 칸씩 밀며 xxh64 로 해시한 목록입니다. 어절이 13개보다 적으면 빈 목록입니다"}},"required":["dataset_id","sample_id","text_hash","ngram13_hashes"]}| Python | 해시 작성기와 판정 엔진의 언어입니다. 본문을 NFC 로 맞추고 공백을 하나로 줄인 뒤 어절 13개씩 xxh64 해시를 만들어 sample_hashes 를 쓰고, 네 표를 읽어 체크포인트마다 겹친 문항 비율, 기준 모델 대비 하락, seed 간 점수 차, 반복 샘플 비율을 계산해 사유 순서대로 판정 하나를 냅니다. |
| PyTorch | LoRA 학습 루프가 도는 바탕입니다. bf16 으로 GPU 한 장(24GB)에서 학습하고, seed 를 torch·numpy·random 모두에 고정해 같은 config_hash 를 다시 돌릴 수 있게 합니다. |
| Hugging Face | datasets 로 KoAlpaca v1.1a 에서 뽑은 8,000샘플, 위키백과 한국어 문단, KoBEST-BoolQ·GSM8K 평가셋을 받고, Transformers 와 PEFT 로 LoRA 어댑터를 적용해 학습한 체크포인트를 run 별로 저장합니다. |
| SFT·PEFT·LoRA | 체크포인트 10개를 만드는 학습 방식입니다. lr 1e-4·3e-4, LoRA r 16·64, epoch 1·3, 학습 데이터 조합을 바꾼 설정 여섯 개를 seed 1·7·42 에 나눠 돌려, 판정 네 사유가 실제 학습에서 나오게 합니다. |
| LLM | Qwen2.5-7B-Instruct 를 vLLM 으로 띄워 위키백과 문단 하나마다 예·아니오로 답하는 질문과 정답, 근거 문장을 만들게 해 kowiki-qa-synth 학습 데이터를 만듭니다. |
| 딥러닝 | Transformer 의 q_proj·k_proj·v_proj·o_proj 에 LoRA 를 적용하고 r 과 lr 을 키웠을 때 seed 별 점수가 벌어지는지를 흔들림 사유로 읽습니다. epoch 를 3으로 늘린 설정에서는 목표 과제에 맞춰지는 사이 GSM8K 추론 능력이 떨어지는지를 하락 사유로 봅니다. |
| 벤치마크 및 평가 프레임워크 | lm-evaluation-harness 로 기준 모델 다섯과 체크포인트 10개를 같은 설정(kobest_boolq 0-shot, gsm8k 5-shot)으로 재서 eval_results 와 base_scores 를 채웁니다. 2주차에는 겹친 문항을 뺀 KoBEST-BoolQ 부분집합을 별도 task 로 만들어 다시 잽니다. |
| Streamlit | 1주차 관리자 페이지입니다. 왼쪽 사이드바에 화면과 학습 작업 선택을 두고, 본문에 판정별 묶음과 체크포인트 펼침을 둡니다. |
| Kubernetes | 3주차에 단일 GPU 노드 k3s 에 NVIDIA device plugin 을 설치하고, 새 체크포인트가 저장되면 평가·해시 대조·판정을 Kubernetes Job 하나로 돌립니다. |
| 학습·배포 워크플로 | 3주차에 배포 후보 체크포인트의 LoRA 를 기준 모델에 병합해 vLLM 엔드포인트로 띄우고, 같은 평가셋을 엔드포인트로 돌려 오프라인 점수와 견줍니다. |
✓ pass → 모델 담당자와 팀장이 이 화면으로 올릴 체크포인트를 고르면 1주차로 완결입니다. 다음 주에는 기준값 앞뒤 사례 36건을 pytest 로 묶고, 오염으로 걸린 체크포인트를 겹친 46문항을 뺀 1,358문항으로 다시 잽니다.
✓ pass → 여기까지도 완결입니다. 다음 주에는 평가와 판정을 k3s 단일 GPU 노드의 Kubernetes Job 으로 올리고, 배포 후보의 LoRA 를 병합해 vLLM 엔드포인트로 띄운 뒤 같은 평가셋 점수를 오프라인 점수와 견줍니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · ckpt_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
배포 후보로 올려도 됨배포 후보평가셋 문항이 학습 데이터에 섞임평가셋 오염기준 모델보다 떨어진 벤치마크가 있음기준 모델 대비 하락같은 설정으로 다시 돌리면 점수가 흔들림seed 간 흔들림학습 데이터에 같은 샘플이 반복됨학습 샘플 반복체크포인트마다 배포 판정 하나와, 그 판정을 만든 네 계산값(평가셋별 겹친 문항 비율, 기준 모델 대비 하락, 같은 설정의 seed 간 점수 차, 반복 샘플 비율)과 근거를 싣는 형식입니다.
{"type":"object","properties":{"ckpt_id":{"type":"string"},"base_model":{"type":"string"},"config_hash":{"type":"string"},"seed":{"type":"integer"},"verdict":{"type":"string","enum":["배포 후보로 올려도 됨","평가셋 문항이 학습 데이터에 섞임","기준 모델보다 떨어진 벤치마크가 있음","같은 설정으로 다시 돌리면 점수가 흔들림","학습 데이터에 같은 샘플이 반복됨"],"description":"걸린 사유가 여럿이면 평가셋 문항이 학습 데이터에 섞임, 기준 모델보다 떨어진 벤치마크가 있음, 같은 설정으로 다시 돌리면 점수가 흔들림, 학습 데이터에 같은 샘플이 반복됨 순으로 앞선 하나입니다. 하나도 걸리지 않으면 배포 후보로 올려도 됨입니다"},"also_found":{"type":"array","items":{"type":"string","enum":["평가셋 문항이 학습 데이터에 섞임","기준 모델보다 떨어진 벤치마크가 있음","같은 설정으로 다시 돌리면 점수가 흔들림","학습 데이터에 같은 샘플이 반복됨"]}},"contamination":{"type":"array","description":"이 체크포인트를 잰 평가셋마다 한 항목입니다","items":{"type":"object","properties":{"eval_set_id":{"type":"string"},"overlap_items":{"type":"integer","minimum":0,"description":"정적 계산값입니다. 그 평가셋 문항 가운데 ngram13_hashes 가 이 체크포인트 train_dataset_ids 의 ngram13_hashes 와 하나라도 같은 문항 수입니다"},"eval_items":{"type":"integer","minimum":1,"description":"정적 계산값입니다. 그 평가셋의 문항 수입니다"},"overlap_pct":{"type":"number","minimum":0,"maximum":100,"description":"정적 계산값입니다. overlap_items ÷ eval_items × 100 을 소수 둘째 자리로 반올림한 값입니다"}},"required":["eval_set_id","overlap_items","eval_items","overlap_pct"]}},"worst_benchmark":{"type":"string","description":"base_scores.score − eval_results.score 가 가장 큰 벤치마크입니다"},"worst_drop_pts":{"type":"number","description":"정적 계산값입니다. worst_benchmark 에서 base_scores.score 와 eval_results.score 를 각각 10배 한 정수로 뺀 뒤 10 으로 나눈 값입니다. 음수면 모든 벤치마크가 기준 모델보다 높습니다"},"seed_runs":{"type":"integer","minimum":1,"description":"정적 계산값입니다. 이 체크포인트와 config_hash 가 같은 체크포인트 수(자기 포함)입니다"},"spread_benchmark":{"type":["string","null"],"description":"seed 간 점수 차가 가장 큰 벤치마크입니다. seed_runs 가 1 이면 null 입니다"},"seed_spread_pts":{"type":["number","null"],"minimum":0,"description":"정적 계산값입니다. 같은 config_hash 체크포인트들의 spread_benchmark 점수 최댓값 − 최솟값입니다. seed_runs 가 1 이면 null 입니다"},"train_samples":{"type":"integer","minimum":1,"description":"정적 계산값입니다. train_dataset_ids 에 속한 sample_hashes 행 수입니다"},"repeat_samples":{"type":"integer","minimum":0,"description":"정적 계산값입니다. 학습 샘플 가운데 text_hash 가 두 번 이상 나온 샘플 수이고 첫 등장도 셉니다"},"repeat_pct":{"type":"number","minimum":0,"maximum":100,"description":"정적 계산값입니다. repeat_samples ÷ train_samples × 100 을 소수 둘째 자리로 반올림한 값입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["checkpoints","eval_results","base_scores","sample_hashes"]},"row":{"type":["string","null"],"description":"checkpoints 는 ckpt_id, eval_results 는 ckpt_id/benchmark, base_scores 는 base_model/benchmark, sample_hashes 는 sample_id 입니다. agg 항목이면 null 입니다"},"field":{"type":"string"},"value":{"type":["string","number","null"]},"agg":{"type":"string","enum":["count","sum","avg","min","max"]},"scope":{"type":"string","description":"agg 항목이 무엇을 셌는지 적습니다"}},"required":["table","row","field","value"]}},"notes":{"type":"array","items":{"type":"string"},"description":"판정에 들지 않았지만 팀장이 알아야 할 사실입니다"},"summary":{"type":"string"}},"required":["ckpt_id","base_model","config_hash","seed","verdict","also_found","contamination","worst_benchmark","worst_drop_pts","seed_runs","spread_benchmark","seed_spread_pts","train_samples","repeat_samples","repeat_pct","evidence","notes","summary"]}[
{
"ckpt_id": "ckpt-q05-lr1e4-r16-wikiqa2-s42",
"base_model": "Qwen2.5-0.5B-Instruct",
"config_hash": "cfg-7d14e8b0",
"seed": 42,
"verdict": "배포 후보로 올려도 됨",
"also_found": [],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 9,
"eval_items": 1404,
"overlap_pct": 0.64
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 1.5,
"seed_runs": 2,
"spread_benchmark": "kobest_boolq",
"seed_spread_pts": 0.8,
"train_samples": 11506,
"repeat_samples": 46,
"repeat_pct": 0.4,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q05-lr1e4-r16-wikiqa2-s42",
"field": "config_hash",
"value": "cfg-7d14e8b0"
},
{
"table": "eval_results",
"row": "ckpt-q05-lr1e4-r16-wikiqa2-s42/kobest_boolq",
"field": "score",
"value": 68
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/kobest_boolq",
"field": "score",
"value": 58.4
},
{
"table": "eval_results",
"row": "ckpt-q05-lr1e4-r16-wikiqa2-s42/gsm8k",
"field": "score",
"value": 40.3
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/gsm8k",
"field": "score",
"value": 41.8
},
{
"table": "eval_results",
"row": "ckpt-q05-lr1e4-r16-wikiqa2-s1/kobest_boolq",
"field": "score",
"value": 67.2
},
{
"table": "sample_hashes",
"row": "kobest_boolq-test-1022",
"field": "sample_id",
"value": "kobest_boolq-test-1022"
},
{
"table": "sample_hashes",
"row": "koalpaca-v1.1a-8k-03321",
"field": "sample_id",
"value": "koalpaca-v1.1a-8k-03321"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 9,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 46,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 11506,
"scope": "koalpaca-v1.1a-8k 와 kowiki-qa-synth-v2 의 학습 샘플"
}
],
"notes": [
"koalpaca-v1.1a-8k 에서 온 9문항이 kobest_boolq-test 와 겹치지만 0.64% 라 1% 아래입니다. kobest_boolq-test-1022 와 koalpaca-v1.1a-8k-03321 은 13-gram 해시 a6cc97213b5e793b 를 둘 다 가집니다.",
"같은 설정의 seed 1 체크포인트는 KoBEST-BoolQ 67.2 로 이 체크포인트와 0.8점 차이입니다."
],
"summary": "KoBEST-BoolQ 68.0 으로 기준 모델보다 9.6점 높고 GSM8K 는 1.5점 낮으며, seed 1 과의 차이도 0.8점이라 배포 후보입니다."
},
{
"ckpt_id": "ckpt-q15-lr1e4-r16-wikiqa2-s42",
"base_model": "Qwen2.5-1.5B-Instruct",
"config_hash": "cfg-c4d9e655",
"seed": 42,
"verdict": "배포 후보로 올려도 됨",
"also_found": [],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 9,
"eval_items": 1404,
"overlap_pct": 0.64
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 1.9,
"seed_runs": 2,
"spread_benchmark": "kobest_boolq",
"seed_spread_pts": 0.8,
"train_samples": 11506,
"repeat_samples": 46,
"repeat_pct": 0.4,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s42",
"field": "config_hash",
"value": "cfg-c4d9e655"
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s42/kobest_boolq",
"field": "score",
"value": 78.9
},
{
"table": "base_scores",
"row": "Qwen2.5-1.5B-Instruct/kobest_boolq",
"field": "score",
"value": 71.5
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s42/gsm8k",
"field": "score",
"value": 62.2
},
{
"table": "base_scores",
"row": "Qwen2.5-1.5B-Instruct/gsm8k",
"field": "score",
"value": 64.1
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s7/kobest_boolq",
"field": "score",
"value": 78.1
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s7/gsm8k",
"field": "score",
"value": 62.1
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 9,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 46,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 11506,
"scope": "koalpaca-v1.1a-8k 와 kowiki-qa-synth-v2 의 학습 샘플"
}
],
"notes": [
"GSM8K 가 기준 모델 64.1 보다 1.9점 낮아 2점 기준 바로 아래입니다.",
"같은 설정의 seed 7 체크포인트는 GSM8K 가 2.0점 낮아 하락으로 걸렸습니다. 이 체크포인트가 남은 까닭이 seed 하나 차이라는 점을 팀장이 펼침에서 봅니다."
],
"summary": "Qwen2.5-1.5B-Instruct 에서 KoBEST-BoolQ 78.9 로 기준 모델보다 7.4점 높고, GSM8K 하락이 1.9점이라 배포 후보입니다."
},
{
"ckpt_id": "ckpt-q05-lr1e4-r16-wikiqa1-s42",
"base_model": "Qwen2.5-0.5B-Instruct",
"config_hash": "cfg-3f9a02c1",
"seed": 42,
"verdict": "평가셋 문항이 학습 데이터에 섞임",
"also_found": [],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 46,
"eval_items": 1404,
"overlap_pct": 3.28
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 1.1,
"seed_runs": 1,
"spread_benchmark": null,
"seed_spread_pts": null,
"train_samples": 11600,
"repeat_samples": 46,
"repeat_pct": 0.4,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q05-lr1e4-r16-wikiqa1-s42",
"field": "config_hash",
"value": "cfg-3f9a02c1"
},
{
"table": "sample_hashes",
"row": "kobest_boolq-test-0187",
"field": "sample_id",
"value": "kobest_boolq-test-0187"
},
{
"table": "sample_hashes",
"row": "kowiki-qa-synth-v1-01733",
"field": "sample_id",
"value": "kowiki-qa-synth-v1-01733"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 46,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
},
{
"table": "eval_results",
"row": "ckpt-q05-lr1e4-r16-wikiqa1-s42/kobest_boolq",
"field": "score",
"value": 75.1
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/kobest_boolq",
"field": "score",
"value": 58.4
},
{
"table": "eval_results",
"row": "ckpt-q05-lr1e4-r16-wikiqa1-s42/gsm8k",
"field": "score",
"value": 40.7
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/gsm8k",
"field": "score",
"value": 41.8
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 46,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 11600,
"scope": "koalpaca-v1.1a-8k 와 kowiki-qa-synth-v1 의 학습 샘플"
}
],
"notes": [
"겹친 46문항 가운데 37문항은 kowiki-qa-synth-v1 에서, 9문항은 koalpaca-v1.1a-8k 에서 옵니다. kobest_boolq-test-0187 과 kowiki-qa-synth-v1-01733 은 13-gram 해시 eb71a9fdf860eb60 과 1f3abf09b0d4acb9 가 같습니다.",
"KoBEST-BoolQ 75.1 은 이 학습 작업에서 가장 높은 점수지만, 같은 lr·LoRA r 로 kowiki-qa-synth-v2 를 쓴 체크포인트는 67.2·68.0 입니다. 2주차에 겹친 46문항을 뺀 1,358문항으로 다시 잽니다."
],
"summary": "KoBEST-BoolQ 75.1 로 가장 높지만 1,404문항 가운데 46문항(3.28%)이 학습 데이터와 13-gram 으로 겹쳐 먼저 걸렸습니다."
},
{
"ckpt_id": "ckpt-q05-lr3e4-r64-wikiqa2-s42",
"base_model": "Qwen2.5-0.5B-Instruct",
"config_hash": "cfg-a62c5f17",
"seed": 42,
"verdict": "기준 모델보다 떨어진 벤치마크가 있음",
"also_found": [
"같은 설정으로 다시 돌리면 점수가 흔들림"
],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 9,
"eval_items": 1404,
"overlap_pct": 0.64
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 2.1,
"seed_runs": 3,
"spread_benchmark": "kobest_boolq",
"seed_spread_pts": 8.2,
"train_samples": 11506,
"repeat_samples": 46,
"repeat_pct": 0.4,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s42",
"field": "config_hash",
"value": "cfg-a62c5f17"
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s42/gsm8k",
"field": "score",
"value": 39.7
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/gsm8k",
"field": "score",
"value": 41.8
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s1/kobest_boolq",
"field": "score",
"value": 64.1
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s7/kobest_boolq",
"field": "score",
"value": 69.8
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s42/kobest_boolq",
"field": "score",
"value": 72.3
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 9,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 46,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 11506,
"scope": "koalpaca-v1.1a-8k 와 kowiki-qa-synth-v2 의 학습 샘플"
}
],
"notes": [
"KoBEST-BoolQ 72.3 은 같은 설정 세 seed 가운데 가장 높고, seed 1 은 64.1 입니다.",
"하락이 흔들림보다 앞서 verdict 는 하락이고 흔들림은 also_found 에 남습니다."
],
"summary": "KoBEST-BoolQ 는 72.3 으로 올랐지만 GSM8K 가 기준 모델보다 2.1점 낮고, 같은 설정의 seed 1·7·42 점수가 8.2점 벌어집니다."
},
{
"ckpt_id": "ckpt-q15-lr1e4-r16-wikiqa2-s7",
"base_model": "Qwen2.5-1.5B-Instruct",
"config_hash": "cfg-c4d9e655",
"seed": 7,
"verdict": "기준 모델보다 떨어진 벤치마크가 있음",
"also_found": [],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 9,
"eval_items": 1404,
"overlap_pct": 0.64
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 2,
"seed_runs": 2,
"spread_benchmark": "kobest_boolq",
"seed_spread_pts": 0.8,
"train_samples": 11506,
"repeat_samples": 46,
"repeat_pct": 0.4,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s7",
"field": "config_hash",
"value": "cfg-c4d9e655"
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s7/gsm8k",
"field": "score",
"value": 62.1
},
{
"table": "base_scores",
"row": "Qwen2.5-1.5B-Instruct/gsm8k",
"field": "score",
"value": 64.1
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s7/kobest_boolq",
"field": "score",
"value": 78.1
},
{
"table": "eval_results",
"row": "ckpt-q15-lr1e4-r16-wikiqa2-s42/kobest_boolq",
"field": "score",
"value": 78.9
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 9,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 46,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 11506,
"scope": "koalpaca-v1.1a-8k 와 kowiki-qa-synth-v2 의 학습 샘플"
}
],
"notes": [
"64.1 − 62.1 을 부동소수점으로 빼면 1.999999999999993 이라 2점 기준에서 빠집니다. 점수를 10배 한 정수로 견줘(641 − 621 = 20) 2.0점 하락으로 잡습니다.",
"같은 설정의 seed 42 체크포인트는 GSM8K 가 1.9점 낮아 배포 후보에 남았습니다."
],
"summary": "KoBEST-BoolQ 는 78.1 이지만 GSM8K 가 기준 모델 64.1 보다 정확히 2.0점 낮은 62.1 이라 하락으로 걸렸습니다."
},
{
"ckpt_id": "ckpt-q05-lr3e4-r64-wikiqa2-s1",
"base_model": "Qwen2.5-0.5B-Instruct",
"config_hash": "cfg-a62c5f17",
"seed": 1,
"verdict": "같은 설정으로 다시 돌리면 점수가 흔들림",
"also_found": [],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 9,
"eval_items": 1404,
"overlap_pct": 0.64
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 1.2,
"seed_runs": 3,
"spread_benchmark": "kobest_boolq",
"seed_spread_pts": 8.2,
"train_samples": 11506,
"repeat_samples": 46,
"repeat_pct": 0.4,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s1",
"field": "config_hash",
"value": "cfg-a62c5f17"
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s1/kobest_boolq",
"field": "score",
"value": 64.1
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s7/kobest_boolq",
"field": "score",
"value": 69.8
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s42/kobest_boolq",
"field": "score",
"value": 72.3
},
{
"table": "eval_results",
"row": "ckpt-q05-lr3e4-r64-wikiqa2-s1/gsm8k",
"field": "score",
"value": 40.6
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/gsm8k",
"field": "score",
"value": 41.8
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 9,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 46,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 11506,
"scope": "koalpaca-v1.1a-8k 와 kowiki-qa-synth-v2 의 학습 샘플"
}
],
"notes": [
"seed 1 의 KoBEST-BoolQ 64.1 은 세 seed 가운데 가장 낮고 GSM8K 하락도 1.2점이라, 이 체크포인트만 보면 다른 사유에 걸리지 않습니다. 흔들림은 같은 config_hash 묶음의 판정이라 세 체크포인트가 모두 걸립니다."
],
"summary": "lr 3e-4·LoRA r 64 설정을 seed 1·7·42 로 돌린 KoBEST-BoolQ 가 64.1·69.8·72.3 으로 8.2점 벌어져, 다시 돌려도 같은 점수가 나온다고 보기 어렵습니다."
},
{
"ckpt_id": "ckpt-q05-lr1e4-r16-wikiqa2b2-s42",
"base_model": "Qwen2.5-0.5B-Instruct",
"config_hash": "cfg-5b2071ae",
"seed": 42,
"verdict": "학습 데이터에 같은 샘플이 반복됨",
"also_found": [],
"contamination": [
{
"eval_set_id": "kobest_boolq-test",
"overlap_items": 9,
"eval_items": 1404,
"overlap_pct": 0.64
},
{
"eval_set_id": "gsm8k-test",
"overlap_items": 0,
"eval_items": 1319,
"overlap_pct": 0
}
],
"worst_benchmark": "gsm8k",
"worst_drop_pts": 1.3,
"seed_runs": 1,
"spread_benchmark": null,
"seed_spread_pts": null,
"train_samples": 16765,
"repeat_samples": 1270,
"repeat_pct": 7.58,
"evidence": [
{
"table": "checkpoints",
"row": "ckpt-q05-lr1e4-r16-wikiqa2b2-s42",
"field": "config_hash",
"value": "cfg-5b2071ae"
},
{
"table": "sample_hashes",
"row": "kowiki-qa-synth-v2-00418",
"field": "text_hash",
"value": "e2c50b35868fb446"
},
{
"table": "sample_hashes",
"row": "kowiki-qa-synth-b2-00631",
"field": "text_hash",
"value": "e2c50b35868fb446"
},
{
"table": "sample_hashes",
"row": null,
"field": "text_hash",
"agg": "count",
"value": 1270,
"scope": "학습 샘플 가운데 두 번 이상 나온 text_hash 의 샘플"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 16765,
"scope": "koalpaca-v1.1a-8k, kowiki-qa-synth-v2, kowiki-qa-synth-b2 의 학습 샘플"
},
{
"table": "eval_results",
"row": "ckpt-q05-lr1e4-r16-wikiqa2b2-s42/gsm8k",
"field": "score",
"value": 40.5
},
{
"table": "base_scores",
"row": "Qwen2.5-0.5B-Instruct/gsm8k",
"field": "score",
"value": 41.8
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 9,
"scope": "kobest_boolq-test 문항 가운데 학습 데이터와 13-gram 이 하나라도 겹친 문항"
},
{
"table": "sample_hashes",
"row": null,
"field": "sample_id",
"agg": "count",
"value": 1404,
"scope": "kobest_boolq-test 문항"
}
],
"notes": [
"반복 샘플 1,270개 가운데 1,224개는 kowiki-qa-synth-v2 와 b2 가 같은 문단에서 만든 같은 첫 질문 612쌍이고, 46개는 koalpaca-v1.1a-8k 안의 23쌍입니다.",
"seed 를 한 번만 돌린 설정이라 흔들림은 재지 않았습니다."
],
"summary": "합성 데이터 두 배치를 같이 넣은 학습 샘플 16,765개 가운데 1,270개(7.58%)가 같은 text_hash 로 두 번 이상 나왔습니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 배포 후보로 올려도 됨·평가셋 문항이 학습 데이터에 섞임·기준 모델보다 떨어진 벤치마크가 있음·같은 설정으로 다시 돌리면 점수가 흔들림·학습 데이터에 같은 샘플이 반복됨 다섯 값 중 하나인지, also_found 의 값이 배포 후보로 올려도 됨을 뺀 네 값 중 하나인지 확인합니다. 2. 필수 필드 ckpt_id·base_model·config_hash·seed·verdict·also_found·contamination·worst_benchmark·worst_drop_pts·seed_runs·spread_benchmark·seed_spread_pts·train_samples·repeat_samples·repeat_pct·evidence·notes·summary 가 모두 존재하는지 확인합니다. 3. overlap_pct·repeat_pct 가 0 이상 100 이하인지, overlap_items 가 eval_items 이하이고 repeat_samples 가 train_samples 이하인지, seed_runs 가 1 이상인지 확인합니다. 4. 겹침 재계산: 평가 문항은 eval_set_id 에 속한 sample_hashes 행이고, 그 행의 ngram13_hashes 가 checkpoints.train_dataset_ids 에 속한 행들의 ngram13_hashes 와 하나라도 같으면 겹친 문항입니다. contamination 의 각 항목에서 overlap_pct 가 evidence 의 두 agg count(겹친 문항 수, 평가셋 문항 수)로 다시 계산한 값과 같은지 확인합니다. ckpt-q05-lr1e4-r16-wikiqa1-s42 는 46 ÷ 1,404 로 3.28 이고, kowiki-qa-synth-v2 를 쓴 체크포인트는 9 ÷ 1,404 로 0.64 입니다. 5. 겹친 문항 수 × 100 이 평가셋 문항 수 이상인 평가셋이 하나라도 있으면 verdict 는 평가셋 문항이 학습 데이터에 섞임입니다. 1% 를 정수로 견주므로 14문항(1,400 < 1,404)과 15문항(1,500 ≥ 1,404)이 반올림 없이 갈립니다. 6. 하락 재계산: worst_drop_pts 가 evidence 의 base_scores.score 와 eval_results.score 를 각각 10배 한 정수로 뺀 값 ÷ 10 과 같은지, 두 벤치마크 가운데 그 값이 가장 큰 쪽이 worst_benchmark 인지 확인합니다. ckpt-q15-lr1e4-r16-wikiqa2-s7 은 641 − 621 = 20 으로 2.0 입니다. 7. worst_drop_pts 가 2.0 이상이면 기준 모델보다 떨어진 벤치마크가 있음이 verdict 나 also_found 에 있습니다. 1.9 인 ckpt-q15-lr1e4-r16-wikiqa2-s42 는 걸리지 않습니다. 8. 흔들림 재계산: seed_runs 가 같은 config_hash 체크포인트 수와 같은지, seed_spread_pts 가 evidence 에 실린 그 체크포인트들의 spread_benchmark 점수 최댓값 − 최솟값과 같은지 확인합니다. seed_runs 가 1 이면 seed_spread_pts 와 spread_benchmark 는 계산하지 않습니다. cfg-a62c5f17 의 kobest_boolq 는 72.3 − 64.1 = 8.2 입니다. 9. seed_spread_pts 가 3.0 을 넘으면 같은 설정으로 다시 돌리면 점수가 흔들림이 verdict 나 also_found 에 있고, 같은 config_hash 의 체크포인트가 모두 이 사유에 걸립니다. 묶음마다 다시 계산해 확인합니다. 10. 반복 재계산: repeat_pct 가 evidence 의 두 agg count(두 번 이상 나온 text_hash 의 샘플 수, 학습 샘플 수)로 다시 계산한 값과 같은지 확인합니다. ckpt-q05-lr1e4-r16-wikiqa2b2-s42 는 1,270 ÷ 16,765 로 7.58 입니다. 11. repeat_samples × 100 이 train_samples × 5 를 넘으면 학습 데이터에 같은 샘플이 반복됨이 verdict 나 also_found 에 있습니다. 두 agg count 로 다시 계산해 확인합니다. 12. 걸린 사유가 여럿이면 평가셋 오염, 기준 모델 대비 하락, seed 간 흔들림, 샘플 반복 순으로 앞선 하나가 verdict 이고 나머지는 also_found 입니다. 하나도 걸리지 않으면 verdict 는 배포 후보로 올려도 됨이고 also_found 는 빈 배열입니다. ckpt-q05-lr3e4-r64-wikiqa2-s42 는 하락과 흔들림이 둘 다 걸려 verdict 가 하락입니다. 이 순서로 정해졌는지 다시 계산합니다. 13. evidence 의 table 이 네 데이터셋 이름 가운데 하나이고 field 가 그 데이터셋에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 row 의 그 컬럼 원문 값과 그대로 같은지 확인합니다. 15. summary 와 notes 가 존댓말로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. 1% 아래 겹침(9문항, 0.64%)이 남은 체크포인트를 그대로 올릴지, 겹친 문항을 뺀 점수로 다시 볼지는 팀장이 정합니다. 2. 흔들림으로 걸린 설정을 seed 를 더 돌려 다시 볼지, lr 과 LoRA r 을 낮춘 설정으로 옮길지는 모델 담당자가 정합니다. 3. 문단을 바꿔 쓴 합성 문항이나 번역된 평가 문항은 13-gram 이 겹치지 않아 이 판정식에 걸리지 않습니다. 합성 데이터의 원천 문단이 평가셋과 같은 출처인지는 사람이 봅니다. 4. 같은 설정의 seed 둘 가운데 하나만 하락으로 걸린 경우(ckpt-q15-lr1e4-r16-wikiqa2-s7 과 s42), 남은 쪽을 올릴지는 팀장이 정합니다. [평가 러너 · 2주차] 1. 겹침 14·15문항, 하락 1.9·2.0점, 흔들림 3.0·3.1점, 반복 5.00·5.01% 같은 기준값 바로 앞뒤 사례와 사유가 둘 이상 겹친 체크포인트로 만든 판정 테스트 36건에서 verdict·also_found 가 손으로 낸 정답과 같은 건수를 셉니다. 2. 평가셋 오염으로 걸린 체크포인트를 겹친 문항을 뺀 KoBEST-BoolQ 부분집합으로 다시 재고, 원래 점수와의 차이를 런타임 측정값으로 기록합니다. [판정식에 더한 정의 · 오너 확인 항목] 1. 학습 샘플은 지시문과 응답을, 평가 문항은 문단과 질문을 이어 적어 해시합니다. 프롬프트 틀 문구는 해시에 넣지 않습니다. 2. 13-gram 은 공백으로 나눈 어절 13개입니다. 어절이 13개보다 적은 샘플은 13-gram 이 없어 겹침 계산에 들지 않습니다. 3. 점수와 점수 차는 10배 한 정수로 견줍니다. 64.1 − 62.1 을 부동소수점으로 빼면 1.999999999999993 이 되어 2점 기준에서 빠지기 때문입니다. 4. 흔들림은 같은 config_hash 묶음의 판정이라 묶음의 체크포인트가 모두 걸립니다. 5. 반복 샘플 수는 두 번 이상 나온 text_hash 의 샘플을 첫 등장까지 모두 셉니다. 6. 사유 순서 가운데 평가셋 오염이 맨 앞인 것은 주제 카드가 정했고, 하락, 흔들림, 반복 순서는 이 편이 정했습니다. 측정된 하락을 점수의 운보다, 점수의 운을 학습 데이터 위생보다 앞에 둔 순서입니다.
근거: 모델 학습, 평가, 실험 관리, 체크포인트 관리 및 배포까지 연결되는 End-to-End 학습 플랫폼을 개발합니다.