您需要機器學習嗎?

機器學習非常擅長發現模式。如果您設法為您的任務收集了一個乾淨的數據集,那麼您能夠構建具有超人性能的 ML 模型通常只是時間問題。在分類、回歸和異常檢測等經典任務中尤其如此。

當您準備好使用 ML 解決一些業務問題時,您必須考慮 ML 模型將在何處運行。對於某些人來說,運行服務器基礎設施是有意義的。這有利於保持您的 ML 模型的私密性,因此競爭對手更難趕上。最重要的是,服務器可以運行更廣泛的模型。例如,GPT 模型(因 ChatGPT 而出名)目前需要現代 GPU,因此消費類設備無法使用這個問題。另一方面,維護你的基礎設施是相當昂貴的,如果消費設備可以運行你的模型,為什麼要付出更多?此外,還可能存在隱私問題,您無法將用戶數據發送到遠程服務器進行處理。

但是,我們假設使用客戶的 iOS 設備運行 ML 模型是有意義的。可能會出什麼問題?

平台限制

內存限制

iOS 設備的可用視頻內存遠少於桌面設備。例如,最近的 Nvidia RTX 4080 Ti 有 20 GB 的可用內存。另一方面,iPhone 在所謂的“統一內存”中與其餘 RAM 共享視頻內存。作為參考,iPhone 14 Pro 有 6 GB 的內存。此外,如果分配的內存超過一半,iOS 很可能會終止應用程序以確保操作系統保持響應。這意味著您只能指望有 2-3 GB 的可用內存用於神經網絡推理。

研究人員通常訓練他們的模型以優化內存使用的準確性。但是,也有關於優化速度和內存佔用的方法的研究,因此您可以尋找要求較低的模型或自己訓練模型。

網絡層(操作)支持

大多數 ML 和神經網絡來自著名的深度學習框架,然後轉換為 CoreML 模型使用 Core ML 工具。 CoreML 是 Apple 編寫的推理引擎,可以在 Apple 設備上運行各種模型。這些層針對硬件進行了很好的優化,支持的層列表很長,所以這是一個很好的起點。但是,Tensorflow Lite 等其他選項也可用。

查看 CoreML 的可能性的最佳方法是使用 Netron 等查看器查看一些已經轉換的模型。 Apple 列出了一些官方支持的模型,但也有社區驅動的模型動物園,如出色地。支持操作的完整列表在不斷變化,因此查看 Core ML Tools 源代碼作為起點可能會有所幫助。例如,如果你想轉換 PyTorch 模型,你可以嘗試找到必要的層 此處

此外,某些新架構可能包含某些層的手寫 CUDA 代碼。在這種情況下,您不能指望 CoreML 提供預定義層。不過,如果您有熟練的工程師熟悉編寫GPU 代碼。

總的來說,這裡最好的建議是儘早嘗試將模型轉換為 CoreML,甚至在訓練之前。如果您有一個未立即轉換的模型,則可以修改 DL 框架或 Core ML Tools 轉換器源代碼中的神經網絡定義以生成有效的 CoreML 模型,而無需為 CoreML 推理編寫自定義層。

Validation

Inference engine bug

沒有辦法測試所有可能的層組合,所以推理引擎總會有一些bug。例如,在 CoreML 中經常會看到擴張卷積使用過多的內存,這可能表明一個大內核用零填充的實現寫得不好。另一個常見錯誤是某些模型架構的模型輸出不正確。

在這種情況下,操作順序可能是一個因素。根據使用卷積激活還是殘差連接先來,可能會得到不正確的結果。保證一切正常工作的唯一真正方法是採用您的模型,在目標設備上運行它並將結果與桌面版本進行比較。對於此測試,至少有一個半訓練模型可用是很有幫助的,否則,數字誤差可能會因隨機初始化不佳的模型而累積。儘管最終訓練的模型可以正常工作,但對於隨機初始化的模型,設備和桌面之間的結果可能會大不相同。

精度損失

iPhone 使用半精度精度廣泛用於推理。雖然某些模型由於浮點表示中的位數較少而沒有任何明顯的精度下降,但其他模型可能會受到影響。您可以通過在桌面上使用半精度評估模型併計算模型的測試指標來估算精度損失。更好的方法是在實際設備上運行它,以了解模型是否如預期的那樣準確。

分析

不同的 iPhone 型號具有不同的硬件功能。最新的改進了神經引擎處理單元,可以顯著提高整體性能。它們針對某些操作進行了優化,CoreML 能夠智能地在 CPU、GPU 和神經引擎之間分配工作。 Apple GPU 也隨著時間的推移而改進,因此在不同的 iPhone 機型上看到性能波動是正常的。最好在支持最少的設備上測試您的模型,以確保舊設備的最大兼容性和可接受的性能。

還值得一提的是,CoreML 可以就地優化一些中間層和計算,這可以大大提高性能。另一個需要考慮的因素是,有時,在桌面上表現較差的模型實際上可能在 iOS 上進行更快的推理。這意味著花一些時間嘗試不同的架構是值得的。

為了進一步優化,Xcode 有一個很好的 Instruments 工具,它有一個專門用於 CoreML 模型的模板,可以更透徹地了解是什麼減慢了您的速度模型推斷。

結論

在為 iOS 開發 ML 模型時,沒有人可以預見所有可能的陷阱。但是,如果您知道要尋找什麼,則可以避免一些錯誤。儘早開始轉換、驗證和分析您的 ML 模型,以確保您的模型能夠正常工作並滿足您的業務需求,並遵循上述提示以確保盡快取得成功。

By Henry Taylor

我是後端開發人員。 你們中有些人可能在開發者大會上見過我。 最近我一直在做一個開源項目。