LLM 엔지니어링4장 · LLM 을 완성하는 3단계와 Hugging Face15 / 23← 이전목차다음 →MetaContents

4장. LLM 을 완성하는 3단계와 Hugging Face

실습 1 — Hugging Face 에서 모델 불러오기

Hugging Face Hub 에서 사전학습만 한 기본 모델 Qwen/Qwen2.5-0.5B(Apache 2.0)를 불러와, 설정과 크기, 토크나이저를 살펴봅니다. 처음 실행할 때 1GB 쯤을 내려받으므로 인터넷이 필요합니다. 결과를 같게 맞추려고 CPU 와 float32 로 불러옵니다.

1단계. 모델과 토크나이저 불러오기

Python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

name = "Qwen/Qwen2.5-0.5B"                       # -Instruct 가 붙지 않은 기본 모델
tokenizer = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name, dtype=torch.float32)
model.eval()                                     # 학습이 아니라 쓰기만 한다는 표시
print(type(model).__name__)                      # Auto 클래스가 골라 준 실제 클래스 이름
출력
Qwen2ForCausalLM

2단계. 설정과 크기 보기

Python
cfg = model.config
print("층 수:", cfg.num_hidden_layers, "/ 좌표 수:", cfg.hidden_size, "/ 헤드 수:", cfg.num_attention_heads)
print("어휘 크기:", cfg.vocab_size, "/ 한 번에 보는 최대 토큰 수:", cfg.max_position_embeddings)

n = sum(p.numel() for p in model.parameters())       # 파라미터 수
print(f"파라미터 수: {n:,}")
# 메모리 어림: float32 는 파라미터 하나에 4바이트
print(f"float32 로 올린 크기: {n * 4 / 1024**3:.2f} GB")
출력
층 수: 24 / 좌표 수: 896 / 헤드 수: 14
어휘 크기: 151936 / 한 번에 보는 최대 토큰 수: 32768
파라미터 수: 494,032,768
float32 로 올린 크기: 1.84 GB

3단계. 토크나이저 살펴보기

Python
for text in ["배송비는 얼마인가요?", "The delivery fee is 3,000 won."]:
    ids = tokenizer(text)["input_ids"]
    print(f"{text} → 토큰 {len(ids)}개")
    print("   ", tokenizer.convert_ids_to_tokens(ids))

# 특별한 표시 토큰들
print("문서 끝 표시:", tokenizer.eos_token)
출력
배송비는 얼마인가요? → 토큰 9개
    ['ë°°', 'ìĨ¡', 'ë¹Ħ', 'ëĬĶ', 'Ġìĸ¼ë§Ī', 'ìĿ¸', 'ê°Ģ', 'ìļĶ', '?']
The delivery fee is 3,000 won. → 토큰 12개
    ['The', 'Ġdelivery', 'Ġfee', 'Ġis', 'Ġ', '3', ',', '0', '0', '0', 'Ġwon', '.']
문서 끝 표시: <|endoftext|>

이 실습이 뜻하는 것

이 실습은 외국에서 온 큰 사전 한 권을 받아 살펴보는 것과 같습니다. 상자를 열어 어떤 사전인지 표지를 보고(1단계), 쪽수와 무게를 재고(2단계), 한국어 문장과 영어 문장이 몇 칸으로 나뉘어 실리는지 봅니다(3단계). 여기서 사전이 사전학습만 한 기본 모델 Qwen/Qwen2.5-0.5B, 표지가 클래스 이름, 쪽수와 무게가 설정값과 파라미터 수, 칸으로 나누는 규칙이 토크나이저입니다. 비유와 다른 점은, 사전은 뜻을 적어 둔 책이지만 모델은 다음 토큰을 맞히는 숫자 묶음이라는 것입니다.

단계출력뜻
1. 불러오기Qwen2ForCausalLMAuto 클래스가 모델 이름을 보고 Qwen2 용 "다음 토큰을 맞히는 모델" 클래스를 골라 주었습니다
2. 짜임층 24, 좌표 896, 헤드 14블록이 24층 쌓여 있고, 토큰 하나를 숫자 896개로 나타내며, 어텐션을 14갈래로 나눠 봅니다
2. 어휘와 길이151936 / 32768아는 토큰이 15만 개쯤이고, 한 번에 32,768토큰까지 읽을 수 있습니다
2. 파라미터 수494,032,768학습으로 정해진 숫자가 약 4억 9천만 개입니다. 이름의 "0.5B"(0.5 billion, 5억)가 이 수를 가리킵니다
2. 메모리1.84 GB숫자 하나에 4바이트(float32)를 쓰면 이만큼의 메모리가 듭니다
3. 한국어 문장토큰 9개10글자 문장이 9토큰입니다. ë°° 같은 이상한 글자는 한글의 바이트 조각을 그대로 찍은 모양일 뿐입니다
3. 영어 문장토큰 12개30글자 문장이 12토큰입니다. 낱말 하나가 토큰 하나라 글자 수에 비해 토큰이 적습니다. 숫자 3,000 은 다섯 토큰으로 갈렸습니다
3. 끝 표시endoftext 표시글 하나가 끝났음을 알리는 특별한 토큰입니다

한 줄로 줄이면, 5억 개 가까운 숫자로 된 기본 모델을 내려받아 크기와 토큰 나누는 법을 확인한 실습입니다. 이 모델이 실제로 글을 어떻게 이어 쓰는지는 실습 2에서 지시 모델과 견줍니다. 토큰 수는 문장 두 개로 본 것이라, 글자 수에 견주어 한국어가 토큰을 더 쓰는 경향만 보여 줄 뿐 정확한 비율을 말해 주지는 않습니다.

코드 설명

  • AutoModelForCausalLM.from_pretrained 는 모델 이름을 보고 알맞은 실제 클래스(여기서는 Qwen2 용)를 골라 가중치를 채워 돌려줍니다. 1단계의 출력이 그 클래스 이름입니다.
  • 층 24개, 좌표 896개, 헤드 14개, 어휘 151,936개이고 파라미터는 494,032,768개입니다. float32 로 올리면 1.84GB 로, "GPU 메모리 어림하기" 절의 "파라미터 × 4바이트"와 같습니다. 한 번에 볼 수 있는 토큰은 32,768개입니다.
  • 한국어 "배송비는 얼마인가요?"(글자 10개)는 9토큰, 영어 "The delivery fee is 3,000 won."(글자 30개)은 12토큰입니다. 영어는 Ġdelivery 처럼 낱말 하나가 토큰 하나인데, 한국어는 ë°° 처럼 한 글자가 바이트 조각으로 갈립니다. 이 토크나이저가 영어 글을 더 많이 보고 만들어졌기 때문입니다. 숫자 3,000 은 3, ,, 0, 0, 0 처럼 한 자씩 갈립니다.
  • 한 번에 보는 최대 토큰 수는 3장 미니 GPT 의 위치 임베딩 줄 수(64)에 해당하는 값입니다. 이 길이를 넘는 글은 잘라서 넣어야 합니다.
← 이전 절4장 · 실습 지도다음 절 →4장 · 실습 2 — 기본 모델과 지시 모델 견주기