Apple神經網絡引擎詳解


熱烈歡迎,請直接點擊!!!

進入博主App Store主頁,下載使用各個作品!!!

注:博主將堅持每月上線一個新app!!

大多數新的 iPhone 和 iPad 都有神經引擎,這是一種特殊的處理器,可以讓機器學習模型變得非常快,但對於這種處理器的實際工作原理,公眾知之甚少。

Apple 神經引擎(或 ANE)是NPU的一種,代表神經處理單元。它就像 GPU,但不是加速圖形,而是 NPU 加速神經網絡操作,例如卷積和矩陣乘法。

ANE 並不是唯一的 NPU——除了 Apple 之外,許多公司都在開發自己的 AI 加速器芯片。除了神經引擎,最著名的 NPU 是谷歌的 TPU(或 Tensor Processing Unit)。

為什么有本文章?

當我還在為 iOS 提供 ML 咨詢服務時,人們很困惑為什么他們的模型似乎沒有在神經引擎上運行,或者為什么當 ANE 應該是方式時它卻如此緩慢比GPU快...

事實證明,並不是每個 Core ML 模型都能充分利用 ANE原因可能很復雜,因此本文檔試圖回答最常見的問題。

ANE 非常適合讓 ML 模型在 iPhone 和 iPad 上運行得非常快。針對 ANE 優化的模型將大大優於 CPU 和 GPU。但 ANE 也有局限性。不幸的是,Apple 沒有就如何優化他們的模型以利用 ANE 向第三方開發人員提供任何指導。這主要是一個反復試驗的過程,以確定哪些有效,哪些無效。

1、哪些設備有 ANE?

A11仿生

第一個神經引擎。它有 2 個內核,每秒可以執行高達 6000 億次操作。但是,Core ML 不能使用這個版本的神經引擎。它僅用於 Face ID 和 Animoji 等任務。

設備:

  • iPhone 8 (2017)
  • iPhone 8 Plus (2017)
  • iPhone X (2017)

A12 仿生

神經引擎的第二代,但 Core ML 可以使用的第一個版本(在 iOS 12 及更高版本上)。

這個 ANE 有 8 個內核,每秒可以執行高達 5 萬億次操作。Apple 聲稱 A12 上的 Core ML 比 A11 快 9 倍,能耗僅為 A11 的 1/10。

設備:

  • iPhone XS (2018)
  • iPhone XS Max (2018)
  • iPhone XR (2018)
  • iPad(第 8 代,2020 年)
  • iPad Air(第三代,2019 年)
  • iPad Mini(第 5 代,2019 年)

A12X 仿生

它具有與 A12 相同的神經引擎。

設備:

  • 11 英寸 iPad Pro(第一代,2018 年)
  • iPad Pro 12.9 英寸(第三代,2018 年)

A12Z 仿生

它具有與 A12X 和 A12 相同的神經引擎。

設備:

  • iPad Pro 11 英寸(第 2 代,2020 年)
  • iPad Pro 12.9 英寸(第 4 代,2020 年)

A13 仿生

這款神經引擎有 8 個內核,比 A12 快 20%,功耗低 15%。

設備:

  • iPhone 11 (2019)
  • iPhone 11 專業版(2019 年)
  • iPhone 11 Pro Max (2019)
  • iPhone SE(第 2 代,2020 年)
  • iPad(第 9 代,2021 年)

A13 中的 CPU 還擁有自己的機器學習加速器(AMX 模塊),其矩陣乘法運算速度比 A12 的 CPU 快 6 倍。

A14 仿生

A14 擁有 16 核神經引擎,速度是上一代的兩倍,每秒可以執行 11 萬億次運算。

設備:

  • iPad 空氣 (2020)
  • iPhone 12 (2020)
  • iPhone 12 迷你版(2020 年)
  • iPhone 12 專業版(2020 年)
  • iPhone 12 Pro Max (2020)

A14 還具有第二代“AMX 模塊”,用於加速 CPU 上的機器學習操作(矩陣乘法)。

M1

M1 中的神經引擎有 16 個核心,每秒可以執行高達 11 萬億次操作。它是 macOS 設備上第一個可用的神經引擎。

這很可能與 A14 Bionic 中的神經引擎相同。

設備:

  • MacBook Air (2020)
  • 配備兩個雷靂 3 端口的 MacBook Pro 13" (2020)
  • Mac mini (2020)
  • 11 英寸 iPad Pro(第三代,2021 年)
  • iPad Pro 12.9 英寸(第 5 代,2021 年)

