Ollama не использует GPU? Чиним на Linux, Windows и в WSL
Ollama игнорирует GPU и пересаживается на CPU? Пять реальных причин — драйверы, VRAM, закреплённый бэкенд, ROCm, флаги Docker — и команда для каждой.
TL;DR
Запустите ollama ps, пока модель загружена: колонка PROCESSOR говорит правду. 100% GPU — с GPU всё в порядке, можно не читать дальше. Разделение вида 40%/60% CPU/GPU — модель не влезла в VRAM, берите квант поменьше. 100% CPU — Ollama не нашла пригодный GPU: обычно устаревший драйвер, отсутствие нужной группы (AMD на Linux), закреплённая OLLAMA_LLM_LIBRARY или контейнер, запущенный без доступа к GPU. Чините причину, которую называет лог; их всего около пяти.
Как проверить, использует ли Ollama GPU на самом деле?
Две команды, без гаданий.
# В одном терминале: загрузить модель
ollama run llama3.2 "hello"
# В другом: посмотреть, где она работает
ollama ps
NAME ID SIZE PROCESSOR UNTIL
llama3.2:latest a80c4de17cd9 3.3 GB 100% GPU 4 minutes from now
У колонки PROCESSOR три состояния:
100% GPU— выгружены все слои. Готово.48%/52% CPU/GPU— частичная выгрузка. GPU работает, но модель вместе с контекстом не влезла в VRAM. См. секцию про VRAM ниже.100% CPU— инференс на CPU. GPU либо не обнаружен, либо отключён намеренно.
Затем прочитайте лог сервера — при старте он называет железо, которое Ollama реально нашла:
journalctl -u ollama --no-pager | grep -i "inference compute"
На здоровой машине с NVIDIA вы хотите увидеть строку вида:
inference compute id=GPU-xxxx library=CUDA compute=8.9 driver=12.4 name=NVIDIA GeForce RTX 4070
Ни одной строки вообще — или строка, кончающаяся сообщением о CPU-only fallback, — и проблема найдена. Остаток поста — пять причин, от самой вероятной к остальным.
Почему Ollama пишет "no compatible GPU discovered"?
У NVIDIA привычный виновник — драйвер, а не CUDA. Ollama везёт собственные библиотеки рантайма CUDA, так что toolkit ставить не нужно — но вшитому рантайму нужен драйвер достаточно свежий, чтобы с ним разговаривать. Работающий nvidia-smi — не доказательство: он доказывает лишь существование драйвера, не его свежесть.
nvidia-smi --query-gpu=driver_version --format=csv,noheader
Если версии годы, обновите и перезагрузитесь:
# семейство Debian/Ubuntu
sudo apt install nvidia-driver-570
# семейство Arch
sudo pacman -S nvidia
После обновления драйвера перезапустите сервис Ollama, чтобы он заново нашёл устройства — детекция происходит один раз на старте, а не на каждый запрос:
sudo systemctl restart ollama
Если лог теперь печатает ваш GPU с library=CUDA — готово. Если упирается, проверьте, не задана ли где-то OLLAMA_LLM_LIBRARY — см. секцию «после обновления».
Почему GPU достаётся лишь части модели?
Частичная выгрузка — арифметика, а не баг: веса модели плюс KV-кэш под ваше окно контекста должны влезть в VRAM. Модель 7B в Q4 — примерно 4–5 ГБ; дайте ей контекст 8K — и кэш добавит сверху. На карте в 8 ГБ что-то остаётся на CPU, а ollama ps показывает раскладку.
Три способа закрыть разрыв, от самого дешёвого:
- Квант поменьше. Переход с Q8 на Q4 вдвое уменьшает размер весов при скромной потере качества. Компромиссы разобраны в уровнях квантования GGUF.
- Короче контекст.
num_ctxопределяет размер кэша. Контекст 32K на карте в 8 ГБ означает: большинство слоёв остаются на CPU. - Меньше слоёв на GPU. Опция
num_gpuограничивает число выгружаемых слоёв. Значение ниже общего числа слоёв гарантирует расщепление — если кто-то задал её в Modelfile или вызове API, уберите.
Заметим и обратную ловушку: GPU, показывающий 100% GPU, но работающий медленнее ожидаемого, может выгружать данные в системную RAM. Сверьте SIZE в ollama ps с реальным объёмом VRAM.
Почему Ollama не использует мой AMD GPU?
AMD на Linux требует трёх вещей, и все три проверяемы.
1. Поддержка ROCm в сборке. Официальный установочный скрипт для Linux несёт ROCm-сборку. Сверьте, что нашёл сервер:
journalctl -u ollama --no-pager | grep -iE "rocm|inference compute"
2. Членство в группах. Рантайму ROCm нужен доступ к /dev/kfd и /dev/dri, а значит группы render и video:
sudo usermod -aG render,video $USER
# выйти и зайти снова, затем:
sudo systemctl restart ollama
Одна пропущенная группа — самая частая причина постов «Ollama not using GPU on Ubuntu» на всех форумах, и она переживает переустановку драйверов, потому что драйвер никогда и не был проблемой.
3. Поддерживаемый GPU — или override. Неподдерживаемые потребительские карты RDNA2 (gfx1031, gfx1032) проваливают детекцию даже при рабочем ROCm. Стандартный обходной путь — притвориться совместимой целью:
sudo systemctl edit ollama
[Service]
Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0"
Затем sudo systemctl restart ollama. Это неподдерживаемый, но широко применяемый override; если поведение странное, уберите его и вернитесь в зону официальной поддержки. Если хочется полного контроля над бэкендами вместо борьбы с автодетектом — это ключевое отличие, разобранное в llama.cpp vs Ollama.
На Windows поддержка AMD уже — сверьтесь со списком поддерживаемых GPU Ollama, прежде чем списывать установку.
Почему Ollama перестала использовать GPU после обновления?
Обновления меняют одно из трёх, по убыванию вероятности:
- Закреплённая библиотека бэкенда.
OLLAMA_LLM_LIBRARYпринудительно задаёт конкретный рантайм (cuda_v11,rocmили дажеcpu). Она для отладки, молча перекрывает автодетект и годами живёт в шелл-профилях и юнит-файлах после того, как причина забыта. Найдите и уберите:
systemctl show ollama --property=Environment | grep -i llm_library
env | grep OLLAMA
- Драйвер отстал от рантайма. Апгрейды Ollama несут более новый рантайм CUDA; ваш драйвер не двигается, пока вы его не сдвинете. Лечение то же, что в секции про драйвер выше.
- Сервис — контейнер, и флаги потерялись. Пересозданный контейнер без GPU-флагов — контейнер только на CPU. Вызов для NVIDIA:
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 ollama/ollama
Для AMD-контейнеров эквивалент — проброс устройств плюс добавление в группы:
docker run -d --device=/dev/kfd --device=/dev/dri \
--group-add video --group-add render \
-v ollama:/root/.ollama -p 11434:11434 ollama/ollama
Нет --gpus=all — нет GPU: Docker не из щедрых.
Работает ли Ollama в WSL2?
Да, при правильном драйвере в правильном месте: ставьте Windows-драйвер NVIDIA и никогда — Linux-драйвер внутри дистрибутива: драйвер внутри WSL ломает CUDA passthrough, а не чинит его. Затем обновите сам WSL и убедитесь, что passthrough-устройство существует:
wsl --update # из PowerShell
ls /dev/dxg # внутри WSL — для GPU обязано существовать
С живым /dev/dxg и свежим Windows-драйвером Ollama в WSL2 выгружается на GPU как нативная установка. Не нужна лишняя прослойка — Windows-сборка Ollama работает нативно и видит GPU без WSL.
А Ollama вообще нужен GPU?
Нет — запуск только на CPU функционально идентичен, просто медленнее, а для маленьких моделей на быстром CPU вполне рабочий. На Apple Silicon вопрос исчезает: Metal автоматически использует unified memory, и предел — лишь сколько RAM вы готовы отдать модели.
Пятиминутный чек-лист
| Симптом | Вероятная причина | Лечение |
|---|---|---|
100% CPU в ollama ps, карта NVIDIA есть |
Драйвер слишком стар для вшитого CUDA | Обновить драйвер, ребут, перезапуск сервиса |
100% CPU, AMD на Linux |
Нет групп render/video |
usermod -aG render,video, перелогин |
100% CPU, неподдерживаемая карта AMD |
ROCm отвергает gfx-цель | HSA_OVERRIDE_GFX_VERSION=10.3.0 |
Расщепление 40%/60% CPU/GPU |
Модель + контекст превышают VRAM | Квант поменьше или короче num_ctx |
| Вчера GPU был, сегодня CPU | Закреплённая OLLAMA_LLM_LIBRARY или старый драйвер |
Найти и убрать переменную; обновить драйвер |
| GPU нативно, CPU в Docker | Контейнер запущен без GPU-флагов | Пересоздать с --gpus=all (или AMD-устройствами) |
Проверяйте в этом порядке: ollama ps за состоянием, логи сервера за списком детекции, затем таблица. В девяти случаях из десяти строка лога уже сказала вам, в какой вы строке таблицы.
GPU снова в строю? Следующее решение — сам рантайм: llama.cpp vs Ollama решает это по публичному следу — без запуска чего-либо.