예전에 올렸던 글(https://news.hada.io/topic?id=32792)을 쓴 지도 꽤 시간이 지났네요. 그동안 한국어 언어 모델을 직접 만들어 보겠다는 생각으로 시작한 프로젝트를 계속 진행하고 있습니다.
처음부터 거창한 계획이 있었던 것은 아닙니다. 기존 모델을 사용하다 보니 직접 만들어 보면 어떨까 싶었고, 그러다 모델 구조와 학습 과정을 하나씩 살펴보기 시작했습니다. 그렇게 50M 모델로 시작해서 541M, 약 1.09B 규모까지 실험하게 됐습니다.
물론 과정이 순탄하지만은 않았습니다. 학습 결과가 이상해서 원인을 찾아보기도 했고, 데이터셋 처리 과정에서 일부 데이터가 제대로 활용되지 않는 문제를 의심해 학습 과정을 다시 확인하기도 했습니다. 모델 크기를 키우는 것만큼 데이터가 의도대로 처리되고 있는지 확인하는 것도 중요하다는 걸 배웠습니다.
이후에는 메모리 사용량과 학습 설정을 조정하면서 실험을 이어 갔습니다. 특히 이전에는 모델 가중치를 BF16으로 강제 변환하는 부분이 있었고, 이를 수정한 뒤 학습을 다시 진행하고 있습니다. 현재는 시퀀스 길이를 1024로 설정해 학습 중이며, GPU 메모리 사용량은 약 20GB 수준입니다.
Hanok-LLM은 기존 공개 모델을 가져와 파인튜닝하는 데 그치지 않고, 모델 구조와 학습 파이프라인을 직접 구성해 보는 프로젝트입니다. AI의 도움을 받아 코드를 작성하고 수정하기도 했으며, 모델 설정과 데이터 구성, 실험 과정을 조정하면서 개발을 진행하고 있습니다.
현재 실험 중인 모델은 약 1.09B 파라미터 규모의 디코더 전용 Transformer입니다. PyTorch를 기반으로 한국어 텍스트를 이용한 프리트레이닝을 진행하고 있습니다. 학습이 진행될수록 손실값과 실제 생성 결과가 어떻게 달라지는지 확인하고 있으며, 이후 추론과 배포에 필요한 과정도 함께 정리하고 있습니다.
이번에는 프리트레이닝 도중 생성된 샘플과 학습 지표가 어떻게 달라졌는지 기록해 보려고 합니다.
현재 공유할 수 있는 최신 학습 기록은 Step 30,000입니다. 전체 학습 목표를 완료한 상태는 아니며, 현재까지의 학습 진행 상황과 생성 결과를 살펴보는 단계입니다.
Step 25,000과 Step 30,000에서 확인한 로그는 다음과 같습니다.
[Step 24999] Train: 2.7159 | LR: 4.28e-05 | Tokens/update: 16368
[Step 25000] Train: 2.8277 | Val: 3.0937 | LR: 4.28e-05 | Tokens/update: 16368
[Step 29999] Train: 2.5741 | LR: 3.98e-05 | Tokens/update: 16368
[Step 30000] Train: 2.6837 | Val: 2.9108 | LR: 3.98e-05 | Tokens/update: 16368
Step 30,000에 도달하자 모델이 직접 텍스트를 생성하도록 해 두었습니다. 입력은 이전 체크포인트와 비교할 수 있도록 세 가지 프롬프트를 사용했습니다.
Q: 한국의 수도는
A: 국제의료센터에서 근무 중인 이주여성은 5명이며, 응답자의 15%는 '응급실' 또는 '건강보호구역'으로 분류된다고 합니다.
(이주
Q: 인공지능이란
A: - 인공지능은 'AI'가 될 수 없다
- AI는 인간이 해야 할 최소한의 일임을 알려주며, 지식과 기술을 바탕으로 사회에 도움이 되는 의사결정 능
Q: 안녕?
A: 안녕하세요, 저는 제가 잘 모르겠다고 생각하거든요. 그 때도 궁금했는데, 아무래도 안녕하게 된 것 같아요.
먼저 질문해 드리겠습니다.
응답:
저는 너무 가
결과가 꽤 흥미롭습니다.
“한국의 수도는”이라고 입력했는데 수도에 대한 답 대신 의료 관련 문장이 나왔습니다. “인공지능이란”에는 AI의 역할과 사회적 의미에 관한 문장이 생성됐지만, 논리적으로 자연스럽게 이어지지는 않았습니다. 반면 “안녕?”에는 인사로 시작하는 대화체 문장이 나왔습니다. 여전히 어색하고 일관성이 부족하지만, 질문의 형식에 따라 서로 다른 형태의 텍스트를 생성하고 있다는 점은 관찰할 만합니다.
이 결과만으로 모델이 질문에 답하는 능력을 갖췄다고 평가하기는 어렵습니다. 아직 프리트레이닝 단계이기 때문입니다. 현재 모델은 텍스트에서 다음 토큰을 예측하는 방식으로 학습하고 있으므로, 문장 형식이나 특정 주제의 표현을 학습하는 것과 질문에 정확하게 답하는 것은 별개의 문제입니다.
지금 결과가 좋다고 과대평가할 필요도 없고, 반대로 몇 개의 샘플만 보고 학습이 실패했다고 단정할 필요도 없습니다. 동일한 프롬프트와 생성 설정을 유지하면서 체크포인트별 결과를 비교해야 실제 변화를 좀 더 객관적으로 확인할 수 있습니다.
Loss도 함께 살펴보고 있습니다. Step 25,000에서는 Train Loss가 2.8277, Validation Loss가 3.0937이었습니다. Step 30,000에서는 Train Loss가 2.6837, Validation Loss가 2.9108로 내려갔습니다.
특히 Validation Loss가 약 5.9% 감소했다는 점은 긍정적인 신호입니다. 학습 데이터에서의 손실뿐 아니라 검증 데이터에서의 손실도 감소했기 때문입니다. 다만 확인된 검증 지점이 아직 많지 않으므로, 이것만으로 모델의 일반화 성능이나 최종 응답 품질이 충분히 좋아졌다고 판단할 수는 없습니다.
학습 중 개별 스텝의 Train Loss는 계속 오르내립니다. 예를 들어 Step 29,996에서는 2.1743까지 내려갔다가 다음 스텝에서는 2.6536으로 올라갔습니다. 각 스텝에서 처리하는 텍스트의 구성과 난이도가 다를 수 있으므로, 단일 스텝의 값보다는 여러 스텝의 추세와 Validation Loss를 함께 살펴보는 것이 중요합니다.
체크포인트 저장도 Step 30,000에서 완료됐습니다.
Checkpoint saved: checkpoints/pretrain/hanok_llm_30000.pth
현재는 프리트레이닝을 진행하면서 체크포인트를 저장하고, 학습 손실과 검증 손실, 생성 샘플을 함께 확인하고 있습니다. 학습과 추론에 필요한 기능을 정리하고 있으며, 각 단계의 동작을 점검하면서 프로젝트를 개선해 나가고 있습니다.
앞으로는 프리트레이닝을 계속 진행하면서 학습 지표와 생성 결과가 어떻게 달라지는지 기록하려고 합니다. 이후에는 SFT를 통해 지시를 따르고 질문에 적절하게 응답하는 능력을 개선하는 것도 목표로 하고 있습니다. 같은 프롬프트를 사용해 체크포인트별 결과를 비교하고, 가능하면 별도의 평가 데이터와 기준도 마련할 계획입니다.
개인 하드웨어인 게이밍 노트북으로 학습하다 보니 모델 규모와 데이터 양을 무작정 늘리기는 어려운것같슴다.그래서 당장은 모델을 더 크게 만드는 것보다 현재 구조와 학습 파이프라인을 안정화하고, 데이터 품질과 생성 결과를 개선하는 데 집중하려고 합니다. 이후에는 Hugging Face나 Ollama 등에서 사용할 수 있는 형태로 모델을 내보내는 과정도 계속 검토하고 싶습니다.
아직 공개 벤치마크를 통한 성능 검증을 완료한 단계는 아닙니다. 또한 현재 학습 중인 체크포인트의 생성 결과만으로 실제 서비스에 사용할 수 있는 수준인지 판단하기는 어렵습니다. 앞으로 응답 품질과 안정성을 더 검증하고, 배포 과정도 확인해 나갈 계획입니다.
처음에는 LLM이 어떻게 만들어지는지도 거의 몰랐는데, 직접 모델을 만들고 학습시키면서 생각보다 많은 것을 배우고 있습니다. 데이터 처리 문제를 확인하고, 메모리 사용량을 줄이기 위해 설정을 조정하고, 학습 중 생성된 문장을 살펴보면서 개선해야 할 부분도 조금씩 분명해지고 있습니다.
아직 갈 길은 멀지만, 숫자로만 보던 모델이 직접 문장을 만들어 내는 것을 확인하는 과정은 확실히 재미있습니다. 특히 최근에는 Train Loss와 Validation Loss가 함께 내려가고, 생성 결과에서도 조금씩 다른 형태의 문장이 나타나고 있습니다. 다음 체크포인트에서는 같은 입력에 어떤 결과가 나올지 궁금하네요.
코드는 GitHub에 공개해 두었습니다.
Hanok-LLM: https://github.com/seoan1024/Hanok-LLM
기존 연구 코드: https://github.com/seoan1024/Korean-llm
소형 언어 모델을 직접 학습해 보신 분들이 있다면 데이터셋 구성이나 프리트레이닝 과정에서 겪었던 문제, 학습 효율을 높이는 방법 등에 대한 경험도 듣고 싶습니다.
읽어 주셔서 감사합니다.