Поделиться через


Производительность и память Windows ML

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

Потоки и параллелизм

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

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

  • Для сеансов GPU: объект блокирует и синхронизирует одновременные вызовы. Если вам требуется конкуренция, необходимо создать несколько сеансов, чтобы её достичь.

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

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

Когда дело доходит до многопоточности и параллелизма, то вы хотите проводить эксперименты и измерять время. Производительность значительно изменится в зависимости от ваших целей и сценария.

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

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

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

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

Поддержка Float16

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

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

  • ЗначениеImageFeatureValue

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

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

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

Замечание

Большую часть времени оператор по-прежнему выполняет 32-разрядную математику. Существует меньший риск переполнения, и результат усечен до формата float16. Однако если оборудование объявляет поддержку float16, среда выполнения будет использовать его.

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

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

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

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

Замечание

Используйте следующие ресурсы, чтобы получить помощь по Windows ML.

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