Налаштування Canary Deployment для ML-моделей: покрокове керівництво

Нова версія моделі здатна за хвилини зіпсувати якість рекомендацій, скорингу чи прогнозів. Ми налаштовуємо канареечний випуск під ключ: спрямовуємо частку трафіку на нову модель, порівнюємо метрики з базовою версією й відкочуємо автоматично. Запуск перестає бути ризиком для продукту та репутації.
Часті запитання

Canary deployment ML: чому розгортання нової моделі ламає прод

Нова версія моделі вирушає в прод одним тегом на весь трафік — так виглядає найпоширеніший збій розгортання. Офлайн-перевірки пройдено, відкладена вибірка дає потрібну якість, реліз іде на 100% запитів.

Через пів години моніторинг показує деградацію прогнозів: зростає частка відмов у скорингу, рідкісні сегменти просіли сильніше за інших, а в логах уже відповіді нової моделі по всіх клієнтах.

Відкотити таке розгортання нічим. Якщо реліз публікується поверх попереднього тегу в реєстрі образів, минулий артефакт перезаписано, і «повернути як було» перетворюється на перезбирання з вихідних кодів і повторну валідацію.

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

Справа не в тому, що модель погана. Прод-контур відрізняється від тестового: інший потік запитів, дрейф ознак, нерівномірні сегменти, затримки зовнішніх джерел даних.

Метрика на статичній вибірці нічого не говорить про поведінку на живому трафіку — отже, ризик прод-контуру обмежують до розгортання, а не розбирають після.

Canary deployment саме про це: нова версія отримує малу частку трафіку, зазвичай 1–5%, передбачення порівнюються з еталонною моделлю за сегментами та розподілами, а розходження вище порогу автоматично повертає попередню версію.

Розділення потоку та правила відкату описуються декларативно — в оркестраторах рівня Kubernetes це рівень маніфестів, а не ручних дій чергового. Нижче розбираємо, як такий контур збирається і що потрібно зафіксувати до першого розгортання.

Кероване розгортання моделі: вимірюваний ефект для продукту

На канареечному розгортанні змінюється не лише процедура релізу — змінюється те, що команда бачить і на що встигає зреагувати. Нижче — ефекти, які проявляються вже в перших циклах, і метрики, за якими їх перевіряють.

Частка помилкових відповідей і спостережуваність моделі

Поки нова версія приймає 1–5% трафіку, її показники рахуються окремо від стабільної: частка відмов, розподіл передбачень, затримка, зміщення вхідних даних.

Порівняння йде не «на око», а за еталонним зрізом, зафіксованим до релізу, — розходження видно на перших сотнях запитів, а не через тиждень за відгуками користувачів.

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

Час відкату і зниклий клас відмов

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

Зникає цілий клас відмов — масове погіршення якості після релізу, коли погані відповіді отримують одразу всі користувачі.

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

Вартість збою падає не за рахунок «більш акуратних релізів», а за рахунок обмеженого радіуса ураження: помилка залишається на кількох відсотках запитів і гаситься до того, як дійде до всієї аудиторії.

Схеми маршрутизації трафіку для ML: порівняння режимів

Вибір схеми визначається тим, що саме перевіряють: стійкість сервісу чи якість відповідей моделі. Нижче — чотири режими, між якими реально обирають команди, та їх обмеження.

Варіант Коли підходить Чим обмежений
Канареечне розгортання за часткою трафіку Потрібна перевірка на живих користувачах при контрольованому ризику: нова версія отримує малу частку запитів, далі частка нарощується за метриками Потребує автоматичного відкату за метриками, інакше частка зростає «на око»; на рідкісних класах відповідей статистика набирається повільно
Тіньовий режим Копія бойових запитів іде на нову модель, відповіді клієнту не повертаються — якість порівнюють на реальному розподілі Подвійне навантаження на сервіс моделі; не можна оцінити, як нова відповідь впливає на поведінку користувача
Синьо-зелене перемикання Потрібен миттєвий перевід усього трафіку після прогону перевірок, наприклад при несумісній зміні формату відповіді Немає проміжних часток: відкат — це повне повернення, потрібен прогрів нового середовища
Ручне перемикання Рідкісні релізи та розбір інцидентів, коли рішення усвідомлено приймає черговий Залежить від людини: немає градації частки, час реакції дорівнює часу до того, хто помітив проблему

