TensorRT: выбор профиля под форму входа — задача
Сервис хранит несколько профилей для одной модели, а запрос приходит с конкретной формой тензора. Проверьте, какие профили принимают эту форму, и выберите один по правилам задачи. Для решения достаточно Python: запуск TensorRT и GPU здесь не требуются.
Программа курса «Computer Vision Engineer: от детекции и Doc-AI до продакшна».
Форма попадает в профиль
Задание
У сервиса заранее собрано несколько engine одной и той же сети — они отличаются только оптимизационными профилями. Приходит запрос с формой входа, и надо решить, каким engine его считать.
Реализуйте функцию pick_profile(profiles, shape). Аргумент profiles — список профилей в том порядке, в каком engine лежат у сервиса; каждый профиль это кортеж из трёх списков целых чисел: наименьшая форма, рабочая и наибольшая. Аргумент shape — форма, которую подают на вход, тоже список целых чисел.
Какой профиль принимает форму. У профиля и у запрошенной формы должно совпасть число осей, и по каждой оси значение должно попадать между наименьшей и наибольшей формой профиля, границы включительно. Профиль с другим числом осей форму не принимает независимо от значений.
Какой из принявших выбрать. План вычислений в engine подобран под рабочую форму, поэтому из принявших берётся тот профиль, у которого запрошенная форма ближе всего к рабочей. Расстояние считается как сумма модулей разностей по осям. Если расстояние совпало у нескольких, берётся профиль с меньшей суммой значений наибольшей формы: широкий диапазон резервирует видеопамять по своему верхнему краю. Если и эта сумма совпала — профиль с меньшим номером в списке.
Что вернуть. Номер выбранного профиля в списке profiles, считая с нуля. Если форму не принимает ни один профиль, верните None.
Пример
profiles = [
([1, 3, 640, 640], [8, 3, 640, 640], [32, 3, 640, 640]),
([1, 3, 640, 640], [4, 3, 640, 640], [8, 3, 640, 640]),
]
pick_profile(profiles, [4, 3, 640, 640]) # 1
pick_profile(profiles, [16, 3, 640, 640]) # 0
Батч из четырёх кадров принимают оба профиля, но у второго это ровно рабочая форма, расстояние ноль. Батч из шестнадцати принимает только первый: у второго наибольшая форма восемь.
Примечание
Вход уже разобран и приходит аргументами, всё в нём — целые числа. У трёх форм одного профиля число осей одинаковое, а вот у разных профилей в списке оно может отличаться, и заранее неизвестно. Менять входные данные нельзя. Вызывать функцию вручную не нужно, проверка запускает её сама.
Что проверяется
Код проверок скрыт, так что вот полный список того, что в них разбирается:
- формат ответа: целое число в пределах списка либо
None; - входные данные после вызова не изменились;
- оба вызова из примера;
- форму принимает ровно один профиль;
- форму не принимает ни один профиль;
- расстояние до рабочей формы набирается по нескольким осям сразу;
- форма ровно на наименьшей и ровно на наибольшей границе профиля;
- форма на единицу за границей профиля;
- равное расстояние до рабочей формы у двух профилей;
- равное расстояние и одинаковая наибольшая форма у двух профилей;
- профиль, у которого по оси все три числа равны;
- профиль, у которого осей больше и у которого меньше, чем у запрошенной формы;
- профиль из одной оси;
- пустой список профилей.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
