Запуск моделей штучного інтелекту з відкритим кодом локально: Посібник для розробників по самостійно розміщеним LLM

AILLMself-hostedOllamaopen source
Kirill Latish
Kirill Latish
LinkedIn
Share

Дослідіть переваги запуску моделей штучного інтелекту з відкритим кодом локально за допомогою цього всебічного посібника. Дізнайтеся, як налаштувати самостійно розміщені LLM та оптимізувати свої витрати.

Вступ

Я підрахував витрати cвого продукту на OpenAI за минулий квартал. Одна функція продукту — резюме документів, що обробляє близько 50 000 запитів на місяць — коштувала нам 740 доларів. Не катастрофічно, але це змусило мене задуматися: вживана RTX 3090 на eBay коштує близько 700 доларів. Один GPU, одноразова покупка, безлімітні запити назавжди. Що насправді потрібно, щоб здійснити цей перехід?

Виявляється, з тих пір, як я востаннє дивився, багато що змінилося. Qwen 3.5 вийшов у березні 2026 року з підтримкою мультимодальності, варіантами змішування експертів, контекстними вікнами 256K та охопленням понад 200 мов. Усе це доступно для завантаження, усе безкоштовно. Модель 9B займає 6.6GB дискового простору і працює на MacBook.

Це не означає, що вам слід завтра відмовитися від ваших API викликів. Самостійне розміщення приносить операційні витрати, і для деяких навантажень хмара все ще є кращою угодою. Цей пост має на меті пояснити, коли локальне рішення має сенс, а коли ні, а потім проходить по конкретному налаштуванню: Ollama, Docker, Qwen 3.5, підключений до стеку Laravel + Next.js з маршрутизатором, який надсилає дешеві завдання на ваш GPU, а дорогі — в хмару.

API проти самостійного розміщення: Коли кожен варіант має сенс

Формулювання цього як "локальне проти хмари" створює хибну дихотомію. Більшість команд врешті-решт використовуватимуть обидва варіанти. Справжнє питання полягає в тому, які запити заслуговують на який бекенд, і це зводиться до чотирьох речей: гроші, конфіденційність, швидкість і якість.

Структура витрат

Хмарні API стягують плату за токен. GPT-4.1 від OpenAI коштує приблизно 2 долари за мільйон вхідних токенів і 8 доларів за мільйон вихідних. Здається, дешево, поки ви не помножите це на кількість. Цей чат-бот, що обробляє 50 000 розмов на місяць з середнім обсягом 2 000 токенів кожен? Десь між 200 і 800 доларами на місяць, залежно від того, наскільки багатослівною є ваша модель.

Налаштування самостійного розміщення виглядає інакше. Ви платите один раз за апаратуру — RTX 4090 коштує близько 1 600 доларів — а ваші постійні витрати — це лише електрика. Назвемо це 15-30 доларів на місяць, залежно від того, наскільки сильно ви навантажуєте картку. Точка беззбитковості знаходиться приблизно на 3-6 місяці для команд із помірним трафіком. Якщо ви робите менше ніж кілька тисяч запитів на день, API виграють, якщо врахувати час на інженерію. Якщо ви перевищите цю межу, математика швидко змінюється.

Управління даними та конфіденційність

Якщо ви працюєте в охороні здоров'я, фінансах або юриспруденції, ви вже знаєте про цей біль. Відправка медичних записів або фінансових даних до стороннього API означає угоди про обробку даних, аудити відповідності та юристів, які стягують плату за годину. Запуск моделі на вашому обладнанні обминає все це. Кожен токен залишається у вашій мережі. Для навантажень GDPR або HIPAA цього вже достатньо, щоб виправдати витрати на налаштування.

Затримка

Виклик API до OpenAI повинен пережити DNS-резолюцію, TLS-рукостискання, чергу на стороні постачальника та зворотний шлях. Це 200-500 мс, перш ніж з'явиться перший токен. Локальна затримка на пристойному GPU? Менше 50 мс до першого токена. Для автозаповнення, вбудованих пропозицій коду або викликів інструментів агента ви можете відчути цю різницю на своїх пальцях.

