教程| 如何用TensorFlow在安卓設備上實現深度學習推斷

2021-01-11 機器之心Pro

選自DataScience

作者:Chia-Chun

機器之心編譯

參與:Edison Ke、路雪

本文作者 Chia-Chun (JJ) Fu 是加州大學聖塔芭芭拉分校的化學工程博士。她在 Insight 工作的時候,在安卓系統上用 TensorFlow 部署了一個 WaveNet 模型。本文詳細介紹了部署和實現過程。

對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。邊緣計算(Edge computing)是一種在物理上靠近數據生成的位置從而對數據進行處理和分析的方法,為解決這些問題提供了方案。

以「Ok Google」這個功能為例:用一名用戶的聲音來訓練「Ok Google」,他的手機在接收到這個關鍵詞的時候就會被喚醒。這種小型關鍵詞檢測(small-footprint keyword-spotting,KWS)推斷通常在本地設備上運行,所以你不必擔心服務提供商隨時監聽你的聲音。而雲服務只在你發出指令後才啟動。類似的概念可以擴展到智能家用電器或其他物聯網設備上的應用,在這些應用中我們需要不依靠網際網路進行免提語音控制。

更重要的是,邊緣計算不僅為物聯網世界帶來了人工智慧,還提供了許多其他的可能性和好處。例如,我們可以在本地設備上將圖像或語音數據預處理為壓縮表示,然後將其發送到雲。這種方法解決了隱私和延遲問題。

在 Insight 任職期間,我用 TensorFlow 在安卓上部署了一個預訓練的 WaveNet 模型。我的目標是探索將深度學習模型部署到設備上並使之工作的工程挑戰!這篇文章簡要介紹了如何用 TensorFlow 在安卓上構建一個通用的語音到文本識別應用程式。

圖 1. 流程概述。將 WaveNet 安裝到安卓的三個步驟。

開發環境信息:

Pixel, cpu type: ARM64

Android 7.1.1

Android NDK 15.2

Android gradle plugin 2.3.0

TensorFlow 1.3.0

bazel 0.5.4-homebrew

詳細教程和實現:https://github.com/chiachunfu/speech

第一步:模型壓縮

為了將深度學習模型部署到移動/嵌入式設備上,我們應該致力於減少模型的內存佔用,縮短推斷時間,減少耗電。有幾種方法可以實現這些要求,如量化、權重剪枝或將大模型提煉成小模型。

