让 CoreML 运行在 ANE/GPU 上

规则:

  1. 芯片的运行速度:ANE > GPU.
  2. ANE 芯片只能运行不超过某个大小的模型。如果模型大小超过一定的阈值(目前大概是 100M),它将无法在 ANE 上。
  3. Flexible Shapes 的模型无法运行在 ANE/GPU 上。所以需要把模型设计成 Flexible Shapes。
  4. 把模型放到 ANE/GPU 上运行,可以突破 App 内在上限的限制。(似乎 iOS/macOS 对 APP 形式的应用程序有一个内存上限。超过上限的 App,会被强制退出)

目前 Transformer 架构的模型,一般在 Decoder 上有一些缓存,而如果要把这些缓存实现在 CoreML 上,需要把缓存从模型外传到模型内,也就是需要有 Flexible Shapes,相当于缓存==CPU。目前的经验是:与其为了加缓存而把模型放到 CPU 去运行,还不如放弃缓存,争取让模型运行在 ANE/GPU 上。

确定 Shape 的模型还能应运 iOS/macOS 上的非常多优化机制:

  1. 用 IOSurface 内存储存模型的输入,避免多余的内存复制,即可以加速模型运行速度,又可以减少模型的内存 footprint。
  2. 用模型的 OutputBackings ,让模型输出到给定的 IOSurface 内存上,进一步减少内存复制。

Comments