Зачем в 2026 году возиться с карточкой 2016-го?
Tesla P40 – это 24 ГБ памяти GDDR5 за смешные деньги на вторичном рынке. Идеально для загрузки больших моделей. Проблема одна: её архитектура Pascal (compute capability 6.1) для современного vLLM – как динозавр в космическом корабле. Фреймворк оптимизирован под Volta, Ampere и новее. Но если ковыряться в исходниках, можно заставить его летать и на этом "динозавре".
vLLM 0.5.8 (последний стабильный релиз на март 2026) официально требует CUDA Compute Capability 7.0+. P40 с её 6.1 – за бортом. Но мы это исправим.
Где ломается vLLM на Pascal и как это починить
Всё упирается в ядра (kernels). vLLM использует кастомные CUDA-ядра для эффективного внимания (attention) и управления кэшем ключей-значений (KV cache). Многие из них скомпилированы только для архитектур 7.0+. При запуске получите ошибку CUDA error: no kernel image is available for execution on the device.
1Скачиваем и вскрываем форк
Не нужно писать всё с нуля. Кто-то уже проделал черновую работу. Находим форк vLLM с патчами для Pascal (например, vllm-project/vllm на GitHub, ищем форки с тегом 'pascal'). Клонируем его.
git clone https://github.com/[username]/vllm-pascal.git
cd vllm-pascal
# Проверяем, что ветка актуальна относительно основной 0.5.8csrc/attention/attention_kernel.cu и файлах, связанных с компиляцией ядер (setup.py, csrc/CMakeLists.txt). Ищем флаги -arch=sm_70 и меняем на -arch=sm_61.2Меняем флаги компиляции и целевые архитектуры
В setup.py находим секцию, где определяются флаги для nvcc. Заменяем все упоминания более новых архитектур на поддержку sm_61.
# Было (пример из vLLM 0.5.8):
arch_flags = ['-arch=sm_70', '-arch=sm_75', '-arch=sm_80', '-arch=sm_86', '-arch=sm_89', '-arch=sm_90']
# Меняем на:
arch_flags = ['-arch=sm_61', '-arch=sm_70'] # Поддерживаем P40 и базово современные картыТакже нужно проверить файл csrc/CMakeLists.txt на наличие похожих флагов. Иногда там жестко прописаны условия.
3Проверяем совместимость операций
Некоторые оптимизации в ядрах vLLM используют инструкции, которых нет в Pascal. Например, __dp4a для INT8 вычислений. Если в планах использовать квантование, нужно закомментировать или переписать эти участки, откатившись на более простые операции FP16. В большинстве случаев для inference с FP16 этого не требуется.
Совет: Сначала соберите и запустите без изменений в ядрах, только с исправлением флагов архитектуры. Часто этого хватает. Если упадёт на конкретном ядре – тогда уже лезть в его код.
4Сборка и установка
# Устанавливаем зависимости
pip install -e .
# ИЛИ для полного контроля (если CMake ругается)
MAX_JOBS=4 pip install -e . --no-build-isolation --verboseЕсли компиляция прошла успешно, можно тестировать. Создаём простой Python-скрипт для проверки, что vLLM видит GPU и может инициализировать движок.
Запускаем Qwen3 ASR для реальной транскрипции
Qwen3 ASR – модель для автоматического распознавания речи от Alibaba. На март 2026 года это всё ещё одна из самых точных open-source моделей для этой задачи. Её размер (например, 1.5B параметров) отлично влезает в 24 ГБ P40 даже для длинных аудио.
from vllm import LLM, SamplingParams
import torch
# Указываем модель с Hub
model_id = "Qwen/Qwen3-ASR-1.5B"
# Ключевой момент: используем dtype=torch.float16, так как P40 поддерживает FP16
llm = LLM(model=model_id, dtype="float16", gpu_memory_utilization=0.9, max_model_len=8192)
# Допустим, у нас есть извлечённые аудио-фичи (псевдокод)
# audio_features = load_audio("sample.wav")
# На практике нужно использовать пайплайн: аудио -> фичи -> промпт для ASR модели
prompts = ["Транскрибируй аудио: [AUDIO_FEATURES_PLACEHOLDER]"]
sampling_params = SamplingParams(temperature=0.0, top_p=1.0, max_tokens=500)
outputs = llm.generate(prompts, sampling_params)
print(outputs[0].outputs[0].text)А что если не хочется ковыряться в коде? Альтернативы
Модификация vLLM – не единственный путь.
- llama.cpp с CLBlast: Если модель в формате GGUF, можно использовать llama.cpp с вычислениями на GPU через CLBlast (OpenCL). Для P40 это работает, но скорость inference будет заметно ниже, чем у vLLM. Подробности в нашем гайде "Как запустить LLM на старом железе: гайд по Raspberry Pi, Steam Deck и майнинг-ригам".
- Text Generation Inference (TGI) от Hugging Face: TGI также отринул поддержку Pascal. Шансов завести меньше.
- Hugging Face Transformers + PEFT (напрямую): Стандартный пайплайн Transformers с урезанием точности до FP16 часто запускается на P40. Но никакого continuous batching, памяти ест больше, скорость на потоке запросов – низкая. Для одиночных экспериментов сойдёт.
| Подход | Скорость (токен/с) | Использование памяти | Сложность настройки |
|---|---|---|---|
| Модифицированный vLLM | Высокая (30-50) | Оптимальное | Высокая |
| Transformers (FP16) | Низкая (5-15) | Высокое | Низкая |
| llama.cpp (CLBlast) | Средняя (10-25) | Низкое | Средняя |
Кому это вообще нужно в 2026 году?
Этот путь для упрямых энтузиастов и тех, у кого стойка P40 уже пылится в дата-центре. Если вам нужна транскрипция аудио в реальном времени для внутренних нужд и бюджет стремится к нулю – то да, игра стоит свеч. Производительность P40 после всех танцев с бубном сравнима с RTX 3060 в подобных задачах, но памяти в два раза больше.
Для тех, кто не готов тратить недели на отладку CUDA ядер, есть более простой путь: аренда облачного GPU с архитектурой Ampere или новее. Например, Vultr предлагает инстансы с A100 по разумной цене (но это всё равно дороже, чем разовая покупка P40). Или можно изучить гайд "vLLM CPU Offloading" для более современных, но слабых карт.
Главный итог: сообщество open-source не оставляет старые железки. Пока есть спрос на дешёвые вычисления, будут находиться умельцы, которые пропатчат последний фреймворк под десятилетние архитектуры. Следующий на очереди – maybe, запуск NVFP4 моделей на Maxwell? Шутка. Или нет.