是否有任何公开文档明确说明了CoreML's在 macOS 上运行推理模型时 GPU 设备放置的策略?它如何决定是否应在集成、离散或 CPU 上运行?可以可靠地“强制”一条路径吗?对于像配备多个独立 GPU 和多个 eGPU 的新款 Mac Pro 这样的系统来说,这种情况有何变化?
我对 rMBP 的测试表明答案是否定的 - 温度、电池、插入电源、自动图形设置和应用程序支持,甚至可能还有一些 MLModel 架构启发式方法都在设备放置中发挥着作用。
结合上下文更长:
我很好奇是否有任何关于 CoreML 的设备选择启发式的公开文档。通过添加 10.15 的 CoreML preferredMetalDeviceAPI MLModelConfig,我想可以强制MTLDevice/ MLModelVision 请求运行。
在我使用 Vega 20 的 2018 rMBP 上对集成、分立和 eGPU 进行的测试中,似乎只有 eGPU 在请求时始终运行 CoreML 模型。
我的 CoreML 模型是一个管道模型,由具有多个输出的 MobileNet 分类器(附加到自定义特征提取器的多头分类器)组成。
我很想了解设备选择偏好,原因如下:
a) 我想确保我的MLModel输入图像CIImages由MTLTextures本地设备推理支持,以限制 PCI 传输并继续在单个 GPU 设备上进行处理
b) 我的模型实际上是输入视频帧,WWDC '19 / 10.15 引入了 VideoToolbox 和 …
TL; DR:
如何引用“不在磁盘上” sampler2D符号并将其传递给SCNTechnique?如果我从捆绑中引用图像,则我的技术有效,但如果不引用,则无法找到将现有id<MTLTexture>技术传递给我的技术已设置的采样器符号的方法。
长:
我有一个有效的工作SCNTechnique,它使用自定义的sampler2D符号作为金属碎片通道的输入。我试图传入id<MTLTexture>从硬件传感器获得的外部(不是来自Scenekit)作为后期处理过程中的输入。
跟随SCNShadable状态为docs的文档id<MTLTexture>可以通过SCNMaterialProperty具有正确内容集的an作为着色器输入传递。此100%可在着色器修改器传递中使用-但失败了SCNTecnique!
let texture = CVMetalTextureGetTexture(textureRef!)
if self.material == nil
{
self.material = SCNMaterialProperty(contents:texture)
}
else
{
self.material?.contents = texture
}
self.currentTechnique?.setObject(self.material, forKeyedSubscript: "myTextureSamplerSymbol" as NSCopying)
Run Code Online (Sandbox Code Playgroud)
对于a SCNTechnique,我得到了错误日志,指示“纹理没有存储”,Metal GPU帧捕获指示为采样器设置了默认的4x4像素白色纹理(大概是从SCNTecnique?开始)。但是,我已经能够验证我的自定义设置id<MTLTexture>是否有效并且调试器中是否包含内容-其格式,宽度,高度和内容均符合预期,我只是似乎无法在场景工具包技术中引用任意纹理正确通过。
如果我在SCNTechniqueplist文件中声明我的符号以引用如下图像:
<dict>
<key>type</key>
<string>sampler2D</string>
<key>image</key>
<string>star.png</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
我的通行证输入如下:
<dict>
<key>colorSampler</key>
<string>COLOR</string>
<key>depthSampler</key>
<string>DEPTH</string>
<key> myTextureSampler</key>
<dict>
<key>target</key>
<string> myTextureSamplerSymbol </string>
</dict>
</dict>
Run Code Online (Sandbox Code Playgroud)
然后,我的通行证开始工作,并且引用了star.png纹理。 …