Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.
Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support
Last updated 2 weeks, 2 days ago
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 1 month ago
Как поймать прод, если он падает?
Я уже писал о том, как подготовиться к инцидентам на проде, чтобы, если это вдруг произошло, не терять время и разрешить быстро.
Сегодня разберем, что делать, когда инцидент уже просходит, и, например,
- у сервиса отпал регион
- трафик на платформу клиент перестал фильтроваться
- произошел резкий скачек QPS входных запросов, ваш кластер машин не вывозит
- latency резко увеличился и не хочет уменьшаться etc.
1️⃣ Для начала, сразу после того, как вам пришло уведомление, или вас пинганул менеджер, оцените ущерб (или по-модному blast radius). Для таких целей у вас должен быть доступ в аналитическую БД, куда аггрегируются ивенты (по аукционам, пользователям, минутам, регионам), и где вы можете, написав SQL запрос, оценить, на каком регионе, клиентской DSP, сегменте пользователей имеет место инцидент. А еще лучше для таких целей иметь уже готовый дашборд с основными аггрегатами и группами.
2️⃣ После того, как оценили ущерб, определяем состояние сервиса:
- operational: работает, возможно с небольшой долей ошибок
- degraded performance: значительная доля ошибок, ухудшен пользовательский опыт, ухудшено качество ML моделей, но основные сценарии работают или резервные (fallback) модели подхватили трафик
- partial outage: часть функционала отпала, отпал регион, полностью не отправляются запросы на конкретные DSP
- major outage: все полегло
После того, как оценили состояние, эскалируем инцидент своему менеджеру и команде инфры
3️⃣ Локализуйте проблему. Постарайтесь определить, из какого сервиса происходит причина инцидента. Если причина на сервисе, куда вы ранее не контрибьютили, пингуйте соответствующие команды, чтобы они подключились и проверили свои зоны ответственности.
4⃣️️️️️️ Пока ищется причина инцидента сфокусируйтесь на том, чтобы оживить прод (по-модному stop bleeding) - проверьте, какие были крайние коммиты, связанные с ошибками, и откатите их.
Если проблема в новых артефактах, которые кеширует сервис, то зачистите кеш (если у вас есть доступ) и перезалейте рабочие или fallback артефакты.
Если проблема в повышенном использованием CPU/ RAM от выброса трафика, upscal'ите машины на кластере
Детально исследовать, что именно привело к инциденту можно уже после - когда проблема решена.
5️⃣ Если все разрешилось - продолжайте мониторить и составьте postmortem. В нем укажите
- Оцененный ущерб
- Проанализируйте причину, почему так произошло
- Укажите ваши действия, и в какие сроки вы их предприняли
Что делают в это время менеджеры и аналитики?
- помогают связаться со стейкхолдерами (чтобы те были в курсе происходящего и могли со своей стороны что-то сделать - например, включить fallback) или нужными командами разработки
- смотрят на метрики и помогают оценить ущерб и в целом состояние приложения
- помогают эскалировать в нужную команду
Также рекомендую хорошую статью, как поднимают упавший прод на Ozon'е
В прошлой статье по задаче сопоставления изображения с помощью ключевых точек мы рассмотрели самый простой алгоритм SIFT. Он доступен из коробки в OpenCV, не требует обученых моделей, и его часто применяют в качестве бейзлайна.
Но поскольку SIFT имеет свои ограничения и корректно срабатывает, только когда имеются большие пересечения между кадрами нам нужен алгоритм, который будет способен обучиться матчить определенные сцены и генерировать дескрипторы под ключевые точки.
SuperPoint
Первым из таких алгоритмов является SuperPoint. Он основан на свёрточной сетке, с двумя выходными головами:
- Одна голова отвечает за классификацию ключевых точек: определяет, является пиксель ключевой точкой или нет.
- Вторая голова генерирует дескрипторы для каждого пикселя. Здесь каждый дескриптор – это вектор размерностью 128.
Для обучения модели используются два основных лосса:
- Кросс-энтропия для классификации ключевых точек.
- Hinge Loss для дескрипторов.
Как обучать SuperPoint?
- Генерируем синтетические данные. Создаём изображения, на которых будет понятно, где нужно разместить ключевые точки. Квадраты, линии, чёрточки, сетки, всё на фоне гауссового шума. Выучиваем сеть на этих данных и называем её MagicPoint.
- Для получения разметки на реальных картинках применяем аффинные преобразования, homography adaptation например, меняем ракурс, масштаб etc. После этого прогоняем через MagicPoint эти картинки, а предсказанные точки объединяем. Таким образом, получаем разметку на предсказание ключевых точек.
- Обучаем сетку. Считаем матрицу M применения homography adaption. Мы можем взять ключевые точки с одной матрицы и спроецировать их на другую.
```
kp1_projected = cv2.perspectiveTransform(kp1_np.reshape((1, -1, 2)), M)[0, :, :]
dists = cdist(kp1_projected, kp2_np)
M = sample_homography_alb(image)
warped = cv2.warpPerspective(src=image, M=M, dsize=(image.shape[1], image.shape[0]))
```
Сопоставив дескрипторы между двумя версиями изображения, будем оценивать расстояние между ними: если расстояние маленькое, то это одна и та же точка, и такие дескрипторы и нужно в конечном счёте стянуть. В итоге нейросеть обучается на основе сопоставления расстояний между точками и их дескрипторов, минимизируя ошибку в сопоставлении.
Сегодня у нас инфографика об основных видах тестирования приложения
▶️ Критерий Вилкоксона
Теперь давайте представим, что разницы метрик не распределены нормально. В таком случае нужны непараметрические тесты. Самый распространненый это критерий Вилкоксона. Его еще называют критерием знаковых рангов.
- Для начала переформулируем гипотезы и вместо средних будем сравнивать медианы
- H0 median(scores_cb) != median(scores_r)
- H1
- двухсторонняя гипотеза median(scores_cb != median(scores_r)
- односторонняя гипотеза median(scores_cb) < median(scores_r)
- Также, как и для Т-теста Стьюдента вычислим попарные разницы diff
между моделями (здесь то же самое ограничение на равенство дисперсий и соответсвенно размеров выборок)
- Проранжируем в порядке возрастания их модулей (при этом для повторяющихся значений назначается одинаковый ранг, равный среднему их рангов)
- Суммируем ранги с положительной разницей и обозначим результат, как W+
- То же самое делаем для суммы рангов с отрицательной разницей W\-
- Расчитем W-статистику, как W = min(W\-, W+)
и сравниваем ее с табличным порогом, чтобы опровергнуть или нет H0.
На питоне пользуемся встроенной функцией
```
stats.wilcoxon(scores_rf, scores_cb)
# output: WilcoxonResult(statistic=1.0, pvalue=0.125)
```
Social Science Statistics
Quick P Value from T Score Calculator
A simple calculator that generates a P Value from a T score.
АБ тесты
Поскольку на работе для выкатки фичей в SSP я провожу АБ тесты, считаю, что можно освежить базу по их анализу и проверке стат. гипотез.
Допустим, нам нужно сравнить две модели регрессии. Для примера возьмем открытый датасет sklearn.datasets.load_diabetes
. Создадим два регрессора CatBoostRegressor
и RandomForestRegressor
. Прогоним для каждой из модели кросс валидацию на 5 фолдов и запишем метрики MSE
двух моделей.
```
X, y = load_diabetes(return_X_y=True)
rf = RandomForestRegressor()
cb = CatBoostRegressor(verbose=False)
folds = KFold(n_splits=5)
scores_rf = cross_val_score(rf, X, y, scoring='neg_mean_squared_error', cv=folds)
scores_cb = cross_val_score(cb, X, y, scoring='neg_mean_squared_error', cv=folds)
```
Когда мы получили метрики, нам нужно выбрать какой тест проводить:
- параметрический в предположении, что наши метрики лежат в каком-то распределении
- или более консервативный непараметрический.
Рассмотрим три самых популярных
▶️ Т-тест Стьюдента
Допустим, мы считаем распределение метрик нормальным и их дисперсии равны. Тогда мы можем использовать параметрический Т-тест Стьюдента. Чтобы попрактиковаться, мы можем посчитать Т-тест руками
- Сформулируем гипотезы
- нулевую H0 avg(scores_cb) != avg(scores_r)
- альтернативную гипотезы H1
- двухсторонняя гипотеза avg(scores_cb) != avg(scores_r)
- односторонняя гипотеза avg(scores_cb) < avg(scores_r)
- Вычислим попарные разницы diff
между метриками MSE
моделей
- Вычислим среднюю разницу M
между метриками
- Вычислим стандартное отклонение разниц sd
- Вычислим стандартную ошибку SE = sd / sqrt(n)
- Посчитаем Т-статистику: t = M / SE
- Посчитаем число степеней свободы df = n \- 1
(количество значений для расчета стат. величиный, которые могут свободно меняться)
- Далее вносим T-статистику t
и df
в калькулятор T-распределения и по таблице находим уровень значимости pvalue
(вероятности ошибки первого рода)
- Сравним pvalue
с порогом alpha
(как правило, берем 0.05).
- Если тест односторонний, т.е. мы предполагаем, что scores_cb < scores_rf
, то при pvalue < 0.05
мы можем опровергнуть нашу нулевую гипотезу и сказать, что MSE
катбуста значимо меньше случайного леса
- Для двусторонней гипотезы мы делим порог значимости пополам и уже опровергаем H0 из условия pvalue < 0.025
На питоне тест Стьюдента выглядит следующим образом
```
stats.ttest_rel(scores_rf, scores_cb)
# output: Ttest_relResult(statistic=1.9353, pvalue=0.12503)
```
поскольку pvalue > 0.05
, мы не можем опровергнуть нулевую гипотезу
▶️ Т-тест Уэлча
Давайте предположим, что мы по проводили кроссвалидацию с разным числом фолдов:
```
scores_rf = cross_val_score(rf, X, y, cv=5, scoring='neg_mean_squared_error')
scores_cb = cross_val_score(cb, X, y, cv=10, scoring='neg_mean_squared_error')
```
В таком случае, тест Стьюдента нам не подходит, поскольку мы уже не можем вычислить попарные разницы. Тогда прибегаем к тесту Уэлча. Здесь нет предположения о равенстве дисперсий, соответственно и выборки могут быть разного размера. Алгоритм следующий:
- H0, H1 формулируем аналогично
- Вычислим средние метрик M1
, M2
- Вычислим дисперсии метрик var1
, var2
- Посчитаем Т-статистику: t = (M1 \- M2) / sqrt(var1/n1 + var2/n2)
- Посчитаем число степеней свободы df = n \- 1
- Далее также по таблице из t
и df
считаем pvalue
и сравниваем с порогом значимости
На питоне для этого есть функция ttest_ind
```
stats.ttest_ind(scores_rf, scores_cb, equal_var=False)
# output: Ttest_indResult(statistic=0.8564, pvalue=0.4077)
```
Social Science Statistics
Quick P Value from T Score Calculator
A simple calculator that generates a P Value from a T score.
trtexec
В продолжение поста о TensorRT
Для быстрой проверки latency модели можно использовать утилиту командной строки trtexec. Она оценивает latency / throughput с различными опциями оптимизации, а также сохраняет собранный engine с возможностью дальнейшей загрузки и запуска. Она содержит много опциональных флагов, которые включают определённые опции оптимизации.
Команды на trtexec выглядят следующим образом
```
trtexec --workspace=4096 --onnx=model.onnx --saveEngine=engine.trt --best --useSpinWait --outputIOFormats=fp16:chw --inputIOFormats=fp16:chw --verbose
```
- Здесь первый аргумент задаёт максимальный объём используемой памяти в мегабайтах, то есть для вычисления модели будет доступно 4 гигабайта видеопамяти.
- Следующие два аргумента указывают пути до модели в формате ONNX и до собранного engine (один из результатов запуска утилиты).
- Флаг \-\-best
разрешает использовать любые типы данных для достижения максимальной производительности. Чаще - это низкоразрядные типы данных.
- Следующие флаги задают порядок осей и тип входных / выходных данных модели (как правило FP16).
Telegram
ML Advertising
Продолжаем тему портирования и оптимизации ML моделей на проде. Сегодня речь пойдет про TensorRT TensorRT — это фреймворк от Nvidia, который позволяет учитывать нюансы аппаратного устройства вычислителей. В нём модель оптимизируется перед запуском таким…
Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.
Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support
Last updated 2 weeks, 2 days ago
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 1 month ago