Как запускать модели Qwen2-VL на нескольких GPU?

Вопрос или проблема

У меня есть 4 GPU, на которых я хочу запустить модели Qwen2 VL, но я получаю ошибку “сработала проверка на стороне устройства. Скомпилируйте с TORCH_USE_CUDA_DSA, чтобы включить проверки на стороне устройства”.

model_name="Qwen/Qwen2-VL-2B-Instruct"
model = Qwen2VLForConditionalGeneration.from_pretrained(
          model_name, torch_dtype="auto", device_map="auto"
        )
model = nn.DataParallel(model)
processor = AutoProcessor.from_pretrained(model_name)

messages = [
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "image": file
                },
                {
                    "type": "text",
                    "text": """Опишите изображение"""
                }
            ]
        }
]
text = processor.apply_chat_template(
            messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
            text=[text],
            images=image_inputs,
            videos=video_inputs,
            padding=True,
            return_tensors="pt",
        )
with torch.no_grad():
    generated_ids = model.module.generate(**inputs, max_new_tokens=128)

но я всегда получаю:

../aten/src/ATen/native/cuda/IndexKernel.cu:92: operator(): block: [35,0,0], thread: [31,0,0] Assertion `-sizes[i] <= index && index < sizes[i] && "index out of bounds"` не выполнена.
ОШИБКА:  CUDA ошибка: сработала проверка на стороне устройства
Скомпилируйте с `TORCH_USE_CUDA_DSA`, чтобы включить проверки на стороне устройства.

Трассировка (последний вызов последний):
  Файл "/home/ubuntu/projects/mistral-qaC/services/VisionService.py", строка 104, в ask_vision
    generated_ids = self.model.module.generate(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/torch/utils/_contextlib.py", строка 116, в decorate_context
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/transformers/generation/utils.py", строка 2015, в generate
    result = self._sample(
             ^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/transformers/generation/utils.py", строка 2965, в _sample
    outputs = self(**model_inputs, return_dict=True)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/torch/nn/modules/module.py", строка 1553, в _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/torch/nn/modules/module.py", строка 1562, в _call_impl
    return forward_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/accelerate/hooks.py", строка 169, в new_forward
    output = module._old_forward(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Файл "/home/ubuntu/projects/upper/lib/python3.12/site-packages/transformers/models/qwen2_vl/modeling_qwen2_vl.py", строка 1598, в forward
    inputs_embeds[image_mask] = image_embeds
    ~~~~~~~~~~~~~^^^^^^^^^^^^
RuntimeError: CUDA ошибка: сработала проверка на стороне устройства
Скомпилируйте с `TORCH_USE_CUDA_DSA`, чтобы включить проверки на стороне устройства.

Что я пробовал?

  • Запускал свой скрипт на Python с CUDA_LAUNCH_BLOCKING=1 python script.py, но это тоже не помогло.
  • напечатал устройства входных данных и модели: Устройство модели: cuda:0
    Устройство входных данных: cuda:0
  • torch.cuda.synchronize() и torch.cuda.empty_cache() перед генерацией.

Мои версии transformers и pytorch:

transformers==4.45.0.dev0
torch==2.4.1+cu124

Как исправить эту проблему?

Ответ или решение

Для запуска моделей Qwen2-VL на нескольких GPU и устранения ошибки "device-side assert triggered", вам следует попробовать следующие шаги:

  1. Проверка входных данных: Ошибка, с которой вы столкнулись, вероятно, связана с тем, что ваши входные данные имеют неправильный размер или индексы выходят за пределы допустимого диапазона. Проверьте, правильно ли вы формируете входные данные для модели, особенно размеры тензоров image_inputs, video_inputs и их соответствие ожидаемым входам модели. Убедитесь, что используемые индексы находятся в допустимых пределах.

  2. Настройка модели для работы на нескольких GPU: Использование nn.DataParallel для распределения модели по нескольким GPU может быть полезным, но это не всегда обеспечивает правильное распределение тендеров. Вместо этого вы можете рассмотреть использование torch.nn.parallel.DistributedDataParallel, который может быть более эффективным для распределенной обработки. Для этого вам нужно будет установить правильную среду для запуска вашего скрипта с параметрами распределения.

  3. Код для DistributedDataParallel (DDP):
    Если вы решите перейти к DistributedDataParallel, измените свой код следующим образом:

    import torch
    import torch.distributed as dist
    from torch.nn.parallel import DistributedDataParallel as DDP
    import os
    
    # Инициализация процесса
    dist.init_process_group(backend="nccl")
    torch.cuda.set_device(args.local_rank)  # args.local_rank будет передан вашим кодом при запуске
    device = torch.device("cuda", args.local_rank)
    
    model_name = "Qwen/Qwen2-VL-2B-Instruct"
    model = Qwen2VLForConditionalGeneration.from_pretrained(model_name, torch_dtype="auto").to(device)
    model = DDP(model, device_ids=[args.local_rank])
    
    processor = AutoProcessor.from_pretrained(model_name)
    
    # ... остальной код остается без изменений, но убедитесь, что вы передаете необходимые входные данные на устройства
    inputs = {k: v.to(device) for k, v in inputs.items()}  # Переместите входные данные на устройство
  4. Включение проверок на устройстве CUDA: Чтобы лучше диагностировать проблему, вы можете скомпилировать PyTorch с включенными ассерциями для устройств. Для этого установите переменную окружения перед сборкой:

    export TORCH_USE_CUDA_DSA=1

    Это позволит вам лучше отслеживать ошибки.

  5. Обновление библиотек: Убедитесь, что у вас установлены последние версии PyTorch и Transformers. Иногда решения проблем с совместимостью и ошибками исправляются в новых релизах.

  6. Используйте CUDA_LAUNCH_BLOCKING=1: Вы уже упомянули, что пробовали запускать ваш скрипт с этой переменной. Это может помочь вам более строго отслеживать, где именно происходит ошибка, но нужно помнить, что это может негативно повлиять на производительность.

  7. Логгирование входных данных: Перед вызовом model(module).generate, проверяйте выходы inputs и формируйте логи, чтобы убедиться, что они корректны.

Если после всех вышеуказанных шагов проблема не решится, вам стоит создать минимальный воспроизводимый пример и обратиться за помощью на GitHub или форумы обсуждений, такие как Stack Overflow, где разработчики и эксперты могут более детально помочь с диагностикой проблемы.

Оцените материал
Добавить комментарий

Капча загружается...