В данной статье, я покажу как собрать портативную сборку карманного помощника (нейросеть) для решения своих задач даже в полях и без интернета.
Стенд:
- рабочий ноутбук:
- ОЗУ: 12 Gb;
- SSD: 512 Gb;
- CPU: intel core i5-1155G7.
В одной из статей я показывал, как можно скачать и запустить локальную нейросеть у себя на компьютере, но там это относится больше к станционарному компьютеру, а здесь я хочу показать, как можно собрать портативную версию.
Что значит портативную версию? Соберем ollama в Docker контейнер и так же Open-webui к нему, рядом положем модель нейросети. Поработали на одном устройстве, перекинули образы контейнеров и файлы от контейнеров с моделькой на флэшку, пересели за другой компьютер (ноутбук), подняли контейнеры из локальных образов, подкинули файлы контейнеров и у нас полная история чатов с нейронкой. Мы можем переезжать с устройства на устройство в полевых условиях без интернета.
Есть конечно свои минусы и нюансы по типу технических характеристик устройств, наличие флэшки или витой пары (чтобы перекинуть с устройства на устройство), объем этих файлов. Но это все равно хоть что-то.
Для начала, нам нужен Docker и Docker compose. Как установить описано здесь.
После того, как установили или уже есть Docker, то заходим на хаб моделек нейросетей.
В поиске ищем qwen 2.5 coder Q4
Либо заходим по прямой ссылке.

Так как у нас ноутбук не болит формулы 1, а выше средней рабочей лошадке, то модельку я решил взять - это квантованные модели формата GGUF, которые отлично работают на CPU и требуют минимум ресурсов. Так как видеокарты нет, поэтому мы будем ориентироваться на эффективный CPU.
Выбор пал на Qwen 2.5 coder (заточенную под программирование).
Скачиваем модельку к себе на ноутбук.


Ставим на загрузку Ollama и Open-webui:
docker pull ollama/ollama:latest
docker pull ghcr.io/open-webui/open-webui:main
Пока мы загружаем образы, создадим директорию под работу нейронки.
Создаем структуру папок:
mkdir -p ~/local_ai/{models,ollama_data,webui_data}
Схема получается вот такой:
local_ai/
├── docker-compose.yml
├── models/
│ ├── qwen2.5-coder-3b-instruct-q4_k_m.gguf
│ └── Modelfile
├── ollama_data/
└── webui_data/
- local_ai - локальный каталог (папка):
- docker-compose.yml - наша кнопка старт/стоп (вкл/выкл) веб-интерфейса с нейронкой;
- models - в ней лежит модель нейросети и файл с настрйоками для ollama;
- ollama_data - в ней будут сохраняться все файлы ollama из контейнера ollama. Если контейнер решим удалить (для переезда на другой компьютер, то когда создадим новый контейнер, он заберет все файлы настроек и историю с этой папки и продолжит работы до пеерезда);
- webui_data - аналогична как ollama_data только для контейнера open-webui.
После создания директории, переходим в нее.
cd ~/local_ai/models
Переносим модельку из загрузок:
mv ~/Загрузки/ВАША_МОДЕЛЬ .

Создаем рядом с моделью файл Modelfile (в папке models/). Этот файл скажет Ollama, как называть модель и где ее взять.
nvim Modelfile
Если nvim нету, то nano или vim.

FROM /models/ВАША_МОДЕЛЬ
Теперь возвращаемся в корень local_ai:
cd ..
и создаем docker-compose.yml файл:
nvim docker-compose.yml
с содержимым:
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ./ollama_data:/root/.ollama
- ./models:/models
environment:
- OLLAMA_NUM_PARALLEL=1
- OLLAMA_MAX_LOADED_MODELS=1
- OLLAMA_NUM_THREADS=4
restart: unless-stopped
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "8080:8080"
volumes:
- ./webui_data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
restart: unless-stopped
depends_on:
- ollama
Ничего тут менять не нужно, за исключем OLLAMA_NUM_THREADS=4 -это количество потоко. Если у вас есть больше, можете поменять на то, которое у вас есть, но не больше!


