Transformers documentation
プロセッサ
プロセッサ
マルチモーダルモデルには、複数のモダリティを組み合わせた入力を処理できるプリプロセッサが必要です。入力モダリティに応じて、プロセッサはテキストをテンソルの配列に変換し、画像をピクセル値に変換し、オーディオを適切なサンプリングレートを持つテンソルの配列に変換する必要があります。
例えば、PaliGemma は、SigLIP 画像プロセッサと Llama トークナイザを使用するビジョン言語モデルです。ProcessorMixin クラスはこれら 2 つのプリプロセッサタイプをラップし、マルチモーダルモデルに対して単一かつ統合されたプロセッサクラスを提供します。
from_pretrained()を呼び出してプロセッサを読み込みます。プロセッサに入力タイプを渡すことで、期待されるモデルの入力、入力ID、ピクセル値を生成します。
from transformers import AutoProcessor, PaliGemmaForConditionalGeneration
from PIL import Image
import requests
processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")
prompt = "answer en Where is the cat standing?"
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
image = Image.open(requests.get(url, stream=True).raw)
inputs = processor(text=prompt, images=image, return_tensors="pt")
inputsこのガイドでは、プロセッサクラスとマルチモーダル入力の前処理方法について説明します。
プロセッサクラス
All processors inherit from the ProcessorMixin class which provides methods like from_pretrained(), save_pretrained(), and push_to_hub() for loading, saving, and sharing processors to the Hub.
プロセッサを読み込む方法には2つあります。AutoProcessorを使用する方法と、モデル固有のプロセッサクラスを使用する方法です。
AutoClass API は、特定のモデルクラスを直接指定せずにプロセッサを読み込むためのシンプルなインターフェースを提供します。
from_pretrained()を使用してプロセッサを読み込みます。
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")プロセッサーは、特定の事前学習済みマルチモーダルモデルクラスに関連付けられています。from_pretrained() を使用して、モデルクラスからプロセッサーを直接読み込むことができます。
from transformers import WhisperProcessor
processor = WhisperProcessor.from_pretrained("openai/whisper-tiny")2つのプリプロセッサタイプ、WhisperTokenizerFastとWhisperFeatureExtractorをそれぞれ個別にロードすることもできます。
from transformers import WhisperTokenizerFast, WhisperFeatureExtractor, WhisperProcessor
tokenizer = WhisperTokenizerFast.from_pretrained("openai/whisper-tiny")
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-tiny")
processor = WhisperProcessor(feature_extractor=feature_extractor, tokenizer=tokenizer)プロセッサの保存と読み込み
save_pretrained() は、プロセッサの設定を単一の processor_config.json ファイルに書き出します。トークナイザーとチャットテンプレートは、それぞれ個別のファイルに保存されます。
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("llava-hf/llava-onevision-qwen2-0.5b-ov-hf")
processor.save_pretrained("./llava-onevision")llava-onevision/ ├── chat_template.jinja ├── processor_config.json ├── tokenizer.json └── tokenizer_config.json
トークナイザ以外のすべてのサブプロセッサは、image_processor、video_processor、feature_extractor などの属性名をキーとして、processor_config.json の中にネストされています。プロセッサ自体に属する設定(image_token など)は、トップレベルに配置されます。以下の例は短縮版です。
{
"image_processor": {
"image_processor_type": "LlavaOnevisionImageProcessor",
"do_resize": true,
"size": {"height": 384, "width": 384},
"image_mean": [0.5, 0.5, 0.5]
},
"image_token": "<image>",
"processor_class": "LlavaOnevisionProcessor",
"video_processor": {
"video_processor_type": "LlavaOnevisionVideoProcessor",
"do_resize": true,
"size": {"height": 384, "width": 384},
"image_mean": [0.5, 0.5, 0.5]
},
"video_token": "<video>"
}その他のファイルは、それぞれ個別に保存されます。
- トークナイザーは、
tokenizer.jsonやtokenizer_config.jsonのような通常どおりのファイルを出力します。プロセッサーに2番目のトークナイザーがある場合、その属性名に由来するサブフォルダー(例:decoder_tokenizer/)に保存されます。 - チャットテンプレートは
chat_template.jinjaに保存されます。プロセッサに複数のチャットテンプレートがある場合、defaultテンプレートはchat_template.jinjaに、それ以外はchat_templates/フォルダに配置されます。
from_pretrained() でプロセッサを読み込むと、各サブプロセッサはまず processor_config.json 内のネストされたキーを探します。キーが見つからない場合は、単独のファイルにフォールバックします。画像プロセッサとフィーチャーエクストラクターは preprocessor_config.json を読み込み、動画プロセッサは video_preprocessor_config.json を読み込んだ後、preprocessor_config.json を読み込みます。各サブプロセッサを個別のファイルに保存する旧バージョンのチェックポイントも、この方法で読み込むことができます。
ネストされた設定は、単独のファイルよりも優先されます。チェックポイントに両方が存在する場合、
preprocessor_config.jsonまたはvideo_preprocessor_config.jsonを編集しても効果はありません。代わりに、processor_config.json内のネストされたエントリを編集してください。
前処理
Processorsは、マルチモーダルな入力をTransformersが期待する形式に前処理します。テキストとオーディオ、テキストと画像など、プロセッサが処理できる入力モダリティの組み合わせはいくつかあります。
自動音声認識(ASR)タスクには、テキストとオーディオの両方の入力を処理できるプロセッサが必要です。データセットを読み込み、audio と text の列を確認してください(不要な他の列は削除できます)。
from datasets import load_dataset
dataset = load_dataset("keithito/lj_speech", split="train")
dataset = dataset.map(remove_columns=["file", "id", "normalized_text"])
dataset[0]["audio"]
{'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
7.3242188e-04, 2.1362305e-04, 6.1035156e-05], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
'sampling_rate': 22050}
dataset[0]["text"]
'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'事前学習済みモデルが要求するサンプリングレートに合わせて、サンプリングレートを再サンプリングすることを忘れないでください。
from datasets import Audio
dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))プロセッサを読み込み、array と text の列を渡します。
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("openai/whisper-tiny")
def prepare_dataset(example):
audio = example["audio"]
example.update(processor(audio=audio["array"], text=example["text"], sampling_rate=16000))
return exampleprepare_dataset 関数を適用して、データセットの前処理を行います。プロセッサは、audio 列に対して input_features を、テキスト列に対して labels を返します。
prepare_dataset(dataset[0])