본문 바로가기
인공지능 (VLM, MLLM)/MLLM (Multimodal Large Language Model)

[Multimodal Large Language Model - Part 5] GenerationMixin 클래스/ generate 메소드

by 애플파ol 2025. 3. 1.

✓ 서론 : 언어모델은 가장 높은 확률의 토큰을 내뱉는다는 것은 너무나도 자명하다. 하지만 이를 Huggingface에서는 어떻게 제공 하는지 간략하게 설명을 해보겠다.

 

✓ GenerationMixin : auto-regressive text 생성시 필요한 기능(메소드)을 담고 있는 클래스  → 그 중에서도 generate메소드가 중요하게 사용된다.

     - auto-regressive 방식(디코더 전용방식) : GPT, LLaMA, LLaVA 등등

     - Masked Language Model 방식 (인코더 전용방식): BERT, RoBERTa 등등 

 

✓ generate() : Generates sequences of token ids for models with a language modeling head.

    - (language modeling head = autoclassforcasallm 을 말하는것으로, 트랜스포머의 마지막계층에서 nn.Linear(hidden_dim, vocab_size) 을 추가함으로써 토큰을 예측하게 한다는 것임)

    - 어텐션 마스크가 제공되지 않아도 추론하지만, 최상의 성능을 위해서는 어텐션 마스크를 전달해야함 

from transformers import AutoTokenizer
import torch

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
device = "cuda" if torch.cuda.is_available() else "cpu"
model_inputs = tokenizer(["A list of colors: red, blue"], return_tensors="pt").to(device)

# 여기서 model_inputs은 아래와 같은 형태로 구성되어 있다
'''
	{
    'input_ids': tensor(...),
    'attention_mask': tensor(...)
	}

'''
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

 

 

    - generate 메소드는 아래와 같이 인자값을 넘겨줌으로 생성방식을 정할수 있다.

출처 : https://huggingface.co/docs/transformers/v4.49.0/ko/main_classes/text_generation#transformers.GenerationMixin%20][%20transformers.GenerationMixin

 

# beam sarch알고리즘 사용 (탐색후보 4개)
output = model.generate(inputs, num_beams=4, do_sample=True)

 

 

✓ GenerationConfig : 텍스트 생성(generation)과 관련된 다양한 파라미터와 기본값을 모아 놓은 설정 객체.

      - bos_token_id : 1( Begin of sentence)

      - EOS_token_id : 2  (2토큰을 출력하면 종료조건임)

      - 생성되는 최대 길이는 : 4096  ( GenerationConfig가 없다면 최대 20개의 토큰만 반환)

      - pad_token_id : 0 ( Train 수행 시 상이한 text의 길이(batch 가 2이상일 때)를 맞추기 위한 토큰)

         - 참고로 일반적으로 패딩은 문장의 좌측에 추가한다.

    

generation_config.json 예시 (참고 : LLaVA1.5)