일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- webserving
- 딥러닝
- gradio
- 3유형
- DASH
- fastapi
- 공간시각화
- 인공지능
- GPU
- 1유형
- ㅂ
- 빅데이터분석기사
- CUDA
- K최근접이웃
- pytorch
- 공간분석
- streamlit
- Ai
- dl
- 성능
- QGIS설치
- Kaggle
- KNN
- 예제소스
- 2유형
- qgis
- ml 웹서빙
- 실기
- 머신러닝
- 캐글
- Today
- Total
에코프로.AI
[Hugging Face - 3] pipeline() 함수 - 내부 처리로직 본문

HuggingFace의 pipeline() 함수를 실행 시, 내부적으로 어떤 절차로 처리가 되는지 확인 합니다.
전체 예제부터 시작하여 다음 코드를 실행했을 때 백그라운드에서 어떤 일이 발생했는지 살펴보겠습니다.
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
classifier(
[
"I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!",
]
)
처리결과
[{'label': 'POSITIVE', 'score': 0.9598047137260437},
{'label': 'NEGATIVE', 'score': 0.9994558095932007}]
이 파이프라인은 전처리, 모델에 입력 전달, 후처리라는 세 가지 단계로 구성됩니다:

각각에 대해 간단히 살펴보겠습니다.
토크나이저를 사용한 전처리
다른 신경망과 마찬가지로 Transformer 모델은 원시 텍스트를 직접 처리할 수 없으므로 파이프라인의 첫 번째 단계는 텍스트 입력을 모델이 이해할 수 있는 숫자로 변환하는 것입니다. 이를 위해 다음을 담당하는 토크나이저를 사용합니다.
- 입력 내용을 토큰 이라고 하는 단어, 하위 단어 또는 기호(예: 구두점)로 분할합니다.
- 각 토큰을 정수로 매핑
- 모델에 유용할 수 있는 추가 입력 추가
이 모든 전처리는 모델이 사전 학습되었을 때와 정확히 같은 방식으로 수행되어야 하므로 먼저 Model Hub 에서 해당 정보를 다운로드해야 합니다 . 이를 위해 클래스 AutoTokenizer와 해당 from_pretrained()메서드를 사용합니다. 모델의 checkpoint name 을 사용하여 모델의 Tokenizer 와 관련된 데이터를 자동으로 가져와서 캐시합니다(따라서 아래 코드를 처음 실행할 때만 다운로드됩니다).
sentiment-analysis파이프라인 의 기본 체크포인트 는 ( 여기서 distilbert-base-uncased-finetuned-sst-2-english 모델 카드를 볼 수 있습니다 )이므로 다음을 실행합니다.
from transformers import AutoTokenizer
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
Tokenizer 가 있으면 문장을 Tokenizer 에 직접 전달하면 모델에 공급할 준비가 된 사전을 다시 얻을 수 있습니다.! 이제 남은 일은 입력 ID 목록을 텐서로 변환하는 것뿐입니다.
어떤 ML 프레임워크가 백엔드로 사용되는지 걱정할 필요 없이 🤗 트랜스포머를 사용할 수 있습니다(일부 모델의 경우 PyTorch 또는 TensorFlow 또는 Flax일 수 있습니다). 하지만 트랜스포머 모델은 텐서만 입력으로 받아들입니다. 텐서에 대해 처음 들어보신다면 텐서를 NumPy 배열로 생각하시면 됩니다. NumPy 배열은 스칼라(0D), 벡터(1D), 행렬(2D) 또는 그 이상의 차원을 가질 수 있습니다. 이는 사실상 텐서이며, 다른 ML 프레임워크의 텐서도 비슷하게 작동하며 일반적으로 NumPy 배열만큼 인스턴스화하기가 간단합니다.
반환하려는 텐서 유형을 지정하려면 반환하려는 텐서 유형(PyTorch, TensorFlow 또는 일반 NumPy)을 return_tensors 인수로 사용합니다:
raw_inputs = [
"I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!",
]
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")
print(inputs)
위의 코드의 결과는 PyTorch 텐서로서 다음과 같습니다:
{
'input_ids': tensor([
[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102],
[ 101, 1045, 5223, 2023, 2061, 2172, 999, 102, 0, 0, 0, 0, 0, 0, 0, 0]
]),
'attention_mask': tensor([
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
])
}
출력 자체는 input_ids와 attention_mask라는 두 개의 키를 포함하는 사전입니다. input_ids에는 각 문장에 있는 토큰의 고유 식별자인 정수 두 행(각 문장당 하나씩)이 포함되어 있습니다. attention_mask는 1로 된 것만 확인하도록 알려주는 항목입니다.
모델 살펴보기
토큰화 도구와 동일한 방식으로 사전 학습된 모델을 다운로드할 수 있습니다. 🤗 트랜스포머는 from_pretrained() 메서드가 있는 AutoModel 클래스를 제공합니다:
from transformers import AutoModel
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModel.from_pretrained(checkpoint)
이 코드 에서는 이전에 파이프라인에서 사용한 것과 동일한 체크포인트를 다운로드하고(실제로는 이미 캐시되어 있어야 함), 이를 사용하여 모델을 인스턴스화했습니다.
이 아키텍처는 기본 Transformer 모듈만 포함합니다. 몇 가지 입력이 주어지면 숨겨진 상태 라고 부르는 것을 출력합니다. 이를 피처 라고도 합니다 . 각 모델 입력에 대해 Transformer 모델이 해당 입력에 대한 맥락적 이해를 나타내는 고차원 벡터를 검색합니다 .
이러한 숨겨진 상태는 그 자체로 유용할 수 있지만, 일반적으로 모델의 다른 부분인 헤드에 대한 입력입니다 . 1 장 에서 서로 다른 작업은 동일한 아키텍처로 수행될 수 있지만, 이러한 각 작업에는 서로 다른 헤드가 연관됩니다.
고차원 벡터?
Transformer 모듈의 벡터 출력은 일반적으로 큽니다. 일반적으로 3가지 차원이 있습니다.
- Batch size (배치 크기) : 한 번에 처리하는 시퀀스 수(예에서는 2개)
- Sequence length (시퀀스 길이) : 시퀀스의 숫자형 표현 길이(예시에서는 16)
- Hidden size (숨겨진 크기) : 각 모델 입력의 벡터 차원입니다.
마지막 값 때문에 "고차원"이라고 합니다. 숨겨진 크기는 매우 클 수 있습니다(작은 모델에서는 768이 일반적이며, 더 큰 모델에서는 3072 이상에 도달할 수 있음).
우리가 사전 처리한 입력을 모델에 입력하면 이를 확인할 수 있습니다.
outputs = model(**inputs)
print(outputs.last_hidden_state.shape)
torch.Size([2, 16, 768])
트랜스포머 모델의 출력은 네임드 튜플이나 딕셔너리처럼 작동한다는 점에 유의하세요. 우리가 했던 것처럼 속성이나 키(outputs["last_hidden_state"])로 요소에 액세스할 수 있고, 찾고 있는 것이 정확히 어디에 있는지 안다면 인덱스(outputs[0])로도 액세스할 수 있습니다.
모델 헤드: 숫자로 의미 파악하기
모델 헤드는 숨겨진 상태의 고차원 벡터를 입력으로 받아서 다른 차원으로 투사합니다. 일반적으로 하나 또는 몇 개의 선형 레이어로 구성됩니다.
트랜스포머 모델의 출력은 처리할 모델 헤드로 직접 전송됩니다. 이 다이어그램에서 모델은 임베딩 레이어와 후속 레이어로 표현됩니다. 임베딩 레이어는 토큰화된 입력의 각 입력 ID를 연관된 토큰을 나타내는 벡터로 변환합니다. 후속 레이어는 주의 메커니즘을 사용하여 이러한 벡터를 조작하여 문장의 최종 표현을 생성합니다. 🤗 트랜스포머에는 다양한 아키텍처가 있으며, 각 아키텍처는 특정 작업을 처리하는 데 중점을 두고 설계되었습니다.
다음은 전체 목록이 아닙니다:
- *Model (retrieve the hidden states)
- *ForCausalLM
- *ForMaskedLM
- *ForMultipleChoice
- *ForQuestionAnswering
- *ForSequenceClassification
- *ForTokenClassification
- and others 🤗
이 예제에서는 문장을 긍정 또는 부정으로 분류할 수 있도록 시퀀스 분류 헤드가 있는 모델이 필요합니다. 따라서 실제로는 AutoModel 클래스를 사용하지 않고 AutoModelForSequenceClassification을 사용합니다:
from transformers import AutoModelForSequenceClassification
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
outputs = model(**inputs)
이제 출력의 형태를 살펴보면 차원이 훨씬 낮아집니다. 모델 헤드는 앞서 본 고차원 벡터를 입력으로 받아 두 개의 값(레이블당 하나씩)을 포함하는 벡터를 출력합니다.
print(outputs.logits.shape)
torch.Size([2, 2])
두 개의 문장과 두 개의 레이블만 있으므로 모델에서 얻은 결과는 2 x 2 모양입니다.
출력 후, 처리
print(outputs.logits)
tensor([[-1.5607, 1.6123],
[ 4.1692, -3.3464]], grad_fn=<AddmmBackward>)
이 모델은 첫 번째 문장에 대해 [-1.5607, 1.6123]을, 두 번째 문장에 대해 [4.1692, -3.3464]를 예측했습니다. 이는 확률이 아니라 모델의 마지막 레이어에서 출력된 정규화되지 않은 원시 점수인 로짓입니다. 확률로 변환하려면 SoftMax 계층을 거쳐야 합니다(모든 🤗 트랜스포머 모델은 로그를 출력하는데, 학습을 위한 손실 함수는 일반적으로 SoftMax와 같은 마지막 활성화 함수와 교차 엔트로피와 같은 실제 손실 함수를 융합하기 때문입니다).
import torch
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)
tensor([[4.0195e-02, 9.5980e-01],
[9.9946e-01, 5.4418e-04]], grad_fn=<SoftmaxBackward>)
이제 모델이 첫 번째 문장에 대해 [0.0402, 0.9598]을, 두 번째 문장에 대해 [0.9995, 0.0005]를 예측한 것을 볼 수 있습니다. 이는 인식 가능한 확률 점수입니다.
각 위치에 해당하는 레이블을 얻으려면 모델 구성의 id2label 속성을 검사하면 됩니다
model.config.id2label
{0: 'NEGATIVE', 1: 'POSITIVE'}
이제 모델이 다음을 예측했다는 결론을 내릴 수 있습니다.
- 첫 번째 문장: 부정(NEGATIVE): 0.0402, 긍정(POSITIVE): 0.9598
- 두 번째 문장: 부정(NEGATIVE): 0.9995, 긍정 (POSITIVE) : 0.0005
[참고사이트] https://huggingface.co/learn/nlp-course/chapter2/2?fw=pt
끝~

'AI Tutorial' 카테고리의 다른 글
[Hugging Face - 5] Tokenizers (2) | 2025.01.01 |
---|---|
[Hugging Face - 4] models (0) | 2024.12.27 |
[Hugging Face - 2] Transformer? (1) | 2024.12.24 |
[Hugging Face - 1] Hugging Face 소개 및 기본사용(Feat. pipeline) (0) | 2024.12.23 |
[Streamlit] PostgreSQL 연동 (0) | 2024.12.23 |