Сколько камер выдержит сервер: расчёт на Python
Перед подключением новых камер нужно оценить нагрузку декодирования и модели. Напишите функцию расчёта ёмкости сервера по замерам и допустимой загрузке CPU. Учтите, что декодируется каждый кадр, а модель получает только часть кадров.
Программа курса «Computer Vision Engineer: от детекции и Doc-AI до продакшна».
Сколько камер выдержит машина
Задание
Замеры на целевой машине уже сделаны: известно, во сколько процессорного времени обходится кадр на пути до сети и во сколько обходится вызов самой сети. Из этих чисел получается ответ заказчику — сколько камер поставить и во что упрётся следующая.
Реализуйте функцию stream_capacity(decode_ms, infer_ms, fps, tick, cores, load). Аргументы:
decode_ms— процессорное время на декодирование и подготовку одного кадра, миллисекунды;infer_ms— процессорное время на вызов сети для одного кадра, миллисекунды;fps— сколько кадров в секунду отдаёт одна камера;tick— шаг обработки: сети достаётся каждыйtick-й кадр;cores— сколько ядер у машины;load— допустимая доля загрузки, от нуля до единицы.
Конвейер устроен так: кадр от камеры декодируется и приводится к входу сети, а дальше сети достаётся каждый tick-й из них — остальные отбрасываются уже готовыми.
Бюджет машины — это cores секунд процессорного времени на каждую секунду работы, из которых занимать разрешено долю load. Число камер — целая часть от бюджета, делённого на цену одной камеры; если не помещается даже одна, камер ноль.
Узкий этап — тот, на который уходит больше процессорного времени за секунду работы одной камеры: строка "декодирование" или строка "сеть". Когда время делится поровну, узким этапом считается декодирование.
Вернуть кортеж из двух значений: число камер и название узкого этапа.
Пример
stream_capacity(20.0, 12.0, 25, 5, 8, 0.75)
# (10, 'декодирование')
Одна камера отдаёт 25 кадров в секунду, и каждый из них стоит 20 мс процессорного времени — 500 мс в секунду. В сеть уходит пять кадров из этих двадцати пяти, то есть ещё 60 мс. Из восьми секунд процессорного времени занимать разрешено три четверти, и на 560 мс они делятся десять раз с остатком.
Примечание
Вход уже разобран и приходит аргументами: времена и load — вещественные числа больше нуля, tick и cores — целые числа не меньше единицы, fps — положительное число. Проверять аргументы не нужно. Вызывать функцию вручную не нужно, проверка запускает её сама.
Что проверяется
Код проверок скрыт, так что вот полный список того, что в них разбирается:
- формат ответа: кортеж из целого числа и строки, название этапа — одно из двух названных;
- вызов из условия;
- шаг обработки, равный единице, и шаг, при котором сети достаётся меньше кадра в секунду;
- набор чисел, где узким этапом оказывается сеть;
- набор чисел, где смена шага обработки переносит узкий этап с сети на декодирование;
- время делится между этапами поровну;
- дробное число камер и набор чисел, где не помещается ни одной камеры;
- допустимая загрузка, равная единице.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
