Вопрос или проблема
Я пытаюсь ускорить генерацию подписей на большом наборе изображений, используя BLIP-2. Приведенный ниже код для одного изображения работает нормально:
prompt = "это изображение"
inputs = processor(trainData[0]["image"], text=prompt, return_tensors="pt").to(device, torch.float16)
generated_ids = model.generate(inputs.pixel_values, input_ids=inputs.input_ids, max_new_tokens=20)
Но когда я пытаюсь обработать его партиями (заменяя, например, trainData[0] на trainData[0:3]), возникает ошибка:
RuntimeError: несоответствие формы: тензор значения формы [245760] не может быть распространен на результат индексирования формы [81920]
Как мне обойти это, чтобы извлекать подписи партиями?
ИЗМЕНЕНИЕ:
Вот что предложил gemini после некоторых уговоров:
prompt = "это изображение"
inputs = processor(trainData[0:3]["image"], text=prompt, return_tensors="pt").to(device, torch.float16)
# Получите эмбеддинги изображений от энкодера модели
image_embeds = shadow_model.get_base_model().vision_model(pixel_values=inputs.pixel_values).last_hidden_state
# Замените эмбеддинги токена <image> на эмбеддинги изображений
image_token_index = processor.tokenizer.convert_tokens_to_ids("<image>")
inputs_embeds = shadow_model.get_base_model().embeddings(inputs.input_ids)
inputs_embeds[inputs.input_ids == image_token_index] = image_embeds
# Генерируйте текст, используя измененные inputs_embeds
generated_ids = model.generate(inputs_embeds=inputs_embeds, max_new_tokens=20)
# Декодируйте и напечатайте сгенерированный текст
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(generated_text)
Действительно ли что-то подобное является лучшим решением? Я бы думал, что существует более “нативный” способ сделать это… плюс, приведенный выше код выдает ошибку. Я пытался попросить gemini исправить это, но безуспешно.
-Пол
Ответ или решение
Устранение ошибки "shape mismatch" при параллельной обработке изображений с использованием BLIP-2
Введение
При попытке ускорить генерацию подписей для большого набора изображений с использованием модели BLIP-2 вы столкнулись с проблемой при обработке изображений пакетами. Ошибка "shape mismatch" указывает на то, что форма тензоров, которые вы пытаетесь передать в модель, несовместима. В данной статье рассматриваются причины возникновения ошибки и возможные пути ее решения.
Ошибка "shape mismatch"
Ошибка RuntimeError: shape mismatch: value tensor of shape [245760] cannot be broadcast to indexing result of shape [81920]
возникает в результате несоответствия размеров тензоров, которые вы используете для обработки изображений. Это может произойти, если вы не правильно подготовили входные данные для пакетной обработки, особенно при работе с изображениями различного размера и формы.
Решение проблемы
-
Корректная подготовка данных: Убедитесь, что ваши изображения имеют одинаковую форму, перед тем как передавать их в модель. Модели, подобные BLIP-2, чаще всего требуют, чтобы входные изображения имели размер, который соответствует ожидаемым параметрам (например, 224×224 для Vision Transformers).
-
Изменение кодирования изображений: Если вы хотите обрабатывать несколько изображений одновременно, вам нужно также корректно извлекать эмбеддинги изображений для каждого входного объекта в пакетной обработке:
prompt = "this is a picture of"
inputs = processor(trainData[0:3]["image"], text=prompt, return_tensors="pt").to(device, torch.float16)
# Получение эмбеддингов изображений
image_embeds = shadow_model.get_base_model().vision_model(pixel_values=inputs.pixel_values).last_hidden_state
# Замените токены <image> эмбеддингами изображений
image_token_index = processor.tokenizer.convert_tokens_to_ids("<image>")
inputs_embeds = shadow_model.get_base_model().embeddings(inputs.input_ids)
# Убедитесь, что заменяет только те токены, что соответствуют изображениям
for i in range(len(inputs_embeds)):
inputs_embeds[i][inputs.input_ids[i] == image_token_index] = image_embeds[i]
# Генерируем текст с использованием модифицированных inputs_embeds
generated_ids = model.generate(inputs_embeds=inputs_embeds, max_new_tokens=20)
# Декодируем и выводим сгенерированный текст
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(generated_text)
-
Проверка совместимости форм: Перед заменой убедитесь, что размеры
inputs_embeds
иimage_embeds
совпадают. Вам может понадобиться добавить проверку форм в код, чтобы избежать дальнейших ошибок. -
Использование GPU: Если ваш код медленный, проверьте, что все ваши данные и модели находятся на подходящем устройстве (GPU), что поможет значительно ускорить процесс обработки.
Альтернативные подходы
Если предложенный выше путь кажется вам не "нативным", вы можете рассмотреть использование API для пакетной обработки, если такая возможность предусмотрена вашей моделью. Многие современные библиотеки, такие как Hugging Face Transformers, имеют встроенные методы для обработки наборов данных, которые могут быть использованы для ускорения процессов.
Заключение
Обработка изображений в пакетах с помощью модели BLIP-2 требует тщательной подготовки данных и управления формами тензоров. Приведенный код показывает, как корректно организовать входные данные, чтобы избежать ошибок. Всегда проверяйте совместимость форм и используйте GPU для ускорения обработки. Если вы продолжаете сталкиваться с проблемами, рекомендуется обратиться к документации используемой модели и библиотек для уточнения возможных ограничений и альтернативных решений.