GW LABS

Gemma3 270M으로 배우는 sLLM 파인튜닝과 Edge Device 서빙 전략 본문

MachineLearning

Gemma3 270M으로 배우는 sLLM 파인튜닝과 Edge Device 서빙 전략

GeonWoo Kim 2025. 9. 2. 08:53

서론

최근 LLM(Large Language Model)의 경량화 버전인 sLLM(Small Language Model) 이 빠르게 주목받고 있습니다. 거대한 모델을 직접 서빙하기 어려운 환경에서는 sLLM과 같은 소형 모델을 적절히 파인튜닝해 활용하는 것이 매우 유효한 전략입니다. 본 포스팅에서는 Gemma3 270M 모델을 활용하여 LoRA 기반 파인튜닝을 진행하고, 학습된 PyTorch 모델을 TensorFlow Lite 변환Mediapipe 기반 Edge Device 서빙까지 이어지는 전체 워크플로우를 정리합니다.

이 글은 실무 환경에서 sLLM을 파인튜닝하거나 모바일·엣지 디바이스에 배포하려는 개발자에게 최적화된 가이드를 제공합니다.


본론

1. Gemma3 270M과 sLLM 파인튜닝

Gemma3 270M은 Google이 공개한 소형 언어 모델로, 경량·저비용·실시간 응답성이라는 특징을 가집니다. 하지만 특정 도메인 데이터에 맞게 활용하려면 파인튜닝이 필수적입니다.

가장 널리 쓰이는 접근은 LoRA(Low-Rank Adaptation) 를 적용하는 방식입니다. LoRA는 전체 파라미터를 학습하지 않고 일부 저차원 행렬만 업데이트하기 때문에, 적은 리소스로도 높은 성능 향상을 기대할 수 있습니다.

LoRA Config 예시

from peft import LoraConfig

lora_config = LoraConfig(
    r=8,                      # 랭크
    lora_alpha=16,            # LoRA scaling
    target_modules=["q_proj", "v_proj"],  # 적용할 레이어
    lora_dropout=0.05,        # 드롭아웃
    bias="none",
    task_type="CAUSAL_LM"
)

이 설정은 Gemma3 270M 같은 소형 모델에서 적절한 학습/메모리 균형을 제공합니다.

파인튜닝 예제

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer

model_name = "google/gemma-3-270m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 데이터 준비
train_dataset = ...

# 학습 설정
training_args = TrainingArguments(
    output_dir="./outputs",
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=2e-4,
    num_train_epochs=3,
    fp16=True,
    logging_steps=50,
    save_steps=500,
    save_total_limit=2,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
)

trainer.train()

2. Torch 모델을 TensorFlow Lite 변환

학습이 완료된 모델을 Edge Device에 배포하기 위해서는 TFLite 변환이 필요합니다.

변환 절차

  • PyTorch → ONNX
  • ONNX → TensorFlow SavedModel
  • SavedModel → TFLite

코드 예제

import torch

# 1. Torch -> ONNX
dummy_input = torch.randint(0, 100, (1, 128))  # 시퀀스 입력
torch.onnx.export(model, dummy_input, "gemma3.onnx", input_names=["input_ids"], output_names=["logits"])

# 2. ONNX -> TensorFlow (onnx_tf 활용)
!onnx-tf convert -i gemma3.onnx -o ./gemma3_tf

# 3. TensorFlow -> TFLite
import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model("./gemma3_tf")
converter.optimizations = [tf.lite.Optimize.DEFAULT]  # 양자화 가능
tflite_model = converter.convert()

with open("gemma3_270m.tflite", "wb") as f:
    f.write(tflite_model)

3. Mediapipe 기반 Edge Device 서빙

변환된 .tflite 모델은 Mediapipe Tasks API를 활용하면 모바일 환경에서 효율적으로 서빙할 수 있습니다.

Python 예제

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
TextEmbedder = mp.tasks.text.TextEmbedder
TextEmbedderOptions = mp.tasks.text.TextEmbedderOptions

options = TextEmbedderOptions(
    base_options=BaseOptions(model_asset_path="gemma3_270m.tflite")
)

with TextEmbedder.create_from_options(options) as embedder:
    result = embedder.embed("sLLM 활용 예제입니다.")
    print(result)

Mediapipe는 GPU 가속, 멀티 플랫폼(Android, iOS, Web) 지원이 가능하기 때문에 실제 서비스에서 경량 AI 모델을 배포할 때 강력한 선택지가 됩니다.


결론

이번 포스팅에서는 Gemma3 270M sLLM을 LoRA로 파인튜닝하고, 학습된 모델을 TFLite 변환 후 Mediapipe로 서빙하는 전체 과정을 살펴보았습니다.

핵심은 작은 모델도 적절한 파인튜닝과 최적화 파이프라인을 거치면, 모바일과 Edge 환경에서도 충분히 실용적인 AI 서비스를 구현할 수 있다는 점입니다.

👉 이 과정을 따라가면 저비용·고효율의 맞춤형 sLLM 서비스를 누구나 구축할 수 있습니다.

Comments