神經引擎在基於 Intel 的 Mac 上不可用,僅在帶有 Apple Silicon 的 Mac 上可用。

A15 仿生

A15 擁有 16 核神經引擎,在相同數量的內核下,它每秒可以執行 15.8 萬億次操作(比上一代快 43%)。

設備:

  • iPad Mini(第 6 代,2021 年)
  • iPhone 13 (2021)
  • iPhone 13 迷你版(2021 年)
  • iPhone 13 專業版(2021 年)
  • iPhone 13 Pro Max (2021)

最近沒有神經引擎的設備

需要注意的是,並非所有新設備都有神經引擎。A10 芯片組沒有 ANE,但仍在某些設備中使用。

配備 A10 Fusion 的設備:

  • iPhone 7、7 Plus(2016 年)
  • iPad(第 6 代,2018 年)
  • iPad(第 7 代,2019 年)
  • iPod touch(第 7 代,2019 年)

配備 A10X Fusion 的設備:

  • iPad Pro 10.5 英寸(2017 年)
  • iPad Pro 12.9 英寸(第 2 代,2017 年)
  • Apple TV 4K(第 5 代,2017 年)

2016 年以前的設備顯然沒有神經引擎。

目前沒有帶 ANE 的 Apple Watch。

基於 Intel 的 Mac 沒有 ANE。

2、我為什么要關心 ANE?

比 CPU 或 GPU快得多!而且它更節能

例如,在實時視頻上運行模型時,ANE 不會使手機變熱,並且電池消耗的速度也大大降低。用戶會欣賞的。

在 ANE 上運行模型將使 GPU 騰出時間來執行圖形任務,並騰出 CPU 來運行應用程序的其余部分。

考慮一下:許多現代神經網絡架構實際上在 CPU 上比在 GPU 上運行得更快(使用 Core ML 時)。那是因為 iPhone 的 CPU 速度非常快!另外,調度任務在 GPU 上運行總是有一定的開銷,這可能會抵消任何速度提升。

鑒於這些事實,您應該在 CPU 上而不是在 GPU 上運行您的神經網絡嗎?好吧,可能不會——你需要 CPU 來處理 UI 事件、處理網絡請求等等……它已經夠忙了。最好將這項工作交給 GPU 等並行處理器,甚至更好的是 ANE。

並非所有模型都可以在 ANE 上運行,因為並非所有類型的層都受支持。但是,如果您有一個可以在 ANE 上運行的模型,那么您應該更喜歡它,而不是具有該模型的設備上的 GPU 或 CPU。

如果您的模型由於某種原因無法在 ANE 上運行怎么辦?無論如何,有可能調整模型以使其與 ANE 兼容。請參閱此 repo 中的其他頁面以獲取幫助的提示。

3、如何讓我的模型在 ANE 上運行?

Core ML 將盡可能嘗試在 ANE 上運行您的模型,但您不能強制Core ML 使用 ANE。

創建 Core ML 模型的實例時,您可以傳入一個MLModelConfiguration對象:

let config = MLModelConfiguration()
config.computeUnits = .all

let model = try MyModel(configuration: config)

要允許模型在 ANE 上運行,請使用computeUnits = .all.

請注意,這並不能保證模型將在 ANE 上運行,它只是告訴 Core ML 如果可用,您更喜歡使用 ANE。如果設備沒有 ANE,Core ML 會自動回退到 GPU 或 CPU。

如果可能,Core ML 將在 ANE 上運行整個模型。但是,它會在遇到不受支持的層時切換到另一個處理器。即使 Core ML 理論上可以在 GPU 上運行模型的第二部分,它實際上也可能決定使用 CPU。你不能在這里假設任何事情。(請注意,在許多神經網絡操作上,CPU 實際上可以比 GPU 更快,所以這不一定是壞事。) 

4、如何防止我的模型在 ANE 上運行?

按如下方式實例化您的模型:

let config = MLModelConfiguration()
config.computeUnits = .cpuAndGPU

let model = try MyModel(configuration: config)

這告訴 Core ML 它只能使用 CPU 或 GPU,而不能使用 ANE。

computeUnits = .cpuOnly如果您不想使用 GPU,但始終強制模型在 CPU 上運行,也可以使用。