Якість виходу

Будемо чесними щодо цього. GPT-4.1, Claude Opus, Gemini 2.5 Pro — вони все ще краще в складному багатоступеневому міркуванні, синтезі з довгим контекстом і складному виконанні інструкцій. Але "краще" має звужене визначення. Qwen 3.5 27B набирає кілька відсотків від моделей класу GPT-4 на MMLU-Pro та GPQA. Для класифікації, витягування, резюмування або генерації коду вам би було скалдно відрізнити виходи.

Фактор

Хмарний API

Самостійно розміщений (локальний)

Початкова вартість

Немає

800 - 5 000+ доларів (апаратура GPU)

Гранична вартість за запит

0.002 - 0.06 доларів за 1K токенів

Практично нульова (тільки електрика)

Конфіденційність даних

Дані залишають вашу мережу

Повністю на місці

Затримка (час до першого токена)

200 - 500 мс

20 - 80 мс

Пікова якість (складне міркування)

Вища (моделі на передовій)

Конкурентоспроможна для більшості завдань

Операційні витрати

Керується постачальником

Ви володієте моніторингом, масштабуванням, оновленнями

Масштабованість

Еластична, плати за використання

Обмежена апаратурою

Залежність від постачальника

Помірна до високої

Немає

Отже, який план? Обробляйте 70-80% запитів, які не потребують передових розумових здібностей, на вашому власному обладнанні, а API залиште для тих завдань, які дійсно виграють від цього. Ми побудуємо саме цей маршрутизатор в цій статті.

Налаштування вашого першого локального LLM з Ollama та Docker

Ollama об'єднує завантаження моделей, квантизацію та сервер API, сумісний з OpenAI, в один бінарний файл. Уявіть, що це Docker для LLM: завантажте модель, запустіть її, зверніться до кінцевої точки. П'ять хвилин від установки до першої відповіді.

Попередні вимоги

Скільки апаратури вам потрібно, залежить від того, який варіант Qwen 3.5 ви виберете:

  • Qwen 3.5 4B — мінімум 8GB RAM. Працює на інтегрованих GPU та Apple Silicon без проблем. Завантаження 3.4GB.

  • Qwen 3.5 9B (за замовчуванням) — мінімум 16GB RAM. Це оптимальний варіант для більшості розробників. Завантаження 6.6GB.

  • Qwen 3.5 27B — 32GB RAM або GPU з 24GB VRAM. Наближається до якості передових моделей на більшості бенчмарків. Завантаження 17GB.

  • Qwen 3.5 35B-A3B (MoE) — 35B загальних параметрів, але лише 3B активуються за один прохід. Потребує 32GB RAM, але пропускна здатність вражаюча для моделі такого розміру. Завантаження 24GB.

Картки NVIDIA з 8GB+ VRAM добре справляються з моделлю 9B. Mac з Apple Silicon з 16GB об'єднаної пам'яті також працюють, оскільки Ollama має нативну підтримку Metal.

Встановлення Ollama та завантаження Qwen 3.5

bash
# Встановіть Ollama (macOS/Linux)
curl -fsSL https://ollama.com/install.sh | sh

# Завантажте Qwen 3.5 (модель за замовчуванням 9B, завантаження 6.6GB)
ollama pull qwen3.5

# Або завантажте конкретний розмір
ollama pull qwen3.5:27b

# Перевірте, чи доступна модель
ollama list

Налаштування Docker Compose

Для всього, що виходить за межі локального експериментування, запуск Ollama в Docker зберігає вашу хост-систему чистою та робить усе налаштування відтворювальним.

yaml
# docker-compose.yml
services:
  ollama:
    image: ollama/ollama:latest
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

volumes:
  ollama_data:
bash
# Запустіть контейнер
docker compose up -d

# Завантажте модель всередині контейнера
docker compose exec ollama ollama pull qwen3.5

Тестування з запитом cURL

