Transformers documentation
Yeni bir pipeline ekleme
Yeni bir pipeline ekleme
Pipeline sınıfını alt sınıflandırarak ve birkaç metodu uygulayarak kendinize göre özelleştirin. Kodu toplulukla Hub üzerinde paylaşın ve pipeline'ı Transformers'a kaydedin ki herkes onu hızlı ve kolay bir şekilde kullanabilsin.
Bu kılavuz, Transformers kütüphanesine yeni bir pipeline ekleme sürecini adım adım anlatır.
Tasarım tercihleri
En azından, Pipeline bileşenine bir görev için uygun bir girdi sağlamanız yeterlidir. Pipeline'ınızı tasarlarken de buradan başlamanız gerekir.
Pipeline'in kabul edebileceği giriş türlerini belirleyin. Bunlar dizeler, ham baytlar, sözlükler vb. olabilir. Mümkün olduğunda girdileri saf Python'da tutmaya çalışın çünkü bu daha uyumludur. Ardından, Pipeline'in döndürmesi gereken çıktıyı belirleyin. Yine, çıktının Python'da tutulması en basit ve en iyi seçenektir çünkü çalışması daha kolaydır.
Girdileri ve çıktıları basit tutmak ve ideal olarak JSON-serializable (JSON’a dönüştürülebilir) kılmak, kullanıcıların yeni nesne türlerini öğrenmek zorunda kalmadan Pipeline’ınızı çalıştırmasını kolaylaştırır. Kullanımı daha da kolaylaştırmak için birçok farklı girdi türünü desteklemek de yaygındır. Örneğin, bir ses dosyasını dosya adı, URL veya ham baytlar olarak kabul etmek, kullanıcının ses verisini sağlama biçiminde daha fazla esneklik kazanmasını sağlar.
Bir pipeline oluşturun
Girdi ve çıktı belirlendikten sonra Pipeline uygulamasına başlayabilirsiniz. Boru hattınız, temel Pipeline sınıfından devralmalı ve 4 yöntem içermelidir.
from transformers import Pipeline
class MyPipeline(Pipeline):
def _sanitize_parameters(self, **kwargs):
def preprocess(self, inputs, args=2):
def _forward(self, model_inputs):
def postprocess(self, model_outputs):preprocess, girdileri alır ve bunları modelin uygun girdi biçimine dönüştürür.
def preprocess(self, inputs, maybe_arg=2):
model_input = Tensor(inputs["input_ids"])
return {"model_input": model_input}_forwarddoğrudan çağrılmamalıdır.forward, beklenen cihazda her şeyin doğru çalışmasını sağlamak için güvenlik önlemleri içerdiği için tercih edilen yöntemdir. Modelle ilgili her şey_forwardiçinde, geri kalan her şey isepreprocessveyapostprocessiçinde yer almalıdır.
def _forward(self, model_inputs):
outputs = self.model(**model_inputs)
return outputspostprocess,_forwardiçindeki model çıktısından nihai çıktıyı üretir.
def postprocess(self, model_outputs, top_k=5):
best_class = model_outputs["logits"].softmax(-1)
return best_class_sanitize_parameters, kullanıcılara Pipeline'e ek parametreler geçmesine olanak tanır. Bu, başlatma sırasında veya Pipeline çağrıldığında olabilir._sanitize_parameters, doğrudanpreprocess,_forwardvepostprocess'e iletilen ek anahtar kelime argümanlarını içeren 3 sözlük döndürür. Kullanıcı pipeline'ı ek parametrelerle çağırmadıysa hiçbir şey ekleme. Bu, fonksiyon tanımındaki varsayılan argümanları korur ve her zaman daha doğal bir yaklaşımdır.
Örneğin, en olası 5 sınıfı döndürmek için postprocess içinde bir top_k parametresi ekleyin. Ardından _sanitize_parameters içinde kullanıcının top_k gönderip göndermediğini kontrol edin ve postprocess_kwargs içine ekleyin.
def _sanitize_parameters(self, **kwargs):
preprocess_kwargs = {}
if "maybe_arg" in kwargs:
preprocess_kwargs["maybe_arg"] = kwargs["maybe_arg"]
postprocess_kwargs = {}
if "top_k" in kwargs:
postprocess_kwargs["top_k"] = kwargs["top_k"]
return preprocess_kwargs, {}, postprocess_kwargsArtık pipeline, kullanıcı isterse en olası etiketleri döndürebilir.
from transformers import pipeline
pipeline = pipeline("my-task")
# returns 3 most likely labels
pipeline("This is the best meal I've ever had", top_k=3)
# returns 5 most likely labels by default
pipeline("This is the best meal I've ever had")Bir pipeline kaydet
Hattınızın desteklediği yeni görevi PIPELINE_REGISTRY içinde kaydedin. Kayıt defteri şunları tanımlar:
pt_modelile desteklenen Pytorch model sınıfıdefaultile modelin beklenen şekilde çalıştığı, belirli bir revizyondan (dal veya commit hash) gelmesi gereken varsayılan modeltypetüründe beklenen girdi
from transformers.pipelines import PIPELINE_REGISTRY
from transformers import AutoModelForSequenceClassification
PIPELINE_REGISTRY.register_pipeline(
"new-task",
pipeline_class=MyPipeline,
pt_model=AutoModelForSequenceClassification,
default={"pt": ("user/awesome-model", "branch-name")},
type="text",
)Hattınızı paylaşın
Hattınızı toplulukla Hub üzerinden paylaşabilir veya doğrudan Transformers'a ekleyebilirsiniz.
Hızlı bir şekilde pipeline kodunuzu Hub'a yüklemeniz, Transformers ekibinden bir inceleme gerektirmediği için daha hızlıdır. Pipeline'ı Transformers'a eklemek, bir inceleme gerektirdiği ve Pipeline'ınızın çalıştığını doğrulamak için testler eklemeniz gerektiği için daha yavaş olabilir.
Hub'a Yükle
Hattınızın kodunu bir Python dosyasına ekleyin ve Hub'a yükleyin.
Örneğin, cümle çifti sınıflandırma için özel bir pipeline aşağıdaki kod gibi görünebilir.
import numpy as np
from transformers import Pipeline
def softmax(outputs):
maxes = np.max(outputs, axis=-1, keepdims=True)
shifted_exp = np.exp(outputs - maxes)
return shifted_exp / shifted_exp.sum(axis=-1, keepdims=True)
class PairClassificationPipeline(Pipeline):
def _sanitize_parameters(self, **kwargs):
preprocess_kwargs = {}
if "second_text" in kwargs:
preprocess_kwargs["second_text"] = kwargs["second_text"]
return preprocess_kwargs, {}, {}
def preprocess(self, text, second_text=None):
return self.tokenizer(text, text_pair=second_text, return_tensors=self.framework)
def _forward(self, model_inputs):
return self.model(**model_inputs)
def postprocess(self, model_outputs):
logits = model_outputs.logits[0].numpy()
probabilities = softmax(logits)
best_class = np.argmax(probabilities)
label = self.model.config.id2label[best_class]
score = probabilities[best_class].item()
logits = logits.tolist()
return {"label": label, "score": score, "logits": logits}Kodu pair_classification.py adlı bir dosyada kaydedin ve aşağıda gösterildiği gibi içe aktarıp kaydedin.
from pair_classification import PairClassificationPipeline
from transformers.pipelines import PIPELINE_REGISTRY
from transformers import AutoModelForSequenceClassification
PIPELINE_REGISTRY.register_pipeline(
"pair-classification",
pipeline_class=PairClassificationPipeline,
pt_model=AutoModelForSequenceClassification,
)register_pipeline işlevi, hattın ayrıntılarını (görev türü, hat sınıfı, desteklenen arka uçlar) modellerin config.json dosyasına kaydeder.
"custom_pipelines": {
"pair-classification": {
"impl": "pair_classification.PairClassificationPipeline",
"pt": [
"AutoModelForSequenceClassification"
],
}
},Hatta göndermek için push_to_hub() çağrın. Kodu içeren Python dosyası Hub'a kopyalanır ve pipeline'ın modeli ile tokenizer'ı da Hub'a kaydedilip gönderilir. Pipeline'ınız artık Hub'da ad alanınız altında kullanılabilir olmalıdır.
from transformers import pipeline
pipeline = pipeline(task="pair-classification", model="sgugger/finetuned-bert-mrpc")
pipeline.push_to_hub("pair-classification-pipeline")Pipeline'i kullanmak için pipeline'ı yüklerken trust_remote_code=True parametresini ekleyin.
from transformers import pipeline
pipeline = pipeline(task="pair-classification", trust_remote_code=True)Transformers'a ekle
Transformers'a özel bir pipeline eklemek, her şeyin beklenildiği gibi çalıştığını doğrulamak için testler eklemeyi ve Transformers ekibinden inceleme talep etmeyi gerektirir.
Hattınızın kodunu pipelines alt modülüne yeni bir modül olarak ekleyin ve pipelines/init.py içinde tanımlanan görev listesine ekleyin.
Ardından, transformers/tests/pipelines içindeki pipeline için yeni bir test ekleyin. Pipeline'ınızı nasıl test edeceğinize dair örnekler için diğer testlere göz atabilirsiniz.
run_pipeline_test fonksiyonu çok genel olmalı ve model_mapping içinde tanımlanan modellerde çalışmalıdır. Bu, yeni modellerle gelecekteki uyumluluğun test edilmesi açısından önemlidir.
Ayrıca run_pipeline_test fonksiyonunun tamamında ANY'nin kullanıldığını da göreceksiniz. Modeller rastgele olduğu için gerçek değerleri kontrol edemezsiniz. ANY kullanmak, testin pipeline türünün çıktısıyla eşleşmesine olanak tanır.
Son olarak, aşağıdaki 4 testi de uygulamanız gerekir.
- test_small_model_pt, bu pipeline'ler için küçük bir model kullanın ve doğru çıktıları döndürdüklerinden emin olun. Sonuçların anlamlı olması gerekmez. Her pipeline aynı sonucu döndürmelidir.
- test_large_model_pt, bu iş akışlarının anlamlı sonuçlar döndürdüğünden emin olmak için gerçekçi bir model kullanın. Bu testler yavaştır ve yavaş olarak işaretlenmelidir.