為什么需要阻止 Core ML 使用 ANE?也許您正在嘗試同時運行多個模型,並且希望其中一個使用 ANE,而其他模型使用 GPU 和 CPU。但大多數時候我需要使用這個功能是因為 Core ML 中的錯誤——當你嘗試在 ANE 上運行某些模型但在 GPU 或 CPU 上運行良好時,它們會出現奇怪的錯誤。

5、我的模型是否使用 ANE?

即使您可以MLModelConfiguration告訴 Core ML 您對使用 CPU / GPU / ANE 的偏好是什么,但沒有 API 可以在運行時詢問它當前在哪個硬件上運行模型。

Core ML 還可以將您的模型分成多個部分,並使用不同的處理器運行每個部分。因此它可能在同一個推理過程中同時使用 ANE和CPU 或 GPU。

H11ANEServicesThread

當您的應用程序在設備上運行時,按下調試器中的暫停按鈕。如果有一個名為H11ANEServicesThread的線程,那么 Core ML 至少在模型的某些部分使用了神經引擎。

嘗試computeUnits

ChangeMLModelConfigurationcomputeUnits選項從.all.cpuAndGPU.cpuOnly

如果你的模型的性能.all並不比其他選項快多少,Core ML 可能只對模型的一部分使用 ANE——或者根本不使用。

斷點

確定哪個處理器 Core ML 正在運行模型的一種方法是設置一個符號斷點並放入調試器。

想知道您的模型是否在 ANE 上運行?設置一個斷點-[_ANEModel program](重要:拼寫完全一樣,前面有破折號。)如果這個斷點被擊中,Core ML 正在使用 ANE。

但是...... Core ML 可能決定在 ANE 上運行您的模型的一部分,而在 GPU 或 CPU 上運行其余部分。僅僅因為您的應用程序成功-[_ANEModel program]並不意味着整個模型都在 ANE 上運行。為了確保,您需要設置其他幾個斷點。

Core ML 使用在私有 Espresso 框架中實現的三種不同“引擎”:

ANE — Espresso::ANERuntimeEngine
GPU — Espresso::MPSEngine and Espresso::MetalLowmemEngine
CPU — Espresso::BNNSEngine

運行模型時,它可以在這些引擎之間切換。通過查看調試器的堆棧跟蹤中出現的引擎名稱,您可以看到當前正在使用哪個引擎/處理器。

要確定模型(也)是否在 GPU 或 CPU 上運行,可以使用以下符號斷點:

  • Espresso::MPSEngine::context::__launch_kernel
  • Espresso::BNNSEngine::convolution_kernel::__launch
  • Espresso::elementwise_kernel_cpu::__launch

尋找哪些符號?

上述符號可能會在 iOS 版本之間發生變化。要查找可用於斷點的其他可能符號,請在設備或模擬器上運行您的應用程序並進入調試器。在調試器提示符處鍵入以下內容:

(lldb) image list Espresso

這將打印私有 Espresso 框架的路徑,如下所示(在您的機器上會有所不同):

/Users/matthijs/Library/Developer/Xcode/iOS DeviceSupport/13.3 (17C54) arm64e/Symbols/System/Library/PrivateFrameworks/Espresso.framework/Espresso

接下來,執行以下操作:

(lldb) image dump symtab 'put-the-path-here'

這會從 Espresso 框架中轉儲整個符號表。您應該能夠在其中找到一些有趣的符號。:-)

如果所有其他方法都失敗,請使用以下斷點之一並使用調試器手動單步執行代碼:

  • Espresso::layer::__launch
  • Espresso::net::__forward

如果你最終得到一個函數,例如Espresso::elementwise_kernel_cpu::__launch,這是一個很好的提示,表明你現在正在 CPU 上運行。

儀器時間分析器

如果您不確定要設置哪些斷點,或者您想了解模型不同部分的速度有多快,請使用Time Profiler工具運行您的應用程序。

我建議制作一個新的空應用程序。循環調用您的 Core ML 模型 100 次左右。

使用 Time Profiler 模板在 Instruments 中運行應用程序並打開調用樹。

提示:按住 Option 鍵單擊項目可展開其下方的所有內容。這將為您節省大量點擊。

找到符號-[MLNeuralNetworkEngine predictionFromFeatures:...]右鍵單擊它,選擇Focus on subtree

現在您將看到在模型執行期間被調用的所有函數,以及它們相對占用的時間。這些函數的名稱將為模型的執行位置提供很好的線索,您也可以將它們用作斷點。