在這個項目中,我使用了 TensorFlow 中的量化工具來進行模型壓縮。目前我只使用權重量化來減小模型大小,因為根據 Mac 上的測試結果,完整 8 位轉換沒有提供額外的好處,比如縮短推斷時間。(由於 requant_range 中的錯誤,無法在 Pixel 上運行完整的 8 位模型)。由於 8 位量化工具不適合 CPU,時間甚至翻了一倍。如果你有興趣了解更多關於量化的實用建議,可以閱讀 Pete Warden 這篇很棒的文章(https://petewarden.com/2017/06/22/what-ive-learned-about-neural-network-quantization/)。

對模型進行權重量化:

1. 將模型寫入協議緩衝區文件。

2. 從源安裝和配置 TensorFlow(https://www.tensorflow.org/install/install_sources)。

3. 在 TensorFlow 目錄下運行下列命令行:

bazel build tensorflow/tools/graph_transforms:transform_graphbazel-bin/tensorflow/tools/graph_transforms/transform_graph \ --in_graph=/your/.pb/file \ --outputs="output_node_name" \ --out_graph=/the/quantized/.pb/file \ --transforms='quantize_weights'

以我的項目為例,在量化權重後,預訓練的 WaveNet 模型的大小從 15.5Mb 下降到了 4.0Mb。現在可以將這個模型文件移動到安卓項目中的「assets」文件夾。

第二步:適用於安卓的 TensorFlow 庫

要用 TensorFlow 構建安卓應用程式,我推薦從 TensorFlow Android Demo開始。在我的項目中,我把 TF speech example 作為模板。這個示例中的 gradle 文件幫助我們構建和編譯安卓的 TF 庫。但是,這個預構建的 TF 庫可能不包括模型所有必要的 ops。我們需要想清楚 WaveNet 中需要的全部 ops,並將它們編譯成適合安卓 apk 的.so 文件。為了找到 ops 的完整列表,我首先使用 tf.train.write_graph 輸出圖的詳細信息。然後在終端中運行下列命令:

grep "op: " PATH/TO/mygraph.txt | sort | uniq | sed -E 's/^.+"(.+)".?$/\1/g'

接著,編輯/tensorflow/tensorflow/core/kernels/裡的 BUILD 文件,在 Android libraries section 中的「android_extended_ops_group1」或「android_extended_ops_group2」裡添加缺失的 ops。我們也可以刪除不必要的 ops,使 .so 文件變得更小。現在,運行下列命令:

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \--crosstool_top=//external:android/crosstool \--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \--cpu=armeabi-v7a

你將在這裡找到 libtensorflow_inference.so 文件:

bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

除了 .so 文件之外,我們還需要一個 JAR 文件。運行:

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

你將在這裡找到該文件:

bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

現在,可以將 .so 和 .jar 文件一起移到你的安卓項目中的「libs」文件夾。

第三步:在安卓上的數據預處理

最後,讓我們將輸入數據處理成模型訓練所需格式。對於音頻系統來說,原始的語音波被轉換成梅爾頻率倒譜係數(MFCC)來模擬人耳感知聲音的方式。TensorFlow 有一個音頻 op,可以執行該特徵提取。然而,事實證明,實現這種轉換存在一些變體。如圖 2 所示,來自 TensorFlow audio op 的 MFCC 不同於 librosa 提供的 MFCC。librosa 是一個被預訓練的 WaveNet 作者們用來轉換訓練數據的 Python 庫。

圖 2. 來自 librosa 和 TensorFlow audio ops 的 MFCC 處在不同的刻度範圍。

如果您正在訓練自己的模型或重訓練一個預先訓練好的模型,那麼在處理訓練數據時,一定要考慮設備上的數據通道。最終,我在 Java 中重寫了 librosa MFCC 來處理轉換問題。

結果

圖 3 展示了 app 的截圖和示例。由於模型中沒有語言模型,而且識別僅在字符級,因此句子中出現了一些拼寫錯誤。雖然沒有經過嚴格的測試,但在量化之後,我確實發現準確率略有下降,以及整個系統對周圍的噪聲很敏感。

圖 3. App 中兩個示例的截圖。

下表所示推斷時間是對 5 秒音頻的 10 次測試的平均值。推斷時間在兩個平臺上都略有增加,而不是減少,因為權重量化有助於縮小文件大小,但不太能優化推斷時間或耗電情況。

表 1. 權重量化前後的推斷時間。測試環境是我的 Pixel 手機和 Macbook air。

接下來做些什麼?

有兩件重要的事情可以讓這個項目更進一步,也可以為社區提供額外的教程和演練,以便在邊緣設備上部署一個現實語音識別系統。

提高語音識別性能:添加拼寫校正的語言模型和噪聲下採樣模型,以降低周圍噪聲的影響。

改善推斷時間和耗電情況:用 NEON 或其他架構進行低層次優化,用 gemmlowp 進行低精度矩陣計算。

GitHub 地址:https://github.com/chiachunfu/speech

原文連結:https://blog.insightdatascience.com/ok-google-how-do-you-run-deep-learning-inference-on-android-using-tensorflow-c39fd00c427b

本文為機器之心編譯, 轉載請聯繫本公眾號獲得授權 。

---

加入機器之心(全職記者/實習生):hr@jiqizhixin.com

投稿或尋求報導:content@jiqizhixin.com

廣告&商務合作:bd@jiqizhixin.com

相關焦點

  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    深度學習,尤其是對抗生成網絡 GAN,已經被成功應用在超分任務上,比如 SRGAN 和 ESRGAN 都可以生成比較真實的超分圖片。那麼在本文裡,我們將介紹一下如何使用TensorFlow Hub上的一個預訓練的 ESRGAN 模型來在一個安卓 app 中生成超分圖片。最終的 app 效果如下圖,我們也已經將完整代碼開源給大家參考。
  • MIT深度學習教程:一文看懂CNN、RNN等7種範例(TensorFlow教程)
    以下是麻省理工學院課程 6.S094 的深度學習基礎課程第一課的視頻:深度學習是表示學習 (representation learning):從數據中自動形成有用的表示。我們如何表示世界,可以讓複雜的東西對我們人類和我們構建的機器學習模型來說都顯得更簡單。
  • 基於TensorFlow的深度學習實戰
    圖像、視頻、文本、音頻等領域的問題,都可以通過深度學習解決。TensorFlow可以用於實現前述所有應用。TensorFlow很快成為GitHub上用戶最多的深度學習框架。這個庫之所以如此流行,是因為開發人員可以輕鬆的用其來搭建、測試和部署機器學習應用。上面是一個TensorFlow的示意圖。
  • 7種架構範例的深度學習,每個範例都提供了TensorFlow教程
    作為MIT的深度學習基礎系列課程的一部分,本文概述了7種架構範例的深度學習,每個範例都提供了TensorFlow教程的連結。 我們不久前介紹了 MIT 的深度學習基礎系列課程,由 MIT 學術研究員 Lex Fridman 開講,將介紹使用神經網絡解決計算機視覺、自然語言處理、遊戲、自動駕駛、機器人等領域問題的基礎知識。
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    當時時間 3 月 30 日,谷歌 TenosrFlow 開發者峰會 2018 在美國加州石景山開幕,來自全球的機器學習用戶圍繞 TensorFlow 展開技術演講與演示。去年的 TensorFlow 開發者大會上,該框架正式升級到了 1.0 版本,逐漸成為最流行的深度學習框架。
  • MIT 深度學習基礎教程:七個基本框架TensorFlow代碼實戰
    專知以前介紹的MIT深度學習課程:作為麻省理工學院深度學習系列講座和GitHub教程的一部分,我們將介紹使用神經網絡解決計算機視覺、自然語言處理、遊戲、自動駕駛、機器人等領域問題的基礎知識。 這篇博客文章提供了7個架構範例的深度學習概述,每個範例都有TensorFlow教程的連結。
  • TensorFlow 資源大全中文版
    TensorFlow 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU)、伺服器、行動裝置等等。
  • TensorFlow圖像分類教程
    兩年前,Google大腦團隊開發了TensorFlow,並將深度學習巧妙的應用於各個領域。現在,TensorFlow則超越了很多用於深度學習的複雜工具。利用TensorFlow,你可以獲得具有強大能力的複雜功能,其強大的基石來自於TensorFlow的易用性。在這個由兩部分組成的系列中,我將講述如何快速的創建一個應用於圖像識別的卷積神經網絡。
  • TFLearn:為TensorFlow提供更高級別的API 的深度學習庫
    TFlearn是一個基於Tensorflow構建的模塊化透明深度學習庫。它旨在為TensorFlow提供更高級別的API,以促進和加速實驗,同時保持完全透明並與之兼容。TFLearn功能包括:通過教程和示例,易於使用和理解用於實現深度神經網絡的高級API。
  • Python安裝TensorFlow 2、tf.keras和深度學習模型的定義
    它使普通的深度學習任務(如分類和回歸預測建模)可供希望完成任務的普通開發人員使用。在本教程中,您將找到使用tf.keras API在TensorFlow中開發深度學習模型的分步指南。完成本教程後,您將知道:Keras和tf.keras之間的區別以及如何安裝和確認TensorFlow是否有效。
  • 大數據下基於Tensorflow框架的深度學習示例教程
    當數據膨脹到一定規模時,基於機器學習對海量複雜數據的分析更能產生較好的價值,而深度學習在大數據場景下更能揭示數據內部的邏輯關係。本文就以大數據作為場景,通過自底向上的教程詳述在大數據架構體系中如何應用深度學習這一技術。
  • 可能是史上最全的Tensorflow學習資源匯總
    ,一步步帶你從入門到精通,是初學者學習Tensorflow的最佳教程。3)當然還有臺灣國立大學李宏毅教程深度學習的課程也值得推薦給大家:https://www.bilibili.com/video/av9770302/4)英文不錯的小夥伴,也為大家推薦一些國外大牛的英文課程:https://www.youtube.com/watch?
  • 用GPU加速深度學習: Windows安裝CUDA+TensorFlow教程
    背景在Windows上使用GPU進行深度學習一直都不是主流,我們一般都首選Linux作為深度學習作業系統。但很多朋友如果只是想要了解深度學習,似乎沒有必要專門裝雙系統或者改用Linux。現實生活中,很多使用學校或者公司電腦的朋友也沒有操作權限改換系統。
  • MobileNet教程(2):用TensorFlow搭建安卓手機上的圖像分類App
    MobileNet是為移動端量身打造的,因此這次我們準備把之前做的辨別道路的模型應用到一個Android App中,看看它在行動裝置上效果如何。用特定數據集訓練MobileNet下一步,是看看不同結構的MobileNet在經過訓練後能達到什麼樣的準確度。我們先從最「寬」的MobileNet開始訓練:MobileNet 1.0 @ 128。 因為我們想把這個模型應用到行動裝置上,因此我們將會採用權值量化,從而進一步減少內存佔用。
  • 玩轉TensorFlow?你需要知道這30功能
    8)TensorFlow Lite (#TFLite)用 #TFLite 可以在手機和嵌入式設備上部署模型。這意味著,如果不想使用低階的模型,那仍然可以用高階 API 的用戶友好性來實現圖形+模型的構建。2.0 版本將會有更多的功能!網址:https://www.tensorflow.org/guide/keras
  • Keras TensorFlow教程:如何從零開發一個複雜深度學習模型
    本文假設你已經熟悉了 TensorFlow 和卷積神經網絡,如果,你還沒有熟悉,那麼可以先看看這個[10分鐘入門 TensorFlow 教程](http://cv-tricks.com/artificial-intelligence/deep-learning/deep-learning-frameworks/tensorflow-tutorial/)和[卷積神經網絡教程](http://cv-tricks.com
  • 掌握深度學習,為什麼要用 PyTorch、TensorFlow 框架?
    TensorFlow.js可以通過瀏覽器支持行動裝置和桌面設備。如果你的瀏覽器支持WebGL著色器API,TensorFlow.js可以利用它們發揮GPU的優勢。與CPU後端相比,這可以為你提供高達100倍的加速。在擁有GPU的計算機上,TensorFlow.js可以非常快速地在瀏覽器中運行。TensorFlow Lite是一個用於行動裝置的開源深度學習框架。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • 【官方教程】TensorFlow在圖像識別中的應用
    在2012年的驗證數據集上,AlexNet取得了15.3%的 top-5 錯誤率;BN-Inception-v2的錯誤率是6.66%;Inception-v3的錯誤率是3.46%。人類在ImageNet挑戰賽上的表現如何呢?Andrej Karpathy寫了一篇博文來測試他自己的表現。他的top-5 錯誤率是5.1%。這篇教程將會教你如何使用Inception-v3。
  • 安裝TensorFlow 2.0 preview進行深度學習(附Jupyter Notebook)
    【導讀】深度學習框架TensorFlow 2.0 (preview版)可以用pip進行安裝了。