Transformers documentation
Pipeline
Pipeline
Le Pipeline est une API d’inférence simple mais puissante, immédiatement disponible pour une grande variété de tâches d’apprentissage automatique avec n’importe quel modèle du Hub Hugging Face.
Adaptez le Pipeline à votre tâche à l'aide de paramètres spécifiques, par exemple en ajoutant des horodatages à un pipeline de reconnaissance automatique de la parole (ASR) pour transcrire des notes de réunion. Pipeline prend en charge les GPU, Apple Silicon et les poids en demi-précision afin d'accélérer l'inférence et d'économiser de la mémoire.
Transformers dispose de deux classes de pipeline : le pipeline générique Pipeline et de nombreux pipelines spécifiques à une tâche, comme TextGenerationPipeline. Pour charger ces pipelines individuels, il suffit de définir l'identifiant de tâche dans le paramètre task de Pipeline. Vous trouverez l'identifiant de tâche de chaque pipeline dans sa documentation API.
Chaque tâche est configurée pour utiliser un modèle pré-entraîné et un préprocesseur par défaut, mais cela peut être remplacé au moyen du paramètre model si vous souhaitez utiliser un autre modèle.
Par exemple, pour utiliser TextGenerationPipeline avec Gemma 2, définissez task="text-generation" et model="google/gemma-2-2b".
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b")
pipeline("the secret to baking a really good cake is ")
[{'generated_text': 'the secret to baking a really good cake is 1. the right ingredients 2. the'}]Lorsque vous avez plus d'une entrée, passez-les sous forme de liste.
from transformers import pipeline
from accelerate import Accelerator
device = Accelerator().device
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device=device)
pipeline(["the secret to baking a really good cake is ", "a baguette is "])
[[{'generated_text': 'the secret to baking a really good cake is 1. the right ingredients 2. the'}],
[{'generated_text': 'a baguette is 100% bread.\n\na baguette is 100%'}]]Ce guide vous présente le Pipeline, illustre ses fonctionnalités et montre comment configurer ses différents paramètres.
Tâches
Pipeline est compatible avec de nombreuses tâches d'apprentissage automatique couvrant différentes modalités. Fournissez une entrée appropriée au pipeline et il s'occupera du reste.
Voici quelques exemples d'utilisation de Pipeline pour différentes tâches et modalités.
from transformers import pipeline
pipeline = pipeline(task="automatic-speech-recognition", model="openai/whisper-large-v3")
pipeline("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}from transformers import pipeline
pipeline = pipeline(task="image-classification", model="google/vit-base-patch16-224")
pipeline(images="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
[{'label': 'lynx, catamount', 'score': 0.43350091576576233},
{'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor',
'score': 0.034796204417943954},
{'label': 'snow leopard, ounce, Panthera uncia',
'score': 0.03240183740854263},
{'label': 'Egyptian cat', 'score': 0.02394474856555462},
{'label': 'tiger cat', 'score': 0.02288915030658245}]from transformers import pipeline
pipeline = pipeline(task="visual-question-answering", model="Salesforce/blip-vqa-base")
pipeline(
image="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/idefics-few-shot.jpg",
question="What is in the image?",
)
[{'answer': 'statue of liberty'}]Paramètres
À minima, Pipeline ne requiert qu’un identifiant de tâche, un modèle et l’entrée appropriée. Toutefois, de nombreux paramètres sont disponibles pour configurer le pipeline, des paramètres spécifiques à la tâche à l’optimisation des performances.
Cette section vous présente certains des paramètres les plus importants.
Appareil
Pipeline est compatible avec de nombreux types de matériel, notamment les GPU, les CPU, Apple Silicon et d'autres encore. Configurez le type de matériel à l'aide du paramètre device. Par défaut, lorsque device n'est pas défini, Pipeline place automatiquement le modèle sur le premier accélérateur disponible (GPU CUDA, Apple Silicon MPS, XPU, …) et ne recourt à un CPU que si aucun accélérateur n'est disponible. Passez device="cpu" pour forcer l'exécution sur un CPU.
Pour exécuter Pipeline sur un GPU, définissez device sur l'identifiant de périphérique CUDA associé. Par exemple, device=0 s'exécute sur le premier GPU.
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device=0)
pipeline("the secret to baking a really good cake is ")Vous pouvez également laisser Accelerate, une bibliothèque pour l’entraînement distribué, choisir automatiquement comment charger et stocker les poids du modèle sur l’appareil approprié. C’est particulièrement utile si vous disposez de plusieurs appareils. Accelerate charge et stocke les poids du modèle d’abord sur l’appareil le plus rapide, puis déplace les poids vers d’autres appareils (CPU, disque dur) au besoin. Définissez device_map="auto" pour laisser Accelerate choisir l’appareil.
Vérifiez que Accelerate est installé.
!pip install -U accelerate
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device_map="auto")
pipeline("the secret to baking a really good cake is ")Pour exécuter Pipeline sur Apple silicon, définissez device="mps".
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device="mps")
pipeline("the secret to baking a really good cake is ")Inférence par lots
Pipeline peut également traiter des lots d’entrées à l’aide du paramètre batch_size. L’inférence par lots peut améliorer la vitesse, en particulier sur GPU, mais ce n’est pas garanti. D’autres variables, telles que le matériel, les données et le modèle lui-même, peuvent influencer l’amélioration de la vitesse obtenue par l’inférence par lots. Pour cette raison, l’inférence par lots est désactivée par défaut.
Dans l’exemple ci-dessous, lorsqu’il y a 4 entrées et que batch_size est défini sur 2, Pipeline transmet au modèle un lot de 2 entrées à la fois.
from transformers import pipeline
from accelerate import Accelerator
device = Accelerator().device
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device=device, batch_size=2)
pipeline(["the secret to baking a really good cake is", "a baguette is", "paris is the", "hotdogs are"])
[[{'generated_text': 'the secret to baking a really good cake is to use a good cake mix.\n\ni’'}],
[{'generated_text': 'a baguette is'}],
[{'generated_text': 'paris is the most beautiful city in the world.\n\ni’ve been to paris 3'}],
[{'generated_text': 'hotdogs are a staple of the american diet. they are a great source of protein and can'}]]Un autre bon cas d’usage de l’inférence par lots est le streaming de données dans Pipeline.
from transformers import pipeline
from accelerate import Accelerator
from transformers.pipelines.pt_utils import KeyDataset
import datasets
device = Accelerator().device
# KeyDataset is a utility that returns the item in the dict returned by the dataset
dataset = load_dataset("stanfordnlp/imdb", name="plain_text", split="unsupervised")
pipeline = pipeline(task="text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", device=device)
for out in pipeline(KeyDataset(dataset, "text"), batch_size=8, truncation="only_first"):
print(out)Gardez à l'esprit les règles générales suivantes pour déterminer si l'inférence par lots peut contribuer à améliorer les performances.
- La seule façon d’être certain est de mesurer les performances sur votre modèle, vos données et votre matériel.
- Ne regroupez pas les inférences par lots si vous êtes contraint par la latence (par exemple, un produit d’inférence en direct).
- N’effectuez pas d’inférence par lots si vous utilisez un CPU.
- Ne regroupez pas l’inférence par lots si vous ne connaissez pas la
sequence_lengthde vos données. Mesurez les performances, augmentez itérativementsequence_lengthet incluez des vérifications de dépassement de mémoire (OOM) pour récupérer en cas d’échec. - Effectuez une inférence par lots si votre
sequence_lengthest régulière, et augmentez la taille du lot jusqu’à ce que vous obteniez une erreur OOM. Plus la GPU est grande, plus l’inférence par lots est utile. - Assurez-vous de pouvoir gérer les erreurs OOM si vous décidez d’effectuer une inférence par lots.
Paramètres spécifiques à la tâche
Pipeline accepte tous les paramètres pris en charge par chaque pipeline de tâche individuel. Pensez à consulter chaque pipeline de tâche pour découvrir les types de paramètres disponibles. Si vous ne trouvez pas un paramètre utile pour votre cas d’usage, n’hésitez pas à ouvrir un issue sur GitHub pour le demander !
Les exemples ci-dessous illustrent certains des paramètres spécifiques à la tâche disponibles.
Transmettez le paramètre return_timestamps="word" à Pipeline pour obtenir le moment où chaque mot a été prononcé.
from transformers import pipeline
pipeline = pipeline(task="automatic-speech-recognition", model="openai/whisper-large-v3")
pipeline(audio="https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac", return_timestamps="word")
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.',
'chunks': [{'text': ' I', 'timestamp': (0.0, 1.1)},
{'text': ' have', 'timestamp': (1.1, 1.44)},
{'text': ' a', 'timestamp': (1.44, 1.62)},
{'text': ' dream', 'timestamp': (1.62, 1.92)},
{'text': ' that', 'timestamp': (1.92, 3.7)},
{'text': ' one', 'timestamp': (3.7, 3.88)},
{'text': ' day', 'timestamp': (3.88, 4.24)},
{'text': ' this', 'timestamp': (4.24, 5.82)},
{'text': ' nation', 'timestamp': (5.82, 6.78)},
{'text': ' will', 'timestamp': (6.78, 7.36)},
{'text': ' rise', 'timestamp': (7.36, 7.88)},
{'text': ' up', 'timestamp': (7.88, 8.46)},
{'text': ' and', 'timestamp': (8.46, 9.2)},
{'text': ' live', 'timestamp': (9.2, 10.34)},
{'text': ' out', 'timestamp': (10.34, 10.58)},
{'text': ' the', 'timestamp': (10.58, 10.8)},
{'text': ' true', 'timestamp': (10.8, 11.04)},
{'text': ' meaning', 'timestamp': (11.04, 11.4)},
{'text': ' of', 'timestamp': (11.4, 11.64)},
{'text': ' its', 'timestamp': (11.64, 11.8)},
{'text': ' creed.', 'timestamp': (11.8, 12.3)}]}Passez return_full_text=False à Pipeline pour ne renvoyer que le texte généré, au lieu du texte complet (invite et texte généré).
call() prend également en charge des arguments nommés supplémentaires issus de la méthode generate(). Pour renvoyer plus d'une séquence générée, définissez num_return_sequences sur une valeur supérieure à 1.
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="openai-community/gpt2")
pipeline("the secret to baking a good cake is", num_return_sequences=4, return_full_text=False)
[{'generated_text': ' how easy it is for me to do it with my hands. You must not go nuts, or the cake is going to fall out.'},
{'generated_text': ' to prepare the cake before baking. The key is to find the right type of icing to use and that icing makes an amazing frosting cake.\n\nFor a good icing cake, we give you the basics'},
{'generated_text': " to remember to soak it in enough water and don't worry about it sticking to the wall. In the meantime, you could remove the top of the cake and let it dry out with a paper towel.\n"},
{'generated_text': ' the best time to turn off the oven and let it stand 30 minutes. After 30 minutes, stir and bake a cake in a pan until fully moist.\n\nRemove the cake from the heat for about 12'}]Batching de chunks
Il existe certains cas où vous devez traiter les données par lots.
- pour certains types de données, une seule entrée (par exemple, un fichier audio très long) peut devoir être découpée en plusieurs parties avant de pouvoir être traitée
- pour certaines tâches, comme la classification en zéro tir ou la réponse à des questions, une seule entrée peut nécessiter plusieurs passes avant, ce qui peut poser des problèmes avec le paramètre
batch_size
La classe ChunkPipeline est conçue pour gérer ces cas d’utilisation. Les deux classes de pipeline s’utilisent de la même manière, mais comme ChunkPipeline peut gérer automatiquement le groupement par lots, vous n’avez pas à vous soucier du nombre de passes avant que vos entrées déclenchent. Vous pouvez donc optimiser batch_size indépendamment des entrées.
L'exemple ci-dessous montre en quoi il diffère de Pipeline.
# ChunkPipeline
all_model_outputs = []
for preprocessed in pipeline.preprocess(inputs):
model_outputs = pipeline.model_forward(preprocessed)
all_model_outputs.append(model_outputs)
outputs =pipeline.postprocess(all_model_outputs)
# Pipeline
preprocessed = pipeline.preprocess(inputs)
model_outputs = pipeline.forward(preprocessed)
outputs = pipeline.postprocess(model_outputs)Jeux de données volumineux
Pour l’inférence sur de grands jeux de données, vous pouvez itérer directement sur le jeu de données lui-même. Cela évite d’allouer immédiatement la mémoire pour l’ensemble du jeu de données, et vous n’avez pas à vous soucier de créer les lots vous-même. Essayez l’inférence par lots avec le paramètre batch_size pour voir si cela améliore les performances.
from transformers.pipelines.pt_utils import KeyDataset
from transformers import pipeline
from accelerate import Accelerator
from datasets import load_dataset
device = Accelerator().device
dataset = load_dataset("stanfordnlp/imdb", name="plain_text", split="unsupervised")
pipeline = pipeline(task="text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", device=device)
for out in pipeline(KeyDataset(dataset, "text"), batch_size=8, truncation="only_first"):
print(out)D'autres façons d'exécuter l'inférence sur de grands jeux de données avec Pipeline consistent à utiliser un itérateur ou un générateur.
def data():
for i in range(1000):
yield f"My example {i}"
pipeline = pipeline(model="openai-community/gpt2", device=0)
generated_characters = 0
for out in pipeline(data()):
generated_characters += len(out[0]["generated_text"])Grands modèles
Accelerate permet d'appliquer plusieurs optimisations pour l'exécution de grands modèles avec Pipeline. Assurez-vous d'abord que Accelerate est installé.
!pip install -U accelerate
Le paramètre device_map="auto" est utile pour distribuer automatiquement le modèle sur les dispositifs les plus rapides (GPU) en priorité, avant de le répartir sur d'autres dispositifs plus lents s'ils sont disponibles (CPU, disque dur).
Pipeline prend en charge les poids en demi-précision (torch.float16), ce qui peut être nettement plus rapide et économiser de la mémoire. La perte de performances est négligeable pour la plupart des modèles, en particulier pour les plus grands. Si votre matériel le permet, vous pouvez activer torch.bfloat16 à la place pour bénéficier d'une plage dynamique plus large.
Les entrées sont converties en interne en torch.float16 et ne fonctionne que pour les modèles avec un backend PyTorch.
Enfin, Pipeline accepte également les modèles quantifiés afin de réduire encore davantage l’utilisation de la mémoire. Assurez-vous d’abord d’avoir installé la bibliothèque bitsandbytes, puis ajoutez quantization_config à model_kwargs dans le pipeline.
import torch
from transformers import pipeline, BitsAndBytesConfig
pipeline = pipeline(model="google/gemma-7b", dtype=torch.bfloat16, device_map="auto", model_kwargs={"quantization_config": BitsAndBytesConfig(load_in_8bit=True)})
pipeline("the secret to baking a good cake is ")
[{'generated_text': 'the secret to baking a good cake is 1. the right ingredients 2. the right'}]