🐍 Python & library/HuggingFace

[HuggingFace] Pipeline & AutoClass

복만 2022. 5. 31. 16:45

PyTorch에서의 사용법 위주로 정리한 글

 

 

Quick tour

Get up and running with 🤗 Transformers! Start using the pipeline() for rapid inference, and quickly load a pretrained model and tokenizer with an AutoClass to solve your text, vision or audio task. All code examples presented in the documentation have a

huggingface.co

 

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}]

AutoModelForSequenceClassificationAutoTokenizer을 이용해 pretrained model을 불러온 후, pipeline에 이들을 인자로 넣어주면 된다. Inference 과정은 위와 동일하다.

 

 

Autoclass

위에서 사용된 AutoClass는 pretrained model을 이름이나 path를 이용해 불러올 수 있는 shortcut이라고 보면 된다. Pretrained model만 있다면, 수행하고자 하는 task에 적합한 AutoModelAutoTokenizer을 선택하기만 하면 된다.

 

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)
반응형