行動和嵌入式裝置的運算資源有限,因此保持應用程式的資源效率非常重要。我們編譯了一份最佳化實務與策略清單,供您用來提升 TensorFlow Lite 模型效能。
為任務選擇最佳模型
根據任務而定,您需要在模型複雜度和大小之間權衡取捨。如果您的任務需要高精確度,則可能需要大型且複雜的模型。對於需要較低精度的任務,最好使用較小的模型,因為它們不僅佔用較少的磁碟空間和記憶體,而且通常速度更快且更節能。例如,以下圖表顯示了一些常見圖片分類模型的精確度和延遲取捨。
針對行動裝置最佳化的模型範例之一是 MobileNets,它針對行動視覺應用程式進行了最佳化。TensorFlow Hub 列出了其他幾個專門針對行動和嵌入式裝置最佳化的模型。
您可以使用遷移學習,在您自己的資料集上重新訓練所列出的模型。請查看使用 TensorFlow Lite Model Maker 的遷移學習教學課程。
分析模型效能
選取適合您任務的候選模型後,最好分析模型效能並進行基準化測試。TensorFlow Lite 基準化測試工具 具有內建分析器,可顯示每個運算子的效能分析統計資訊。這有助於瞭解效能瓶頸,以及哪些運算子佔用最多的運算時間。
您也可以使用 TensorFlow Lite 追蹤,透過標準 Android 系統追蹤在您的 Android 應用程式中分析模型效能,並使用 GUI 型分析工具,依時間視覺化運算子調用。
分析及最佳化圖形中的運算子
如果某個運算子在模型中經常出現,且根據效能分析,您發現該運算子佔用最多的時間,則您可以研究最佳化該運算子。這種情況應該很少見,因為 TensorFlow Lite 針對大多數運算子都有最佳化版本。但是,如果您知道運算子執行的限制,則您可以編寫更快版本的自訂運算子。請查看自訂運算子指南。
最佳化模型
模型最佳化旨在建立更小的模型,這些模型通常速度更快且更節能,以便它們可以部署在行動裝置上。TensorFlow Lite 支援多種最佳化技術,例如量化。
請查看模型最佳化文件以瞭解詳情。
調整執行緒數量
TensorFlow Lite 支援多執行緒核心,適用於許多運算子。您可以增加執行緒數量並加速運算子執行。但是,增加執行緒數量會使您的模型使用更多資源和電力。
對於某些應用程式,延遲可能比節能更重要。您可以透過設定解譯器執行緒數量來增加執行緒數量。但是,多執行緒執行會導致效能變異性增加,具體取決於同時執行的其他內容。對於行動應用程式而言,尤其如此。例如,隔離測試可能會顯示比單執行緒快 2 倍的速度提升,但是,如果另一個應用程式同時執行,則可能會導致比單執行緒更差的效能。
消除多餘的副本
如果您的應用程式設計不夠仔細,則在將輸入饋送到模型以及從模型讀取輸出時,可能會有多餘的副本。請務必消除多餘的副本。如果您使用的是較高層級的 API (例如 Java),請務必仔細檢查文件以瞭解效能注意事項。例如,如果使用 ByteBuffers
作為輸入,則 Java API 會快很多。
使用平台專用工具分析應用程式效能
平台專用工具 (例如 Android Profiler 和 Instruments) 提供了豐富的效能分析資訊,可用於偵錯您的應用程式。有時,效能錯誤可能不在模型中,而是在與模型互動的應用程式程式碼部分中。請務必熟悉平台專用分析工具以及適用於您平台的最佳化實務。
評估模型是否受益於使用裝置上可用的硬體加速器
TensorFlow Lite 新增了使用更快硬體 (例如 GPU、DSP 和神經網路加速器) 加速模型的新方法。通常,這些加速器透過接管解譯器執行部分的委派子模組公開。TensorFlow Lite 可以透過以下方式使用委派:
- 使用 Android 的 Neural Networks API。您可以利用這些硬體加速器後端來提升模型的速度和效率。若要啟用 Neural Networks API,請查看 NNAPI 委派指南。
- GPU 委派在 Android 和 iOS 上可用,分別使用 OpenGL/OpenCL 和 Metal。若要試用它們,請參閱 GPU 委派教學課程和文件。
- Hexagon 委派在 Android 上可用。如果裝置上提供 Qualcomm Hexagon DSP,它會加以利用。如需詳細資訊,請參閱 Hexagon 委派教學課程。
- 如果您可以存取非標準硬體,則可以建立自己的委派。如需詳細資訊,請參閱TensorFlow Lite 委派。
請注意,某些加速器對於不同類型的模型效果更好。某些委派僅支援浮點模型或以特定方式最佳化的模型。務必進行基準化測試每個委派,以查看它是否是您應用程式的理想選擇。例如,如果您有一個非常小的模型,則可能不值得將模型委派給 NN API 或 GPU。相反地,加速器是具有高算術密度的較大型模型的絕佳選擇。
需要更多協助
TensorFlow 團隊很樂意協助診斷和解決您可能遇到的特定效能問題。請在 GitHub 上提交問題,並提供問題詳情。