Если все сделали правильно, то запускаем оркестрацию:
docker-compose up -d
Через docker ps проверяем, поднялись ли контейнеры. Должно быть Up и Up.

Видим, что контейнеры создались и оба в работе (Up). Теперь нужно зарегистрировать модель в Ollama (делается 1 раз).
Так как Ollama не умеет сама видеть сырые GGUF файлы в папке, их нужно один раз зарегистрировать.
Выполняем команду:
docker exec -it ollama ollama create coder -f /models/Modelfile

Все, теперь модель с именем coder навсегда сохранена в ollama_data.
Открываем интерфейс.
Заходи в браузере на http://localhost:8080. При первом входе нужно будет зарегистрировать локального админа (данные хранятся в папке webui_data). В списке моделей выбираем coder и начинаем работать.




Видим нашу загруженную модель coder. Можно подкинуть и зарегистрировать несколько моделей.
Если вы получили ошибку как у меня:
{"error":{"code":400,"message":"request (5956 tokens) exceeds the available context size (4096 tokens), try increasing it","type":"exceed_context_size_error","n_prompt_tokens":5956,"n_ctx":4096}}

То мы не укладываемся в количество токенов. Полазив в настройках, я нашел параметр отвечающий за этот порог. Слева где аватар, нажимаем на наш аватар и настройки. Сразу откроются общие настройки, в них находим внизу Model parameters и нажимаем «Показать».

Нам нужно найти num_ctx. Можно воспользоваться поиском Ctrl + F и вбить num_ctx.
По-умолчанию стояло 2048, я поставил 8192.

![]()
После нажимаем «Сохранить».

Теперь попробуем перезапустить ответ нейронки.

Нейронка нам ответила. Правда на английском, но стоит попросить отвечать на Русском и она перестроится.
Попросил я на трех языках написать функцию приветствия, она сгенерировала ответ за ~1.5-2 минуты. При этом ресурсы ноута почти на пределе.

Вот такой результат.

Теперь покажу, как выгрузить образ ollama и open-webui.
Выгружаем ollama:
docker save -o ollama.tar ollama/ollama:latest
Выгружаем webui:
docker save -o webui.tar ghcr.io/open-webui/open-webui:main

Вот объем файлов:



Общий объем архива 9,1 GiB, в целом более-менее приемлимо для портативной сборки нейронки.
Как пеерехать:
Стопим и удаляем контейнеры:
docker-compose down


Как видим, файлы с контейнеров на месте, хотя контейнеров уже физически нет (они удалены). А это значит, что при создании новых им вернется память от предыдущих контейнеров.
down- останавливает и удаляет;stop- останавливает контейнеры из docker-compose.yml;start- запускает контейнеры из docker-compose.yml;down -v- останавливает и удаляем контейнеры и volume (папки ollama_data и webui_data).
условно у вас есть ollama.tar и webui.tar и все это в local_ai.
Упаковываем компактно в tar.gz
tar -czvf local_ai.tar.gz local_ai/
Переносим на флэшку, на внешний диск, либо по сети переносим, как угодно этот архив.
На другой машине распаковываем:
tar -xzvf local_ai.tar.gz -C ~/
Извлекает в домашнюю ~/
Далее переходм в ~/local_ai
и загружаем образы в Docker:
docker load -i ollama.tar
и
docker load -i webui.tar
После успешной загрузки образов, запускаем оркестрацию:
docker-compose up -d
Если все сделали правильно, то на новом устройстве у вас из коробки будет сохранен весь чат общения с нейронкой уже на новом месте. В условиях отсутствия интернета я считаю это отличным вариантом, тем более если нужно поработать временно.
Надеюсь Вам данная статья была интересной и полезной, удачи!