실습으로 알아보는 파인튜닝: 비상 생존 안내를 위한 0.5B 모델 적용하기
요약
본 글은 작은 오픈 소스 모델(Qwen2.5-0.5B-Instruct)을 활용하여 비상 생존 가이드 역할을 하도록 파인튜닝하는 과정을 단계별로 설명합니다. 사전 학습과 달리, 파인튜닝은 전문 데이터셋으로 특정 역할에 맞게 모델을 조정하는 과정입니다. 이를 통해 모델의 출력을 직접적이고 우선순위가 높은 형태로 유도하는 공학적 원리를 이해할 수 있습니다.
핵심 포인트
- 파인튜닝은 이미 학습된 모델을 전문 데이터로 재훈련하여 특정 역할을 부여하는 과정이다.
- SFT(Supervised Fine-Tuning)는 프롬프트와 이상적인 답변 쌍으로 구성되어 모델을 조정한다.
- 0.5B 같은 작은 모델은 실험에 용이하며, Colab 무료 GPU 환경에서도 구동 가능하다.
면책 조항 및 공지: 본 프로젝트는 언어 모델 파인튜닝 및 배포의 메커니즘을 이해하기 위해 자체 학습 목적으로 수행된 순수한 교육 실험입니다. 결과로 나온 모델 가중치(weights)를 실제 의료, 야외 생존 또는 생명 안전 조언으로 절대 사용해서는 안 됩니다.
파인튜닝 언어 모델은 종종 '가중치(weights)', '토큰(tokens)', 'FP32 정밀도(precision)', '손실 곡선(loss curves)', '양자화(quantization)'와 같은 위압적인 어휘로 둘러싸여 있는 느낌을 줍니다. 대부분의 가이드는 이 용어들을 사용하지만, 실제 내부에서 무슨 일이 일어나고 있는지는 설명하지 않습니다.
저는 모델이 실제로 어떻게 적응하는지에 대한 공학적 원리가 궁금했고, 그래서 Google Colab을 사용하여 종단 간(end-to-end) 실험을 진행했습니다. 저는 작고 오픈 소스인 모델을 가져와 전문화된 데이터셋으로 훈련시켜 간결한 비상 생존 가이드 역할을 하도록 만들었고, 최종 결과물을 클라우드에 게시했습니다.
어떤 AI 용어가 나타날 때마다 설명하면서, 이것이 어떻게 작동하는지에 대한 정직하고 단계별 분석을 소개합니다.
🎯 1. 핵심 목표: 실제로 무엇을 하고 있는가?
파인튜닝을 이해하기 위해서는 AI 모델 구축의 두 가지 주요 단계를 구분하는 것이 도움이 됩니다:
- 사전 학습(Pre-training): 신경망(neural network)을 인터넷 텍스트 수백 테라바이트로 처음부터 훈련시켜 문법, 사실, 추론 능력을 습득하게 하는 것입니다. 마치 누군가가 학교에서 15년을 보내며 전체 도서관을 읽는 것과 같습니다.
- 파인튜닝(Fine-Tuning): 이미 교육받은 모델을 가져와 작고 전문화된 데이터셋으로 추가 훈련시켜 특정 역할, 어조 또는 형식에 맞게 가르치는 것입니다. 이는 졸업생에게 비상 사고 대응에 대한 집중적인 2일 워크숍을 제공하는 것과 같습니다.
- 지도 학습 파인튜닝(Supervised Fine-Tuning, SFT): 여기서 사용된 특정 훈련 방식입니다. '지도(Supervised)'라는 것은 단순히 훈련 데이터가 명확한 쌍(pair)을 포함한다는 의미입니다. 즉, 프롬프트와 이상적인 목표 답변이 한 쌍으로 이루어져 있습니다. 모델은 답을 추측하고, 그 추측을 목표와 비교하여 스스로를 조정합니다.
이 목표는 비상 생존 보조 도우미를 훈련하는 것이었습니다. 자연스럽게 길고 수다스러운 응답을 하는 모델을 가져와서, 이를 직접적이고 우선순위가 높은 생명 구호 단계로 유도하는 것이 목적이었습니다.
🧠 2. 기본 모델 및 파라미터
이번 실험을 위해 **Qwen/Qwen2.5-0.5B-Instruct**를 선택했습니다.
- 기본 모델 / 가중치 (Weights): 신경망 파일 자체입니다. 이는 본질적으로 엄청난 양의 숫자들(이를 가중치라고 부름)로 구성되어 있으며, 입력 텍스트가 어떻게 출력 예측으로 변환되는지를 결정합니다.
- 파라미터 (0.5B): 모델 내부의 조정 가능한 수치 값입니다. 0.5B는 0.5 billion(5억) 파라미터를 의미합니다. 플래그십 모델들이 70B에서 400B+ 파라미터를 가진 환경에서, 0.5B는 매우 작습니다. 이러한 작은 크기는 실험에 이점을 제공합니다: 빠르게 로드되며 Google Colab의 무료 GPU 제한 내에 완전히 들어갑니다.
- Instruct 모델: 단순히 원시 텍스트 자동 완성만 하는 것이 아니라, 대화형 주고받음을 이어가는 방법을 이미 학습한 모델입니다.
🔤 3. 데이터 준비: 토큰 및 채팅 템플릿
컴퓨터는 일반 텍스트를 읽을 수 없습니다. 오직 숫자로만 수학 계산을 할 수 있습니다. 따라서 훈련하기 전에 단어들을 숫자 시퀀스로 번역해야 합니다.
토큰과 토크나이저 (Tokens and Tokenizers)
- 토큰 (Token): 하나의 텍스트 조각—단어, 음절 또는 구두점—을 정수(integer)로 표현한 것입니다. 예를 들어, 단어 `
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
- Special Tokens: 텍스트 주변에 배치되는 보이지 않는 제어 태그입니다. 모델 개발사마다 다른 태그를 사용합니다. Qwen은 경계를 표시하기 위해
<|im_start|>와<|im_end|>를 사용합니다. - Chat Template: 메시지를 정확히 그 특수 토큰으로 감싸는 형식 규칙입니다. 이를 통해 모델이 시스템 지침(system instructions), 사용자 프롬프트(user prompts), 어시스턴트 답변(assistant replies)을 혼동 없이 인식하게 합니다:
messages = [
{"role": "system", "content": "You are an emergency survival assistant. Provide direct, step-by-step, life-saving instructions without fluff."},
{"role": "user", "content": inst},
...
Labels
- Labels: 토큰 형태의 정답(ground-truth answers)입니다. 훈련 과정 중 프레임워크는 모델이 예측한 토큰 ID와 레이블을 비교하여 오류가 발생한 지점을 계산합니다.
tokenized = tokenizer(formatted_texts, truncation=True, max_length=512, padding=False)
tokenized["labels"] = tokenized["input_ids"].copy()
⚙️ 4. 학습 루프 및 하이퍼파라미터 (The Training Loop & Hyperparameters)
학습은 Hugging Face의 trl (Transformer Reinforcement Learning) 라이브러리와 그 안에 포함된 SFTTrainer를 사용하여 구성되었습니다.
이 단계에서는 종종 여러 가지 혼란스러운 설정(훈련 시작 전에 엔지니어가 선택하는 하이퍼파라미터—hyperparameters)을 소개합니다:
training_args = TrainingArguments(
output_dir="./survival_model_out",
per_device_train_batch_size=2,
...
이 파라미터들이 실제로 제어하는 내용은 다음과 같습니다:
- 정밀도 및 FP32 (32비트 부동 소수점): 컴퓨팅에서 십진수는 '부동 소수점 숫자(floating-point numbers)'라고 불립니다. FP32는 각 수치 가중치가 컴퓨터 메모리 32비트를 사용한다는 의미입니다. 이는 최대의 수학적 정확도를 제공하며, 학습 중 수치 불안정성을 방지합니다. 숫자가 각각 4바이트를 차지하므로, 5억 개의 파라미터는 원시 FP32 기준으로 약 2GB의 메모리를 소비합니다.
- 에포크(Epochs) (5): 에포크는 전체 데이터셋을 한 번 완전히 통과하는 것을 의미합니다. 5 에포크를 실행했다는 것은 모델이 파일 내의 모든 생존 시나리오를 5번 보았고 연습했다는 뜻입니다.
- 배치 크기(Batch Size) (2): GPU에서 정확히 같은 순간에 처리되는 학습 예제의 개수입니다.
- 경사 누적 단계(Gradient Accumulation Steps) (2): GPU 메모리가 부족할 경우 큰 배치 크기를 사용할 수 없습니다. 경사 누적은 모델이 더 작은 마이크로 배치(여기서는 2개의 배치, 각 2개)에 걸쳐 오류를 계산하고 업데이트를 결합하여, GPU가 다운되지 않으면서 효과적으로 배치 크기 4처럼 작동하게 합니다.
- 학습률(Learning Rate) (
3e-5/0.00003): 각 오류 발생 후 모델 가중치에 적용되는 조정의 크기입니다. 학습률이 너무 높으면 모델이 과잉 반응하여 이미 알고 있던 것을 잊어버립니다(파국적 망각, catastrophic forgetting). 너무 낮으면 모델이 진행하기에는 너무 느리게 학습합니다.
💾 5. 모델 저장 및 보관: Safetensors & Hugging Face
학습이 완료된 후, 모델은 업데이트된 가중치를 survival_model_final 폴더 내 디스크에 기록했습니다.
.safetensors: 모델의 학습된 숫자를 저장하는 파일 형식입니다. 역사적으로 모델들은 Python의pickle형식(.bin또는.pt)을 사용했는데, 이는 로드될 때 실수로 악성 코드를 실행할 수 있었습니다..safetensors는 코드 실행 익스플로잇에 안전하고 로딩 속도가 빠른 현대적인 제한적 형식입니다.
GitHub에 푸시하지 않는 이유?
내보내진 가중치 총량은 약 1GB였습니다.
표준 Git / GitHub는 소스 코드(작은 텍스트 파일)를 위해 설계되었으며, 단일 파일을 100MB 초과하는 것을 제한합니다.
- 대규모 머신러닝 모델을 저장하기 위한 표준 레지스트리는 Hugging Face Hub입니다 (본질적으로 GitHub와 같지만, 다중 기가바이트 신경망 파일에 최적화되어 있습니다).
huggingface_hub Python 라이브러리를 사용하여 가중치(weights)와 토크나이저(tokenizer)를 Colab에서 직접 게시했습니다:
👉 sahil2605/survival-qwen-0.5b
이제 누구나 표준 Python 스크립트로 이 체크포인트를 가져와 테스트할 수 있습니다:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "sahil2605/survival-qwen-0.5b"
...
📊 6. 달성된 성과 (What Was Achieved)
- 작동하는 엔드투엔드 파이프라인: 원시 대화 텍스트 기록을 가져와 네이티브 경계 구분자(native boundary delimiters)로 토큰화하고, 네트워크 매개변수(network parameters)를 학습시키고, 최종 체크포인트를 공개 레지스트리에 호스팅하는 과정을 성공적으로 수행했습니다.
- 뚜렷한 행동 변화: 비상 질문(예: 영하의 날씨에 고립된 상황)으로 테스트했을 때, 기본 모델은 일반적으로 공손한 소개 문구로 채우는 경향을 보입니다. 파인튜닝된 버전은 즉시 우선순위가 지정되고 번호가 매겨진 응급 처치 단계(대피소 마련, 지면 단열재, 신호 보내기)로 시작합니다.
- 실습을 통한 명확성: 모든 단계를 실행하면서 파인튜닝이 신비로운 직관이 아니라 텍스트-투-넘버 인코딩, 그래디언트 최적화(gradient optimization), 이진 체크포인트 저장의 자동화된 파이프라인임을 입증했습니다.
🗺️ 7. 다음 계획: 예정된 실험 (What’s Next: Planned Experiments)
이번 학습 실행은 기능적인 기준선 체크포인트를 산출했습니다. 다음 반복에서는 다음 사항들을 테스트할 것입니다:
- 양자화 (Quantization) (4비트 / GGUF):
llama.cpp와 같은 도구를 사용하여 32비트 부동 소수점 가중치를 4비트 정수로 변환하는 과정입니다. 이를 통해 파일 크기가 약 1GB에서 약 300MB로 압축되어, GPU가 필요 없는 저사양 노트북이나 모바일 기기에서도 오프라인으로 실행할 수 있게 합니다. - 파국적 망각 평가 (Catastrophic Forgetting Evaluation): 원래의 기본 모델(base model)과 비교하는 벤치마크를 실행하여, 생존 지침에 특화된 것이 일반적인 추론 능력이나 문법에 해를 끼쳤는지 검증합니다.
- 안전 경계 및 가드레일 (Safety Boundaries & Guardrails): 모델이 그럴듯하게 들리는 환각(hallucinations)을 생성하는 대신, 명백히 위험하거나, 무의미하거나, 악의적인 요청에 대해 안전하게 거부하도록 하는 행동 양식을 추가합니다.
본 글은 머신러닝 엔지니어링 분야에서 진행 중인 개인 학습 경로를 기록한 것입니다. 소규모 LLM 실험 실행이나 평가에 대한 질문 또는 제안 사항이 있으시면 언제든지 연결하여 의견을 공유해 주십시오!
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기