Ollama відкриває API, сумісний з OpenAI, на порту 11434. Це деталь, яка робить усе інше в цій статті працездатним: будь-який SDK, фреймворк або інструмент, створений для API OpenAI, буде спілкуватися з вашою локальною моделлю, якщо ви заміните базовий URL.

bash
# Кінцевий чат (кінцева точка, сумісна з OpenAI)
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.5",
    "messages": [
      {"role": "user", "content": "Поясніть ін'єкцію залежностей у трьох реченнях."}
    ],
    "temperature": 0.7
  }'

Швидкий бенчмаркінг

Перш ніж ви зупинитеся на розмірі моделі, протестуйте її на вашому реальному обладнанні. Два числа, які мають значення, це токени за секунду та час до першого токена.

bash
# Ollama показує статистику продуктивності в режимі детального звіту
ollama run qwen3.5 --verbose "Напишіть функцію, яка перевертає зв'язаний список у Python"

# Шукайте ці рядки в виході:
# eval rate: ~45 tokens/s (варіюється в залежності від апаратури)
# prompt eval duration: ~120ms

На MacBook Pro з M2 з 16GB я бачу приблизно 40-50 токенів за секунду з моделі 9B. RTX 4090 підвищує це до 80-120 ток/с. Чіпи Apple M3 Pro та M4 з 36GB об'єднаної пам'яті комфортно обробляють модель 27B на рівні 25-35 ток/с, що все ще цілком придатно для розробки та навіть легкого виробництва. Усе, що вище 30 токенів за секунду, відчувається миттєвим в інтерфейсі чату. Якщо впаде нижче 15, користувачі почнуть помічати.

Інтеграція локальних моделей у ваш стек Laravel + Next.js

Backend Laravel з OpenAI PHP SDK

php
// config/services.php
'llm' => [
    'local' => [
        'url' => env('OLLAMA_URL', 'http://localhost:11434/v1'),
        'model' => env('OLLAMA_MODEL', 'qwen3.5'),
    ],
    'cloud' => [
        'key' => env('OPENAI_API_KEY'),
        'model' => env('OPENAI_MODEL', 'gpt-4.1-mini'),
    ],
],
php
// app/Services/LlmService.php
namespace App\Services;

use OpenAI;

class LlmService
{
    private $localClient;
    private $cloudClient;

    public function __construct()
    {
        $this->localClient = OpenAI::factory()
            ->withBaseUri(config('services.llm.local.url'))
            ->withApiKey('ollama')  // Ollama ігнорує це, але SDK вимагає його
            ->make();

        $this->cloudClient = OpenAI::client(config('services.llm.cloud.key'));
    }

    public function complete(string $prompt, string $backend = 'local'): string
    {
        $client = $backend === 'local' ? $this->localClient : $this->cloudClient;
        $model = $backend === 'local'
            ? config('services.llm.local.model')
            : config('services.llm.cloud.model');

        $response = $client->chat()->create([
            'model' => $model,
            'messages' => [
                ['role' => 'user', 'content' => $prompt],
            ],
        ]);

        return $response->choices[0]->message->content;
    }
}

Потокові відповіді до Next.js

Ніхто не хоче дивитися на порожній екран, поки модель думає. Для чат-інтерфейсів можна стрімити токени на фронтенд за допомогою Vercel AI SDK.

typescript
// app/api/chat/route.ts (Next.js App Router)
import { streamText } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';

const localProvider = createOpenAI({
  baseURL: process.env.OLLAMA_URL || 'http://localhost:11434/v1',
  apiKey: 'ollama',
});

export async function POST(req: Request) {
  const { messages } = await req.json();

  const result = streamText({
    model: localProvider('qwen3.5'),
    messages,
  });

  return result.toDataStreamResponse();
}

Краса цього патерну полягає в тому, що зміна бекендів стає зміною конфігурації, а не зміною коду. Розробницьке середовище працює з Ollama локально. Стейджинг працює на OpenAI. Виробництво використовує обидва, що саме ми налаштуємо далі.

Гібридний підхід: Розумна маршрутизація між локальним та хмарним

