Сколько камер выдержит сервер: расчёт на 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 — положительное число. Проверять аргументы не нужно. Вызывать функцию вручную не нужно, проверка запускает её сама.

Что проверяется

Код проверок скрыт, так что вот полный список того, что в них разбирается:

  • формат ответа: кортеж из целого числа и строки, название этапа — одно из двух названных;
  • вызов из условия;
  • шаг обработки, равный единице, и шаг, при котором сети достаётся меньше кадра в секунду;
  • набор чисел, где узким этапом оказывается сеть;
  • набор чисел, где смена шага обработки переносит узкий этап с сети на декодирование;
  • время делится между этапами поровну;
  • дробное число камер и набор чисел, где не помещается ни одной камеры;
  • допустимая загрузка, равная единице.
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи