Pooling 모델
Pooling 모델 (Pooling Models)
참고: 현재 pooling 모델은 주로 편의를 위해 지원해요. Hugging Face Transformers나 Sentence Transformers를 직접 쓰는 것에 비해 성능 개선을 보장하지 않아요. vLLM에서 pooling 모델을 최적화할 계획이 있으니, 의견이 있다면 Issue #21796에 남겨주세요.
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 메서드는 각 프롬프트에 대한 확률 벡터를 출력해요. 주로 분류 모델을 위해 설계되었죠.
각 용도에 대한 자세한 내용은 다음 링크를 참고하세요.
- Classification Usages
- Embedding Usages
- Token Classification Usages
- Token Embedding Usages
- Reward Usages
- Scoring Usages