Gemma3-1b-it 사용해보기

KIMHYUNSU·2025년 5월 14일

LLM

목록 보기
2/5
post-thumbnail

Gemma3-1b-it


데이터사이언스 수업에서 진료 음성 ai 요약 서비스를 개발 중에 있는데,
whisper 를 통해 얻은 텍스트를 요약해주는 모델을 다뤄보았습니다.


https://huggingface.co/google/gemma-3-1b-it

gemma3-1b-it 모델을 허깅페이스에서 불러와 사용해볼 예정입니다.

비교적 작은 모델로 먼저 성능을 실험해보고 싶어 1b모델로 진행했습니다.
프롬프트로 작동하도록 하기 위해 instruction 모델을 사용했습니다.


코랩에서 진행했습니다.
(m1 16gb 로컬 환경에서도 정상적으로 작동합니다.)


라이브러리 설치

!pip install transformers datasets accelerate peft bitsandbytes

위 라이브러리가 거의 필수적인데 transformer 와 accelerate의 버전이 문제가 많은지 로컬에서는 특정 버전을 사용하지 않으면 버전충돌이 너무 쉽게 일어납니다...
(코랩에서 진행하는 게 편한 이유..)

로컬에서는

#requirements.txt

# 핵심 모델 관련
transformers==4.51.3
torch==2.6.0
accelerate==1.6.0  # 안정 버전 명시
safetensors==0.5.3
sentencepiece==0.1.99
peft==0.8.2
einops==0.7.0
bitsandbytes==0.42.0  # 최소 안정 버전 명시

# 기타
protobuf==5.28.1
numpy==1.26.4
python-dotenv==1.0.1
tokenizers==0.21.1
huggingface_hub==0.30.1

위의 버전들을 이용했는데
코랩에서는
numpy 2.0.2
peft 0.15.2
torch 2.6.0+cu124
transformers 4.51.3
bitsandbytes 0.45.5
tokenizers 0.21.1
이렇게 설정되어 있습니다.

코랩이 설정해주기 편했습니다..


허깅페이스 로그인

gemma3 는 허깅페이스에서 직접 access 요청을 하고 토큰을 이용해서 사용할수있습니다.

huggingface 토큰을 발급받았으면 로그인 해줍니다.

!huggingface-cli login  

토큰을 입력해주면

Token has not been saved to git credential helper.
Your token has been saved to /root/.cache/huggingface/token
Login successful.
The current active token is: `hyunsu 250509`

이렇게 연결됩니다.


모델 로드

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")

tokenizer = AutoTokenizer.from_pretrained("google/gemma-3-1b-it", use_auth_token=True)
model = AutoModelForCausalLM.from_pretrained("google/gemma-3-1b-it", use_auth_token=True)
model = model.to(device)

device 설정을 해주고 코랩은 gpu 런타임에 연결해두었기 때문에 gpu를 사용하게 됩니다.

토크나이저와 모델을 google/gemma-3-1b-it 로 불러오고
use_auth_token=True 를 통해 액세스를 진행합니다.

코랩에서는 꽤 빠르게 로드됩니다.


evaluation

먼저 모델을 eval 을 위한 상태로 만들어줍니다.

model.eval()

아래 함수는 모델 성능을 테스트하기 위한 함수입니다.

프롬프팅을 통해 input text를 특정 형식으로 요약하도록 구성했습니다.
이때 max token 은 일단 1000으로 설정해두었습니다.

def test_gemma(treatment_text: str):
    messages = [
        [
            {
                "role": "system",
                "content": [{"type": "text", "text": "당신은 마취통증의학과 전문의입니다. 아래 상담 내용을 요약해 주세요. 형식은 아래와 같습니다:\n\n- 증상:\n- 진단:\n- 치료:\n- 주의사항:\n- 환자 반응:\n\n반드시 형식을 지킨 요약 내용만 출력해 주세요."}],
            },
            {
                "role": "user",
                "content": [{"type": "text", "text": treatment_text}],
            }
        ]
    ]

    inputs = tokenizer.apply_chat_template(
        messages,
        add_generation_prompt=True,
        return_tensors="pt",
        return_dict=True
    ).to(model.device).to(torch.bfloat16)

    with torch.inference_mode():
        outputs = model.generate(
            **inputs,
            max_new_tokens=1000,
            temperature=0.7,
            top_p=0.9,
            pad_token_id=tokenizer.eos_token_id
        )

    result = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return result

