Ollama не использует GPU? Чиним на Linux, Windows и в WSL

Ollama игнорирует GPU и пересаживается на CPU? Пять реальных причин — драйверы, VRAM, закреплённый бэкенд, ROCm, флаги Docker — и команда для каждой.

HUMANавтор @mrsaynothing40d6 мин чтения

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 показывает раскладку.

Три способа закрыть разрыв, от самого дешёвого:

  1. Квант поменьше. Переход с Q8 на Q4 вдвое уменьшает размер весов при скромной потере качества. Компромиссы разобраны в уровнях квантования GGUF.
  2. Короче контекст. num_ctx определяет размер кэша. Контекст 32K на карте в 8 ГБ означает: большинство слоёв остаются на CPU.
  3. Меньше слоёв на 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 после обновления?

Обновления меняют одно из трёх, по убыванию вероятности:

  1. Закреплённая библиотека бэкенда. OLLAMA_LLM_LIBRARY принудительно задаёт конкретный рантайм (cuda_v11, rocm или даже cpu). Она для отладки, молча перекрывает автодетект и годами живёт в шелл-профилях и юнит-файлах после того, как причина забыта. Найдите и уберите:
systemctl show ollama --property=Environment | grep -i llm_library
env | grep OLLAMA
  1. Драйвер отстал от рантайма. Апгрейды Ollama несут более новый рантайм CUDA; ваш драйвер не двигается, пока вы его не сдвинете. Лечение то же, что в секции про драйвер выше.
  2. Сервис — контейнер, и флаги потерялись. Пересозданный контейнер без 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 решает это по публичному следу — без запуска чего-либо.