Чому обирати один бекенд, коли можна використовувати обидва? Ідея проста: дешеві, високі обсяги завдань виконуються на вашому локальному GPU. Завдання, які дійсно потребують передових розумових здібностей, йдуть до хмарного API. Маленький маршрутизатор у вашому бекенді обробляє рішення, а решта вашого коду ніколи не повинна знати, яка модель відповіла.

Будівництво маршрутизатора моделей

php
// app/Services/ModelRouter.php
namespace App\Services;

class ModelRouter
{
    private const LOCAL_TASKS = [
        'classify', 'extract', 'summarize',
        'translate', 'format', 'parse',
    ];

    public function resolve(string $task, int $inputTokens): string
    {
        // Довгий контекст або складне міркування → хмара
        if ($inputTokens > 8000) {
            return 'cloud';
        }

        // Відомі прості завдання → локально
        if (in_array($task, self::LOCAL_TASKS, true)) {
            return 'local';
        }

        // Творче, багатоступеневе або неоднозначне → хмара
        return 'cloud';
    }
}

Додайте це в LlmService, і класифікація, витяг, переклад та форматування виконуються на вашому обладнанні з нульовими граничними витратами. Творча генерація, складне міркування та довгі документи все ще йдуть до хмари.

Одне, що я б наполегливо рекомендував: фіксуйте кожне рішення маршрутизації. Тип завдання, кількість токенів, обраний бекенд, затримка та будь-який сигнал якості, який ви можете отримати. Після кількох тижнів даних ви помітите шаблони, які дозволять вам впевнено перенести більше роботи на локальний рівень. Ми почали з 60% локальної маршрутизації і підвищили її до 78% протягом місяця, як тільки побачили показники якості.

Більшість навантажень SaaS складаються з "нудних" речей. Валідація введення, витяг сутностей, тегування контенту, автоматичні відповіді на запитання типу FAQ. Типовий додаток може маршрутизувати 75% викликів LLM локально, відправляючи лише чверть в хмару для маркетингових текстів, аналізу довгих документів або складних ескалацій клієнтів. Ваш рахунок на API відповідно зменшується.

Для команд, які хочуть підвищити локальний відсоток ще більше, Unsloth робить тонке налаштування дивовижно доступним. Тонке налаштування Qwen 3.5 9B на ваших специфічних даних дозволяє вам закрити розрив у якості для вашого конкретного випадку використання без необхідності мати кластер A100. Це складний крок, але варто розглянути, коли базова маршрутизація працює.

Куди йти далі

Рік тому самостійне розміщення LLM означало боротьбу з драйверами CUDA, написанням власного коду для інференції та прийняттям помітно гіршої якості виходу. Ця ера закінчилася. Qwen 3.5 конкурує з моделями, які коштують реальні гроші за токен, Ollama робить обслуговування тривіальним, а API, сумісний з OpenAI, означає, що ваш існуючий код майже не потребує змін.

Якщо ви перевищите можливості одно-машинного налаштування Ollama, зверніть увагу на vLLM для високопродуктивного обслуговування з безперервним пакетуванням, або на Text Generation Inference від Hugging Face, якщо ви розгортаєте на Kubernetes. Різні інструменти для різних масштабів, одна й та ж основна ідея: ви володієте інференцією.

Вирішення питання, коли самостійно розміщувати, коли викликати API та як побудувати маршрутизатор між ними, є продуктом так само, як і технічним рішенням. Курс AI Product Manager на SkillHub охоплює стратегічну сторону цього рівняння, включаючи моделювання витрат та оцінку постачальників. А якщо ви масштабуєте інфраструктуру за цим, курс Highload Software Architecture глибоко розглядає патерни розподілених систем, які забезпечують надійність самостійно розміщеного ШІ під час виробничого трафіку.

Почніть з Ollama та моделі 9B. Виміряйте свою пропускну здатність. Маршрутизуйте високі обсяги завдань локально. Залиште API для того, що дійсно потребує його. Ви можете бути здивовані, як це змінить ваші рахунки за використання API хмарних LLM.

Kirill Latish
Kirill Latish
LinkedIn
Share