결과

print(test_gemma(treatment_test))
user
당신은 마취통증의학과 전문의입니다. 아래 상담 내용을 요약해 주세요. 형식은 아래와 같습니다:

- 증상:
- 진단:
- 치료:
- 주의사항:
- 환자 반응:

반드시 형식을 지킨 요약 내용만 출력해 주세요.

의사: 안녕하세요, 어디가 불편하셔서 오셨나요?
환자: 네, 목이랑 오른쪽 어깨가 2~3주 전부터 뻐근하고 아파요. 컴퓨터 오래 하면 더 심해지는 것 같아요.
의사: 뒷목 당기는 느낌인가요, 아니면 팔까지 저리거나 힘 빠지는 건 없으세요?
환자: 네, 뒷목이 뻣뻣하고, 오른쪽 어깨까지 뻐근해요. 팔까지 저리지는 않아요.
의사: 예전에 교통사고나 외상 있었던 적 있으세요?
환자: 없어요.
의사: 자가 스트레칭이나 파스 같은 거 해보셨어요?
환자: 네, 파스 붙이고, 마사지도 받았는데 잠깐 괜찮았다가 다시 아파졌어요.
의사: 지금 봤을 때는 근막통증증후군일 가능성이 있고요, 경추 염좌나 긴장도 의심됩니다. 일단 근육이완제와 소염진통제를 쓰고, 병행해서 도수치료 한번 시작해보시죠.
환자: 네, 알겠습니다.
model
- 증상: 목과 오른쪽 어깨 부위에서 2~3주 전부터 뻐근하고 아픈 증상 (뒷목 당기는 느낌, 팔까지 저리거나 힘 빠짐 없음)
- 진단: 근막통증증후군 가능성 (경추 염좌 또는 긴장 가능성)
- 치료:
    - 근육 이완제 복용
    - 소염진통제 복용
    - 도수치료 시작
- 주의사항:
    - 스트레칭이나 파스 사용 시 효과가 일시적일 수 있음
    - 증상 악화 시 즉시 치료 중단
- 환자 반응: 의사의 진단에 동의하고 치료에 대한 긍정적인 반응을 보임.

임시 텍스트를 통한 결과는 꽤나 잘 나오는 것을 볼 수 있습니다.


아래는 model 의 응답만을 추출하기 위한 간단한 함수를 추가해주었습니다.

def extract_model_response(full_text: str):
    if "model" in full_text:
        return full_text.split("model", 1)[1].strip()
    return full_text.strip()
raw_output = test_gemma(treatment_test)
clean_output = extract_model_response(raw_output)
print("[최종 요약 결과]")
print(clean_output)

이런식으로 treatment_test text를 불러와 테스트 해보면 다음과 같습니다.

treatment_test4 = """
의사: 안녕하세요. 어떤 문제로 오셨나요?
환자: 네, 한 달 전부터 허리랑 왼쪽 다리가 저리고 당기는 통증이 계속돼요. 오래 앉아 있으면 심해지고, 아침에 일어날 때도 힘들어요.
...
의사: 오래 앉지 말고 30분에 한 번씩 스트레칭, 허리 숙이기 금지, 낮은 의자 사용 금지 등 지켜주세요.
환자: 네, 알겠습니다.
의사: 그럼 약 처방해드리고, 1주일 후 통증 경과 보면서 필요하면 MRI도 고려해보죠.
환자: 감사합니다.
"""

print(extract_model_response(test_gemma(treatment_test4)))

꽤나 긴 문장에 대해서도 요약 결과가 꽤 괜찮다는 것을 확인할 수 있습니다.


RAM

RAM: 12.67 GB total, 4.50 GB used

작은 모델인데 정말 성능이 좋은 것 같습니다..


이제 다음은 ngrok 과 fastapi 를 이용해서 api로 제공할 수 있도록 해보려고 합니다..

0개의 댓글