ios - CoreML/MLModelConfig 首选MetalDevice - 了解设备放置启发式

标签 ios macos metal coreml metal-performance-shaders

有没有公​​开文件明确说明CoreML's在 macOS 上运行推理模型时 GPU 设备放置的策略?它如何决定它应该在集成、离散还是 CPU 上运行?可以可靠地“强制”一条路径吗?对于具有多个独立 GPU 和多个 eGPU 的新 Mac Pro 等系统,这种情况有何变化?
我对我的 rMBP 的测试表明答案是否定的——温度、电池、插入电源、自动图形设置和应用程序支持,甚至可能一些 MLModel 架构启发式都在设备放置中发挥作用。
更长的上下文:
我很好奇是否有任何关于 CoreML 的设备选择启发式的公共(public)文档。添加了 10.15 的 CoreML preferredMetalDevice MLModelConfig 的 API ,我想可以强制 MTLDevice一个 MLModel/视觉请求运行。
在我使用 Vega 20 在我的 2018 rMBP 上使用集成、离散和 eGPU 进行的测试中,似乎只有 eGPU 在请求时始终运行 CoreML 模型。
我的 CoreML 模型是一个管道模型,由具有多个输出的 MobileNet 分类器(附加到自定义特征提取器的多头分类器)组成。
出于以下几个原因,我很想了解设备选择偏好:
a) 我想确保我的 MLModel图片 CIImages支持 MTLTextures本地设备推理将运行,以限制 PCI 传输并继续在单个 GPU 设备上进行处理
b) 我的模型实际上是输入视频帧,WWDC '19/10.15 引入了 VideoToolbox 和 AVFoundation API,以帮助强制特定 GPU 上的特定视频编码器和解码器。
理论上,如果一切正常,我应该可以指定相同的 MTLDevice用于视频解码、预处理、CoreML/Vision 推理和后续编码 - 保留所有 IOSurface支持 CVPixelBuffers , CVMetalTextureRefs , MPSImages和 friend 驻留在同一个 GPU 上。
Apple 有一个 Pro Apps WWDC 视频,表明这是通往多 GPU 支持/Afterburner 解码器支持的快速路径的前进之路。
是否 CoreML 实际上 允许建议的设备放置工作?
我正在运行配备 Vega 20 GPU 的 Retina MacBook Pro 2018,并尝试各种方法让 Vega 20 点亮。

  • 禁用自动图形切换
  • 禁用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 False
  • 禁用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 True
  • 启用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 False
  • 启用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 True
  • 电池充满并插入我的 Apple 电源适配器
  • 充满电池并插入我的 eGPU

  • 结果:
  • 我可以可靠地让 eGPU 在我的 MLModel 上运行推理如果我使用 MLModelConfigpreferredMetalDevice - 每次。
  • 如果我要求,我可以相当可靠地让集成 GPU 运行推理——但有时在某些电池电源配置、插入电源或自动图形切换选项的情况下,它不会运行。
  • 我无法可靠地让离散 GPU 在上述任何配置组合上始终如一地运行 - 但确实看到我的所有资源都驻留在 GPU(纹理等)上,并且看到 CoreML 配置为在那里运行。它只是不报告任何事件。

  • 我已将我的 info.plist 配置为具有适当的 eGPU 支持,并且可以热插拔/检测设备更改并将工作分配给 eGPU,并且还支持检测设备移除请求。这一切都有效。 CoreML 不尊重我的设备放置!

    最佳答案

    没有公开文件明确说明 CoreML 的 GPU 使用计划。请注意,您的问题似乎提出了许多不同的问题,并且应该更加关注每个帖子的一个问题,但我会尽我所能回答它们。
    您可以“强制”它仅在 CPU 上运行:

    let config = MLModelConfiguration()
    config.computeUnits = .cpuOnly
    
    或 CPU 和 GPU:
    config.computeUnits = .cpuAndGPU
    
    或者包括神经引擎的所有可用计算单元(如果可用),并且如果 MLModel 层支持它:
    config.computeUnits = .all
    
    当有多个 Metal 设备时,您可以选择使用哪个。看到这个example code在功率最高的 Metal 设备、外部 GPU 或不驱动显示器的 GPU 之间进行选择。
    您还可以选择允许低精度损失:
    config.allowLowPrecisionAccumulationOnGPU = true
    

    关于ios - CoreML/MLModelConfig 首选MetalDevice - 了解设备放置启发式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58437789/

    相关文章:

    java - 为什么 Intellij Idea 的字体渲染在 JDK 1.8 和 1.6 上更差

    git - MacOS 终端 git 返回错误 : zsh: bad option: -l

    ios - 使用 ReactiveCocoa 进行 View 之间的通信?

    macos - Git 错误 "fatal: ambiguous argument ' HEAD' : unknown revision or path not in the working tree"

    ios - 使用 Objective C 在 Cocos2d 中展示 AdMob Reward 广告和插屏广告

    ios - AVCaptureVideoPreviewLayer 在 iOS 中添加覆盖和捕获照片

    ios - Metal 可以在非 A7 设备上使用吗? (例如 iPhone 5 或 iPad Mini(非视网膜))

    ios - 如何使用 Metal IOS 正确渲染 3d 模型?

    ios - 将数据传递给另一个 View Controller

    iphone - 从文件夹中的图像创建数组?