Python for AI, Embedded/Deep Learning: PyTorch & AI Modeling

PyTorch와 Hugging Face Transformers 라이브러리로 시작하는 NLP 가이드

임베디드 친구 2026. 5. 20. 20:56
반응형

딥러닝 기반의 자연어 처리(NLP)를 구현할 때 Transformer 아키텍처는 이제 빼놓을 수 없는 표준이 되었습니다. 수많은 오픈소스 거대 언어 모델이 쏟아져 나오는 지금, 이를 가장 쉽고 빠르게 다룰 수 있도록 도와주는 도구가 바로 Hugging Face의 transformers 라이브러리입니다. 이번 글에서는 복잡한 딥러닝 아키텍처 구현에 시간을 쏟는 대신, 이미 검증된 사전 학습 모델을 가져와 내 데이터에 맞게 PyTorch 환경에서 파인튜닝(미세조정)하는 실전 가이드를 소개해 드리겠습니다.

Generated by Gemini AI.

핵심 요약 3줄

  • Hugging Face의 pipeline을 사용하면 단 몇 줄의 코드만으로 감성 분석, 요약 등의 NLP 태스크를 즉시 수행할 수 있습니다.
  • AutoModel과 AutoTokenizer를 활용하여 모델의 구조를 수동으로 바꿀 필요 없이 원하는 사전 학습 모델을 유연하게 로드합니다.
  • 최신 eval_strategy를 반영한 Trainer API로 파이프라인 전처리부터 모델 평가까지 통합된 PyTorch 학습 워크플로우를 완성합니다.

1. Hugging Face transformers 라이브러리 개요

Hugging Face의 transformers 라이브러리는 BERT, GPT, T5, RoBERTa 등 전 세계 연구자들이 공개한 수만 개의 사전 학습 모델(Pre-trained Model)을 몇 줄의 명령어로 다운로드하고 활용할 수 있게 해주는 거대한 생태계입니다. PyTorch 및 TensorFlow 프레임워크와 완벽하게 호환되며, 복잡한 전처리 과정을 단순화해 주는 것이 가장 큰 장점입니다.

라이브러리가 제공하는 핵심 인터페이스와 기능적 특징을 정리하면 다음과 같습니다.

핵심 구성 요소 주요 역할 및 기능 개발 편의성 효과
Pipeline 복잡한 텐서 변환이나 후처리 없이 텍스트 입력만으로 즉시 추론 결과 반환 프로토타입 빠른 검증 가능
Tokenizer 문자열을 모델이 이해할 수 있는 토큰 ID, 어텐션 마스크 등의 텐서 데이터로 변환 패딩(Padding) 및 잘림(Truncation) 자동 처리
Auto Classes 모델 이름(String)만 지정하면 아키텍처에 맞는 클래스를 자동으로 찾아 로드 코드 재사용성 극대화
Trainer API PyTorch의 복잡한 학습 루프(Loss 계산, 역전파, 가중치 업데이트)를 추상화 학습 설정에만 집중 가능

2. 환경 설정

실습을 진행하기 위해 가상환경 또는 개발 환경에 필요한 핵심 라이브러리를 설치해 주어야 합니다. 터미널을 열고 아래 명령어를 실행하여 transformers와 datasets, 그리고 PyTorch를 설치합니다.

Bash
 
pip install transformers datasets torch

설치가 정상적으로 완료되었는지, 그리고 라이브러리 간의 버전 충돌이 없는지 확인하기 위해 파이썬 인터프리터나 주피터 노트북에서 아래의 확인 코드를 실행해 봅니다.

Python
 
import torch
from transformers import pipeline

print("PyTorch 버전:", torch.__version__)
print("Pipeline 로드 확인:", pipeline)

에러 메시지 없이 정상적으로 버전과 클래스 정보가 출력된다면 이제 자연어 처리 모델을 다룰 모든 준비가 끝난 것입니다.

3. 파이프라인(Pipeline)으로 사전 학습 모델 맛보기

