Transformers documentation
Çıkarım için uyumlu bir model arka ucu oluşturma
Çıkarım için uyumlu bir model arka ucu oluşturma
Transformers modelleri, vLLM ve SGLang gibi çıkarım motorlarıyla uyumludur. Aynı Transformers modelini her yerde kullanabilir ve her çıkarım motoru için bir modeli sıfırdan yeniden uygulamaktan kaçınabilirsiniz. Model, aşağıda açıklanan dikkat (attention) arka uç arayüzünü desteklediği sürece, bu durum motorun yerel olarak yeniden uygulamadığı modeller için de faydalıdır.
Bu kılavuz, herhangi bir çıkarım motoru için bir arka uç olarak çalışan bir modelin Transformers içinde nasıl uygulanacağını gösterir.
Model uygulaması
Model katkı yönergelerini veya özel model katkı yönergelerini izleyin. Modelin dizininde geçerli bir
config.jsonve yapılandırmadaki model sınıfına işaret eden geçerli birauto_mapalanı bulunmalıdır.Özel ve optimize edilmiş dikkat (attention) işlevleri için AttentionInterface sınıfını kullanın. Bu arayüz, her çıkarım motorunun performans özelliklerini devreye sokar.
Dikkat katmanını tanımlarken
ALL_ATTENTION_FUNCTIONSkullanın ve tabanMyModelsınıfından**kwargsdeğerlerini dikkat katmanlarına iletin. PreTrainedModel içinde_supports_attention_backenddeğeriniTrueolarak ayarlayın.Örnek olarak aşağıdaki kodu genişletin.
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İsteğe bağlı tensör veya boru hattı paralelliğini etkinleştirmek için PreTrainedConfig öğesine aşağıdaki anahtarları ekleyin.
base_model_tp_plan, tam nitelikli katman ad desenlerini gergilik paralelliği stillerine eşleyerek tensor parallelism özelliğini etkinleştirir. Yalnızca"colwise"ve"rowwise"bölme stratejilerini destekler.base_model_pp_plan, doğrudan alt katman adlarını, string listelerinden oluşan tuple'lara eşleyerek pipeline paralelliğini etkinleştirir. Tuple'ın ilk öğesi, girdi argümanlarının adlarını içerir. Son öğe ise modelleme kodundaki katman çıktılarının değişken adlarını içerir.
Örnek olarak aşağıdaki kodu genişletin.
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"]), }
Çok modlu modeller
Çok modlu modeller, görsel dil modeli katkı yönergelerinin ötesinde ek değişiklikler gerektirir. Bu değişiklikler, çok modlu girdilerin doğru şekilde işlenmesini sağlar.
ProcessorMixin sınıfı,
self.image_tokenveself.image_token_idsözniteliklerini içermelidir. Bu yer tutucu jetonlar, girdideki görüntü konumlarını belirtir. Aynı jeton, görüntüler için girdi isteminde ve görüntü özelliklerini dağıtmak için model kodunda yer alır.ProcessorMixin sınıfı bir
self._get_num_multimodal_tokensmetodu içermelidir. Bu metot, verilen boyutlara sahip çok modlu girdiler için gereken yer tutucu token sayısını hesaplar. BirMultiModalDatanesnesi döndürür.<image>token'ları arasındaki yer tutucular, örneğin satır veya sütun token'ları, görsel yer tutucu olarak sayılmaz. Modelleme kodunda daha sonra görsel özelliklerle değiştirilen token'ları sayın.ProcessorMixin sınıfı,
return_mm_token_type_idsdeğerini kontrol etmeli vemm_token_type_idsdeğerini döndürmelidir. Bu, her konumun bir metin jetonu (0), bir görsel yer tutucu jetonu (1) veya bir video yer tutucu jetonu (2) olup olmadığını belirtir. Çok modlu jeton türü kimlik dizileri, ardışık jetonlar arasında kesinti olmadan sürekli olmalıdır. Başlangıç, bitiş, satır ve sütun jetonları için özel jetonlar yer tutucu olarak ele alınmalıdır.
Örnek olarak aşağıdaki kodu genişletin.
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)Kaynaklar
- Daha fazla ayrıntı için Transformers backend integration in vLLM blog yazısını okuyun.
- Daha fazla ayrıntı için SGLang'daki Transformers backend entegrasyonu blog yazısını okuyun.