Що вирішують правила маршрутизації

Частка трафіку — не єдиний важіль: розподіл задається правилами за ідентифікатором клієнта або заголовком запиту, щоб одна сесія не стрибала між версіями.

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

Як ми впроваджуємо кероване розгортання: етапи інженерних робіт

Розгортання ML-моделі відрізняється від релізу звичайного сервісу: нова версія може відповідати швидко й без помилок, але давати менш якісні передбачення. Тому частку трафіку прив'язують не лише до доступності, а й до сигналів якості, а перемикання ведуть ступенями.

  1. Аудит розгортання. Розбираємо, як версії моделі потрапляють у продакшен: де лежать артефакти, як обирається активна версія, чи можна відвести частину трафіку на нову. Відзначаємо місця, де немає зворотного шляху.
  2. Схема маршрутизації. Визначаємо, де ділиться потік — балансувальник, шлюз або сервіс інференсу, — і як задається частка трафіку: змінюється на ходу чи потребує перезапуску.
  3. Сигнали якості моделі. Узгоджуємо метрики порівняння версій: частка відмов інференсу, час відповіді, розподіл передбачень, бізнес-метрика на розміченому зрізі. Для кожної — поріг і мінімальний обсяг спостережень.
  4. Правила перемикання. Фіксуємо в конфігурації стартову частку, крок і паузу між ступенями, умови автоматичної зупинки розгортання.
  5. Перевірка на трафіку. Ведемо канареечну версію на малій частці, звіряємо сигнали з базовою і нарощуємо ступенями. Для швидкого набору статистики додаємо тіньовий прогін на історичних запитах.
  6. Регламент відкату. Прописуємо, який сигнал і чий тригер повертає попередню версію, за який час проходить відкат і як перевіряється цілісність після нього.
  7. Передача. Віддаємо схему маршрутизації, конфігурацію правил, панель метрик і регламент відкату, проводимо розбір з командою.

Комплект постачання: конфігурації, схеми та регламенти відкату

Налаштування канареечного розгортання (canary deployment) для ML-моделей — це не разова правка в конфізі, а набір артефактів, які залишаються у вашої команди.

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

  • Конфігурації розгортання — файли з описом версій, кроків нарощування частки трафіку та порогів, за яких розгортання зупиняється автоматично.
  • Схема потоків даних — від вхідного запиту до логування передбачень: де трафік розходиться на дві версії, як порівнюються відповіді, де зберігаються ознаки.
  • Політики доступу — розмежування ролей: хто змінює ваги, хто бачить метрики, хто має право на відкат. Окремі області видимості для бойового і тестового контурів.
  • Спостережуваність — дашборди за якістю моделі та службовими метриками, алерти на розходження між стабільною і канареечною версією.
  • Регламент відкату — критерії спрацьовування, порядок дій, відповідальний за рішення і цільовий час повернення до стабільної версії.
  • Документація — інструкції з розгортання, чек-лист перед релізом, опис середовищ і типових збоїв.
  • Передача знань — розбір архітектури з вашою командою і запис сесії, щоб підтримка не залежала від нас.

Кейс: переведення рекомендаційної моделі на канареечне розгортання

Як було до впровадження

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

Якість у проді безперервно не вимірювалася: орієнтувалися на офлайн-заміри перед релізом, а про деградацію дізнавалися за падінням замовлень, найчастіше вночі. Черговий відкочував вручну — півтори-дві години на діагностику і повернення версії, три-чотири таких випадки на місяць.

Що змінили і що вийшло

Трафік розділили: 5% на нову версію, потім 25%, потім весь потік — просування лише за виконання умов. Онлайн-метрики якості (частка кліків за рекомендаціями і попадання релевантних товарів у першу видачу) звіряються з контрольною групою кожні кілька хвилин.

Поріг якості задано заздалегідь: відхилення метрики нижче контрольної на два процентних пункти або зростання частки відмов запускає автоматичний відкат. Ваги перемикає Kubernetes — повернення на попередню версію йде без участі людини.

Метрики до і після: нічні аварії — було три-чотири на місяць, стало нуль за квартал. Цикл випуску скоротився з двох-трьох тижнів до одного, бо перевірка на 5% потоку займає години і не потребує ручних узгоджень.

Відкат — з двох годин роботи чергового до кількох хвилин за сигналом. Частка розгортань, що доїхали до повного трафіку без відкатів, зросла приблизно до дев'яти з десяти: модель доходить до користувачів швидше, а деградація відсікається на малій частці аудиторії.

