GPT-2를 활용한 텍스트 생성하기¶
개발 환경 구축¶
- torch, torchvision, torchaudio, transformers 설치
!pip install torch torchvision torchaudio transformers --upgrade
In [ ]:
!pip install torch torchvision torchaudio transformers --upgrade
In [ ]:
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
# GPT-2 모델과 토크나이저 로드
model_name = "gpt2"
model = GPT2LMHeadModel.from_pretrained(model_name)
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
# 모델을 평가 모드로 설정
model.eval()
# 텍스트 입력
input_text = "Once upon a time"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
# 텍스트 생성
with torch.no_grad():
output = model.generate(input_ids, max_length=50, num_return_sequences=1)
# 생성된 텍스트 디코딩
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)
코드 설명¶
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
- transformers 라이브러리에서 GPT2LMHeadModel과 GPT2Tokenizer를 임포트합니다.
- GPT2LMHeadModel은 GPT-2 모델을 로드하고 텍스트 생성을 수행하는 데 사용되며,
- GPT2Tokenizer는 텍스트를 토큰으로 변환하거나 토큰을 텍스트로 변환하는 데 사용됩니다.
- torch는 PyTorch 라이브러리로, 모델의 연산과 텐서 조작을 위해 사용됩니다.
model_name = "gpt2"
model = GPT2LMHeadModel.from_pretrained(model_name)
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
- model_name 변수에 사용할 GPT-2 모델의 이름을 지정합니다. "gpt2"는 기본 모델입니다.
- GPT2LMHeadModel.from_pretrained(model_name) 호출을 통해 사전 훈련된 GPT-2 모델을 로드합니다.
- GPT2Tokenizer.from_pretrained(model_name) 호출을 통해 해당 모델에 맞는 토크나이저를 로드합니다.
model.eval()
- model.eval()을 호출하여 모델을 평가 모드로 설정합니다.
- 이는 모델이 학습이 아닌 추론을 수행하도록 하며, Dropout과 BatchNorm과 같은 학습 중에만 활성화되는 기능을 비활성화합니다.
- 학습 모드에서 평가 모드 전환
- Dropout 비활성화,
- Batch Normalizaion 고정(학습 중, 배치마다 평균과 분산을 계산하여 정규화하는 Batch Normalization이 평가 모드에서는 학습된 평균과 분산을 사용하여 고정.)
input_text = "Once upon a time"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
- input_text 변수에 생성할 텍스트의 시작 부분을 지정합니다.
- tokenizer.encode()를 호출하여 입력 텍스트를 모델이 이해할 수 있는 형태인 토큰 ID(숫자 형태로 매핑)로 변환합니다. return_tensors="pt"는 pt는 PyTorch를 의미한다. PyTorch 텐서 형식으로 반환되도록 지정합니다. 텐서는 PyTorch에서 효율적인 계산을 위해 사용하는 다차원 배열의 형태로, 특히 GPU에서 계산이 유리.
with torch.no_grad():
output = model.generate(input_ids, max_length=50, num_return_sequences=1)
with torch.no_grad() 블록은 모델 평가나 추론할 때 사용.
- 모델의 가중치를 업데이트하기 위해 그래디언트를 계산합니다.
- 모델 평가, 추론할 때는 가중치 업데이트가 필요없음. 이때 그래디언트 계산을 비활성화하여 메모리와 계산 비용을 줄입니다.
model.generate()를 호출하여 텍스트 생성을 시작합니다. input_ids는 입력 텍스트를 토큰화한 ID이며, max_length=50은 생성할 텍스트의 최대 길이를 50으로 설정합니다. num_return_sequences=1은 하나의 생성된 텍스트 시퀀스만 반환하도록 지정합니다.
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)
- tokenizer.decode()를 호출하여 모델이 생성한 토큰 ID를 사람이 읽을 수 있는 텍스트로 변환합니다. - skip_special_tokens=True는 특별 토큰(예: 패딩, 시작, 종료 토큰 등)을 제거합니다.
- 패딩, 시작, 종료 토큰을 제거하면 최종 출력이 더 깔끔하고 사람이 읽기 쉬운 형태가 된다.
- 최종적으로 생성된 텍스트를 출력합니다.
In [ ]: