是否有任何公开文档明确说明了CoreML's
在 macOS 上运行推理模型时 GPU 设备放置的策略?它如何决定是否应在集成、离散或 CPU 上运行?可以可靠地“强制”一条路径吗?对于像配备多个独立 GPU 和多个 eGPU 的新款 Mac Pro 这样的系统来说,这种情况有何变化?
我对 rMBP 的测试表明答案是否定的 - 温度、电池、插入电源、自动图形设置和应用程序支持,甚至可能还有一些 MLModel 架构启发式方法都在设备放置中发挥着作用。
结合上下文更长:
我很好奇是否有任何关于 CoreML 的设备选择启发式的公开文档。通过添加 10.15 的 CoreML preferredMetalDevice
API MLModelConfig
,我想可以强制MTLDevice
/ MLModel
Vision 请求运行。
在我使用 Vega 20 的 2018 rMBP 上对集成、分立和 eGPU 进行的测试中,似乎只有 eGPU 在请求时始终运行 CoreML 模型。
我的 CoreML 模型是一个管道模型,由具有多个输出的 MobileNet 分类器(附加到自定义特征提取器的多头分类器)组成。
我很想了解设备选择偏好,原因如下:
a) 我想确保我的MLModel
输入图像CIImages
由MTLTextures
本地设备推理支持,以限制 PCI 传输并继续在单个 GPU 设备上进行处理
b) 我的模型实际上是输入视频帧,WWDC '19 / 10.15 引入了 VideoToolbox 和 …
在查看新的CoreML API时,我看不到在生成.mlmodel并将其捆绑到您的应用程序后继续训练模型的任何方法.这让我觉得我无法对用户的内容或动作进行机器学习,因为模型必须事先经过完全训练.
发货后有没有办法将训练数据添加到我训练过的模型中?
编辑:我刚刚注意到你可以从URL初始化生成的模型类,所以也许我可以将新的训练数据发布到我的服务器,重新生成训练模型并将其下载到应用程序中?似乎它会起作用,但这完全打败了在没有用户数据离开设备的情况下能够使用ML的隐私方面.
有没有人知道iOS下使用OpenGL ES 2.0的线性代数库?
具体来说,我正在寻找一种方法,使用iOS设备上的GPU对任意大小的矩阵(例如,远大于4x4,更像是5,000 x 100,000)进行矩阵乘法.
我正在尝试通过使用“金属”视图在相机Feed上显示滤镜:MTKView
。我密切关注Apple的示例代码的方法- 通过利用TrueDepth摄像机数据(链接)来增强实时视频。
以下代码效果很好(主要从上述示例代码解释):
class MetalObject: NSObject, MTKViewDelegate {
private var metalBufferView : MTKView?
private var metalDevice = MTLCreateSystemDefaultDevice()
private var metalCommandQueue : MTLCommandQueue!
private var ciContext : CIContext!
private let colorSpace = CGColorSpaceCreateDeviceRGB()
private var videoPixelBuffer : CVPixelBuffer?
private let syncQueue = DispatchQueue(label: "Preview View Sync Queue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)
private var textureWidth : Int = 0
private var textureHeight : Int = 0
private var textureMirroring = …
Run Code Online (Sandbox Code Playgroud) 我目前正在使用 mac book m2 pro 并安装了 Docker 桌面来在 Linux 上创建开发容器。我知道启动容器时可以选择将 GPU 添加到容器--gpus
中。docker run
但是有没有办法在docker容器上使用mac book上的MPS呢?我认为这可能永远行不通......这个问题可能听起来很愚蠢,但我找不到任何指出这一点的文章。谢谢
我正在尝试更好地了解与Metal Performance Shaders
和一起使用时的同步要求MTLBlitCommandEncoder
。
我有一个MTLCommandBuffer
设置如下:
使用MTLBlitCommandEncoder
到纹理A的区域复制到纹理B. 纹理A比纹理B.大我提取纹理特征的一个“瓦”,并复制成质地B.
使用MPSImageBilinearScale
金属性能着色器,将纹理B作为源纹理,将第三纹理纹理C作为目标。此金属性能着色器将缩放并可能将纹理B的内容转换为纹理C。
在金属性能着色器开始尝试缩放纹理B之前,如何确保blit编码器完全完成了从纹理A到纹理B的数据复制?我什至不必担心这个问题,还是命令缓冲区的串行特性已经为我解决了这个问题?
Metal具有MTLFence
用于同步访问资源的围栅的概念,但是我仍然看不到要在围栅上等待Metal Performance Shader。(而waitForFence:
编码器上有。)
如果我不能使用篱笆并且需要同步,建议的做法是仅使blit编码器入队,然后waitUntilCompleted
在使着色器入队并再次调用之前调用命令缓冲区waitUntilCompleted
吗?例如:
id<MTLCommandBuffer> commandBuffer;
// Enqueue blit encoder to copy Texture A -> Texture B
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
[blitEncoder copyFromTexture:...];
[blitEncoder endEncoding];
// Wait for blit encoder to complete.
[commandBuffer commit];
[commandBuffer waitUntilCompleted];
// Scale Texture B -> Texture C
MPSImageBilinearScale *imageScaleShader = [[MPSImageBilinearScale alloc] initWithDevice:...];
[imageScaleShader encodeToCommandBuffer:commandBuffer...];
// Wait …
Run Code Online (Sandbox Code Playgroud) 是否可以使用 Apple 的 Metal Performance Shaders 来执行 Hadamard 产品?我看到可以使用this执行普通矩阵乘法,但我专门寻找元素乘法,或者一种巧妙的构造方法。(例如,是否可以将 MPSMatrix 转换为 MPSVector,然后使用向量执行乘积?)
更新:我很欣赏使用着色器的建议!我正在致力于实施,这看起来很有希望!一旦我有工作,我会发布解决方案。
原来没有这样的操作deconvolution
在MPS
.最接近的类比tensorflow
是conv2d_transpose
.
是否可以在MPS
默认操作之间进行插件自定义操作?
我要求在实时视频上应用过滤器,我正在尝试在Metal中进行过滤.
但是在将过滤器编码为目标过滤器之后,我遇到了将MTLTexture转换为CVPixelBuffer的问题.参考(https://github.com/oklyc/MetalCameraSample-master-2)
这是我的代码.
if let pixelBuffer = pixelBuffer {
CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0))
let region = MTLRegionMake2D(0, 0, Int(currentDrawable.layer.drawableSize.width), Int(currentDrawable.layer.drawableSize.height))
let bytesPerPixel = 4;
let bytesPerRow = CGFloat(bytesPerPixel) * currentDrawable.layer.drawableSize.width
let tempBuffer = CVPixelBufferGetBaseAddress(pixelBuffer)
destinationTexture.getBytes(tempBuffer!, bytesPerRow: Int(bytesPerRow), from: region1, mipmapLevel: 0)
let image = self.imageFromCVPixelBuffer(buffer: pixelBuffer)
CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0))
}
Run Code Online (Sandbox Code Playgroud)
imageFromCVPixelBuffer方法看起来像这样.
func imageFromCVPixelBuffer(buffer: CVPixelBuffer) -> UIImage {
let ciimage = CIImage(cvPixelBuffer: buffer)
let context = CIContext(options: nil)
let cgimgage = context.createCGImage(ciimage, from: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(buffer), height: …
Run Code Online (Sandbox Code Playgroud) 我想使用MPSImageGaussianPyramid
但对 Metal 的用法和 mipmap 非常陌生。我想使用过滤器为图像处理技术生成图像金字塔。
根据我能够收集的内容,MPSImageGaussianPyramid
创建了一个 mipmapped 图像,但是在我的代码中,我什至很难确保我正确地看到了输出。是否有正确使用此过滤器的示例?我的问题是:
应用过滤器后如何访问 mipmap 图像?
是否可以将 mipmapped 图像复制到另一个图像进行处理?
这个 mipmapped 图像会比通过自定义过滤器手动创建金字塔更快吗?
谢谢,稍后我将提供一些我无法开始工作的示例代码。