CoreML / MLModelConfig предпочитаемыйMetalDevice - понимание эвристики размещения устройства - PullRequest
2 голосов
/ 17 октября 2019

TL / DR:

Существует ли какой-либо общедоступный документ, в котором четко изложена стратегия CoreML's для размещения устройств графического процессора при запуске моделей логического вывода в macOS? Как он решает, должен ли он работать на интегрированном, дискретном или процессоре? Может ли надежно «форсировать» один путь? Как это меняется для таких систем, как новый Mac Pro с несколькими дискретными графическими процессорами, а также с несколькими eGPU?

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

Я хотел бы получить ответы на некоторые вопросы!

Дольше с контекстом:

Мне интересно, есть ли какая-либо публичная документация поВыбор устройства CoreML эвристический. С добавлением 10,15 CoreML preferredMetalDevice API для MLModelConfig я подумал, что можно будет принудительно выполнить запрос MTLDevice и MLModel / Vision.

В моем тестировании с интегрированным, дискретный и eGPU на моем rMBP 2018 с Vega 20, кажется, что только eGPU последовательно запускает модель CoreML при запросе.

Моя модель CoreML - это конвейерная модель, состоящая из классификатора MobileNet с несколькими выходами (многоголовочные классификаторыподключен к экстрактору пользовательских функций).

Мне интересно понять предпочтения выбора устройства по нескольким причинам:

a) Я хочу убедиться, что мои MLModel снабжены изображениями CIImagesпри поддержке MTLTextures локально для устройства будет выполняться вывод, чтобы ограничить передачу PCI и продолжить обработку на одном устройстве с графическим процессором

b) Моя модель фактически получает кадры видео, а WWDC '19 / 10.15представляет VideoToolbox и API-интерфейсы AVFoundation, чтобы помочь навязывать определенные видеокодеры и декодеры на определенных графических процессорах.

Теоретически, если все работает хорошоЯ должен иметь возможность указать тот же MTLDevice для декодирования видео, предварительной обработки, вывода CoreML / Vision и последующего кодирования - сохраняя все IOSurface с поддержкой CVPixelBuffers, CVMetalTextureRefs, MPSImages и друзей, проживающих на одном и том жеГрафический процессор.

У Apple есть видео WWDC Pro Apps, в котором говорится, что это путь к быстрому переходу Поддержка нескольких графических процессоров / поддержка декодера Afterburner.

Имеет CoreML В действительности разрешить работу предложенного устройства?

Я использую RetBook MacBook Pro 2018 с графическим процессором Vega 20 и пробую различные способы, чтобы загорелся Vega 20.

  • Отключение автоматического переключения графики
  • Отключение автоматического переключения / настройки графики NSSupportsAutomaticGraphicsSwitching to False
  • Отключение автоматического переключения / настройки графики NSSupportsAutomaticGraphicsSwitching to True
  • Включение автоматического переключения графики /установка NSSupportsAutomaticGraphicsSwitching на False
  • Enabling автоматическое переключение / настройка графики NSSupportsAutomaticGraphicsSwitching to True

  • с полным аккумулятором и подключенным к моему адаптеру питания Apple

  • с полным аккумулятором и подключенным к моему eGPU

Результаты:

  • Я могу надежно заставить eGPU запускать логический вывод на моем MLModel, если я использую MLModelConfig с preferredMetalDevice - каждый раз.

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

  • Я не могу надежно заставить последовательный графический процессор работать стабильно на любой из вышеуказанных комбинаций конфигураций - но все же вижу, что все мои ресурсы хранятся в графическом процессоре (текстуры и т. д.),и увидите, что CoreML настроен для работы там. Он просто не сообщает о какой-либо активности.

Я настроил свой info.plist для надлежащей поддержки eGPU, а также могу оперативно подключать / обнаруживать изменения устройства и отправлять работу на eGPU, а также поддерживать обнаружение запросов на удаление устройства. Это все работает. CoreML уважает мое устройство!

Любое понимание будет наиболее полезным.

Заранее спасибо.

...