Transformers documentation
추론을 위한 호환 가능한 모델 백엔드 구축
추론을 위한 호환 가능한 모델 백엔드 구축
Transformers 모델은 vLLM 및 SGLang과 같은 추론 엔진과 호환됩니다. 동일한 Transformers 모델을 어디에서나 사용할 수 있으며, 각 추론 엔진마다 모델을 처음부터 다시 구현할 필요가 없습니다. 이는 해당 엔진이 기본적으로 재구현하지 않는 모델의 경우에도, 아래에 설명된 어텐션 백엔드 인터페이스를 모델이 지원하기만 하면 유용합니다.
이 가이드는 Transformers에서 추론 엔진의 백엔드로 작동하는 모델을 구현하는 방법을 보여줍니다.
모델 구현
모델 기여 가이드라인 또는 커스텀 모델 기여 가이드라인을 따르세요. 모델 디렉터리에는 유효한
config.json이 있어야 하며, config에서 모델 클래스를 가리키는 유효한auto_map필드가 있어야 합니다.커스텀 및 최적화된 어텐션 함수에는 AttentionInterface 클래스를 사용합니다. 이 인터페이스를 통해 각 추론 엔진의 성능 기능을 활용할 수 있습니다.
ALL_ATTENTION_FUNCTIONS를 사용하여 attention 레이어를 정의하고, baseMyModel클래스에서**kwargs를 attention 레이어로 전달하세요. PreTrainedModel에서_supports_attention_backend를True로 설정하세요.아래 코드를 확장하여 예시를 확인해 보세요.
modeling_my_model.py
from transformers import PreTrainedModel from transformers.modeling_utils import ALL_ATTENTION_FUNCTIONS from torch import nn class MyAttention(nn.Module): def forward(self, hidden_states, **kwargs): ... attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation] attn_output, attn_weights = attention_interface( self, query_states, key_states, value_states, **kwargs, ) ... class MyModel(PreTrainedModel): _supports_attention_backend = True다음 키를 PreTrainedConfig에 추가하여 선택적 텐서 또는 파이프라인 병렬성을 활성화합니다.
base_model_tp_plan은 완전한 계층 이름 패턴을 텐서 병렬 스타일에 매핑하여 tensor parallelism을 활성화합니다."colwise"및"rowwise"분할 전략만 지원합니다.base_model_pp_plan은 직접 자식 레이어 이름을 문자열 목록의 튜플에 매핑하여 파이프라인 병렬성을 활성화합니다. 튜플의 첫 번째 요소에는 입력 인수의 이름이 포함됩니다. 마지막 요소에는 모델링 코드에서 레이어 출력의 변수 이름이 포함됩니다.
아래 코드를 확장하여 예시를 확인해 보세요.
configuration_my_model.py
from transformers import PreTrainedConfig class MyConfig(PreTrainedConfig): base_model_tp_plan = { "layers.*.self_attn.k_proj": "colwise", "layers.*.self_attn.v_proj": "colwise", "layers.*.self_attn.o_proj": "rowwise", "layers.*.mlp.gate_proj": "colwise", "layers.*.mlp.up_proj": "colwise", "layers.*.mlp.down_proj": "rowwise", } base_model_pp_plan = { "embed_tokens": (["input_ids"], ["inputs_embeds"]), "layers": (["hidden_states", "attention_mask"], ["hidden_states"]), "norm": (["hidden_states"], ["hidden_states"]), }
멀티모달 모델
멀티모달 모델은 비전 언어 모델 기여 가이드라인 외에도 추가적인 변경 사항이 필요합니다. 이러한 변경 사항은 멀티모달 입력이 올바르게 처리되도록 보장합니다.
ProcessorMixin 클래스에는
self.image_token및self.image_token_ids속성이 포함되어야 합니다. 이러한 플레이스홀더 토큰은 입력 내의 이미지 위치를 나타냅니다. 동일한 토큰은 이미지용 입력 프롬프트와 이미지 특징을 분산(scatter)하는 모델 코드에 모두 나타납니다.ProcessorMixin 클래스에는
self._get_num_multimodal_tokens메서드가 포함되어야 합니다. 이 메서드는 주어진 크기의 멀티모달 입력에 필요한 플레이스홀더 토큰 수를 계산합니다. 반환값은MultiModalData객체입니다.<image>토큰 사이의 행 또는 열 토큰과 같은 플레이스홀더는 이미지 플레이스홀더로 계산하지 않습니다. 모델링 코드에서 나중에 이미지 특징으로 대체되는 토큰만 계산하십시오.ProcessorMixin 클래스는
return_mm_token_type_ids의 값을 확인하고mm_token_type_ids를 반환해야 합니다. 이는 각 위치가 텍스트 토큰(0), 이미지 플레이스홀더 토큰(1), 또는 비디오 플레이스홀더 토큰(2)인지 나타냅니다. 멀티모달 토큰 타입 id 시퀀스는 연속적이어야 하며, 연속된 토큰 사이에 끊김이 없어야 합니다. 시작, 종료, 행, 열 토큰에 대한 특수 토큰은 플레이스홀더로 취급합니다.
아래 코드를 확장하여 예시를 확인해 보세요.
modeling_my_multimodal_model.py
class MyMultimodalProcessor(ProcessorMixin):
def __call__(self, images=None, text=None, **kwargs):
if return_mm_token_type_ids:
mm_token_type_ids = np.zeros_like(input_ids)
mm_token_type_ids[input_ids == self.image_token_id] = 1
text_inputs["mm_token_type_ids"] = mm_token_type_ids.tolist()
return BatchFeature(data={**text_inputs, **image_inputs}, tensor_type=return_tensors)
def _get_num_multimodal_tokens(self, image_sizes=None, **kwargs):
"""
Computes the number of placeholder tokens needed for multimodal inputs with the given sizes.
Args:
image_sizes (`list[list[int]]`, *optional*):
The input sizes formatted as (height, width) per each image.
Returns:
`MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided
input modalities, along with other useful data.
"""
vision_data = {}
if image_sizes is not None:
num_image_tokens = [256] * len(image_sizes) # 256 placeholder tokens for each image always
num_image_patches = [1] * len(image_sizes) # no patching, thus each image is processed as a single base image
vision_data.update({"num_image_tokens": num_image_tokens, "num_image_patches": num_image_patches})
return MultiModalData(**vision_data)리소스
- 자세한 내용은 Transformers backend integration in vLLM 블로그 게시물을 참고하세요.
- 자세한 내용은 SGLang의 Transformers 백엔드 통합 블로그 게시물을 참고하세요.