Чим канареечне розгортання відрізняється від тіньового режиму?

Тіньовий режим запускає нову модель на копії бойового трафіку: вона рахує передбачення паралельно з поточною, але її відповіді не йдуть користувачу. Впливу на користувачів немає — запити обслуговує попередня версія, а розходження рахуються на тих самих входах. Порівняння виходить чесним за даними, але одностороннім.

Головне обмеження тіньового режиму — немає зворотного зв'язку моделі. Ми бачимо помилки, затримки і дрейф вхідних даних, але не бачимо, як змінюється поведінка людей при нових відповідях.

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

Канареечне розгортання віддає новій моделі реальну частку трафіку — зазвичай одиниці відсотків — і підвищує її в міру підтвердження метрик.

Вплив на користувачів тут є, зате з'являється справжній зворотний зв'язок: продуктові показники рахуються на тих самих запитах, що й раніше, і їх можна порівнювати з попередньою версією напряму.

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

Якщо помилка помітна і погано відкочується, спочатку проганяють тіньовий режим на реальних даних, а вже потім відкривають трафік. Умови відкату задаються заздалегідь і спрацьовують автоматично — тоді порівняння режимів не перетворюється на ручне чергування біля графіків.

Технічні сумніви: відкат, якість даних, навантаження

Перед увімкненням канареечного деплою на бойовому ML-сервісі виникають одні й ті самі сумніви: хто і як відкочує, як відокремити деградацію моделі від сезонності даних і чи не доведеться переробляти сервіс.

Ручний відкат — це довго і ризиковано?

Ручний відкат безпечний, якщо це перемикання частки трафіку на попередній артефакт моделі, а не перезбирання сервісу. Обидві версії живуть одночасно, ваги правляться одним конфігом, повернення займає десятки секунд. Право натиснути закріплено за роллю, а автотригер за метриками якості страхує.

Як відрізнити деградацію моделі від сезонності даних?

Метрику рахуємо на однаковому зрізі: обидві версії отримують запити в одній пропорції за каналами, регіонами та годинами. Паралельно стежимо за дрейфом вхідних даних — зсувом розподілу ознак.

Якщо входи поїхали і якість впала слідом, це розходження навчальної вибірки з бойовим потоком, а не сезонність.

Чи потрібна переробка сервісу під розділення трафіку?

Зазвичай ні. Якщо сервіс не зберігає стан між викликами, а модель постачається окремим артефактом, розділення робить шлюз — за часткою або службовим заголовком. Переробка потрібна там, де версія вшита в код або вивід іде всередині довгого процесу з накопиченим станом.

Як канареечна версія впливає на навантаження?

Вона забирає частку запитів, тому її пул рахуємо окремо, із запасом під пік. Якщо ресурсів впритул, вмикаємо тіньовий режим: версія отримує копію запитів, не впливаючи на відповідь користувачу, а якість рахуємо офлайн — навантаження на сервіс залишається передбачуваним.

Обговоримо вашу задачу розгортання: повернемося з оцінкою та планом

Оцінка впровадження виходить точною, коли є вихідні дані. Опишіть задачу: що за сервіс, як зараз розгортається нова версія моделі і що у вашому розумінні вважається невдалим релізом. Звіримо це з вашим контуром і повернемося з планом робіт, а не із загальними формулюваннями.

  • Схема сервісу: звідки йде трафік, де стоїть балансувальник, куди пишуться відповіді моделі та логи.
  • Поточний порядок розгортання: вручну чи автоматично, хто перемикає версію і за якою командою.
  • Вимоги до якості: які метрики вважаються погіршенням і на якому обсязі запитів це вже видно.
  • Правила відкату: за який час версія має бути повернена і хто приймає рішення про повернення.
  • Обмеження контуру: де живуть дані, чи допустимо направляти частину трафіку на нову модель.
  • Склад команди та вікна змін, щоб план робіт не конфліктував з поточними релізами.
  • Доступи та ролі для налаштування спостережуваності — хто дивиться метрики і хто на них реагує.

З цього збираємо план робіт з етапами, ролями та точками контролю, а наступні кроки фіксуємо після короткого розбору вашого контуру. Напишіть нам і обговоріть задачу — повернемося з оцінкою та планом.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142