AI Sparkup

복잡한 AI 세상을 읽는 힘

트랜스포머 라이브러리의 Auto 클래스 활용하기

자동차 대시보드
Photo by Erik Mclean.

자연어 처리(NLP)나 컴퓨터 비전 등 다양한 분야에서 사용되는 Hugging Face의 트랜스포머(Transformers) 라이브러리는 수많은 사전 훈련된 모델을 제공합니다. 하지만 다양한 모델 아키텍처의 사용법을 모두 익히는 것은 쉽지 않습니다. 특히 특정 모델의 정확한 클래스 이름을 기억하고 적절한 API를, 매번 찾아 사용하는 것은 번거로운 일입니다. 이러한 문제를 해결하기 위해 트랜스포머 라이브러리는 ‘Auto 클래스’라는 특별한 설계를 제공합니다.

이 글에서는 Auto 클래스가 무엇인지, 어떻게 작동하는지, 그리고 코드에서 어떻게 활용할 수 있는지 알아보겠습니다.

Auto 클래스란 무엇인가?

트랜스포머 라이브러리에는 실제로 “AutoClass”라는 이름의 클래스는 없습니다. 대신 “Auto” 접두사가 붙은 여러 클래스가 존재합니다. 이 클래스들은 모델 이름이나 경로만으로 적절한 모델 아키텍처를 자동으로 추론하여 사용자가 세부적인 구현을 신경쓰지 않고도 모델을 쉽게 활용할 수 있게 해줍니다.

자연어 처리 작업의 일반적인 워크플로우를 생각해보면, 텍스트를 토큰으로 변환하고, 토큰을 ID로 변환한 후 이를 모델에 입력으로 제공합니다. 모델은 출력을 생성하고, 이 출력을 다시 텍스트로 변환하는 과정을 거칩니다. 이 과정에서 토크나이저(tokenizer)와 모델이 필요하며, 작업에 따라 다른 모델 변형(variant)을 사용하게 됩니다.

예를 들어, DistilBERT 모델을 사용하여 문장 분류를 수행하려면 다음과 같은 코드를 작성해야 합니다:

import torch
from transformers import DistilBertTokenizer, DistilBertForSequenceClassification

model_name = "KernAI/stock-news-distilbert"
tokenizer = DistilBertTokenizer.from_pretrained(model_name)
model = DistilBertForSequenceClassification.from_pretrained(model_name)

text = "Machine Learning Mastery is a nice website."
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    logits = model(**inputs).logits

predicted_class_id = logits.argmax().item()

이 코드는 이미 from_pretrained() 메서드를 사용하여 워크플로우를 단순화했지만, 여전히 정확한 토크나이저와 모델 클래스를 지정해야 합니다. 모델을 변경하려면 코드도 함께 변경해야 하는 번거로움이 있습니다.

Auto 클래스 사용하기

Auto 클래스를 사용하면 모델 아키텍처에 관계없이 동일한 코드로 다양한 모델을 활용할 수 있습니다. 위의 예제를 Auto 클래스를 사용하여 다시 작성하면 다음과 같습니다:

import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "KernAI/stock-news-distilbert"  # 또는 "ArthurZ/opt-350m-dummy-sc"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

text = "Machine Learning Mastery is a nice website."
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    logits = model(**inputs).logits

predicted_class_id = logits.argmax().item()

이 코드에서는 AutoTokenizerAutoModelForSequenceClassification을 사용했습니다. 이제 모델 이름만 변경하면 코드는 자동으로 적절한 토크나이저와 모델을 초기화합니다.

Auto 클래스는 어떻게 작동할까요? 간단히 말해, from_pretrained() 메서드가 모델을 다운로드하고 해당 모델의 설정 파일을 확인합니다. 그런 다음 설정 파일에 지정된 정보에 따라 올바른 토크나이저와 모델을 인스턴스화합니다. 이 과정은 사용자 입력 없이 자동으로 이루어집니다.

트랜스포머 라이브러리는 PyTorch, TensorFlow, Flax 등 다양한 백엔드를 지원합니다. 기본적으로 PyTorch가 사용되지만, TensorFlow나 Flax로 전환하는 것도 간단합니다. 예를 들어, TensorFlow 버전을 사용하려면:

import tensorflow as tf
from transformers import AutoTokenizer, TFAutoModelForSequenceClassification

model_name = "KernAI/stock-news-distilbert"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = TFAutoModelForSequenceClassification.from_pretrained(model_name, from_pt=True)

text = "Machine Learning Mastery is a nice website."
inputs = tokenizer(text, return_tensors="tf")
logits = model(**inputs).logits
predicted_class_id = tf.math.argmax(logits).numpy()

