, ...]
+```
+
Both videos have cats.
diff --git a/docs/source/es/chat_templating.md b/docs/source/es/chat_templating.md
index e287c2137435..5864da22b498 100644
--- a/docs/source/es/chat_templating.md
+++ b/docs/source/es/chat_templating.md
@@ -55,6 +55,7 @@ Observa cómo todo el chat se condensa en una sola cadena. Si usamos `tokenize=T
Ten en cuenta que esta vez, el tokenizador ha añadido los tokens de control [INST] y [/INST] para indicar el inicio y el final de los mensajes de usuario (¡pero no de los mensajes del asistente!). Mistral-instruct fue entrenado con estos tokens, pero BlenderBot no lo fue.
+Además, con la introducción de la nueva funcionalidad de `ImageTextToTextPipeline`, ahora es posible integrar imágenes en las conversaciones de chat. Esto permite que los modelos manejen tareas multimodales, como responder preguntas visuales o generar texto basado en imágenes. Para utilizar esta funcionalidad, las imágenes se pueden incluir en el contenido del mensaje como un tipo de entrada adicional, lo que amplía las capacidades de los modelos de chat para interactuar con entradas visuales y textuales de manera integrada.
## ¿Cómo uso las plantillas de chat?
Como puedes ver en el ejemplo anterior, las plantillas de chat son fáciles de usar. Simplemente construye una lista de mensajes, con claves de `rol` y `contenido`, y luego pásala al método [`~PreTrainedTokenizer.apply_chat_template`]. Una vez que hagas eso, ¡obtendrás una salida lista para usar! Al utilizar plantillas de chat como entrada para la generación de modelos, también es una buena idea usar `add_generation_prompt=True` para agregar una [indicación de generación](#¿Qué-son-los-"generation-prompts"?).
@@ -69,12 +70,12 @@ tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint) # You may want to use bfloat16 and/or move to GPU here
messages = [
- {
- "role": "system",
- "content": "You are a friendly chatbot who always responds in the style of a pirate",
- },
- {"role": "user", "content": "How many helicopters can a human eat in one sitting?"},
- ]
+{
+"role": "system",
+"content": "You are a friendly chatbot who always responds in the style of a pirate",
+},
+{"role": "user", "content": "How many helicopters can a human eat in one sitting?"},
+]
tokenized_chat = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt")
print(tokenizer.decode(tokenized_chat[0]))
```
@@ -83,16 +84,16 @@ Esto generará una cadena en el formato de entrada que Zephyr espera.
```text
<|system|>
-You are a friendly chatbot who always responds in the style of a pirate
+You are a friendly chatbot who always responds in the style of a pirate
<|user|>
-How many helicopters can a human eat in one sitting?
+How many helicopters can a human eat in one sitting?
<|assistant|>
```
Ahora que nuestra entrada está formateada correctamente para Zephyr, podemos usar el modelo para generar una respuesta a la pregunta del usuario:
```python
-outputs = model.generate(tokenized_chat, max_new_tokens=128)
+outputs = model.generate(tokenized_chat, max_new_tokens=128)
print(tokenizer.decode(outputs[0]))
```
@@ -100,9 +101,9 @@ Esto producirá:
```text
<|system|>
-You are a friendly chatbot who always responds in the style of a pirate
+You are a friendly chatbot who always responds in the style of a pirate
<|user|>
-How many helicopters can a human eat in one sitting?
+How many helicopters can a human eat in one sitting?
<|assistant|>
Matey, I'm afraid I must inform ye that humans cannot eat helicopters. Helicopters are not food, they are flying machines. Food is meant to be eaten, like a hearty plate o' grog, a savory bowl o' stew, or a delicious loaf o' bread. But helicopters, they be for transportin' and movin' around, not for eatin'. So, I'd say none, me hearties. None at all.
```
@@ -118,11 +119,11 @@ from transformers import pipeline
pipe = pipeline("conversational", "HuggingFaceH4/zephyr-7b-beta")
messages = [
- {
- "role": "system",
- "content": "You are a friendly chatbot who always responds in the style of a pirate",
- },
- {"role": "user", "content": "How many helicopters can a human eat in one sitting?"},
+{
+"role": "system",
+"content": "You are a friendly chatbot who always responds in the style of a pirate",
+},
+{"role": "user", "content": "How many helicopters can a human eat in one sitting?"},
]
print(pipe(messages, max_new_tokens=128)[0]['generated_text'][-1]) # Print the assistant's response
```
@@ -140,9 +141,9 @@ Puede que hayas notado que el método `apply_chat_template` tiene un argumento `
```python
messages = [
- {"role": "user", "content": "Hi there!"},
- {"role": "assistant", "content": "Nice to meet you!"},
- {"role": "user", "content": "Can I ask a question?"}
+{"role": "user", "content": "Hi there!"},
+{"role": "assistant", "content": "Nice to meet you!"},
+{"role": "user", "content": "Can I ask a question?"}
]
```
@@ -188,12 +189,12 @@ from datasets import Dataset
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-beta")
chat1 = [
- {"role": "user", "content": "Which is bigger, the moon or the sun?"},
- {"role": "assistant", "content": "The sun."}
+{"role": "user", "content": "Which is bigger, the moon or the sun?"},
+{"role": "assistant", "content": "The sun."}
]
chat2 = [
- {"role": "user", "content": "Which is bigger, a virus or a bacterium?"},
- {"role": "assistant", "content": "A bacterium."}
+{"role": "user", "content": "Which is bigger, a virus or a bacterium?"},
+{"role": "assistant", "content": "A bacterium."}
]
dataset = Dataset.from_dict({"chat": [chat1, chat2]})
@@ -228,13 +229,13 @@ La plantilla de chat para un modelo se almacena en el atributo `tokenizer.chat_t
```
{% for message in messages %}
- {% if message['role'] == 'user' %}
- {{ ' ' }}
- {% endif %}
- {{ message['content'] }}
- {% if not loop.last %}
- {{ ' ' }}
- {% endif %}
+{% if message['role'] == 'user' %}
+{{ ' ' }}
+{% endif %}
+{{ message['content'] }}
+{% if not loop.last %}
+{{ ' ' }}
+{% endif %}
{% endfor %}
{{ eos_token }}
```
@@ -243,11 +244,11 @@ Si nunca has visto uno de estos antes, esto es una [plantilla de Jinja](https://
```python
for idx, message in enumerate(messages):
- if message['role'] == 'user':
- print(' ')
- print(message['content'])
- if not idx == len(messages) - 1: # Check for the last message in the conversation
- print(' ')
+if message['role'] == 'user':
+print(' ')
+print(message['content'])
+if not idx == len(messages) - 1: # Check for the last message in the conversation
+print(' ')
print(eos_token)
```
@@ -260,13 +261,13 @@ Esta es una plantilla bastante simple: no añade ningún token de control y no a
```
{% for message in messages %}
- {% if message['role'] == 'user' %}
- {{ bos_token + '[INST] ' + message['content'] + ' [/INST]' }}
- {% elif message['role'] == 'system' %}
- {{ '<>\\n' + message['content'] + '\\n<>\\n\\n' }}
- {% elif message['role'] == 'assistant' %}
- {{ ' ' + message['content'] + ' ' + eos_token }}
- {% endif %}
+{% if message['role'] == 'user' %}
+{{ bos_token + '[INST] ' + message['content'] + ' [/INST]' }}
+{% elif message['role'] == 'system' %}
+{{ '<>\\n' + message['content'] + '\\n<>\\n\\n' }}
+{% elif message['role'] == 'assistant' %}
+{{ ' ' + message['content'] + ' ' + eos_token }}
+{% endif %}
{% endfor %}
```
@@ -280,13 +281,13 @@ Simple, solo escribe una plantilla de Jinja y establece `tokenizer.chat_template
```
{% for message in messages %}
- {% if message['role'] == 'user' %}
- {{ bos_token + '[INST] ' + message['content'].strip() + ' [/INST]' }}
- {% elif message['role'] == 'system' %}
- {{ '<>\\n' + message['content'].strip() + '\\n<>\\n\\n' }}
- {% elif message['role'] == 'assistant' %}
- {{ '[ASST] ' + message['content'] + ' [/ASST]' + eos_token }}
- {% endif %}
+{% if message['role'] == 'user' %}
+{{ bos_token + '[INST] ' + message['content'].strip() + ' [/INST]' }}
+{% elif message['role'] == 'system' %}
+{{ '<>\\n' + message['content'].strip() + '\\n<>\\n\\n' }}
+{% elif message['role'] == 'assistant' %}
+{{ '[ASST] ' + message['content'] + ' [/ASST]' + eos_token }}
+{% endif %}
{% endfor %}
```
@@ -315,7 +316,7 @@ Si estás entrenando un modelo desde cero o ajustando finamente un modelo de len
```
{% for message in messages %}
- {{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}
+{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}
{% endfor %}
```
diff --git a/docs/source/fr/quicktour.md b/docs/source/fr/quicktour.md
index 3cc2a8c5faac..ab388a090063 100644
--- a/docs/source/fr/quicktour.md
+++ b/docs/source/fr/quicktour.md
@@ -64,6 +64,7 @@ Le [`pipeline`] est le moyen le plus simple d'utiliser un modèle pré-entraîn
| Classification d'audio | Attribue une catégorie à un fichier audio | Audio | pipeline(task="audio-classification") |
| Reconnaissance automatique de la parole | Extrait le discours d'un fichier audio en texte | Audio | pipeline(task="automatic-speech-recognition") |
| Question réponse visuels | Etant données une image et une question, répond correctement à une question sur l'image | Modalités multiples | pipeline(task="vqa") |
+| Image-texte à texte | Génère du texte à partir d'une image et d'un texte donnés | Modalités multiples | pipeline(task="image-text-to-text") |
Commencez par créer une instance de [`pipeline`] et spécifiez la tâche pour laquelle vous souhaitez l'utiliser. Vous pouvez utiliser le [`pipeline`] pour n'importe laquelle des tâches mentionnées dans le tableau précédent. Pour obtenir une liste complète des tâches prises en charge, consultez la documentation de l'[API pipeline](./main_classes/pipelines). Dans ce guide, nous utiliserons le [`pipeline`] pour l'analyse des sentiments à titre d'exemple :
@@ -80,6 +81,20 @@ Le [`pipeline`] télécharge et stocke en cache un [modèle pré-entraîné](htt
[{'label': 'POSITIVE', 'score': 0.9998}]
```
+Si vous voulez classifier plus qu'un texte, donnez une liste de textes au [`pipeline`] pour obtenir une liste de dictionnaires en retour :
+```py
+>>> from transformers import pipeline
+
+>>> classifier = pipeline("sentiment-analysis")
+```
+
+Le [`pipeline`] télécharge et stocke en cache un [modèle pré-entraîné](https://huggingface.co/distilbert/distilbert-base-uncased-finetuned-sst-2-english) et un tokenizer par défaut pour l'analyse des sentiments. Vous pouvez maintenant utiliser le `classifier` sur le texte de votre choix :
+
+```py
+>>> classifier("We are very happy to show you the 🤗 Transformers library.")
+[{'label': 'POSITIVE', 'score': 0.9998}]
+```
+
Si vous voulez classifier plus qu'un texte, donnez une liste de textes au [`pipeline`] pour obtenir une liste de dictionnaires en retour :
```py
@@ -123,7 +138,6 @@ Extrayez les tableaux de formes d'ondes brutes des quatre premiers échantillons
```
Pour les ensembles de données plus importants où les entrées sont volumineuses (comme dans les domaines de la parole ou de la vision), utilisez plutôt un générateur au lieu d'une liste pour charger toutes les entrées en mémoire. Pour plus d'informations, consultez la documentation de l'[API pipeline](./main_classes/pipelines).
-
### Utiliser une autre modèle et tokenizer dans le pipeline
Le [`pipeline`] peut être utilisé avec n'importe quel modèle du [Hub](https://huggingface.co/models), ce qui permet d'adapter facilement le [`pipeline`] à d'autres cas d'utilisation. Par exemple, si vous souhaitez un modèle capable de traiter du texte français, utilisez les filtres du Hub pour trouver un modèle approprié. Le premier résultat renvoie un [modèle BERT](https://huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment) multilingue finetuné pour l'analyse des sentiments que vous pouvez utiliser pour le texte français :
@@ -192,8 +206,8 @@ Passez votre texte au tokenizer :
>>> encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
>>> print(encoding)
{'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
- 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
+'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
```
Le tokenizer retourne un dictionnaire contenant :
@@ -269,7 +283,7 @@ Le modèle produit les activations finales dans l'attribut `logits`. Appliquez l
>>> pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
>>> print(pt_predictions)
tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
- [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=)
+[0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=)
```
@@ -412,61 +426,61 @@ En fonction de votre tâche, vous passerez généralement les paramètres suivan
1. Un [`PreTrainedModel`] ou un [`torch.nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module):
- ```py
- >>> from transformers import AutoModelForSequenceClassification
+```py
+>>> from transformers import AutoModelForSequenceClassification
- >>> model = AutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
+>>> model = AutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
```
2. [`TrainingArguments`] contient les hyperparamètres du modèle que vous pouvez changer comme le taux d'apprentissage, la taille de l'échantillon, et le nombre d'époques pour s'entraîner. Les valeurs par défaut sont utilisées si vous ne spécifiez pas d'hyperparamètres d'apprentissage :
- ```py
- >>> from transformers import TrainingArguments
+```py
+>>> from transformers import TrainingArguments
- >>> training_args = TrainingArguments(
- ... output_dir="path/to/save/folder/",
- ... learning_rate=2e-5,
- ... per_device_train_batch_size=8,
- ... per_device_eval_batch_size=8,
- ... num_train_epochs=2,
- ... )
+>>> training_args = TrainingArguments(
+... output_dir="path/to/save/folder/",
+... learning_rate=2e-5,
+... per_device_train_batch_size=8,
+... per_device_eval_batch_size=8,
+... num_train_epochs=2,
+... )
```
3. Une classe de prétraitement comme un tokenizer, un processeur d'images ou un extracteur de caractéristiques :
- ```py
- >>> from transformers import AutoTokenizer
+```py
+>>> from transformers import AutoTokenizer
- >>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
+>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
```
4. Chargez un jeu de données :
- ```py
- >>> from datasets import load_dataset
+```py
+>>> from datasets import load_dataset
- >>> dataset = load_dataset("rotten_tomatoes") # doctest: +IGNORE_RESULT
+>>> dataset = load_dataset("rotten_tomatoes") # doctest: +IGNORE_RESULT
```
5. Créez une fonction qui transforme le texte du jeu de données en token :
- ```py
- >>> def tokenize_dataset(dataset):
- ... return tokenizer(dataset["text"])
+```py
+>>> def tokenize_dataset(dataset):
+... return tokenizer(dataset["text"])
```
Puis appliquez-la à l'intégralité du jeu de données avec [`~datasets.Dataset.map`]:
- ```py
- >>> dataset = dataset.map(tokenize_dataset, batched=True)
+```py
+>>> dataset = dataset.map(tokenize_dataset, batched=True)
```
6. Un [`DataCollatorWithPadding`] pour créer un échantillon d'exemples à partir de votre jeu de données :
- ```py
- >>> from transformers import DataCollatorWithPadding
+```py
+>>> from transformers import DataCollatorWithPadding
- >>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
+>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
```
Maintenant, rassemblez tous ces éléments dans un [`Trainer`] :
@@ -497,52 +511,64 @@ Pour les tâches - comme la traduction ou la génération de résumé - qui util
Vous pouvez personnaliser le comportement de la boucle d'apprentissage en redéfinissant les méthodes à l'intérieur de [`Trainer`]. Cela vous permet de personnaliser des caractéristiques telles que la fonction de perte, l'optimiseur et le planificateur. Consultez la documentation de [`Trainer`] pour savoir quelles méthodes peuvent être redéfinies.
+Une fois que vous êtes prêt, appelez la fonction [`~Trainer.train`] pour commencer l'entraînement :
-L'autre moyen de personnaliser la boucle d'apprentissage est d'utiliser les [Callbacks](./main_classes/callback). Vous pouvez utiliser les callbacks pour intégrer d'autres bibliothèques et inspecter la boucle d'apprentissage afin de suivre la progression ou d'arrêter l'apprentissage plus tôt. Les callbacks ne modifient rien dans la boucle d'apprentissage elle-même. Pour personnaliser quelque chose comme la fonction de perte, vous devez redéfinir le [`Trainer`] à la place.
+```py
+>>> trainer.train() # doctest: +SKIP
+```
+
+
+
+Pour les tâches - comme la traduction ou la génération de résumé - qui utilisent un modèle séquence à séquence, utilisez plutôt les classes [`Seq2SeqTrainer`] et [`Seq2SeqTrainingArguments`].
+
+
+Vous pouvez personnaliser le comportement de la boucle d'apprentissage en redéfinissant les méthodes à l'intérieur de [`Trainer`]. Cela vous permet de personnaliser des caractéristiques telles que la fonction de perte, l'optimiseur et le planificateur. Consultez la documentation de [`Trainer`] pour savoir quelles méthodes peuvent être redéfinies.
+
+L'autre moyen de personnaliser la boucle d'apprentissage est d'utiliser les [Callbacks](./main_classes/callback). Vous pouvez utiliser les callbacks pour intégrer d'autres bibliothèques et inspecter la boucle d'apprentissage afin de suivre la progression ou d'arrêter l'apprentissage plus tôt. Les callbacks ne modifient rien dans la boucle d'apprentissage elle-même. Pour personnaliser quelque chose comme la fonction de perte, vous devez redéfinir le [`Trainer`] à la place.
## Entraînement avec TensorFlow
Tous les modèles sont des modèles standard [`tf.keras.Model`](https://www.tensorflow.org/api_docs/python/tf/keras/Model) afin qu'ils puissent être entraînés avec TensorFlow avec l'API [Keras](https://keras.io/). 🤗 Transformers fournit la fonction [`~TFPreTrainedModel.prepare_tf_dataset`] pour charger facilement votre jeu de données comme un `tf.data.Dataset` afin que vous puissiez commencer l'entraînement immédiatement avec les fonctions [`compile`](https://keras.io/api/models/model_training_apis/#compile-method) et [`fit`](https://keras.io/api/models/model_training_apis/#fit-method) de Keras.
1. Vous commencez avec un modèle [`TFPreTrainedModel`] ou [`tf.keras.Model`](https://www.tensorflow.org/api_docs/python/tf/keras/Model) :
- ```py
- >>> from transformers import TFAutoModelForSequenceClassification
+```py
+>>> from transformers import TFAutoModelForSequenceClassification
- >>> model = TFAutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
+>>> model = TFAutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
```
2. Une classe de prétraitement comme un tokenizer, un processeur d'images ou un extracteur de caractéristiques :
- ```py
- >>> from transformers import AutoTokenizer
+```py
+>>> from transformers import AutoTokenizer
- >>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
+>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
```
3. Créez une fonction qui transforme le texte du jeu de données en token :
- ```py
- >>> def tokenize_dataset(dataset):
- ... return tokenizer(dataset["text"]) # doctest: +SKIP
+```py
+>>> def tokenize_dataset(dataset):
+... return tokenizer(dataset["text"]) # doctest: +SKIP
```
4. Appliquez le tokenizer à l'ensemble du jeu de données avec [`~datasets.Dataset.map`] et passez ensuite le jeu de données et le tokenizer à [`~TFPreTrainedModel.prepare_tf_dataset`]. Vous pouvez également modifier la taille de l'échantillon et mélanger le jeu de données ici si vous le souhaitez :
- ```py
- >>> dataset = dataset.map(tokenize_dataset) # doctest: +SKIP
- >>> tf_dataset = model.prepare_tf_dataset(
- ... dataset, batch_size=16, shuffle=True, tokenizer=tokenizer
- ... ) # doctest: +SKIP
+```py
+>>> dataset = dataset.map(tokenize_dataset) # doctest: +SKIP
+>>> tf_dataset = model.prepare_tf_dataset(
+... dataset, batch_size=16, shuffle=True, tokenizer=tokenizer
+... ) # doctest: +SKIP
```
5. Une fois que vous êtes prêt, appelez les fonctions `compile` et `fit` pour commencer l'entraînement :
- ```py
- >>> from tensorflow.keras.optimizers import Adam
+```py
+>>> from tensorflow.keras.optimizers import Adam
- >>> model.compile(optimizer=Adam(3e-5))
- >>> model.fit(dataset) # doctest: +SKIP
+>>> model.compile(optimizer=Adam(3e-5))
+>>> model.fit(dataset) # doctest: +SKIP
```
## Et après ?
diff --git a/docs/source/ja/pipeline_tutorial.md b/docs/source/ja/pipeline_tutorial.md
index 5dbda5ce4d4a..6b2fa340dd95 100644
--- a/docs/source/ja/pipeline_tutorial.md
+++ b/docs/source/ja/pipeline_tutorial.md
@@ -67,10 +67,10 @@ Hubでは、ブラウザから直接モデルの結果をチェックして、
```py
generator(
- [
- "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
- "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
- ]
+[
+"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
+"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
+]
)
```
@@ -151,24 +151,25 @@ texts = generator(audio_filenames)
各タスクごとに利用可能な多くのパラメータがありますので、何を調整できるかを確認するために各タスクのAPIリファレンスを確認してください!
たとえば、[`~transformers.AutomaticSpeechRecognitionPipeline`]には、モデル単体では処理できない非常に長いオーディオファイル(たとえば、映画全体や1時間のビデオの字幕付けなど)で役立つ`chunk_length_s`パラメータがあります。
+新たに追加された`ImageTextToTextPipeline`では、画像とテキストを入力として受け取り、テキストを生成することができます。このパイプラインは、画像キャプション生成や視覚的質問応答などのマルチモーダルタスクに役立ちます。`return_full_text`や`return_tensors`などのパラメータを使用して、出力形式を制御することができます。
+
役立つパラメータが見つからない場合は、[リクエスト](https://github.com/huggingface/transformers/issues/new?assignees=&labels=feature&template=feature-request.yml)してください!
-
## Using pipeline in a dataset
パイプラインは大規模なデータセット上で推論を実行することもできます。これを行う最も簡単な方法は、イテレータを使用することです:
```py
def data():
- for i in range(1000):
- yield f"My example {i}"
+for i in range(1000):
+yield f"My example {i}"
pipe = pipeline(model="openai-community/gpt2", device=0)
generated_characters = 0
for out in pipe(data()):
- generated_characters += len(out[0]["generated_text"])
+generated_characters += len(out[0]["generated_text"])
```
イテレーター `data()` は各結果を生成し、パイプラインは自動的に入力が反復可能であることを認識し、データを取得し続けながらGPU上で処理を行います(これは[DataLoader](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader)を内部で使用しています)。
@@ -187,7 +188,7 @@ pipe = pipeline(model="hf-internal-testing/tiny-random-wav2vec2", device=0)
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation[:10]")
for out in pipe(KeyDataset(dataset, "audio")):
- print(out)
+print(out)
```
## Using pipelines for a webserver
@@ -266,6 +267,23 @@ pip install pytesseract
+### ImageTextToTextPipeline
+
+`ImageTextToTextPipeline`は、画像とテキストを入力として受け取り、テキストを生成するためのパイプラインです。このパイプラインは、画像キャプショニングや画像ベースのテキスト生成などのマルチモーダルタスクをサポートします。
+
+```python
+>>> from transformers import pipeline
+
+>>> image_text_to_text = pipeline(task="image-text-to-text", model="llava-hf/llava-onevision-qwen2-0.5b-ov-hf")
+>>> output = image_text_to_text(
+... images="https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png",
+... text="A photo of"
+... )
+>>> output
+[{'generated_text': 'a photo of two birds'}]
+```
+
+このパイプラインは、チャット形式の入力もサポートしており、会話を続けることができます。
## Using `pipeline` on large models with 🤗 `accelerate`:
まず、`accelerate` を`pip install accelerate` でインストールしていることを確認してください。
diff --git a/docs/source/ko/pipeline_tutorial.md b/docs/source/ko/pipeline_tutorial.md
index 2f166fc6939f..ff0034b73adb 100644
--- a/docs/source/ko/pipeline_tutorial.md
+++ b/docs/source/ko/pipeline_tutorial.md
@@ -65,10 +65,10 @@ Hub의 모델들은 여러 다양한 언어와 전문분야를 아우르기 때
```py
generator(
- [
- "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
- "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
- ]
+[
+"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
+"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
+]
)
```
@@ -142,24 +142,30 @@ texts = generator(audio_filenames)
태스크마다 다양한 매개변수를 가지고 있는데요. 원하는 태스크의 API를 참조해서 바꿔볼 수 있는 여러 매개변수를 살펴보세요!
지금까지 다뤄본 [`~transformers.AutomaticSpeechRecognitionPipeline`]에는 `chunk_length_s` 매개변수가 있습니다. 영화나 1시간 분량의 동영상의 자막 작업을 할 때처럼, 일반적으로 모델이 자체적으로 처리할 수 없는 매우 긴 오디오 파일을 처리할 때 유용하죠.
+또한, 새로운 `ImageTextToTextPipeline`을 사용하여 이미지와 텍스트를 입력으로 받아 텍스트를 생성할 수 있습니다. 이 파이프라인은 이미지 설명 생성, 시각적 질문 응답 등 다양한 멀티모달 작업에 유용합니다. 사용 예시는 다음과 같습니다:
-도움이 될 만한 매개변수를 찾지 못했다면 언제든지 [요청](https://github.com/huggingface/transformers/issues/new?assignees=&labels=feature&template=feature-request.yml)해주세요!
-
+```py
+>>> from transformers import pipeline
+>>> pipe = pipeline(task="image-text-to-text", model="Salesforce/blip-image-captioning-base")
+>>> pipe("https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png", text="A photo of")
+[{'generated_text': 'a photo of two birds'}]
+```
+도움이 될 만한 매개변수를 찾지 못했다면 언제든지 [요청](https://github.com/huggingface/transformers/issues/new?assignees=&labels=feature&template=feature-request.yml)해주세요!
## 데이터세트에서 Pipeline 사용하기[[using-pipelines-on-a-dataset]]
파이프라인은 대규모 데이터세트에서도 추론 작업을 할 수 있습니다. 이때 이터레이터를 사용하는 걸 추천드립니다.
```py
def data():
- for i in range(1000):
- yield f"My example {i}"
+for i in range(1000):
+yield f"My example {i}"
pipe = pipe(model="openai-community/gpt2", device=0)
generated_characters = 0
for out in pipe(data()):
- generated_characters += len(out["generated_text"])
+generated_characters += len(out["generated_text"])
```
이터레이터 `data()`는 각 결과를 호출마다 생성하고, 파이프라인은 입력이 순회할 수 있는 자료구조임을 자동으로 인식하여 GPU에서 기존 데이터가 처리되는 동안 새로운 데이터를 가져오기 시작합니다.(이때 내부적으로 [DataLoader](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader)를 사용해요.) 이 과정은 전체 데이터세트를 메모리에 적재하지 않고도 GPU에 최대한 빠르게 새로운 작업을 공급할 수 있기 때문에 중요합니다.
@@ -176,7 +182,7 @@ pipe = pipeline(model="hf-internal-testing/tiny-random-wav2vec2", device=0)
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation[:10]")
for out in pipe(KeyDataset(dataset["audio"])):
- print(out)
+print(out)
```
@@ -241,3 +247,53 @@ NLP 태스크를 위해 [`pipeline`]을 사용하는 일도 거의 동일합니
... )
[{'score': 0.42514941096305847, 'answer': 'us-001', 'start': 16, 'end': 16}]
```
+
+### 이미지-텍스트-텍스트 Pipeline[[image-text-to-text-pipeline]]
+
+이미지와 텍스트를 입력으로 받아 텍스트를 생성하는 `ImageTextToTextPipeline`을 사용할 수 있습니다. 이 파이프라인은 이미지 캡셔닝, 이미지 기반 텍스트 생성과 같은 멀티모달 태스크를 수행할 수 있습니다. 이미지는 URL 또는 로컬 경로의 형태로 전달해주세요.
+
+예를 들어, 두 마리의 새가 있는 사진을 설명하고 싶다면:
+
+```py
+>>> from transformers import pipeline
+
+>>> pipe = pipeline(task="image-text-to-text", model="Salesforce/blip-image-captioning-base")
+>>> pipe("https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png", text="A photo of")
+[{'generated_text': 'a photo of two birds'}]
+```
+
+또는 대화 형식으로 이미지를 설명하고 싶다면:
+
+```py
+>>> from transformers import pipeline
+
+>>> pipe = pipeline("image-text-to-text", model="llava-hf/llava-interleave-qwen-0.5b-hf")
+>>> messages = [
+>>> {
+>>> "role": "user",
+>>> "content": [
+>>> {
+>>> "type": "image",
+>>> "url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",
+>>> },
+>>> {"type": "text", "text": "Describe this image."},
+>>> ],
+>>> },
+>>> {
+>>> "role": "assistant",
+>>> "content": [
+>>> {"type": "text", "text": "There is a dog and"},
+>>> ],
+>>> },
+>>> ]
+>>> pipe(text=messages, max_new_tokens=20, return_full_text=False)
+[{'input_text': [{'role': 'user',
+ 'content': [{'type': 'image',
+ 'url': 'https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg'},
+ {'type': 'text', 'text': 'Describe this image.'}]},
+{'role': 'assistant',
+ 'content': [{'type': 'text', 'text': 'There is a dog and'}]}],
+'generated_text': ' a person in the image. The dog is sitting on the sand, and the person is sitting on'}]
+```
+
+`ImageTextToTextPipeline`은 "image-text-to-text" 태스크 식별자를 사용하여 `pipeline()`에서 로드할 수 있습니다. 사용 가능한 모델 목록은 [huggingface.co/models](https://huggingface.co/models?pipeline_tag=image-text-to-text)에서 확인할 수 있습니다.
\ No newline at end of file