PyTorch에서의 사용법 위주로 정리한 글
HuggingFace의 가장 기본 기능인 pipeline()
과 AutoClass
를 소개한다.
pipeline()
은 빠른 inference를 위해 사용할 수 있고,AutoClass
를 이용하면 pretrained model과 tokenizer를 불러와 사용할 수 있다.
Pipeline
pipeline()
은 pretrained model을 사용하는 가장 쉬운 방법이다.
pipeline()
을 이용해 수행할 수 있는 기본적인 task는 text (sentiment analysis, text generation), image (classification, segmentation, object detection), audio (classification, speech recognition) 등으로 매우 다양하다. (Task에 대한 더 많은 정보는 여기에서 확인할 수 있다.)
다음과 같이 매우 간단하게 inference를 수행할 수 있다.
from transformers import pipeline
# build pipeline
classifier = pipeline("sentiment-analysis")
#inference
classifier("we are very happy to show you the 🤗 Transformers library.")
>> [{'label': 'POSITIVE', 'score': 0.9998}]
혹은, 다음과 같이 Model Hub에 있는 모델을 가져와 이용할 수도 있다. (Model Hub은 여러 사용자가 올린 Model들이 올라와있는 곳으로, 직접 다운로드하고 불러오는 과정을 생략하고 path만 지정해주면 자동으로 모델과 pretrained weight을 가져올 수 있다.)
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
# load model and tokenizer
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# build pipeline
classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
# inference
classifier("Nous sommes très heureux de vous présenter la bibliothèque 🤗 Transformers.")
>> [{'label': '5 stars', 'score': 0.7273}]
AutoModelForSequenceClassification
과 AutoTokenizer
을 이용해 pretrained model을 불러온 후, pipeline에 이들을 인자로 넣어주면 된다. Inference 과정은 위와 동일하다.
Autoclass
위에서 사용된 AutoClass
는 pretrained model을 이름이나 path를 이용해 불러올 수 있는 shortcut이라고 보면 된다. Pretrained model만 있다면, 수행하고자 하는 task에 적합한 AutoModel
와 AutoTokenizer
을 선택하기만 하면 된다.
AutoTokenizer
HuggingFace에 대한 튜토리얼 글이기 때문에 Tokenizer에 대한 설명은 생략한다. Tokenizer은 입력을 token으로 바꾸는 역할을 한다. (Tokenization에 대한 보다 자세한 설명: [HuggingFace] Tutorial of Tokenizers, Tokenizer Class 정리, Tokenizer 역할과 기능)
다음과 같이 pretrained tokenizer을 불러올 수 있다.
from transformers import AutoTokenizer
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)
정의한 tokenizer을 이용해, 다음과 같이 문장을 token으로 바꿀 수 있다.
encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
print(encoding)
>>> {'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
다음과 같이, padding과 truncation의 여부 등의 parameter을 tokenizer에 설정할 수 있다.
pt_batch = tokenizer(
["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
padding=True,
truncation=True,
max_length=512,
return_tensors="pt",
)
중요한 것은, AutoTokenizer
을 초기화할 때 사용하는 model name을 AutoModel
을 초기화할 때 사용한 것과 동일한 것으로 해야 한다는 것이다. 이는 model과 tokenizer이 동일한 tokenization 방법을 사용하도록 하기 위함이다.
전처리 파트에 대한 더 자세한 설명은 여기에서 확인할 수 있다.
AutoModel
AutoTokenizer
와 마찬가지로, 사용하려는 task에 맞는 pretrained model을 다음과 같이 불러올 수 있다.
from transformers import AutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
pt_model = AutoModelForSequenceClassification.from_pretrained(model_name)
이외에도 다양한 task를 위한 AutoModel
의 목록은 여기 (task summary)에서 확인할 수 있다.
앞에서 생성한 pt_batch
를 다음과 같이 모델에 입력으로 줄 수 있으며,
pt_outputs = pt_model(**pt_batch)
출력으로 얻은 logit을 softmax 함수에 통과시켜 확률값을 얻을 수 있다.
import torch.nn as nn
pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
print(pt_predictions)
>> tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
[0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=<SoftmaxBackward0>)
이렇게 불러온 모델들은 torch.nn.Module
을 상속하는 객체들이다. 따라서 일반적인 training loop를 이용해 훈련시킬 수 있다.
혹은, HuggingFace에서 제공하는 Trainer
class를 이용해 보다 편리하게 훈련시킬 수 있다. 이 방법은 Training tutorial에서 제공하고 있다.
Fine-tuning 된 모델은 다음과 같이 저장할 수 있다.
pt_save_directory = "./pt_save_pretrained"
tokenizer.save_pretrained(pt_save_directory)
pt_model.save_pretrained(pt_save_directory)
이렇게 저장된 모델은 처음과 같이 불러오면 된다.
pt_model = AutoModelForSequenceClassification.from_pretrained("./pt_save_pretrained")
HuggingFace의 놀라운 점 중 하나는.. PyTorch로 모델을 저장했어도 TensorFlow로 불러오거나, 그 반대도 가능하다는 것이다.
✔ TensorFlow에서 저장한 모델을 PyTorch에서 불러오기:
from transformers import AutoModel
tokenizer = AutoTokenizer.from_pretrained(tf_save_directory)
pt_model = AutoModelForSequenceClassification.from_pretrained(tf_save_directory, from_tf=True)
✔ PyTorch에서 저장한 모델을 TensorFlow에서 불러오기:
from transformers import TFAutoModel
tokenizer = AutoTokenizer.from_pretrained(pt_save_directory)
tf_model = TFAutoModelForSequenceClassification.from_pretrained(pt_save_directory, from_pt=True)
'🐍 Python & library > HuggingFace' 카테고리의 다른 글
HuggingFace Space 만들기 (1) | 2023.06.10 |
---|---|
[HuggingFace] Trainer 사용법 (0) | 2022.07.23 |
[HuggingFace] Tokenizer의 역할과 기능, Token ID, Input ID, Token type ID, Attention Mask (0) | 2022.06.03 |
[HuggingFace] Tokenizer class 알아보기 (0) | 2022.06.03 |