是否有任何公共文件清楚地说明了在macOS上运行推断模型时,CoreML
的GPU设备放置策略?它如何决定是否在集成、独立或CPU上运行?一个人能否可靠地“强制”一条路径?对于像新的Mac Pro那样具有多个独立GPU以及多个eGPU的系统,这会发生什么变化?
我在我的rMBP上进行的测试表明,答案是否定的,并且温度、电池、插入电源、自动图形设置以及应用程序支持甚至一些MLModel架构启发式都在设备放置中起着作用。
附带背景的较长内容:
我很好奇是否有任何公共文档介绍了CoreML的设备选择启发式。随着10.15的CoreML preferredMetalDevice
API的添加,我想象可以强制运行MLModel
/Vision请求所在的MTLDevice
。
在我的2018年rMBP上,通过使用集成、独立和eGPU进行测试,似乎只有eGPU在请求时始终运行CoreML模型。
我的CoreML模型是一个由多个输出(附加到自定义特征提取器的多头分类器)的MobileNet分类器组成的流水线模型。
出于几个原因,我很好奇了解设备选择偏好:
a) 我希望确保我的MLModel
被提供由本地MTLTextures
支持的CIImages
图像,在执行推断的设备上限制PCI传输并仅在单个GPU设备上进行处理。
b) 实际上,我的模型被提供视频帧,并且WWDC'19 / 10.15引入了VideoToolbox和AVFoundation API,以帮助强制使用特定的视频编码器和解码器在特定的GPU上运行。
理论上,如果一切正常,我应该能够为视频解码、预处理、CoreML/Vision推断和后续编码指定相同的MTLDevice
- 使所有基于IOSurface
的CVPixelBuffers
、CVMetalTextureRefs
、MPSImages
等友好的对象都驻留在同一个GPU上。
苹果有一个Pro Apps WWDC视频,建议这是快速路径多GPU支持/后燃解码器支持未来的发展方向。
CoreML
是否真正允许建议的设备放置工作?
我正在使用带有Vega 20 GPU的Retina MacBook Pro 2018,并尝试各种方法来启用Vega 20。
禁用自动图形切换
禁用自动图形切换/将NSSupportsAutomaticGraphicsSwitching设置为False
禁用自动图形切换/将NSSupportsAutomaticGraphicsSwitching设置为True
启用自动显卡切换/将NSSupportsAutomaticGraphicsSwitching设置为False
启用自动显卡切换/将NSSupportsAutomaticGraphicsSwitching设置为True
电池充满并插入我的苹果电源适配器
电池充满并插入我的eGPU
结果:
如果我使用
MLModelConfig
中的preferredMetalDevice
,则可以可靠地使eGPU每次都能运行我的MLModel
。如果请求,我可以相当可靠地让集成显卡运行推论,但在某些电池电量、插入状态或自动显卡切换选项的配置下,它不会运行。
我无法在任何以上配置组合中可靠地使独立显卡始终运行 - 但我看到所有资源都驻留在GPU上(纹理等),并且CoreML已经配置为在那里运行。只是没有报告任何活动。
我已经配置了我的info.plist以获得正确的eGPU支持,并且可以热插拔/检测设备更改并分派工作到eGPU,并支持检测设备移除请求。所有这些都有效。不起作用的是CoreML尊重我的设备位置!