Hugging Face에서 모델을 가장 빠르게 써보는 방법은 바로 pipeline 기능을 이용하는 것입니다. 텍스트 전처리, 모델 추론, 결과 가독화 단계를 하나로 묶어 제공하기 때문에 딥러닝 내부 구조를 몰라도 바로 결과를 낼 수 있습니다. 예시로 감성 분석(Sentiment Analysis)을 수행하는 코드를 살펴보겠습니다.

Python
 
from transformers import pipeline

# 감성 분석 파이프라인 객체 생성
classifier = pipeline("sentiment-analysis")

# 문장 예측 실행
result = classifier("I love using Hugging Face!")
print(result)

출력 결과

Python
 
[{'label': 'POSITIVE', 'score': 0.9998}]

별도의 모델 다운로드 경로를 지정하지 않아도 텍스트 분류에 적합한 기본 모델을 알아서 가져와 긍정(POSITIVE) 확률을 정확하게 계산해 줍니다. 서비스 초기 검증이나 간단한 토이 프로젝트를 만들 때 매우 유용합니다.

4. 토크나이저와 모델 직접 불러오기

파이프라인은 편리하지만, 실제 서비스 개발이나 세부적인 임베딩 값을 제어해야 할 때는 토크나이저와 모델을 직접 분리하여 로드해야 합니다. Hugging Face는 Auto 클래스를 제공하므로 모델 이름만 바꾸면 코드 구조를 그대로 유지한 채 다른 모델로 쉽게 스위칭할 수 있습니다. 가장 대중적인 bert-base-uncased 모델을 직접 제어해 보겠습니다.

Python
 
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

model_name = "bert-base-uncased"

# 토크나이저 및 모델 로드
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

text = "Hugging Face is amazing!"

# 1. 텍스트 전처리 (PyTorch 텐서 형태로 반환)
inputs = tokenizer(text, return_tensors="pt")

# 2. 모델 추론 (학습이 아니므로 그래디언트 계산 제외)
with torch.no_grad():
    outputs = model(**inputs)

# 3. 로짓(Logits) 출력 확인
print(outputs.logits)

텍스트가 토크나이저를 거치면서 숫자 형태의 텐서로 바뀌고, 이 값이 모델의 입력으로 들어가 최종 가중치가 반영된 연산 결과(Logits)를 내놓는 흐름을 이해하는 것이 중요합니다.

5. 나의 데이터로 모델 미세 조정(Fine-tuning)하기

가장 핵심이 되는 파트인 파인튜닝입니다. 인터넷상의 거대한 데이터로 미리 학습된 원본 모델에 우리가 가진 특정 데이터셋을 추가로 학습시켜 도메인에 특화된 모델을 만드는 과정입니다. 여기서는 대규모 영화 리뷰 데이터인 IMDB 감성 분석 데이터셋을 가져와서 BERT 모델을 학습시키는 전체 워크플로우를 구현해 보겠습니다.

Python
 
import torch
from datasets import load_dataset
from transformers import (
    AutoModelForSequenceClassification,
    AutoTokenizer,
    Trainer,
    TrainingArguments,
)

# 1. IMDB 영화 리뷰 데이터셋 로드
dataset = load_dataset("imdb")

# 2. 토크나이저 및 모델 준비 (이진 분류를 위해 num_labels=2 설정)
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)


# 3. 데이터 전처리 함수 정의
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)


# 데이터셋 전체에 토큰화 적용 (학습 속도를 위해 배치 단위 처리)
tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 4. 하이퍼파라미터 및 학습 환경 설정
training_args = TrainingArguments(
    output_dir="./results",
    eval_strategy="epoch",  # 에폭마다 검증 진행
    save_strategy="epoch",  # 에폭마다 모델 체크포인트 저장
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=3,
    weight_decay=0.01,
    logging_steps=10,
)

# 5. Trainer 객체 선언 및 학습 시작
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
)

# 모델 훈련 진행
trainer.train()

과거 PyTorch로 직접 코딩했을 때 수십 줄에 달하던 Train Loop와 Validation 루프가 Trainer 객체 하나로 깔끔하게 정돈된 것을 볼 수 있습니다.