使用 ANE 時,還會調用-[_ANEClient evaluateWithModel...]這似乎可以衡量在 ANE 上運行模型所需的時間。

6、我可以直接對 ANE 進行編程嗎?

不幸的是沒有。目前你只能通過 Core ML 使用神經引擎。

目前沒有用於對 ANE 進行編程的公共框架。有幾個私有的、未記錄的框架,但顯然我們不能使用它們,因為 Apple 拒絕使用私有框架的應用程序。

(也許將來蘋果會提供AppleNeuralEngine.framework的公共版本。)

7、ANE和GPU不一樣嗎?

ANE 和 GPU 是兩個獨立的處理器。它們與 CPU 內核一起位於同一個裸片上,但它們是不同的東西。

這是 A12 Bionic 的外觀(圖片來自anandtech.com 和 TechInsights)。如您所見,ANE(此處標記為 NPU)和 GPU 內核是芯片上的獨立區域。

A12 模具

要對 GPU 進行編程,您需要使用Apple 的 GPU 編程語言Metal除了圖形着色器,Metal 還允許您編寫計算着色器。

iOS 和 macOS 都提供Metal Performance Shaders (MPS),這是一個為許多圖像處理任務預先構建着色器的框架。MPS 還具有用於神經網絡操作(例如卷積)的計算着色器。事實上,當 Core ML 在 GPU 上運行您的模型時,它在后台使用 MPS。

Metal 不能用於對 ANE 進行編程,它專門用於 GPU。目前沒有用於直接對 ANE 進行編程的公共框架。

Core ML 為不同的處理器使用以下框架:

  • CPU: BNNS,或 Basic Neural Network Subroutines,Accelerate.framework 的一部分
  • GPU:金屬性能着色器 (MPS)
  • ANE:私有框架

Core ML 可以拆分模型,以便一部分在 ANE 上運行,另一部分在 GPU 或 CPU 上運行。當它這樣做時,它會在這些不同的框架之間切換。

iPhone、iPad 和 Apple Silicon Mac 具有共享內存,這意味着 CPU、GPU 和 ANE 都使用相同的 RAM。共享內存的優點是您不需要將數據從一個處理器上傳到另一個處理器。但這並不意味着在處理器之間切換沒有成本:數據仍然需要轉換成合適的格式。例如,在 GPU 上,需要首先將數據放入紋理對象中。

在基於 Intel 的 Mac 上,GPU 可能有自己的 RAM(通常稱為 VRAM)。

8、ANE 是 16 位的嗎?

看起來是這樣。

當您在 CPU 上運行 Core ML 模型時,它使用 float32 進行所有計算並存儲中間張量。(從 iOS 14 和 macOS 11 開始,Core ML 也可以在 CPU 上使用 float16。)

在 GPU 上,它使用 float16 作為權重和中間張量,但使用 float32 進行計算。allowLowPrecisionAccumulationOnGPU您可以使用from選項將其關閉MLModelConfiguration,在這種情況下,GPU 也使用 float16 進行計算。這有點快,但您可能會失去精度。

ANE 似乎對所有內容都使用 float16。這意味着,如果您的模型具有相對較大 ( > 1e2) 或相對較小 ( < 1e-4) 的激活,您將失去精度。或者更糟糕的是,模型實際上可能根本無法正常工作——即非常小的數字變成了 0。

多精度

蘋果聲稱 A12 Bionic 中的 ANE 具有“多精度”支持。這也稱為可變精度。

TODO:看看這實際上意味着什么。

量化操作

Core ML 支持使用 8 位或更小的整數來量化權重。但是,這似乎只是為了將權重存儲在 mlmodel 文件中。理論上,NPU 可以直接使用量化權重執行卷積等操作,但目前沒有證據表明 ANE 可以這樣做。

從 iOS 14 和 macOS 11 開始,Core ML 確實支持 8 位操作,但僅支持矩陣乘法層,不支持卷積層或其他操作。不知道這樣的 8 位操作實際上是在 ANE 上執行還是僅在 CPU 上執行。

9、ANE 不支持哪些 Core ML 層?

警告!此處提供的信息不完整,可能是錯誤的。它甚至可能在不同版本的 ANE 之間有所不同。在調試機器學習模型的性能問題時,請將此作為起點,但不要將其視為福音。如果您知道此處未解釋的內容,或者您​​發現信息有誤或缺失,請提出問題提出拉取請求謝謝!

