Ultralytics YOLO27: Встать в лист ожидания.
Get Started
Создание решений на Ultralytics Platform·Развёртывание и мониторинг·Урок 7/10
Уроксредний

Разверни и вызывай конечную точку

Создай отдельную конечную точку в одном из 42 регионов, подбери размер под свой трафик и вызывай её через клиент, который обрабатывает холодные старты, ответы 429 и недействительные ключи.

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

Результат

Ты можешь развернуть модель на отдельной конечной точке, выбрать бесплатный или пользовательский размер с учётом характера трафика и вызывать её через клиент, который повторяет запросы при холодном старте и ответах 429 и быстро завершает работу при реальных ошибках.

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. На вкладке Deploy модели нажми Deploy в регионе с наименьшей задержкой.

  2. Начни с бесплатного размера: 1 vCPU и 2 GiB; выбирай пользовательский размер только для стабильного трафика реального времени.

  3. Вызывай /predict со своего сервера, используя привязанный к развёртыванию ключ; повторяй запросы при ответах 429 и тайм-аутах с экспоненциальной задержкой.

  4. Выпускай новые модели с помощью Replace model: URL, регион и ключ останутся прежними.

Практические занятия

Общий инференс или отдельная конечная точка#

Любую модель уже можно вызывать через общий API инференса Platform — он подходит для тестирования. Для производственного трафика используй отдельную конечную точку:

Общий инференсОтдельная конечная точка
СервисОбщий для пользователей PlatformОдна модель, один клиент
РегионыРегион твоих данных (US, EU или AP)Любой из 42 регионов
Ограничение частоты запросов20 запросов в минуту на ключPlatform не ограничивает прямые вызовы
Размер запросаОколо 4,5 MB32 MB, до 1 часа на запрос (поддерживается видео)
АутентификацияЛюбой API-ключ рабочего пространстваТолько ключ, привязанный к развёртыванию

Создай и настрой размер конечной точки#

Открой вкладку модели Deploy. Браузер измерит задержку до всех 42 регионов (14 в Северной и Южной Америке, 13 в Европе, 12 в Азиатско-Тихоокеанском регионе, 3 на Ближнем Востоке и в Африке) и отсортирует таблицу по этому показателю:

Вкладка Deploy модели на Ultralytics Platform: карта мира с отметками регионов и таблица Region Latency, отсортированная по измеренной задержке; в каждой строке есть кнопка Deploy

Нажми Deploy в строке региона, ближайшего к твоим клиентам, проверь CPU, объём памяти, цену и сгенерированное имя (например, yolo26n-iowa), затем нажми Create Deployment. Также можно начать с пункта New Deployment на вкладке Deployments в своём профиле:

Диалоговое окно New Deployment на Ultralytics Platform: выбор модели, мини-карта регионов с таблицей задержек, CPU задан как 1 vCPU, а память — как 2 GiB

Выбирай размер с учётом характера трафика:

ТрафикОбъёмСтоимость
Пакетные задания, внутренние инструменты, демонстрации с неравномерной нагрузкойПо умолчанию: 1 vCPU, 2 GiB; масштабируется до нуляБесплатно на любом тарифе
Постоянный трафик реального времени, который не может ждать холодного запускаНастраиваемый размер (1–8 vCPU, 2–32 GiB) с одним постоянно работающим экземпляромПочасовая оплата с момента готовности до остановки, включая простой: около $0.12/ч за 1 vCPU и 4 GiB в Айове
Пользователи в нескольких частях светаОдна конечная точка на регион за твоим собственным маршрутизаторомОплата каждой конечной точки зависит от её размера

Диалоговое окно New Deployment на Ultralytics Platform: таблица задержек по регионам и селекторы CPU и памяти с пользовательским размером 1 vCPU и 4 GiB

Тарифы допускают 3 (Free), 10 (Pro) или неограниченное количество (Enterprise) развёртываний; остановленные конечные точки тоже учитываются. Конечная точка принимает трафик, когда её статус становится Ready:

