Найти тему
Pavel Zloi

Ollama: переезд из системы в Docker-контейнер

Оглавление

Всем привет! Решил оформить эту небольшую заметку для всех тех, кто хочет перенести свою установку ollama в Docker-контейнер, ничего при этом не потеряв (включая веса загруженных моделей, настройки и ключи шифрования).

Логотип ollama
Логотип ollama

Идея данной заметки возникла после очередного обновления ollama которое сбросило мои настройки включающие поддержку flash attention и открывающие порт 11434 на всех интерфейсах, чтобы можно было с внешних машин подключаться.

Указанные настройки выполняются через конфигурационный файл сервиса ollama расположенный по адресу /etc/systemd/system/ollama.service, ну и так вот, при установке обновления указанный файл бы заменён на дефолтный, баг это или фича разбираться лень, проще перенести всё в докер и забыть об этом.

Деинсталяция ollama

Для начала выполним остановку сервиса ollama и удалим конфирацию:

sudo systemctl stop ollama
sudo systemctl disable ollama
sudo rm /etc/systemd/system/ollama.service

Теперь удаляем пользователя ollama и группу ollama:

sudo userdel ollama
sudo groupdel ollama

Все модели, которые были скачали из библиотеки или созданы врунчю хранятся в /usr/share/ollama, запомним эту директорию, вернёмся к ней чуть позже.

Подготовка docker-compose.yml с сервисом ollama

Создадим пустую директорию, скажем docker-ollama, и в ней файл docker-compose.yml, вот так:

mkdir docker-ollama
cd docker-ollama
touch docker-compose.yml

Заполним его следующим содержимым:

Пример конфирурации сервиса ollama с GPU
Пример конфирурации сервиса ollama с GPU

Код тут.

Можно явно указать версии через image директиву, например ollama/ollama:0.4.0-rc1 говорит нам о том, что необходимо взять контейнер с тегом 0.4.0-rc1 и юзать его в дальнейшем.

Все доступные теги у образа ollama/ollama можно посмотреть тут.

В примере конфигурации видно, что в блоке environment активируется поддержка flash attention (которая по умолчанию отключена), а в время жизни модели в памяти меняется с 5 минут по умолчанию на 60 минут.

Далее перенесём папку /usr/share/ollama (о которой было упомянуто ранее) в текущую директорию и поменяем имя на ollama_data:

mv /usr/share/ollama ./ollama_data

На этом подготовка завершена, пробуем запустить.

Запуск композиции

Скачаем образ и запустим композицию:

docker-compose pull
docker-compose up -d

Для обновления `ollama` нужно будет зайти через редактор и подправить тег у image, далее выполнить pull, up -d и вот вы уже на новой версии.

Проверим работоспособность

Предположим, что ollama мы запустили на некоем удалённом сервере с IP-адресом 192.168.1.10, на него и будем делать запросы через curl.

Получим список доступных моделей:

curl http://192.168.1.10:11434/api/tags

В ответе будет список всех моделей которые мы ранее скачали или создали, допустим у нас есть среди прочих модель llama3.2:8b, попробуем выполнить простую генерацию через неё.

curl http://192.168.1.10:11434/api/generate -d '{"model":"llama3.1:8b","stream": false,"prompt":"Почему трава зелёная?"}'

В ответе будет текст сгенерированный моделью, отвечающий на заданный вопрос.

Установка новых и удаление старых моделей

После переезда на Docker-контейнер у нас пропадёт возможность простой и быстрой установки моделей через ollama pull, эту проблему можно решить несколькии способами

Переменная OLLAMA_HOST

Перед вызовом бинарника ollama мы можем передавать переменную окружения, в которой будет указан удалённый хост и порт на котором запущена ollama в Docker-контейнере:

OLLAMA_HOST=192.168.1.6:11434 ollama list

Переменную OLLAMA_HOST можно прописать на постоянной основе:

echo 'export OLLAMA_HOST=192.168.1.6:11434' >> ~/.bashrc

После выполнения указанной комманды наш локальный бинарник ollama будет обращаться в API на удалённом (или локальном) сервере.

[pasha-lt] ~ $ ollama -v
ollama version is 0.4.0-rc1
Warning: client version is 0.3.13

Обновлять консольный клиент отдельно от сервера можно так:

curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz
sudo tar -C /usr -xzf ollama-linux-amd64.tgz

В отличии от скрипта install.sh этот метод не устанавливает ollama сервер.

Подключаясь в контейнер

Второй вариант это способ через docker-compose exec, полезен в ситуациях когда нет желания ставить в систему лишние бинарники.

И так, заходим в папку с docker-compose.yml и подключаемся к контейнеру ollama:

cd docker-ollama
docker-compose exec ollama bash

Теперь мы можем использовать консольную утилиту ollama и скажем получить список моделей или запустить нужную модель.

ollama -v
ollama list
ollama run llama3.1:8b

Вот пример:

Тут видно, что выполняются запросы на ollama запущенном в контейнере
Тут видно, что выполняются запросы на ollama запущенном в контейнере

Через API

Пожалуй самый хитрый способ, я сам им пользуюсь только через Open WebUI, так как лень каждый раз формировать curl запросы, но тем не менее можно с грацией мангуста управлять моделями на удалённом (или локальном) API сервере.

Какие модели есть:

curl http://192.168.1.6:11434/api/tags

Установим модель gemma:2b

curl http://localhost:11434/api/pull -d '{"name": "gemma:2b"}'

Удалим модель gemma:2b

curl -X DELETE http://192.168.1.6:11434/api/delete -d '{"name": "gemma:2b"}'

Вот в принципе и всё что может потребоваться для управлениями моделями на удалённом ollama сервере.

Больше подробностей о работе с ollama API в официальной документации.

Завершение

Ну чтож, надеюсь моя небольшая заметка поможет вам перенести вашу ollama в Docker-контейнер и получить больше гибкости и удобства.

Если у вас остались вопросы или вы хотите узнать больше о нейросетях и машинном обучении, подписывайтесь на мой Телеграм-канал и блог, а также не забудьте поставить лайк этой публикации. Ваши отзывы и поддержка мотивируют меня на создание новых полезных материалов.

Спасибо за внимание и удачи в ваших проектах!