From a6479218415f1839da7818435f1c4bd58214da3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=91=D0=B4=D0=BE=D1=80?= Date: Wed, 25 Mar 2026 20:12:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20Instruction=5Fparallel=5Fcodex.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Instruction_parallel_codex.md | 289 +++++++++++++++++----------------- 1 file changed, 144 insertions(+), 145 deletions(-) diff --git a/Instruction_parallel_codex.md b/Instruction_parallel_codex.md index 39422d3..476fb89 100644 --- a/Instruction_parallel_codex.md +++ b/Instruction_parallel_codex.md @@ -1,145 +1,144 @@ -# 1. Одновременная работа с Ollama - ---- - -### Максимальное количество пользователей и зависимые факторы - -Прямого жесткого ограничения на "максимальное количество пользователей" в Ollama нет. Вместо этого, реальное количество одновременных сессий определяется следующими ключевыми факторами: - -| Фактор | Влияние | -|---|---| -| **Видеопамять (VRAM)** | Это самый главный ограничитель. Каждый параллельный запрос к модели требует дополнительной VRAM. Как только VRAM заканчивается, новые запросы не могут быть обработаны параллельно. | -| **Параметр `OLLAMA_NUM_PARALLEL`** | Эта переменная окружения напрямую указывает, сколько запросов ОДНА модель может обрабатывать одновременно. Требуемая память масштабируется пропорционально этому значению, умноженному на размер контекста модели. | -| **Сложность и размер модели** | Более крупные модели (например, с 70B параметров) потребляют значительно больше VRAM, чем маленькие (например, 7B), что напрямую сокращает возможное число параллельных сессий. | -| **Объем системной памяти (RAM)** | Если модель не помещается полностью в VRAM, часть ее слоев переносится в системную RAM. Это значительно замедляет обработку, но позволяет работать с моделями, превышающими объем VRAM. | -| **Производительность CPU** | Хотя GPU выполняет основную работу, CPU все равно участвует в обработке, и его производительность может стать узким местом при очень большом количестве одновременных легких запросов. | - -**Пример:** На GPU `RTX 3090` с 24 ГБ VRAM, для модели размером 8B, можно комфортно обслуживать около 20 одновременных пользователей. - ---- - -### Максимальное значение `OLLAMA_NUM_PARALLEL` - -Теоретического или программного "максимума" для `OLLAMA_NUM_PARALLEL` не существует. Вы можете установить это значение хоть в 100, но **практический предел всегда упирается в доступную VRAM**. - -Установка слишком высокого значения `OLLAMA_NUM_PARALLEL` приведет к ошибкам нехватки памяти, когда реальные запросы начнут поступать, и сервер не сможет выделить требуемый объем VRAM. Поэтому рекомендуется увеличивать это значение постепенно, тестируя нагрузку. - ---- - -### Что происходит при превышении лимита `OLLAMA_NUM_PARALLEL`? - -Если количество одновременных запросов от пользователей превышает значение `OLLAMA_NUM_PARALLEL`, Ollama не "падает" и не теряет запросы. Происходит следующее: - -1. **Запросы в очереди:** Все запросы, которые поступают сверх лимита `OLLAMA_NUM_PARALLEL`, помещаются в очередь. -2. **Обработка по принципу FIFO:** Эта очередь работает по принципу "первый пришел — первый обслужен" (First-In, First-Out). Как только один из параллельных слотов освобождается, Ollama берет следующий запрос из очереди и начинает его обработку. -3. **Лимит очереди:** Сама очередь тоже имеет лимит, который задается переменной `OLLAMA_MAX_QUEUE` (по умолчанию 512). Если и эта очередь переполняется, новые запросы будут отклонены с ошибкой `503 Server Overloaded`, что сигнализирует клиенту о перегрузке сервера. - -Таким образом, система спроектирована быть отказоустойчивой: она обрабатывает столько, сколько может, а остальных вежливо просит подождать в очереди. - -# 2. API Ollama - -Ollama предоставляет два основных способа взаимодействия через API: -1. **API, совместимый с OpenAI (рекомендуемый)**: Имитирует структуру OpenAI API, что позволяет использовать огромное количество существующих инструментов "из коробки". -2. **Нативный API Ollama**: Прямой, более простой API для базовых взаимодействий. - -Для большинства задач, включая интеграцию с внешними инструментами, **настоятельно рекомендуется использовать API, совместимый с OpenAI**. - ---- - -## 1. API, совместимый с OpenAI - -Этот режим специально создан для того, чтобы любые приложения, написанные для работы с OpenAI, могли без изменений кода работать с вашим локальным сервером Ollama. - -* **Базовый URL:** `http://<адрес_вашего_сервера>:11434/v1` -* **Ключ API (API Key):** Не требуется. Библиотеки могут требовать указать его, но Ollama игнорирует любое переданное значение. - -### Ключевой эндпоинт: `POST /v1/chat/completions` - -Это полный аналог эндпоинта OpenAI для чатов. - -**Пример запроса (`curl`):** -```bash -curl http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{ - "model": "llama3", - "messages": [ - { - "role": "user", - "content": "Почему небо голубое?" - } - ] -}' -``` -Структура ответа (формат OpenAI): - -Ответ полностью соответствует формату OpenAI, используя массив choices для вывода. - -```JSON -{ - "id": "chatcmpl-123", - "object": "chat.completion", - "created": 1716218112, - "model": "llama3", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": "Небо кажется голубым из-за явления, называемого рэлеевским рассеянием..." - }, - "finish_reason": "stop" - } - ], - "usage": { - "prompt_tokens": 10, - "completion_tokens": 150, - "total_tokens": 160 - } -} -``` - -## 2. Нативный API Ollama -Ollama также имеет свой собственный, более простой API. Он может быть полезен для быстрых скриптов или специфических задач. - -| Метод | Эндпоинт | Описание | -|---|---|---| -| `POST` | `/api/chat` | Основной эндпоинт для чата (нативный формат). | -| `POST` | `/api/generate` | Генерация текста из одного промпта. | -| `GET` | `/api/tags` | Получение списка локальных моделей. | -| `POST` | `/api/pull` | Скачивание модели из репозитория. | -| `DELETE` | `/api/delete` | Удаление локальной модели. | - -# 3. Расширение прокси для работы нескольких Codex - ---- - -## Что даёт настройка Ollama (без изменений в прокси) - -| Переменная | Назначение | -|---|---| -| `OLLAMA_NUM_PARALLEL` | Количество одновременно обрабатываемых запросов одной моделью. | -| `OLLAMA_MAX_QUEUE` | Размер очереди ожидания (по умолчанию 512). Превышение → ошибка 503. | -| `OLLAMA_KEEP_ALIVE` | Время удержания модели в памяти после последнего запроса. | - -Если эти параметры выставлены, Ollama справляется с несколькими клиентами: запросы сверх `NUM_PARALLEL` встают в очередь, а после освобождения слота обрабатываются. Прокси в этом случае выступает просто как прозрачный шлюз. - ---- - -## Как можно улучшить прокси - -Для **контроля доступа**, **изоляции клиентов** и **предотвращения злоупотреблений** в прокси можно добавить следующие механизмы: - -### 1. Аутентификация по API-ключам -- Идентифицировать каждого клиента по уникальному токену -- Отклонять запросы без валидного ключа - -### 2. Rate limiting на клиента -- Ограничивать количество запросов в секунду для каждого клиента -- При превышении лимита возвращать ошибку `429 Too Many Requests` - -### 3. Ограничение используемых моделей -- Разрешать клиенту только определённый список моделей -- Проверять поле `model` в теле запроса - -### 4. Детальное логирование -- Логировать имя клиента, метод, путь, статус, длительность запроса - +# 1. Одновременная работа с Ollama + +--- + +### Максимальное количество пользователей и зависимые факторы + +Прямого жесткого ограничения на "максимальное количество пользователей" в Ollama нет. Вместо этого, реальное количество одновременных сессий определяется следующими ключевыми факторами: + +| Фактор | Влияние | +|---|---| +| **Видеопамять (VRAM)** | Это самый главный ограничитель. Каждый параллельный запрос к модели требует дополнительной VRAM. Как только VRAM заканчивается, новые запросы не могут быть обработаны параллельно. | +| **Параметр `OLLAMA_NUM_PARALLEL`** | Эта переменная окружения напрямую указывает, сколько запросов ОДНА модель может обрабатывать одновременно. Требуемая память масштабируется пропорционально этому значению, умноженному на размер контекста модели. | +| **Сложность и размер модели** | Более крупные модели (например, с 70B параметров) потребляют значительно больше VRAM, чем маленькие (например, 7B), что напрямую сокращает возможное число параллельных сессий. | +| **Объем системной памяти (RAM)** | Если модель не помещается полностью в VRAM, часть ее слоев переносится в системную RAM. Это значительно замедляет обработку, но позволяет работать с моделями, превышающими объем VRAM. | +| **Производительность CPU** | Хотя GPU выполняет основную работу, CPU все равно участвует в обработке, и его производительность может стать узким местом при очень большом количестве одновременных легких запросов. | + +**Пример:** На GPU `RTX 3090` с 24 ГБ VRAM, для модели размером 8B, можно комфортно обслуживать около 20 одновременных пользователей. + +--- + +### Максимальное значение `OLLAMA_NUM_PARALLEL` + +Теоретического или программного "максимума" для `OLLAMA_NUM_PARALLEL` не существует. Вы можете установить это значение хоть в 100, но **практический предел всегда упирается в доступную VRAM**. + +Установка слишком высокого значения `OLLAMA_NUM_PARALLEL` приведет к ошибкам нехватки памяти, когда реальные запросы начнут поступать, и сервер не сможет выделить требуемый объем VRAM. Поэтому рекомендуется увеличивать это значение постепенно, тестируя нагрузку. + +--- + +### Что происходит при превышении лимита `OLLAMA_NUM_PARALLEL`? + +Если количество одновременных запросов от пользователей превышает значение `OLLAMA_NUM_PARALLEL`, Ollama не "падает" и не теряет запросы. Происходит следующее: + +1. **Запросы в очереди:** Все запросы, которые поступают сверх лимита `OLLAMA_NUM_PARALLEL`, помещаются в очередь. +2. **Обработка по принципу FIFO:** Эта очередь работает по принципу "первый пришел — первый обслужен" (First-In, First-Out). Как только один из параллельных слотов освобождается, Ollama берет следующий запрос из очереди и начинает его обработку. +3. **Лимит очереди:** Сама очередь тоже имеет лимит, который задается переменной `OLLAMA_MAX_QUEUE` (по умолчанию 512). Если и эта очередь переполняется, новые запросы будут отклонены с ошибкой `503 Server Overloaded`, что сигнализирует клиенту о перегрузке сервера. + +Таким образом, система спроектирована быть отказоустойчивой: она обрабатывает столько, сколько может, а остальных вежливо просит подождать в очереди. + +# 2. API Ollama + +Ollama предоставляет два основных способа взаимодействия через API: +1. **API, совместимый с OpenAI (рекомендуемый)**: Имитирует структуру OpenAI API, что позволяет использовать огромное количество существующих инструментов "из коробки". +2. **Нативный API Ollama**: Прямой, более простой API для базовых взаимодействий. + +Для большинства задач, включая интеграцию с внешними инструментами, **настоятельно рекомендуется использовать API, совместимый с OpenAI**. + +--- + +## 1. API, совместимый с OpenAI + +Этот режим специально создан для того, чтобы любые приложения, написанные для работы с OpenAI, могли без изменений кода работать с вашим локальным сервером Ollama. + +* **Базовый URL:** `http://<адрес_вашего_сервера>:11434/v1` +* **Ключ API (API Key):** Не требуется. Библиотеки могут требовать указать его, но Ollama игнорирует любое переданное значение. + +### Ключевой эндпоинт: `POST /v1/chat/completions` + +Это полный аналог эндпоинта OpenAI для чатов. + +**Пример запроса (`curl`):** +```bash +curl http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{ + "model": "llama3", + "messages": [ + { + "role": "user", + "content": "Почему небо голубое?" + } + ] +}' +``` +Структура ответа (формат OpenAI): + +Ответ полностью соответствует формату OpenAI, используя массив choices для вывода. + +```JSON +{ + "id": "chatcmpl-123", + "object": "chat.completion", + "created": 1716218112, + "model": "llama3", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Небо кажется голубым из-за явления, называемого рэлеевским рассеянием..." + }, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 10, + "completion_tokens": 150, + "total_tokens": 160 + } +} +``` + +## 2. Нативный API Ollama +Ollama также имеет свой собственный, более простой API. Он может быть полезен для быстрых скриптов или специфических задач. + +| Метод | Эндпоинт | Описание | +|---|---|---| +| `POST` | `/api/chat` | Основной эндпоинт для чата (нативный формат). | +| `POST` | `/api/generate` | Генерация текста из одного промпта. | +| `GET` | `/api/tags` | Получение списка локальных моделей. | +| `POST` | `/api/pull` | Скачивание модели из репозитория. | +| `DELETE` | `/api/delete` | Удаление локальной модели. | + +# 3. Расширение прокси для работы нескольких Codex + +--- + +## Что даёт настройка Ollama (без изменений в прокси) + +| Переменная | Назначение | +|---|---| +| `OLLAMA_NUM_PARALLEL` | Количество одновременно обрабатываемых запросов одной моделью. | +| `OLLAMA_MAX_QUEUE` | Размер очереди ожидания (по умолчанию 512). Превышение → ошибка 503. | +| `OLLAMA_KEEP_ALIVE` | Время удержания модели в памяти после последнего запроса. | + +Если эти параметры выставлены, Ollama справляется с несколькими клиентами: запросы сверх `NUM_PARALLEL` встают в очередь, а после освобождения слота обрабатываются. Прокси в этом случае выступает просто как прозрачный шлюз. + +--- + +## Как можно улучшить прокси + +Для **контроля доступа**, **изоляции клиентов** и **предотвращения злоупотреблений** в прокси можно добавить следующие механизмы: + +### 1. Аутентификация по API-ключам +- Идентифицировать каждого клиента по уникальному токену +- Отклонять запросы без валидного ключа + +### 2. Rate limiting на клиента +- Ограничивать количество запросов в секунду для каждого клиента + +### 3. Ограничение используемых моделей +- Разрешать клиенту только определённый список моделей +- Проверять поле `model` в теле запроса + +### 4. Детальное логирование +- Логировать имя клиента, метод, путь, статус, длительность запроса +