Профилирование AI Computer Vision

AI-ориентированная карта по профилированию CV и производительности скриптов с MiniProfiler.

Профилирование и поиск проблем с производительностью

Карта-справочник по измерению производительности скриптов и computer vision через API на базе MiniProfiler, встроенные CV-хелперы, ручные шаги и вывод профайлера.

Что обычно хотят сделать

  • Понять, почему медленно работает CV-цикл.
  • Измерить скорость image search, OCR, color search, ML search или обработки пикселей.
  • Сравнить две реализации.
  • Добавить тайминги вокруг своего скриптового кода.
  • Вывести данные профилирования в текстовом виде или в собственном UI.
  • Не допустить бесконтрольного роста памяти из-за профилирования.

Как это устроено

  • В EyeAuras используется иерархия таймингов в стиле MiniProfiler.
  • У ICvAccessor есть свойство Profiler.
  • EnableProfiling() включает тайминги для конкретного экземпляра CV accessor.
  • CV-операции создают внутренние шаги профайлера только если профилирование включено.
  • Для своего кода можно использовать Profiler.Step("name") вокруг измеряемых блоков.
  • Данные профилирования хранятся в памяти, поэтому их жизненный цикл должен быть ограничен сценарием использования.
  • Первый вызов часто включает инициализацию и обычно работает медленнее, чем вызовы в стабильном режиме.

Детали API

  • ICvAccessor.Profiler — экземпляр MiniProfiler, связанный с этим accessor.
  • ICvAccessor.EnableProfiling() — включает внутренние CV-тайминги для данного accessor.
  • MiniProfiler.Step(...) — создаёт дочерний шаг с измерением времени.
  • MiniProfiler.RenderPlainText() — текстовый отчёт для логов.
  • IProfilerProvider — общий провайдер профайлера для app/global-сценариев.
  • ProfilerProvider.Default / ProfilerProvider.Startup — стандартные точки входа для профилирования на уровне приложения.
  • Имена внутренних CV-шагов обычно включают операцию, ключ и фазу: Renting, Preparations, Refresh, Resolution, OSD.

Типовые сценарии

Профилирование CV-цикла

  1. Создайте CV accessor для нужного окна или источника.
  2. Вызовите EnableProfiling() у этого accessor.
  3. Оберните каждую итерацию цикла в Profiler.Step("Loop #...").
  4. Дайте CV-вызовам добавить свои внутренние дочерние шаги.
  5. После ограниченного прогона выведите или проверьте результат Profiler.

Профилирование своего кода

  1. Возьмите существующий профайлер или создайте/получите общий экземпляр.
  2. Оборачивайте дорогие блоки в using (profiler.Step("Meaningful step name")).
  3. Используйте достаточно стабильные названия шагов, чтобы их можно было агрегировать.
  4. Сравнивайте отдельно тайминги прогрева и тайминги стабильной работы.

Сравнение реализаций

  1. Сделайте один прогревочный проход, если API, модель или image pipeline инициализируются лениво.
  2. Запускайте сравниваемые реализации внутри именованных шагов профайлера.
  3. Смотрите не только на один замер, а на average/min/max/percentile.
  4. Если CPU-тайминги выглядят странно, дополнительно проверьте выделения памяти и перемещение данных.

Важные замечания по производительности

  • Первые вызовы CV/ML могут включать создание модели, инициализацию захвата, выделение изображений или настройку OCR-движка.
  • Прямой доступ через memory/span может быть заметно быстрее, чем API с по-пиксельным доступом.
  • OSD/debug-отрисовка полезна, но её лучше измерять отдельно от самого детекта.
  • Профилирование каждой итерации бесконечно долго само по себе может стать дорогим.
  • Профайлеры хранят дерево таймингов в памяти, поэтому в long-running mini-app стоит ограничивать хранение данных или периодически делать reset/report.

Что лучше делать

  • Лучше вызывать EnableProfiling(), прежде чем писать свои таймеры для CV API.
  • Лучше использовать стабильные названия шагов, если вы агрегируете повторяющиеся тайминги цикла.
  • Лучше отдельно измерять прогрев и отдельно — стабильный цикл.
  • Лучше использовать RenderPlainText() для быстрых логов, а для дашбордов — свои рендеры.
  • Лучше профилировать точечно вокруг подозрительно медленных мест.

Чего лучше избегать

  • Не профилируйте бесконечные циклы без ограничений по времени.
  • Не сравнивайте инициализацию первого вызова со стабильной рабочей фазой.
  • Не включайте время input/mouse/OSD в чистое время CV detection, если это не сделано специально.
  • Не делайте выводы по одному случайному замеру одной итерации.
  • Не добавляйте дорогой логгинг внутрь tight loop во время измерения производительности.

Опорные термины для поиска

  • ICvAccessor
  • EnableProfiling
  • MiniProfiler
  • MiniProfiler.Step
  • RenderPlainText
  • IProfilerProvider
  • ProfilerProvider
  • ImageSearchRaw
  • ColorCheckRaw
  • PixelSearchRaw
  • TextSearchRaw
  • CountPixels
  • ProcessPixels
  • MLSearchRaw

Синонимы для поиска

  • profiling
  • performance
  • MiniProfiler
  • profiler step
  • CV profiler
  • render plain text
  • image search timing
  • pixel processing performance
  • first call warmup
  • steady state
  • percentile
  • profiling memory

Связанные карты

  • computer-vision/images.md
  • ml/ai.md
  • osd/screen-overlay.md
  • scripting/runtime.md