6. 성공적인 NLP 개발을 위한 팁

  • Dynamic Padding 활용하기: 위 예시에서는 padding="max_length"를 사용하여 모든 문장을 모델의 최대 길이로 맞췄습니다. 하지만 데이터셋에 짧은 문장이 많다면 이는 불필요한 연산 낭비로 이어집니다. DataCollatorWithPadding을 함께 사용하면 미니 배치 내에서 가장 긴 문장을 기준으로 패딩 길이가 유동적으로 결정되어 학습 속도를 최대 2배 이상 끌어올릴 수 있습니다.
  • Mixed Precision(fp16) 활성화: 최신 GPU 환경에서 학습을 진행한다면 TrainingArguments에 fp16=True 옵션을 추가해 보시기 바랍니다. 메모리 사용량이 절반으로 줄어들어 더 큰 배치 사이즈를 사용할 수 있고 가속도가 붙습니다.
  • Hugging Face Hub 연동: 모델 학습이 끝난 뒤 trainer.push_to_hub() 한 줄만 실행하면 원격 저장소에 모델이 업로드됩니다. 이를 통해 팀원들과 쉽게 결과물을 공유하고 어디서나 다시 불러올 수 있는 환경이 만들어집니다.

7. 흔히 하는 실수와 해결 방법

  • Warning 메세지 무시로 인한 예기치 못한 에러: Transformers 라이브러리는 업데이트가 매우 빠른 편입니다. 예를 들어, 기존 학습 인자 중 하나였던 evaluation_strategy 옵션은 최신 버전에서 deprecated(상호 호환성 저하로 폐기 예정)되어 경고를 발생시키며, 현재는 eval_strategy로 변경되었습니다. 콘솔에 출력되는 경고문을 꼼꼼히 읽고 최신 인자 명칭으로 수정해 주어야 추후 라이브러리 업데이트 시 코드가 터지는 일을 막을 수 있습니다.
  • 토크나이저와 모델의 불일치: BERT 모델을 사용하면서 GPT 토크나이저를 불러오거나, bert-base-uncased(소문자 전용) 모델을 쓰면서 대소문자가 구분되는 전처기를 사용하면 모델의 임베딩 레이어에서 엉뚱한 토큰 ID를 참조하게 됩니다. 학습 에러는 안 나지만 성능이 처참하게 낮아지므로, 반드시 AutoTokenizer.from_pretrained(model_name)처럼 모델과 동일한 식별자를 사용해 로드해야 합니다.
  • Truncation 옵션 누락으로 인한 Out Of Memory(OOM): 텍스트 토큰화 진행 시 truncation=True 설정을 누락하면, 모델의 최대 수용 길이(예: BERT의 경우 512토큰)를 초과하는 긴 텍스트가 들어왔을 때 GPU 메모리가 폭발하거나 인덱스 참조 에러가 발생합니다. 데이터셋 전처리 함수를 만들 때 항상 잘림 설정을 명시하는 버릇을 들이는 것이 좋습니다.

8. 맺음말

이번 글에서는 Hugging Face의 transformers 라이브러리를 활용해 간단한 파이프라인 추론부터 PyTorch 기반의 파인튜닝 기초 프로세스까지 함께 짚어보았습니다. 과거에 모델 아키텍처 레이어를 한 땀 한 땀 설계하고 텐서 크기를 맞추느라 밤을 새우던 것에 비하면, 이제는 비즈니스 로직과 데이터 정제에 더 많은 에너지를 쏟을 수 있는 시대가 되었습니다.

오늘 다룬 뼈대 코드를 바탕으로 여러분이 가진 비즈니스 데이터나 도메인 텍스트를 대입해 보면서 직접 분류 성능을 개선해 보시기 바랍니다. 기초가 다져졌다면 다음 단계로 문장 요약, 질의응답(QA) 등 더 복잡한 생성형 다운스트림 태스크에 도전해 보는 것도 좋은 공부가 될 것입니다.

반응형