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

2021-01-10 機器之心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 效果如下圖,我們也已經將完整代碼開源給大家參考。
  • TensorFlow 資源大全中文版
    TensorFlow 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU)、伺服器、行動裝置等等。
  • TensorFlow Lite發布重大更新!支持移動GPU、推斷速度提升4-6倍
    乾明 發自 凹非寺量子位 出品 | 公眾號 QbitAITensorFlow用於行動裝置的框架TensorFlow Lite發布重大更新,支持開發者使用手機等行動裝置的GPU來提高模型推斷速度。在進行人臉輪廓檢測的推斷速度上,與之前使用CPU相比,使用新的GPU後端有不小的提升。
  • 玩轉TensorFlow?你需要知道這30功能
    如果你關心如何使模型保持最新並監控它們,那麼你可以了解一下這個產品、看看它的論文。地址是:tensorflow.org/tfx/?如果你看到安卓手機上有檢測植物葉子是否有疾病的 APP,或者小型的、具備 AI 技能的機器人,那麼它們很有可能使用了 #TFLite。網址是:https://t.co/suCsBIeQz4?
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    《TensorFlow學習筆記1:入門》連結:http://www.jeyzhang.com/tensorflow-learning-notes.html本文與上一篇的行文思路基本一致,首先概括了TensorFlow的特性,然後介紹了graph、session、variable 等基本概念的含義,以具體代碼的形式針對每個概念給出了進一步的解釋
  • TensorFlow 中文資源全集,學習路徑推薦
    安裝教程,安裝之後跑起來。入門教程,簡單的模型學習和運行。實戰項目,根據自己的需求進行開發。/GitHub:https://github.com/tensorflow安裝教程中文安裝教程Mac安裝:http://www.cnblogs.com/tensorflownews/p/7298646.htmlubuntu 16.04 安裝 tensorflow-gpu:http://www.tensorflownews.com/2017/09/02/tensorflow-gpu-install-ubuntu
  • 英文教程太難啃?這裡有一份TensorFlow2.0中文教程
    今年 3 月份,谷歌在 Tensorflow Developer Summit 2019 大會上發布 TensorFlow 2.0 Alpha 版。作為當前最為流行的深度學習框架,2.0 Alpha 版的正式發布引人關注。近兩個月,網上已經出現了大量 TensorFlow 2.0 英文教程。在此文章中,機器之心為大家推薦一個持續更新的中文教程,以便大家學習。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    雷鋒網按:本文作者姚健,畢業於中科院計算所網絡數據實驗室,曾就職於360天眼實驗室,主要從事深度學習和增強學習相關研究工作。目前就職於騰訊MIG事業部,從事神經機器翻譯工作。摘要2015年11月9日,Google發布深度學習框架TensorFlow並宣布開源,並迅速得到廣泛關注,在圖形分類、音頻處理、推薦系統和自然語言處理等場景下都被大面積推廣。TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。
  • TensorFlow極速入門
    作者孟曉龍,2016年加入Qunar,目前在去哪兒網機票事業部擔任算法工程師。熱衷於深度學習技術的探索,對新事物有著強烈的好奇心。一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    用來實現高性能深度學習推理的平臺——TensorRT 與 TensorFlow Serving 打通結合,使用戶可以輕鬆地實現最佳性能的 GPU 推理。TensorFlow Serving 是應用於機器學習模型的靈活的高性能服務系統,而 NVIDIA TensorRT 則是一個用以實現高性能深度學習推理的平臺,將二者相結合後,用戶可以輕鬆地實現最佳性能的 GPU 推理。
  • 基於TensorFlow2.0的中文深度學習開源書來了!GitHub趨勢日榜第一
    十三 發自 凹非寺 量子位 報導 | 公眾號 QbitAITensorFlow 2.0 發布已有一個半月之久,你會用了嗎?近日,一個叫做深度學習開源書的項目在火了。主要介紹TensorFlow相關基礎,為後續算法實現鋪墊。第三部分是6-9章。主要介紹神經網絡的核心理論和共性知識,助於理解深度學習的本質。第四部分是10-15章。主要介紹常見的算法與模型。除此之外,每個章節裡的內容編排也是理論與實戰相結合。
  • 【強化學習實戰】基於gym和tensorflow的強化學習算法實現
    1新智元推薦【新智元導讀】知乎專欄強化學習大講堂作者郭憲博士開講《強化學習從入門到進階》,我們為您節選了其中的第二節《基於gym和tensorflow的強化學習算法實現》,希望對您有所幫助。同時,由郭憲博士等擔任授課教師的深度強化學習國慶集訓營也將於 10 月 2 日— 6 日在北京舉辦。
  • 深度解讀TensorFlow,了解它的最新發展!
    在前段時間的TensorFlow峰會上,TensorFlow 發布了面向 JavaScript 開發者的全新機器學習框架 TensorFlow.js。  TensorFlow.js 是一個開源的用於開發機器學習項目的 WebGL-accelerated JavaScript 庫。
  • 從框架優缺點說起,這是一份TensorFlow入門極簡教程
    本文介紹了學習 TensorFlow 的系列教程,旨在通過簡單的理論與實踐幫助初學者一步步掌握 TensorFlow 的編程技巧。這一系列教程分為 6 部分,從為什麼選擇 TensorFlow 到卷積神經網絡的實現,介紹了初學者所需要的技能。
  • 聯邦學習:Tensorflow中的逐步實現
    在本教程中,我將實現聯邦學習(FL)的構建塊,並從頭開始對MNIST機器學習數據集進行訓練。介紹FL架構的基本形式包括一個位於中心的管理員或伺服器,負責協調訓練活動。客戶端主要是邊緣設備,可以達到數百萬的數量。這些設備在每次訓練迭代中至少與伺服器通信兩次。
  • 「人工智慧」深度學習代碼教程:簡單線性回歸擬合,送源碼!
    每天更新教程,記得關注《編程高手傑瑞》哦!人工智慧——深度學習要說當前熱度最高的領域,非人工智慧領域莫屬。人工智慧的意義是:為機器賦予人的智能,而機器學習是實現「為機器賦予人的智能」的一種方法,深度學習則是一種實現機器學習的技術,準確來說,深度學習並不等於人工智慧,它只是人工智慧的一個子集而已。目前用來實現深度學習的框架有谷歌的TensorFlow、Facebook的Torch、Keras、Mxnet,除此之外還有百度最近開源的PddlePaddle Fluid框架等。
  • 深度學習的敲門磚:手把手教你TensorFlow初級入門
    公眾號: weic2c在開始使用機器學習算法之前,我們應該首先熟悉如何使用它們。  關於TensorFlow的Python和C ++ API的各種函數的詳細文檔,請參見https://www.tensorflow.org/api_docs/index.html 機器學習主要依賴於很多數學公式,本文將對使用TensorFlow進行這類數學運算做一個初步的介紹。
  • TFX 最新博文:如何使用 TensorFlow 生態系統實現快速高效的 BERT...
    Transformer 模型,特別是 BERT 模型,徹底改變了 NLP,並在諸如情感分析、實體抽取或問答等任務上開闢了新的天地。BERT 模型允許數據科學家站在巨人的肩膀上。當企業用這些模型在大型語料庫中進預訓練時,數據科學家可以將遷移學習應用到這些多用途的 transformer 模型中,並針對其領域特定的問題取得突破性的結果。
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    希望你從這個教程中得到啟發。需求Python3 (https://www.python.org/)TensorFlow (https://www.tensorflow.org/)NumPy (http://www.numpy.org/)TensorFlow:保存/恢復和混合多重模型在第一個模型成功建立並訓練之後,你或許需要了解如何保存與恢復這些模型。