Практический пример: клиент, готовый к работе в production#

Страница развёртывания exp-3-los-angeles на Ultralytics Platform: карточки запросов, частоты ошибок и P95-задержки, карта местоположения, карточка Endpoint с URL конечной точки для копирования и сведения о развёртывании с ценой

У каждой конечной точки есть URL, например https://predict-<id>-<hash>-<region>.a.run.app, который обслуживает /predict (POST), /health и интерактивную страницу /docs. Она принимает только API-ключ, привязанный при создании; владельцы рабочего пространства видят этот ключ уже заполненным на вкладке Predict в разделе Docs развёртывания, рядом с примерами для Python, JavaScript и cURL. Примеры выполняют один запрос; производственный код должен также выдерживать холодный запуск и высокую нагрузку на экземпляр:

import os
import time
from collections import Counter

import httpx

URL = "https://YOUR_DEPLOYMENT_URL.run.app/predict"
HEADERS = {"Authorization": f"Bearer {os.environ['ULTRALYTICS_API_KEY']}"}  # the deployment's bound key, server-side only

def predict(client, path, conf=0.25, attempts=4):
    """POST one image; retry timeouts, 429, and 5xx with backoff; fail fast on other errors."""
    for attempt in range(attempts):
        try:
            with open(path, "rb") as f:
                r = client.post(URL, headers=HEADERS, data={"conf": conf}, files={"file": f}, timeout=90)
            if r.status_code < 400:
                return r.json()
            if r.status_code != 429 and r.status_code < 500:
                r.raise_for_status()  # 401 wrong key, 413 too large: retrying won't help
            wait, reason = float(r.headers.get("Retry-After", 2**attempt)), r.status_code
        except httpx.TimeoutException:  # a scaled-to-zero endpoint can take up to a minute to wake
            wait, reason = 2**attempt, "timeout"
        print(f"attempt {attempt + 1}: {reason}, retrying in {wait:.0f} s")
        time.sleep(wait)
    raise RuntimeError(f"endpoint still unavailable after {attempts} attempts")

with httpx.Client() as client:
    response = predict(client, "bus.jpg")
for image in response["images"]:
    counts = Counter(d["name"] for d in image["results"])
    print(f"{sum(counts.values())} objects {dict(counts)} in {image['speed']['inference']:.1f} ms")

Мы проверили его на локальной заглушке: она один раз отвечает 429, а затем возвращает настоящий результат YOLO26n для bus.jpg в формате ответа конечной точки:

attempt 1: 429, retrying in 2 s
5 objects {'bus': 1, 'person': 4} in 34.9 ms

Разберём важные решения построчно:

  • timeout=90 учитывает холодный запуск длительностью до минуты; стандартные тайм-ауты большинства HTTP-клиентов намного короче.
  • Для ошибок 429 и 5xx выполняются повторные попытки с учётом Retry-After, если конечная точка его отправляет. Каждая конечная точка обслуживает запросы одним экземпляром и при перегрузке ограничивает нагрузку с помощью 429.
  • При других ошибках 4xx запрос сразу завершается с ошибкой: 401 означает неверный ключ, а 413 — что размер тела запроса превышает 32 MB; ни одна из этих проблем не исчезнет сама собой.
  • Ответ содержит по одной записи на изображение (или видеокадр) в images; каждая запись включает results (class, name, confidence, box с x1, y1, x2, y2) и speed в миллисекундах.

Необязательные поля формы: conf (по умолчанию 0.25), iou (0.7), imgsz (размер, на котором обучалась модель), vid_stride для видео и normalize=true для координат в диапазоне 0–1. Эквивалентный вызов cURL — по одной строке на поле:

curl -X POST "https://YOUR_DEPLOYMENT_URL.run.app/predict" \
  -H "Authorization: Bearer $ULTRALYTICS_API_KEY" \
  -F "file=@bus.jpg" -F "conf=0.25" -F "iou=0.7" -F "imgsz=640"

