Text Generation

apply_chat_template, Streaming 예제

m = 'meta-llama/Llama-3.1-8B-Instruct'

# ---
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer

tokenizer = AutoTokenizer.from_pretrained(m)
model = AutoModelForCausalLM.from_pretrained(m, device_map='auto')
streamer = TextStreamer(tokenizer)

def say(prompt: str):
    chat = [
        {"role": "user", "content": prompt},
    ]
    inputs = tokenizer.apply_chat_template(chat, 
        add_generation_prompt=True, return_dict=True, return_tensors="pt").to(0)
    _ = model.generate(**inputs, 
        streamer=streamer, do_sample=True, temperature=0.1, max_new_tokens=1024)


# ---
say('1km에 7분으로 달리면 마라톤 완주에 걸리는 시간은?')

torch_dtype=torch.bfloat16으로 모델을 로딩하면 첫 호출시 CPU로 파라미터를 전처리하는 작업이 있어 오래 걸린다.

파라미터 CUDA 위치 디버깅:

>>> model.hf_device_map
for i in model.named_parameters():
    print(f"{i[0]} -> {i[1].device}")

base 모델인 경우 say() 함수는 다르게 처리:

def say(prompt: str):
    inputs = tokenizer(prompt, return_tensors="pt").to(0)
    _ = model.generate(**inputs, 
        streamer=streamer, do_sample=True, temperature=0.1, max_new_tokens=128)

Subword Tokenization

드물게 등장하는 단어를 더 작은 단위로 나눔

  • BPE: GPT 사용. 단어를 유니코드 문자가 아닌 바이트 단위 구성으로 간주
  • WordPiece: BERT 사용
  • SentencePiece: BPE + Unigram LM Tokenizer
    text = "Jack Sparrow loves New York!"
    WordPiece는 York과 ! 사이에 공백이 없다는 정보를 잃어버리지만 SentencePiece는 U+2581 또는 아래 1/4 블록 문자로 할당해 공백 정보를 보존한다.1
  1. p142, 트랜스포머를 활용한 자연어 처리 

Last Modified: 2024/11/11 14:48:44

is a collection of Papers I have written.
© 2000 - Sang Park Except where otherwise noted, content on this site is licensed under a CC BY 4.0.
This site design was brought from Distill.