Запускаем Ollama в Podman
Из каждого утюга слышно про LLM. Их нынче называют AI, хотя я сомневаюсь в этом. Мне, как любителю Open Source и Self Hosted, претит мысль пользоваться облачными решениями. Поэтому LLM’ки, чтобы не отставать от моды, я разворачиваю локально.
Ollama – простейшее решение для развёртывания LLM в контейнере. Это тулза, которая позволит загружать LLM, запускать её и взаимодействовать через CLI. Доки Ollama на Docker Hub дают понять, что для исполнения LLM на GPU от AMD мне нужно загружать тег rocm. Начинаем с этого. Пользуюсь, по традиции, Podman.
$ podman pull docker.io/ollama/ollama:rocm
Trying to pull docker.io/ollama/ollama:rocm...
Getting image source signatures
Copying blob a1a22aa331e6 done
Copying blob b08e2ff4391e done
Copying blob bdf13fb94fec done
Copying blob 3fd4deb1a79f done
Copying config d466fc07e3 done
Writing manifest to image destination
Storing signatures
d466fc07e32ed2f07fa1c9de9e4fe48d5d4b1aab72a9083d3809018cce5f76c6
$ podman image ls ollama
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ollama/ollama rocm d466fc07e32e 11 days ago 6.42 GB
Да, образ толстенький. Теперь его надо запустить. На странице Docker Hub есть команда для запуска на AMD GPU. Немного её модифицируем, добавив права опцией container_runtime_t и сохраняя пользовательские группы опцией keep-groups. Это нужно для Podman, ведь он выдаёт контейнерам меньше прав по-умолчанию.
$ podman run -d \
--device /dev/kfd \
--device /dev/dri \
-v ollama:/root/.ollama \
-p 11434:11434 \
--name ollama \
--security-opt label=type:container_runtime_t \
--group-add keep-groups \
ollama/ollama:rocm
f864498e8c3df755b854527e393f1372fb25dc3405374fdc75a8abf2a30c2e9b
Запустилось! Посмотрим на версию Ollama, заодно поймём как пользоваться CLI.
$ podman exec -it ollama ollama --version
ollama version is 0.9.6
Чтобы не писать каждый раз podman exec -it ollama ollama, делаем alias.
$ alias ollama='podman exec -it ollama ollama'
Загружаем какие-нибудь модели. Возмём дистиллят попсового DeepSeek-R1 на 8 миллиардов параметров. Это не настоящая архитектура R1, но локально пойдёт.
$ ollama pull deepseek-r1:8b
pulling manifest
pulling e6a7edc1a4d7: 100% ▕██████████████████▏ 5.2 GB
pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B
pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB
pulling ed8474dc73db: 100% ▕██████████████████▏ 179 B
pulling f64cd5418e4b: 100% ▕██████████████████▏ 487 B
verifying sha256 digest
writing manifest
success
$ ollama ls
NAME ID SIZE MODIFIED
deepseek-r1:8b 6995872bfe4c 5.2 GB 9 seconds ago
Ух, и это не самая большая модель! Запускаем интерактивный CLI с помощью run.
$ ollama run deepseek-r1:8b
>>> Hello there
Thinking...
Okay, the user just said “Hello there” – that's a pretty neutral and
friendly opening.
Hmm, they didn't specify their name or what they want to talk about yet.
Maybe they're just testing how I respond before diving into something more
substantial? Or perhaps they're in a greeting mode checking if it's an
appropriate time to interact.
Their message length suggests they might prefer concise responses too, but
I'll keep monitoring that as the conversation develops. For now, this
balanced approach should work well – friendly enough without being
overbearing.
...done thinking.
Hello! Hi there,
How can I help you today?
>>> Send a message (/? for help)
CLI даже показывает блок thinking, отражающего псевдо-мыслительный процесс LLM. В целом бывает удобно для отладки промпта, если нейронка несёт полную чушь.
Чтобы погасить LLM, пользуемся /bye в чате и podman stop опосля.
>>> /bye
$ podman stop ollama
ollama
Чтобы обратно запустить Ollama, достаточно использовать podman start.
$ podman start ollama
ollama
На этом quick start можно завершать. Оставлю только одну ремарку – все LLM’ки, с которыми я пока поработал, несут полнейшую чушь время от времени, особенно относительно фактической информации. Будьте внимательны и проверяйте ответы :)