TL;DR
이 글은 SmolLM3-3B를 중심으로 3B급 소형 언어 모델이 특정 도메인에서 70B급 모델을 대체할 수 있는 실무 패턴을 단계별로 연결합니다. 모델의 핵심 설계(GQA, NoPE, 이중 모드 추론)와 하드웨어·환경 설정, 추론·도구호출·티켓 라우팅 파이프라인 구현, 그리고 LoRA 기반의 빠른 파인튜닝 절차를 하나의 연속된 워크플로로 제공합니다. 그 결과, 비용·지연·개인정보 보호 측면에서 실무적 이점을 얻으면서도 도메인 특화 성능을 확보하는 방법을 제시합니다.
섹션별 상세
- SmolLM3는 11.2조 토큰으로 학습되었고 128k 컨텍스트 윈도우를 지원한다. — 아키텍처 및 성능 소개 섹션(모델 사양과 학습 혼합을 설명한 문단).
- SmolLM3의 IFEval 점수는 76.7로 Qwen3-4B 대비 우세를 보인다. — 성능 비교가 나열된 벤치마크 문단(IFEval 및 Global MMLU 수치 표기).
- 그룹화 쿼리 어텐션 적용으로 KV 캐시가 약 25% 절감된다. — GQA 설명 부분에서 KV 캐시 절감 비율과 그 결과로 인한 VRAM 이점 언급.
def detect_device():
try:
import torch
except ImportError:
raise RuntimeError("PyTorch not found. Install with: pip install torch")
if torch.cuda.is_available():
return "cuda", torch.bfloat16, {"device_map": "auto", "torch_dtype": torch.bfloat16}
elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
return "mps", torch.float16, {"device_map": "mps", "torch_dtype": torch.float16}
else:
return "cpu", torch.float32, {"device_map": "cpu", "torch_dtype": torch.float32}실행 환경에서 최적 디바이스와 연산 정밀도(dtype) 설정을 자동으로 결정하는 보조 스크립트입니다. CUDA가 가능하면 bfloat16을 권장하고 Apple Silicon은 float16, GPU가 없으면 CPU와 float32를 사용하도록 반환값을 구성합니다. 이후 모델 로드에 사용되는 load kwargs를 함께 제공해 환경별 로드 경로를 일관되게 만듭니다.
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
torch_dtype=torch.bfloat16,
device_map="auto",
)
model.eval()SmolLM3-3B를 로컬 캐시나 허브에서 불러오는 표준 로드 패턴입니다. 학습에 사용된 dtype(bfloat16)을 맞추고 device_map="auto"로 멀티-GPU 분산 또는 CPU 오프로딩에 대응하게 합니다. 로드 후 model.eval()로 추론 모드로 전환하는 것이 포함되어 있습니다.
def generate(messages: list[dict], max_new_tokens: int = 512) -> str:
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
output_ids = model.generate(**inputs, max_new_tokens=max_new_tokens, temperature=0.6, top_p=0.95, do_sample=True)
new_tokens = output_ids[0][inputs["input_ids"].shape[-1]:]
raw = tokenizer.decode(new_tokens, skip_special_tokens=True)
final = re.sub(r".*?\<\.\.\.\>", "", raw, flags=re.DOTALL).strip()
return finalSmolLM3의 채팅 템플릿을 적용해 입력을 구성하고 토크나이즈한 뒤 샘플링 기반 생성으로 새 토큰을 얻는 제너레이터 헬퍼입니다. 생성 결과에서 모델이 think 모드로 남긴 체인오브쏘트 블록을 정규식으로 제거해 최종 답안만 반환하도록 처리합니다. 온톨로지별 온도와 top_p 권장값을 포함해 실무에서 균형 잡힌 출력을 얻도록 설계되어 있습니다.
match = re.search(r"\{.*?\}", raw, re.DOTALL)
if not match:
return {"category": "general", "confidence": 0.0, "reply": raw}
try:
return json.loads(match.group())
except json.JSONDecodeError:
return {"category": "general", "confidence": 0.0, "reply": raw}모델 출력에서 JSON 형태의 라우팅 결과를 안전하게 추출하는 파서 로직입니다. 출력에 JSON이 없거나 파싱이 실패하면 기본값을 반환해 파이프라인이 예외로 중단되는 것을 방지합니다. 티켓 라우터처럼 외부 시스템과 상호작용하는 구성에서 견고한 실패 모드를 제공합니다.
lora_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()파라미터 효율적 파인튜닝을 위해 LoRA 설정을 작성하고 대상 모듈에 어댑터를 적용하는 코드입니다. r=16과 alpha=32 같은 설정으로 트레이너가 학습해야 할 파라미터를 수백만 수준으로 제한해 소비 전원과 메모리 제약이 있는 개인 GPU에서도 실용적인 fine-tuning을 가능하게 합니다. 학습 후 어댑터 병합을 통해 배포 의존성을 제거할 수 있습니다.
- LoRA 어댑터를 사용하면 학습 가능한 파라미터가 약 0.4%로 줄어든다(예시: 13.6M / 3.085B). — 파인튜닝 섹션의 트레이닝 출력 예시와 LoRA 설정, 출력 로그.
용어 해설
- 그룹화 쿼리 어텐션(Grouped Query Attention (GQA))
- — 다수의 어텐션 헤드를 몇 개의 공유된 쿼리 투영으로 묶어 키-값 캐시 크기를 줄이는 기법입니다. SmolLM3에서는 16개 헤드를 4개 쿼리로 묶어 KV 캐시를 약 25% 절감하여 동일한 하드웨어에서 더 긴 컨텍스트나 더 큰 배치를 처리할 수 있게 합니다. 추론 시 VRAM 피크를 낮추는 것이 핵심입니다.
- NoPE (선택 레이어에서 위치 인코딩 제거)(NoPE (선택적 RoPE 제거))
- — RoPE(rotary positional encoding)를 일부 트랜스포머 계층에서 제거하는 접근법으로, SmolLM3는 3:1 비율로 RoPE를 유지하고 매 네 번째 레이어에서 RoPE를 빼어 긴 컨텍스트 일반화 성능을 개선합니다. 이 방식은 긴 시퀀스에서 위치 임베딩 열화 문제를 완화합니다.
- 이중 모드 추론(think / no_think)(Dual-mode reasoning (think / no_think))
- — 단일 가중치 세트로 '생각하는 모드'와 '직답 모드'를 구동하는 기능으로, think 모드에서는 체인오브쏘트(chain-of-thought)를 ... 태그로 출력하고 no_think에서는 바로 답을 제공합니다. 요청 단위로 모드를 선택해 지연과 정확도의 균형을 조절할 수 있습니다.
- LoRA (파라미터 효율적 파인튜닝)(LoRA (PEFT))
- — 기본 모델 가중치를 유지한 채 저순위 행렬만 학습해 파라미터 수를 극적으로 줄이는 파인튜닝 방식입니다. SmolLM3 예제에서는 r=16 설정으로 전체 파라미터의 약 0.4%만 학습하여 수분~수십 분 내에 도메인 적응을 완료합니다. 학습 후 어댑터를 병합해 PEFT 의존성 없이 운영할 수 있습니다.
기술
- SmolLM3-3B
- Hugging Face transformers
- PyTorch
- TRL
- PEFT (LoRA)
- bitsandbytes
- datasets / tokenizers
활용 사례
- 다국어 고객 지원 티켓 분류 및 자동 회신 생성
- 온프레미스 PII 처리용 오프라인 챗봇 운영
- 주문 상태 조회 같은 실시간 데이터 연동을 위한 도구 호출 에이전트
- 도메인 데이터로 파인튜닝한 응답 스타일과 정책 내재화
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.