Выпускай новые версии, не меняя URL#

Команда Replace model на странице развёртывания заменяет модель на другую завершённую модель из того же рабочего пространства. Старая модель продолжает работать, пока не будет готова новая; URL, регион и ключ остаются прежними. Если развёртывание новой модели завершится неудачей, предыдущая модель продолжит работу. Откат выполняется той же командой для предыдущей модели, поэтому не удаляй её из проекта. Команда Update configuration меняет размер на месте, а Stop приостанавливает оплату, сохраняя URL.

Для некоторых изменений нужна новая конечная точка: регионы нельзя изменить (для переноса нужно удалить конечную точку и создать заново, получив новый URL), а пользовательские домены не поддерживаются. Если клиентам нужно постоянное брендированное доменное имя, поставь перед конечной точкой собственный шлюз. Чтобы работать вне Platform, экспортируй модель (Экспорт для развёртывания) или размести её самостоятельно за Triton Inference Server.

Подводные камни#

API-ключ попадает в браузер

Симптом: на твоём эндпоинте появляется трафик, который ты не можешь объяснить. Решение: никогда не помещай ключ в веб-приложение или мобильное приложение; вызывай эндпоинт из своего бэкенда. Удаление или деактивация привязанного ключа не блокирует эндпоинт, потому что он всё ещё принимает эту строку ключа. Чтобы отозвать доступ, останови или удали развёртывание и создай новое, привязав к свежему ключу.

Первый запрос после тихой ночи завершается по тайм-ауту

Симптом: первый утренний запрос завершается ошибкой, а повторный проходит успешно. Решение: эндпоинты стандартного размера масштабируются до нуля. Установи тайм-аут не менее 90 секунд, отправь запрос /health для прогрева эндпоинта перед ожидаемым трафиком или переключись на пользовательский размер, если каждый запрос должен обрабатываться быстро.

Большие видео отклоняются

Симптом: загрузка завершается ошибкой 413. Решение: выделенные эндпоинты принимают тела запросов размером до 32 МБ. Раздели длинные видео на короткие клипы или отправляй выбранные кадры, а также передай vid_stride, чтобы пропускать кадры на стороне сервера.

Попробовать

Разверни лучшую модель с размером по умолчанию в регионе с минимальной задержкой. Отправь запрос с помощью client.py с сервера или из терминала, затем измерь время одного запроса после часа простоя конечной точки (не открывая её страницу) и ещё одного сразу после него. Наконец, замени модель на следующую по качеству и проверь, что тот же URL возвращает результаты новой модели.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • client.py выводит количество объектов, обнаруженных твоей конечной точкой.

  • Ты измерил время холодного и прогретого запросов и записал решение о размере вместе с его месячной стоимостью.

  • Замена модели завершена, и тот же URL обслуживает запросы с новой моделью.

Показать решение

Пример ответа для камеры контроля таблеток на производственной линии: разверни v2-finetune в europe-west1 (Сен-Гилен — регион с минимальной задержкой для немецкого завода) с размером по умолчанию. Холодный запрос после часа простоя: 38 с — тайм-аут в 90 секунд позволяет его обработать; прогретый запрос: 0,3 с. Решение: ПЛК линии отправляет кадр каждые 30 секунд во время смен, поэтому конечная точка остаётся прогретой всю смену и только обработка первого кадра требует холодного запуска. Вызов /health с контроллера линии за 2 минуты до каждой смены устраняет и эту задержку, поэтому можно оставить бесплатный размер по умолчанию и сэкономить около $90 в месяц по сравнению с пользовательским экземпляром на 1 vCPU и 4 GiB. Повторная замена модели на v1-baseline возвращает результаты v1 по тому же URL; для завершения снова замени модель на v2.

Что дальше

Сервис работает. Далее ты настроишь две проверки, которые сообщат о проблемах с конечной точкой или моделью.

Войди, чтобы сохранять прогресс