Вопрос или проблема
У меня есть 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", вам следует попробовать следующие шаги:
-
Проверка входных данных: Ошибка, с которой вы столкнулись, вероятно, связана с тем, что ваши входные данные имеют неправильный размер или индексы выходят за пределы допустимого диапазона. Проверьте, правильно ли вы формируете входные данные для модели, особенно размеры тензоров
image_inputs
,video_inputs
и их соответствие ожидаемым входам модели. Убедитесь, что используемые индексы находятся в допустимых пределах. -
Настройка модели для работы на нескольких GPU: Использование
nn.DataParallel
для распределения модели по нескольким GPU может быть полезным, но это не всегда обеспечивает правильное распределение тендеров. Вместо этого вы можете рассмотреть использованиеtorch.nn.parallel.DistributedDataParallel
, который может быть более эффективным для распределенной обработки. Для этого вам нужно будет установить правильную среду для запуска вашего скрипта с параметрами распределения. -
Код для 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()} # Переместите входные данные на устройство
-
Включение проверок на устройстве CUDA: Чтобы лучше диагностировать проблему, вы можете скомпилировать PyTorch с включенными ассерциями для устройств. Для этого установите переменную окружения перед сборкой:
export TORCH_USE_CUDA_DSA=1
Это позволит вам лучше отслеживать ошибки.
-
Обновление библиотек: Убедитесь, что у вас установлены последние версии PyTorch и Transformers. Иногда решения проблем с совместимостью и ошибками исправляются в новых релизах.
-
Используйте
CUDA_LAUNCH_BLOCKING=1
: Вы уже упомянули, что пробовали запускать ваш скрипт с этой переменной. Это может помочь вам более строго отслеживать, где именно происходит ошибка, но нужно помнить, что это может негативно повлиять на производительность. -
Логгирование входных данных: Перед вызовом
model(module).generate
, проверяйте выходыinputs
и формируйте логи, чтобы убедиться, что они корректны.
Если после всех вышеуказанных шагов проблема не решится, вам стоит создать минимальный воспроизводимый пример и обратиться за помощью на GitHub или форумы обсуждений, такие как Stack Overflow, где разработчики и эксперты могут более детально помочь с диагностикой проблемы.