Transformers documentation
Процессоры
Процессоры
Мультимодальные модели требуют преобразователь, способный обрабатывать входные данные, сочетающие более одной модальности. В зависимости от входной модальности процессору необходимо преобразовать текст в массив тензоров, изображения — в пиксельные значения, а аудио — в массив тензоров с корректной частотой дискретизации.
Например, PaliGemma — это мультимодальная модель, использующая процессор изображений SigLIP и токенизатор Llama. Класс ProcessorMixin объединяет оба этих типа препроцессоров, предоставляя единый класс процессора для мультимодальной модели.
Вызовите from_pretrained(), чтобы загрузить процессор. Передайте процессору тип входных данных, чтобы получить ожидаемые входные данные модели, идентификаторы входных токенов и пиксельные значения.
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.
Существует два способа загрузить процессор: с помощью AutoProcessor и с помощью класса процессора, специфичного для конкретной модели.
API AutoClass предоставляет простой интерфейс для загрузки процессоров без необходимости явно указывать конкретный класс модели, к которому они относятся.
Используйте 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")Вы также можете загрузить два типа преобразователей отдельно: 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
Каждый субпроцессор, за исключением токенизатора, вложен в processor_config.json под именем своего атрибута, например image_processor, video_processor или feature_extractor. Настройки, относящиеся к самому процессору, такие как 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. Если у процессора есть второй токенизатор, он сохраняется в подпапку, названную по имени его атрибута, например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.
Предобработка
Процессоры выполняют предобработку мультимодальных входных данных, приводя их к ожидаемому формату 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 exampleПримените функцию prepare_dataset для предобработки набора данных. Процессор возвращает input_features для столбца audio и labels для текстового столбца.
prepare_dataset(dataset[0])