Использование вычислительной мощности и памяти для Windows ML

В этой статье показано, как управлять производительностью приложения при использовании Машинного обучения Windows.

Работа с потоками и параллелизм

Каждый объект, предоставляемый из среды выполнения, является гибким. Это означает, что к нему можно получить доступ из любого потока. См. сведения о гибких объектах в C++/WinRT.

Одним из ключевых объектов, с которыми вы будете работать, является LearningModelSession. Этот объект всегда безопасно вызывать из любого потока.

  • Для сеансов с нагрузкой на GPU: объект блокирует и синхронизирует параллельные вызовы. Для обеспечения параллелизма нужно создать несколько сеансов.

  • Для сеансов с нагрузкой на ЦП: объект не блокирует и разрешает параллельные вызовы в одном сеансе. Необходимо соблюдать осторожность при управлении собственным состоянием, буферами и объектами привязки.

Необходимо соблюдать осторожность, оценивая цель вашего сценария. Современные архитектуры GPU работают не так, как архитектуры ЦП. Например, если требуется низкая задержка, вы можете управлять распределением работы между ядрами ЦП и GPU с помощью конвейеров, а не параллелизма. Для начала ознакомьтесь со сведениями о синхронизации с несколькими ядрами. Если же требуется обеспечить пропускную способность (например, одновременную обработку максимального количества образов), вы можете использовать несколько потоков и параллелизм, чтобы повысить нагрузку на ЦП.

В контексте потоков и параллелизма вы можете выполнять эксперименты и измерять временные показатели. Производительность будет заметно меняться в зависимости от целей и сценария.

Использование памяти

Каждый экземпляр LearningModel и LearningModelSession имеет копию модели в памяти. Если вы работаете с небольшими моделями, вы не почувствуете сложностей, но при использовании больших моделей это становится важным.

Чтобы освободить память, вызовите метод Dispose в модели или сеансе. Недостаточно их просто удалить, так как в некоторых языках применяется отложенная сборка мусора.

LearningModel сохраняет копию в памяти для поддержки создания нового сеанса. Когда вы удаляете LearningModel, все существующие сеансы продолжают работать. Но теперь вы не сможете создать новый сеанс с тем же экземпляром LearningModel. Для больших моделей можно создать модель и сеанс, а затем удалить модель. Используя один сеанс для всех вызовов Evaluate, вы получите только одну копию большой модели в памяти.

Поддержка Float16

Для повышения производительности и уменьшения объема памяти, занимаемой моделью, можно с помощью ONNXMLTools преобразовать модели в формат float16.

После преобразования все весовые коэффициенты и входные данные будут иметь тип float16. Ниже описано, как работать с входными и выходными данными типа float16:

  • ImageFeatureValue

    • Рекомендуется использовать этот способ.
    • Преобразует цвета и тензоры в тип float16.
    • Поддерживает 8-битные изображения и изображения в формате bgr8, которые можно безопасно преобразовывать в тип float16 без потери данных.
  • TensorFloat

    • Дополнительный способ.
    • Приведение float32 к float16.
    • Для изображений такое приведение безопасно, так как bgr8 имеет малый размер и размещается в новом типе без проблем.
    • Для других типов данных операция Bind завершится сбоем, и вместо этого нужно передавать данные в TensorFloat16Bit.
  • TensorFloat16Bit

    • Дополнительный способ.
    • Нужно выполнить преобразование во float16 и передать входные данные в формате float32, которые будут приводиться к float16.

Примечание.

В большинстве случаев этот оператор все равно выполняет вычисления в 32-разрядном формате. Так снижается риск переполнения, а полученный результат обрезается до типа float16. Впрочем, если для оборудования заявлена поддержка float16, среда выполнения воспользуется этой возможностью.

Предварительная обработка входных данных

WinML автоматически выполняет некоторые действия по предварительной обработке, чтобы упростить обработку и повысить ее эффективность. Например, входящие изображения могут иметь разные цветовые форматы и размеры, часть из которых отличается от ожиданий модели. WinML преобразует такие изображения, чтобы они соответствовали требованиям, снимая эту проблему с разработчика.

Также WinML применяет весь аппаратный стек (ЦП, GPU и т. д.) для максимально эффективного преобразования под конкретное устройство и сценарий.

Но в некоторых случаях вам придется вручную преобразовывать входные данные в тензор с учетом особых ограничений. Например, если вы не хотите использовать для изображений формат VideoFrame или вам нужно нормализовать значения пикселей из диапазона 0–255 в диапазон 0–1. Для таких случаев можете реализовать собственное преобразование данных в тензор. Примеры таких преобразований вы найдете здесь.

Примечание.

Используйте следующие ресурсы для получения справки по машинному обучению в Windows:

  • Чтобы задать технические вопросы о машинном обучении в Windows или ответить на них, используйте тег windows-machine-learning в Stack Overflow.
  • Сообщить об ошибке можно в нашем репозитории GitHub.