TensorFlow 버전의 Auto 클래스는 TF 접두사가 붙습니다(예: TFAutoModelForSequenceClassification). 위 예제에서 from_pt=True 매개변수는 PyTorch 가중치를 TensorFlow로 변환하라는 의미입니다.

Auto 클래스의 종류와 제한사항

트랜스포머 라이브러리에는 다양한 Auto 클래스가 있습니다. NLP 작업을 위한 주요 클래스로는 다음과 같은 것들이 있습니다:

  • AutoModel: 기본 모델(hidden states 출력)
  • AutoModelForCausalLM: 인과적 언어 모델링(다음 토큰 예측)
  • AutoModelForMaskedLM: 마스크된 언어 모델링(마스크된 토큰 예측)
  • AutoModelForSequenceClassification: 시퀀스 분류(전체 입력을 분류)
  • AutoModelForQuestionAnswering: 질의응답
  • AutoModelForTokenClassification: 토큰 분류(각 토큰을 분류)
  • AutoModelForMultipleChoice: 객관식 문제
  • AutoModelForTextEncoding: 텍스트 인코딩
  • AutoModelForNextSentencePrediction: 다음 문장 예측

모든 모델이 모든 작업을 지원하는 것은 아닙니다. 예를 들어, DistilBERT는 DistilBertForMaskedLM을 지원하므로 AutoModelForMaskedLM을 통해 사용할 수 있지만, AutoModelForCausalLM은 사용할 수 없습니다(DistilBERT에는 인과적 언어 모델링을 위한 변형이 없기 때문).

Auto 클래스의 또 다른 제한사항은 기본 모델 이름을 사용하는 경우입니다. 예를 들어:

from transformers import AutoModelForSequenceClassification
model_name = "distilbert-base-uncased"
model = AutoModelForSequenceClassification.from_pretrained(model_name)

이 코드를 실행하면 다음과 같은 경고가 표시됩니다:

Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight', 'pre_classifier.bias', 'pre_classifier.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.

이는 “distilbert-base-uncased”가 기본 모델만 포함하기 때문입니다. 분류 헤드의 가중치는 포함되어 있지 않으므로 무작위로 초기화됩니다. 이 모델을 사용하려면 먼저 훈련해야 합니다. 또는 “KernAI/stock-news-distilbert”와 같이 이미 특정 작업을 위해 훈련된 모델을 사용할 수 있습니다.

더 간단한 방법: Pipeline API

Auto 클래스는 특정 모델을 지정하고 세부적인 제어가 필요할 때 유용합니다. 하지만 그런 제어가 필요 없고 단순히 모델을 사용하여 작업을 수행하고 싶다면, 트랜스포머 라이브러리의 pipeline() 함수를 사용하여 코드를 더욱 단순화할 수 있습니다:

import torch
from transformers import pipeline

model_name = "KernAI/stock-news-distilbert"
classifier = pipeline(model=model_name)

text = "Machine Learning Mastery is a nice website."
prediction = classifier(text)
print(prediction)

이 예제는 Auto 클래스 버전보다 더 간결하며, 다음과 같은 출력을 생성합니다:

[{'label': 'positive', 'score': 0.9953118562698364}]

Pipeline API는 모델 유형을 자동으로 감지하고 적절한 후처리를 수행하여 사람이 읽을 수 있는 출력을 제공합니다.

결론

트랜스포머 라이브러리의 Auto 클래스는 다양한 모델 아키텍처를 쉽게 사용할 수 있게 해주는 강력한 도구입니다. 이를 통해 모델 설정에 대한 걱정 없이 코드를 작성할 수 있으며, 모델 이름만 변경하여 다른 모델로 쉽게 전환할 수 있습니다.

Auto 클래스는 일반적인 모델 클래스를 대체하는 역할을 하며, 라이브러리가 모델 구성을 기반으로 올바른 클래스를 찾도록 합니다. 이는 다양한 모델이나 체크포인트 간에 코드 변경 없이 쉽게 전환할 수 있게 해줍니다.

Auto 클래스 사용은 파이프라인 API보다 약간 더 자세하지만, 모델 텐서를 직접 조작해야 할 때 유용합니다. 단순히 모델을 사용하여 작업을 수행하고 싶다면 파이프라인 API가 좋은 선택입니다.

자연어 처리 프로젝트를 진행하면서 특정 모델의 정확한 클래스 이름과 사용법을 매번 찾아보는 데 시간을 낭비하지 마세요. Auto 클래스를 활용하면 모델 아키텍처에 대한 세부 사항에 신경 쓰지 않고도 트랜스포머 모델의 강력한 기능을 쉽게 활용할 수 있습니다.

참고자료

Comments