效能最佳做法

行動裝置和嵌入式裝置的運算資源有限,因此請務必讓應用程式資源保持效率。我們彙整了一份最佳做法和策略清單,可協助您提升 TensorFlow Lite 模型效能。

選擇最適合這項工作的模型

視任務而定,您需要在模型複雜度和大小之間做出取捨。如果工作需要高準確度,您可能需要大型複雜模型。對於精確度要求較低的作業,建議使用較小的模型,因為這類模型不僅佔用的磁碟空間和記憶體較少,通常也比較快速且省電。舉例來說,下方的圖表顯示一些常見圖片分類模型的準確度和延遲時間取捨。

模型大小與準確度比較圖

準確度與延遲時間的比較圖

針對行動裝置最佳化的模型範例包括 MobileNets,這類模型專為行動視覺應用程式最佳化。Kaggle 模型列出多個其他模型,這些模型專為行動裝置和嵌入式裝置進行最佳化。

您可以使用遷移學習,在自己的資料集上重新訓練所列模型。

剖析模型

選取適合工作使用的候選模型後,建議您為模型建立設定檔並進行基準測試。LiteRT 基準化工具內建剖析器,可顯示每個運算子的剖析統計資料。這有助於瞭解效能瓶頸,以及哪些運算子佔據大部分的運算時間。

您也可以使用 LiteRT 追蹤記錄,透過標準 Android 系統追蹤記錄,在 Android 應用程式中分析模型,並使用以 GUI 為基礎的分析工具,以時間為單位顯示運算子呼叫。

剖析及最佳化圖表中的運算子

如果特定運算子經常出現在模型中,且根據剖析結果,您發現該運算子耗用最多時間,可以考慮最佳化該運算子。TensorFlow Lite 已針對大多數運算子提供最佳化版本,因此這種情況應該很少發生。不過,如果您知道運算子執行的限制,或許就能編寫速度更快的自訂作業版本。請參閱自訂運算子指南

將模型最佳化

模型最佳化旨在建立更小的模型,通常速度更快且更省電,因此可部署在行動裝置上。LiteRT 支援多種最佳化技術,例如量化。

詳情請參閱模型最佳化文件

調整執行緒數量

LiteRT 支援多個運算子的多執行緒核心。您可以增加執行緒數量,加快運算子執行速度。不過,增加執行緒數量會導致模型使用更多資源和電力。

對某些應用程式來說,延遲時間可能比能源效率更重要。您可以設定解譯器執行緒數量,藉此增加執行緒數量。不過,多執行緒執行作業會導致效能變異性增加,具體情況取決於同時執行的其他作業。行動應用程式尤其如此。舉例來說,相較於單一執行緒,獨立測試可能會顯示 2 倍的加速,但如果另一個應用程式同時執行,效能可能會比單一執行緒更差。

刪除多餘的副本

如果應用程式設計不當,在將輸入內容提供給模型並從模型讀取輸出內容時,可能會出現多餘的副本。請務必刪除多餘的副本。如果您使用較高層級的 API (例如 Java),請務必仔細查看說明文件,瞭解效能注意事項。舉例來說,如果使用 ByteBuffers 做為輸入內容,Java API 的速度會快上許多。

使用平台專屬工具分析應用程式

Android 分析器Instruments 等平台專屬工具提供豐富的剖析資訊,可用於偵錯應用程式。有時效能錯誤可能不在模型中,而是在與模型互動的應用程式程式碼部分。請務必熟悉平台專屬的剖析工具,以及平台的最佳做法。

評估模型是否能善用裝置上的硬體加速器

LiteRT 新增了加速模型的新方法,例如使用 GPU、DSP 和神經網路加速器等更快的硬體。通常這些加速器會透過 delegate 子模組公開,接管部分解譯器執行作業。LiteRT 可透過下列方式使用委派:

  • GPU 委派項目適用於 Android 和 iOS,分別使用 OpenGL/OpenCL 和 Metal。如要試用,請參閱 GPU 委派
  • 如果您可以存取非標準硬體,就能建立自己的委派項目。詳情請參閱「LiteRT 委派」。

請注意,部分加速器更適合用於不同類型的模型。部分委派只支援浮點模型,或以特定方式最佳化的模型。請務必評估每個委派,判斷是否適合您的應用程式。舉例來說,如果模型非常小,可能就不值得將模型委派給 GPU。反之,加速器則非常適合算術密集度高的大型模型。