Gemma 3 270M용 LoRA를 제작하여 아마도 가장 작은 추론(thinking) 모델을 만들었습니다.
요약
작성자는 Gemma 3 270M 모델을 기반으로 LoRA를 적용하여 '사고(Thinking)' 기능을 갖춘 소형 언어 모델을 성공적으로 개발했습니다. 이 모델은 단순히 응답하는 것을 넘어, 추론 과정을 명시적으로 보여주는 구조를 채택하고 있습니다. 학습 과정에서는 커스텀 손실 함수와 제한된 VRAM 환경에서의 최적화 기법 등을 활용하여 기술적인 난관들을 극복한 것이 특징입니다.
핵심 포인트
- Gemma 3 270M에 LoRA를 적용하여 '사고(Thinking)' 기능을 갖춘 소형 모델을 구현했습니다.
- 모델 출력 형식을 `==================== THINKING ===================`와 같이 명확하게 구조화하여 추론 과정을 보여줍니다.
- 학습 과정에서 커스텀 손실 함수, 낮은 배치 크기 및 그래디언트 누적 단계를 활용하는 등 VRAM 제약 환경에서의 최적화 기법을 적용했습니다.
- Function Calling과 연계된 '사고(Thinking)' 어댑터 개발에 초점을 맞추어 모델의 추론 능력을 향상시키고자 합니다.
[https://huggingface.co/firstbober/gemma-3-270M-it-smol-thinker]
출력 예시는 다음과 같습니다:
==================== THINKING ====================
Here is the thinking process:
- This is a large community with a wide range of interests
- Users can ask questions, share experiences, and discuss local events
- The rules are generally open-ended and allow for creativity
- However, the rules may be unclear or incomplete
<|thinking_end|>
==================== RESPONSE ====================
r/LocalLLaMA is a large, open-source question answering subreddit. Its rules are generally open-ended, allowing users to ask questions and share their experiences. However, the rules might be unclear or incomplete depending on the current state of the community.
<|response_end|>
별도의 지식(knowledge)이 많이 내장되어 있지는 않지만, 프롬프팅(prompting)을 통해 흥미로운 결과를 얻을 수 있습니다.
Lore:
며칠 동안 작업해 왔습니다. 처음에는 FunctionGemma를 사용하지 않고 로컬에서 함수 호출(function calling)에 맞게 적응시키고 싶었습니다. 어느 정도 작동하게 되자 (어느 정도는), 추론 과정(thinking)을 추가하는 것으로 넘어갔습니다. 데이터셋은 절차적으로 생성된 것(procedurally generated)과 Qwen 3.6 35B A3B (Q4 quants) 및 GLM 5.1로 일부 구성되었습니다.
가장 큰 어려움은 형식을 유지하는 방법을 알아내는 것이었습니다. 저는 학습 데이터의 최대 길이(max length)를 768, 순위(rank)는 24로 설정하고, 적절한 태그를 사용하지 않을 경우 20배의 가중치를 부여하는 사용자 지정 손실 함수(customized loss function)를 사용하기로 결정했습니다. 그 결과 손실 값은 약 7에 머물렀지만, 효과는 있었습니다.
더 긴 예시를 추가하고 싶었지만, 제 RTX 3050 4GB Mobile로는 역부족이었습니다. 배치 크기(train batch size)를 1로, 그래디언트 누적 단계(gradient accumulation step)를 2로 설정하는 것이 제가 할 수 있는 최선이었습니다.
또 다른 흥미로운 점은 Claude/Gemini가 더 큰 gradient_accumulation_steps는 실제로 배치 크기를 늘리지 않으면서 본질적으로 더 큰 배치 크기를 의미한다고 말한 것입니다. 이는 모델이 완전히 엉터리 같은 결과물이나 무작위 중국어 문자열을 내뱉는 문제의 약 40%를 해결해 주었습니다.
자, 이것으로 충분할 것 같고, 관련 학습 매개변수(training parameters)는 다음과 같습니다:
SFTConfig:
per_device_train_batch_size=1,
gradient_accumulation_steps=2,
per_device_eval_batch_size=1,
learning_rate=1e-4,
lr_scheduler_type="cosine",
warmup_ratio=0.10,
weight_decay = 0.1,
load_best_model_at_end=True,
LoraConfig:
n_rank = 24
r=n_rank,
lora_alpha=n_rank,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
lora_dropout=0.15,
task_type="CAUSAL_LM",
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기