Pooling 모델

Pooling 모델 (Pooling Models)

참고: 현재 pooling 모델은 주로 편의를 위해 지원해요. Hugging Face Transformers나 Sentence Transformers를 직접 쓰는 것에 비해 성능 개선을 보장하지 않아요. vLLM에서 pooling 모델을 최적화할 계획이 있으니, 의견이 있다면 Issue #21796에 남겨주세요.

출처: vLLM 공식 문서 — models-pooling_models

Pooling 모델이란 무엇인가요? (What are pooling models?)

자연어 처리(NLP)는 크게 두 가지 유형의 작업으로 나눌 수 있어요.

  • 자연어 이해 (Natural Language Understanding, NLU)
  • 자연어 생성 (Natural Language Generation, NLG)

vLLM이 지원하는 생성 모델은 우리가 익숙한 대형 언어 모델(LLM), 이미지·비디오·오디오 같은 멀티모달 입력을 다루는 멀티모달 모델(VLM), 음성을 텍스트로 바꾸는 전사 모델, 스트리밍 입력을 지원하는 실시간 모델 등 다양한 작업 유형을 아우러요. 이들의 공통 특징은 텍스트를 생성할 수 있다는 것이죠.

생성 모델의 능력이 계속 좋아지면서 그 경계도 계속 넓어지고 있어요. 그런데도 어떤 애플리케이션 시나리오는 특정 작업을 효율적으로 수행하기 위해 특화된 작은 언어 모델이 여전히 필요해요. 이런 모델은 보통 다음 특징을 가져요.

  • 콘텐츠 생성이 필요 없다.
  • 강한 일반화, 창의성, 높은 지능이 필요 없는 매우 제한된 기능만 수행하면 된다.
  • 극도로 낮은 레이턴시를 요구하고 비용에 제약이 있는 하드웨어에서 동작할 수 있다.
  • 텍스트 전용 모델은 보통 10억 파라미터 미만, 멀티모달 모델은 일반적으로 100억 파라미터 미만이다.

이 모델들은 규모는 작지만 여전히 Transformer 아키텍처를 기반으로 하고, 최첨단 대형 언어 모델과 유사하거나 심지어 동일해요. 최근 출시된 많은 pooling 모델도 대형 언어 모델에서 파인튜닝되어 대형 모델의 지속적 개선 이점을 누려요. 이 아키텍처 유사성 덕분에 vLLM 인프라를 많이 재사용할 수 있어요. 호환된다면 vLLM의 최신 기능도 활용하도록 돕고 싶어요.

시퀀스 단위 작업과 토큰 단위 작업 (Sequence-wise Task and Token-wise Task)

시퀀스 단위 작업(sequence-wise task)과 토큰 단위 작업(token-wise task)의 핵심 차이는 출력 세분성(granularity)이에요. 시퀀스 단위 작업은 전체 입력 시퀀스에 대해 단일 결과를 내고, 토큰 단위 작업은 시퀀스 안의 각 토큰마다 결과를 내요.

많은 pooling 모델이 시퀀스 작업과 토큰 작업을 모두 지원해요. 기본 pooling 작업(예: 시퀀스 단위)이 원하는 것이 아니라면, 오프라인에서는 PoolerConfig(task=<task>)로, 온라인에서는 --pooler-config.task <task>로 직접 지정해야 해요.

물론 사용자가 입력·출력 프로세서를 커스터마이즈할 수 있는 "플러그인" 작업도 있어요. 자세한 내용은 IO Processor Plugins를 참고하세요.

Pooling 작업 (Pooling Tasks)

Pooling Tasks Granularity Outputs
classify (see note) Sequence-wise 시퀀스별 클래스 확률 벡터
embed Sequence-wise 시퀀스별 벡터 표현
token_classify Token-wise 토큰별 클래스 확률 벡터
token_embed Token-wise 토큰별 벡터 표현

참고: 분류 작업 안에 cross-encoder(일명 reranker) 모델이라는 특수 하위 범주가 있어요. 두 프롬프트를 입력으로 받고 num_labels가 1인 출력을 내는 분류 모델의 부분집합이에요.

Pooling 타입 (Pooling Types)

Pooling Tasks Granularity Description
CLS pooling Sequence-wise BERT류(양방향 self-attention) 모델에서 기본 사용. 첫 토큰([CLS] 토큰)의 last_hidden_states를 출력으로 취함
LAST pooling Sequence-wise GPT류(causal self-attention) 모델에서 기본 사용. 마지막 토큰의 last_hidden_states를 출력으로 취함
MEAN pooling Sequence-wise 모든 입력 토큰에 대해 last_hidden_states를 평균하는 것이 특정 다운스트림 작업에서 더 좋다는 연구가 많아 점점 더 많이 사용됨
ALL pooling Token-wise 모든 입력 토큰의 last_hidden_states를 출력
STEP pooling Token-wise returned_token_ids가 반환하는 토큰 ID에 해당하는 last_hidden_states를 필터링해 출력

스코어 타입 (Score Types)

스코어링 모델은 두 입력 프롬프트 사이의 유사도 점수를 계산하도록 설계돼요. cross-encoder, late-interaction, bi-encoder 세 가지 모델 타입(일명 score_type)을 지원합니다.

Pooling Tasks Granularity Outputs Score Types scoring function
classify (see note) Sequence-wise 시퀀스별 reranker 점수 cross-encoder linear classifier
embed Sequence-wise 시퀀스별 벡터 표현 bi-encoder cosine similarity
token_classify Token-wise 토큰별 클래스 확률 벡터 N/A N/A
token_embed Token-wise 토큰별 벡터 표현 late-interaction late interaction (MaxSim)

참고: 분류 모델이 num_labels가 1인 출력을 낼 때만 scoring 모델로 사용되고 scoring API가 활성화될 수 있어요.

오프라인 추론 (Offline Inference)

vLLM의 각 pooling 모델은 Pooler.get_supported_tasks에 따라 이 작업 중 하나 이상을 지원하고, 해당 API를 활성화해요.

pooling 용도에 대응하는 오프라인 API

Pooling Usages Dedicated API Pooling task for LLM.encode API Score Types scoring function
Classification Usages LLM.classify(...) classify cross-encoder (see note) linear classifier
Embedding Usages LLM.embed(...) embed bi-encoder cosine similarity
Token Classification Usages N/A token_classify N/A N/A
Token Embedding Usages N/A token_embed late-interaction late interaction(MaxSim)
Reward Usages N/A classify & token_classify N/A N/A
Scoring Usages LLM.score(...) N/A N/A N/A
Plugins Usages N/A plugin N/A N/A

LLM.classify 메서드는 각 프롬프트에 대한 확률 벡터를 출력해요. 주로 분류 모델을 위해 설계되었죠.

각 용도에 대한 자세한 내용은 다음 링크를 참고하세요.

더 알아보기 (Learn more)