Core ML 不會在 ANE 上運行模型的主要原因是模型包含某些層類型。

Core ML 可能會在 ANE 上運行模型的第一部分,然后切換到 GPU(或 CPU)來運行模型的其余部分。從理論上講,它可以進行多個這樣的切換,但是設備之間的每次切換都會產生開銷。

如果您的模型S → U → S → U → S → U中 S 是受支持的層而 U 是不受支持的層,Core ML 可能只會做ANE → GPU一次,而不是ANE → GPU → ANE → GPU → etc然而,ANE → CPU → ANE → CPU → etc似乎確實會發生,因為在 ANE 和 CPU 之間切換比在 ANE 和 GPU 之間切換更便宜。

也就是說,Core ML 主要是一個黑盒子我們不了解 Core ML 如何決定在哪個處理器上運行模型的哪個部分。找出答案的唯一方法是設置一些斷點並嘗試一下。

提示:如果您的模型只有一兩層不受 ANE 支持,那么明智的做法是編輯 mlmodel 文件並將這些層替換為可在 ANE上工作的替代層。在 ANE 上運行整個模型將使您的模型更快、更節能。

有問題的層

此列表絕不是詳盡無遺的,但已知以下層類型不適用於 ANE:

  • 自定義圖層
  • RNN 層,例如 LSTM 或 GRU
  • 收集
  • 空洞卷積
  • 可廣播和“ND”層
  • 某些廣播操作(例如乘以CxHxWCx1x1張量)
  • 池化內核大小大於 13 或步幅大於 2 的層
  • 縮放因子大於 2 的上采樣

注意:其中一些是猜測。很難說 Core ML 到底是什么,最多有一半的時間。

可廣播層

Core ML 3添加了許多支持廣播的新層,例如:

  • AddBroadcastableLayer
  • DivideBroadcastableLayer
  • MultiplyBroadcastableLayer
  • SubtractBroadcastableLayer
  • 和其他一些...

還有一些名稱中帶有“ND”的新層,表示它們可以在任何等級的張量上運行:

  • ConcatNDLayer
  • SplitNDLayer
  • LoadConstantNDLayer
  • 等等...

這些層不會在 ANE 上運行。當遇到這種“可廣播”或“ND”層類型時,Core ML 會回退到 CPU 或 GPU。

好消息是:大多數時候您實際上並不需要這些新的圖層類型!當您的張量沒有通常的(batch, channels, height, width)形狀時,它們最有用。

您通常可以用 Core ML 2 中較舊的層類型替換這些可廣播層。這些仍然允許有限數量的廣播。他們大多在 ANE 上工作得很好。

問題是 coremltools 4 的新轉換器傾向於更喜歡這些新的可廣播層。當您使用參數時,對於舊轉換器也是如此minimum_ios_deployment_target='13'

發生這種情況時,您的模型無法在 ANE 上運行,您可以執行一些模型手術並將這些層替換為舊版本:

  • AddBroadcastableLayerAddLayer
  • MultiplyBroadcastableLayerMultiplyLayerScaleLayer或 線性Activation
  • ConcatNDConcat
  • 等等...

例如,您可以LoadConstantND使用較舊的LoadConstant層進行替換。舊版本僅支持 3 階張量,因此如果您的張量使用更多維度,您可能必須將其中一些維度變平。這是否可能取決於您的模型的架構。

可能並不總是有兼容的舊式層可用——例如,沒有SubtractLayer可以替代的層SubtractBroadcastableLayer——因此您可能需要聰明並引入額外的層作為解決方法(例如,使用線性激活層否定張量的內容alpha = -1,后跟AddLayer)。

自定義圖層

自定義層允許您向 Core ML 添加新功能。但是有一個缺點:你只能提供一個 CPU 和 GPU 的實現。因為沒有用於對 ANE 進行編程的公共 API ,所以自定義層無法在 ANE 上運行。

如果自定義層出現在模型的末尾附近,則將模型分成兩部分並一個接一個地運行它們可能是有意義的。第一部分可以使用 ANE,而其中包含自定義層的第二部分將使用 CPU 或 GPU。這可能比在 CPU 或 GPU 上運行整個東西要快。

起作用的圖層

  • 上采樣:最近我使用了一個模型,其中上采樣層似乎在 ANE 上運行得很好(Core ML 也有一個Espresso::ANERuntimeEngine::upsample_kernel),所以我猜這些確實有效。

  • 反卷積 

