티스토리 뷰

Deep-learning

[LLM] Tokenizer 기본

Sims. 2025. 2. 1. 14:43
728x90

Tokenizer 기본 선언 방식

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(CFG["model"])

기존 본인이 사용하고자 하는 모델명, Tokenizer 위치를 파라미터에 넣어 불러오면 끝.

 

하지만, 위 방식으로 진행하면, 모델따로 토크나이저 따로 불러와 사용해야함.

이걸 한번에 할 수 있는게 바로 pipeline 함수. 

 

# pipline을 이용하여 추론
import transformers
from transformers import AutoModelForCausalLM ,BitsAndBytesConfig
# 4bit quantization
quantization_config = BitsAndBytesConfig(load_in_4bit=True,
                                         bnb_4bit_quant_type = "nf4")


#  pipeline으로 진행하면, 자동으로 tokenizer도 불러옴 
pipline = transformers.pipeline(
    "text-generation",
    model = CFG["model"],
    model_kwargs = {'quantization_config' : quantization_config},
    device_map="auto"
)

위처럼 transformers.pipeline을 사용시 모델과 해당 모델에 사용되는 토크나이저를 한번에 받을 수 있음.

pipline.tokenizer
pipline.model

로 기존처럼 모델과 토크나이저에 접근이 가능하며 사용할 수 있음.

 

 

Chat 형식 

https://huggingface.co/docs/transformers/main/ko/chat_templating

 

채팅 모델을 위한 템플릿

(번역중) 효율적인 학습 기술들

huggingface.co

 

LLM 하면서 가장 많이 활용하는 것이 chat모델일 것임.

 

모델명-chat / 모델명-it 과 같이 허깅페이스에 저장된 모델들이 있는데, 이것들이 바로 채팅을 위해 finetuning된 모델임.

기존 대기업에서 모델을 개발하여 배포하는 것 ( ex. google/gemma-7b )은 next token generation으로 pretrain한 모델이다.

이러한 모델을 base로 사용자들은 번역, 요약과 같은 여러가지 DownStreamTask로 FineTuning을 진행한다.

chat 형식으로 답변을 출력할 수 있도록 DownStreamTask를 진행한다고 생각하면 된다.

 

그럼 여기서 가장 헷갈렸던 부분이 있다. "어떤 형식으로 chat Template를 구성해야 하는가? " 

여러가지 모델이 있고, 각 모델별 스페셜 토큰도 다른데 구성을 어떻게 해야할까...

 

결론

1. Pretrain 된 모델을 이용할 경우에는 자유롭게 만들어 주면 됨 ( 상대적으로 자유로움 )

2. 이미 chat/it 형식으로 finetuning된 모델을 이용할 경우, 기존 학습에 사용한 template를 사용하면 됨

 

그럼, 1번의 경우는 큰 문제가 없지만, 2번의 경우는 어떤 형식인지 알아보기 위한 방법은 아래와 같음.

# pipline을 이용하여 추론
import transformers
from transformers import AutoModelForCausalLM ,BitsAndBytesConfig
import torch
import json
import huggingface_hub

with open('./settings/config.json') as f:
    CFG = json.load(f)

# Private Token value input & login
huggingface_hub.login(token = CFG["TOKEN"])

CFG["model"] = "rtzr/ko-gemma-2-9b-it"

# 4bit quantization
quantization_config = BitsAndBytesConfig(load_in_4bit=True,
                                         bnb_4bit_quant_type = "nf4")


#  pipeline으로 진행하면, 자동으로 tokenizer도 불러옴 
pipline = transformers.pipeline(
    "text-generation",
    model = CFG["model"],
    model_kwargs = {'quantization_config' : quantization_config},
    device_map="auto"
)

위처럼 gemma를 it형식으로 학습시켜 놓은 모델을 pipeline을 이용하여 모델과 토크나이저를 불러왔다.

그 후, messages를 위 형태처럼 만들어주고, apply_chat_template를 이용하여 넣어주면 해당 모델에서 사용한 채팅형식에 맞춰서 프롬프트를 생성할 수 있다. 

 

prompt의 출력물을 보면, <bos> <start_of_turn> <end_of_turn> 형식으로 작성되는 것을 볼 수 있는데,

학습시킬때 위와같은 형식을 바탕으로 학습을 진행하여 해당 it 모델의 chat template은 위와같다.

생성을 진행해보면 아래와 같은 결과물을 얻을 수 있다.(pipeline으로 추론을 진행하면, 끝나는 지점의 스페셜토큰을 볼 수 없기에 기존 generate 함수를 이용하여 진행하였다.)

여기서 마지막 스페셜 토큰으로 <end_of_turn> <eos> 가 생성되어 더이상 생성을 멈춘 것도 볼 수 있다.

반응형

'Deep-learning' 카테고리의 다른 글

[LLM] Fine-Tuning  (0) 2025.02.06
[LLM] huggingface LLM 기본 내용 ( 양자화 )  (0) 2025.01.30
YOLOv11 이해하기 (4) - Loss  (0) 2024.11.19
YOLOv11 이해하기 (3) - Head  (0) 2024.11.18
What is Attention?(어텐션 이란?)  (0) 2024.11.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함