10、使用 os_log 查看警告/錯誤消息

Core ML 可能會向控制台打印一條錯誤消息,例如“[coreml] 計算 NN 輸出錯誤 -1”或“錯誤計划構建:-1”。不幸的是,此類消息對於診斷導致錯誤的原因並不是很有幫助。

要獲得更多有用的消息,請使用 os_log 工具在 Instruments 中運行您的應用程序。Core ML 將在此處打印更多信息。

這對於確定 ANE 是否支持模型中的所有層也很有用。如果沒有,Core ML 可能會打印一條關於它的消息。

您還可以從您的設備下載日志並進行檢查。例如,要下載最近 1 天 ( 1d) 的日志:

$ sudo log collect --device --last 1d

這將創建一個文件夾system_logs.logarchive您可以雙擊它在控制台應用程序中打開它,然后搜索coremlespresso

使用命令行:

$ log show --archive system_logs.logarchive --predicate '(subsystem IN {"com.apple.espresso","com.apple.coreml"}) && (category IN {"espresso","coreml"})' --info --debug --last 1d

日志將顯示<private>模型及其層的名稱,但您可以通過在 Mac 上安裝設備配置文件來解決此問題。

如果您在 Mac 上運行 Core ML,您可以使用log stream實時查看與 Core ML 相關的日志消息:

$ log stream --predicate '(subsystem IN {"com.apple.espresso","com.apple.coreml"}) && (category IN {"espresso","coreml"})' --info --debug
11、如何替換不支持的圖層

這是一個簡單的腳本,可讓您addBroadcastable用普通的舊圖層替換add圖層。

可廣播版本是在 Core ML 3 中引入的,功能更強大,但並不總是適用於 ANE。在大多數情況下,舊add層執行等效操作(它在一定程度上也支持廣播)並與 ANE 兼容。

import coremltools

model = coremltools.models.MLModel("YourModel.mlmodel")
spec = model._spec
nn = spec.neuralNetwork

# NOTE: If your model is a classifier, use the following:
# nn = spec.neuralNetworkClassifier

for layer in nn.layers:
    if layer.WhichOneof("layer") == "addBroadcastable":
        layer.add.MergeFromString(b"")

new_model = coremltools.models.MLModel(spec)
new_model.save("YourNewModel.mlmodel")
12、ANE 如何在內部工作?

好問題!我認為 Apple 以外的任何人都不知道,但其他 NPU 似乎主要專注於真正有效地進行矩陣乘法,因此假設 ANE 相似是合理的。

同時,請查看TPU 的這些 解釋,以了解 Google 是如何做到的。

另請查看 NVIDIA 的張量核心

Google Pixel 4 的神經核心是什么? 

13、其他奇怪的問題

我或其他人看到的東西(軼事證據):

  • 使用將其權重存儲為 16 位浮點數的 mlmodel 文件似乎比使用 32 位浮點數的模型慢。在 GPU 上這沒有什么區別,因為它總是將權重轉換為 16 位浮點數,但神經引擎似乎很難解決這個問題。(我不是 100% 確定這里發生了什么。)

  • A12 及更高版本的處理器具有“智能計算系統”,可確定任務應在 CPU、GPU 還是 ANE 上運行。因此,即使模型可以毫無問題地在 ANE 上運行,Core ML 仍可能決定在其他地方運行它,這取決於系統在做什么。來自推特:“我們還發現,如果 NPU 支持模型的所有層並且 GPU 處於休眠狀態,CoreML 很有可能會在 GPU 上運行它。但如果 GPU 的工作負載很重 - 你可以期望模型在 NPU 上運行。”

  • 即使您模型中的所有層都與 ANE 兼容,Core ML 仍可能決定在 GPU 上運行您的模型。如果您相信這種情況正在發生,請將您的模型分成兩部分,看看第一部分會發生什么。現在可以在 ANE 上運行嗎?我見過這樣的情況,一旦模型變得大於某個大小,Core ML 可能會決定 GPU 更合適,即使模型可以完全在 ANE 上運行。 

14、對 ANE 進行逆向工程

目前沒有用於使用 ANE 的公共 API,但 Core ML 使用了私有框架。通過查看這些私有框架,可以弄清楚 ANE 是如何工作的——或者至少是如何與它對話的。

geohot在 tinygrad repo 中發布了一些初步結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM