分享TensorFlow Lite應用案例

2020-11-29 電子發燒友

  輸入法引擎預測效果圖

  作為輸入法這樣的一個重度使用的工具類 APP,在移動端做輕量化部署非常重要,具體包括以下四個方面:模型壓縮、快速的響應時間、較低的內存佔用以及 較小的 so 庫(shared object,共享庫)大小等。

  在 Kika 將 TF Mobile 部署到移動端的過程中,除了 CPU 佔用偏高,還有由於 TF Mobile 內存管理與內存保護設計的問題,導致:

  內存保護機制不完善,在實際內存不是很充足的情況(尤其對於部分低端機型以及在內存消耗較大的應用,如大型手遊中彈起輸入法),容易引發內存非法操作。

  內存大小控制機制存在一定的問題,例如模型本身在計算時只有 20MB,但加載到內存之後的運行時峰值可能會飆升 40 到 70MB。

  TF Lite 對於 CNN 類的應用支持較好,目前對於 RNN 的支持尚存在 op 支持不足的缺點。但是考慮到內存消耗和性能方面的提升,Kika 仍然建議投入一部分的研發力量,在移動端考慮採用 TF Lite 做為基於 RNN 深度學習模型的 inference 部署方案。

  2. TensorFlow Lite 對 RNN/LSTM based 模型的原生支持情況

  相對於 CNN 而言,TF Lite 對於 RNN/LSTM 的支持程度稍顯不足。目前的情況是,RNN 相關的基本元素的 op 目前都已經支持,最近也剛剛支持了 LSTM,但遺憾的是 beamSearch 支持暫時還沒有完成。

  不支持的 op 主要集中有兩大類情況:

  包括控制流 (control flow) 的 op

  相對於 TF mobile,TF Lite 的部分 op 只支持最簡單的 case

  目前的一個好的消息就是 TensorFlow 項目組一直在持續的推進對 RNN 系列的支持。

  3. 如何應對 op 缺失的情況

  對於移動端用 TF Lite 部署最友好的開發姿勢是在設計模型之處就了解當前的 TF Lite版本哪些 op 是缺失或者功能不完整的,然後在模型設計過程中:

  儘量避免使用這些 TF Lite 不支持的 op;

  對於不得不使用的情況,也需要結合具體的業務邏輯,優化設計,使得在移動端部署的二次開發的工作量儘可能的小。

  以下是應對 op 缺失的一些常見做法。

  組合

  最為常見的處理方式,例如在早期的 TF Lite 版本中,tf.tile 和 tf.range 都不支持,這個時候建議採用 broadcast_add 來組合代替實現。

  補充

  TF mobile 的 op 相當於完整版的 TensorFlow,於此相比,TF Lite 缺失最嚴重的是包含控制流的部分。例如 seq2seq 模型中常用的 beam search。

  補充的方式有兩種:

  直接開發一個全新的 op;

  在 TF Lite 之外的上層 api 中實現 (此時可能需要拆解模型)。

  兩種方式各有優劣,具體的需要根據功能的複雜度和業務邏輯決定。

  模型拆分

  1) 原因

  需要模型拆分的原因一般有 3 個:

  訓練時用流程控制的方式(如 batch)一次性跑完多個樣本,但在 Inference 的過程中,需要用到單步運行;

  某些 op 不支持,需要在 TF Lite 的上層『手動』實現,可能需要將原有的模型拆分為若干的子模型 (sub graph);

  有部分的冗餘,但是重新設計 graph 再訓練的時間代價較大。

  2) 方法與坑

  以下通過一個實例來描述如何進行模型的拆分。

  將 variable 共享給不同的 op,甚至於不同的 sub graph,通用做法是 採用 `placeholder` 的方式將輸入輸出分開,然後在導出 freeze graph 的時候用 `tf.graph_util.convert_variables_to_constants` 只抓取需要的部分。

  代碼實例:

  python

  vars = tf.get_variable(。..)

  inputs = tf.placeholder(『inputids』, shape=[BATCH, None], 。..)

  embs = tf.nn.embedding_lookup(vars, inputs)

  cells = tf.nn.rnn_cell.MultiRNNCell(。..)

  output, state = tf.nn.dynamic_rnn(cells, embs, 。..)

  實際整合進入客戶端產品 inference 的時候,可能存在的坑:

  可能不需要 `BATCH`,雖然可以每次都指定 batch 為 1,但對於 TF 來說,

  batch = 1 跟直接沒有這個維度的模型結構並不同;

  如果都需要單步運行的話,`dynamic_rnn` 也不需要,而且這裡有大量流程控制 (最新的 TF Lite 開始逐步的對 dynamic rnn 進行了支持)。

  對於後端的模型算法工作者來說,寫出上述的訓練代碼是一件非常自然的事情。如果我們既想保持後端代碼的普適和自然度,又想要快速實現能夠在客戶端部署,需要作出如下的事情:

  python

  prod_inputs = tf.placeholder(『prod_inputids』, shape=[None], 。..)

  prod_embs = tf.nn.embedding_lookup(vars, prod_inputs)

  prod_output, prod_state = cells(prod_embs, 。..)

  其中有 3 個需要被注意的地方:

  RNN cell 本身可以被調用。同一個 cell 如果想讓多個地方同時調用,內部 variable 只會產生一次。

  一般聲明的 variables 如果是用 `tf.get_variable()` 出來的,直接用即可。

  另外一個方式是可以考慮採用 `tf.variable_scope(reuse=True)` 的方式重寫 inference 的過程,以解耦 training 和 inference 的代碼,代價就是整個 graph 會偏大,但是優點使得進行 sub graph 切分的工作變得更加簡單。

  python

  with tf.variable_scope(『my_network』):

  vars = tf.get_variable(。..)

  inputs = tf.placeholder(『inputids』, shape=[BATCH, None], 。..)

  embs = tf.nn.embedding_lookup(vars, inputs)

  cells = tf.nn.rnn_cell.MultiRNNCell(。..)

  output, state = tf.nn.dynamic_rnn(cells, embs, 。..)

  # 。..

  with tf.variable_scope(『my_network』, reuse=True):

  vars = tf.get_variable(。..)

  prod_inputs = tf.placeholder(『prod_inputids』, shape=[None], 。..)

  prod_embs = tf.nn.embedding_lookup(vars, prod_inputs)

  prod_cells = tf.nn.rnn_cell.MultiRNNCell(。..)

  prod_output, prod_state = prod_cells(prod_embs, 。..)

  在進行這些『切分』操作的時候需要注意到幾個問題:

  1. `tf.Variable()` 和 `tf.get_variable()`

  儘量用後者,因為`tf.Variable()`對 variable scope 無效。

  2. 部分 op 有隱藏的 optional argument

  有些 op 有 optional argument,如果不指定的話,可能會自動引入一些額外的 op 來代入默認值。這樣偶爾會引入一些 TF Lite 不支持的 op。例如:

  python

  softmax = tf.nn.softmax(logits)

  其實有個參數 axis 默認是 -1 ,也就是最後一個維度。不寫明的話 TF 會『默認』插入一些 op 在運行時幫你計算:

  python

  axis = tf.sub(tf.shape(logits), tf.constant(1))

  `tf.shape()` 在 TF Lite 一直到最近才支持,而且只要調用的時候直接寫明,並不需要在運行時算:

  python

  # logits has shape [1, VOCABS]

  softmax = tf.nn.softmax(logits, axis=1)

  這類 op 暫時沒有系統性的方式可以辨認 (spec 上沒寫),只能等到試錯的時候才會被發現。

  因此,在實際操作的時候對於默認參數,需要特別的注意。

  4. toolchain -- 模型轉換與整合

  拆完以後的模型仍然是一個 protobuffer 格式,要先把它轉換成 tflite 的 flatbuffers 格式才能用。

  轉換工具可以直接採用 TF 官方的轉換工具。比如在kika 我們的 toolchain 是這樣的:

  bash

  git clone -b tflite https://github.com/KikaTech/tensorflow.git

  cd tensorflow/kika

  bazel build -s -c dbg \

  @org_tensorflow//tensorflow/contrib/lite/toco:toco \

  //graph_tools/python:tf2lite \

  //graph_tools/python:tfecho \

  //graph_tools/python:quantize

  第一個就是模型轉換工具 toco,建議採用獨立的命令行版本,而不是採用 python API,目前對於 OSX 這樣的系統,會有一些編譯上的問題,同時編譯的耗時也比較長。

  第二個是一個包含 toco 的小啟動器,因為 toco 從命令列呼叫起來的話要填的參數比較多,所以這個啟動器會使用 tensorflow 查詢一些可以自動填的參數,來降低手動填的參數數量。

  第三個就是量化工具。如果只是要驗證 graph 能否在 TF Lite 上運行,不需要用到。如果要整合進客戶端產品的話,還會經過量化把模型體積壓縮後才推送至用戶手機 (或打包進安裝包),在用戶手機上做一次性的還原後才能運行。

  5. 效果分析: TF Lite 帶來的收益

  在客戶端實現基於 TF Lite 模型的部署之後,我們分別測試了同一模型在 TF 完全版(TF Mobile)和 TF Lite 10, 000 次 Inference 的資源消耗情況,如下圖所示。主要的 Metrics 包括內存佔用 (memory),運行時間(speed)和靜態連結庫的大小 (image size)。

  

相關焦點

  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    file_path=org%2Ftensorflow%2Ftensorflow-lite%2F2.3.0%2Ftensorflow-lite-2.3.0.aar" dest "${project.rootDir}/libraries/tensorflow-lite-2.3.0.aar" overwrite false retries 5 } } task downloadTFLiteGPUDelegateAARFile
  • 步履不停:TensorFlow 2.4新功能一覽!
    參數伺服器訓練教程           https://tensorflow.google.cn/tutorials/distribute/parameter_server_training    ClusterCoordinator           https://tensorflow.google.cn/api_docs/python
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    下文的所有案例都在配備 Titan-V GPU 的工作站上運行。HTTP/REST API at:localhost:8501 …$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
  • TensorFlow官方發布消息稱將引入一個新的優化工具包
    TensorFlow官方發布消息稱將引入一個新的優化工具包 李倩 發表於 2018-09-21 08:53:44 編者按:幾個月前,Tensorflow發布了一份名為《Quantizing deep convolutional
  • 深度解讀TensorFlow,了解它的最新發展!
    TensorFlow其他應用  研發者還可以在TensorFlow上構建其他機器學習算法,例如決策樹或k-Nearest Neighbors。Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化,使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。
  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • 最簡單的深度學習TensorFlow應用舉例!
    小編我的電腦很一般,沒有32G內存,也沒有1080,就windows上直接裝了23333windows+python 3.6+pycharm+tensorflow cpu話不多說,直接線性回歸,上圖。代碼截圖#接下來貼代碼#辰星樹洞import numpy as np #這是Python的一種開源的數值計算擴展,非常強大import tensorflow
  • TensorFlow 中文資源全集,學習路徑推薦
    https://gitee.com/fendouai/Awesome-TensorFlow-Chinese很多內容下面這個英文項目:Inspired by https://github.com/jtoy/awesome-tensorflow官方網站官網:https://www.tensorflow.org/中文:https://tensorflow.google.cn
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • Tensorflow基礎教程15天之創建Tensor
    Tensor是Tensorflow中使用在計算圖中的最基本的數據單位,我們可以聲明Tensor為variable,或者為Tensor提供placeholer。但首先我們必須知道如何創建Tensor。在將Tensor定義為Variable之後,Tensorflow才會將其傳入計算圖。如何操作我們將在這裡介紹創建Tensor的主要方法。
  • TensorFlow 資源大全中文版
    (點擊上方藍字,快速關注我們)譯文:伯樂在線專欄作者 - Yalye英文:jtoy如有好文章投稿
  • python應用之基於tensorflow的數據擬合:深度學習之預測入門篇
    實驗目的:1、了解python在深度學習領域的應用2、學習安裝python第三方依賴庫實驗環境:已正確安裝python3.5以及依賴庫tensorflow、matplotlib預測過程展示:1、應用領域python是一種高級面向對象的動態類型語言,具有開發高效,學習簡單的特點,主要應用於大數據、深度學習、
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    更多關於TensorFlow的深入介紹、應用項目以及各機器學習開源框架之間的對比等內容,請見雷鋒網的系列文章。下面是本文整理的資料內容:在安裝之前,這裡先列出一些對TensorFlow給出大略介紹的文章,其中包括一些重要的概念解釋,TensorFlow的具體含義和優點,以及TensorFlow的基本工作原理等。
  • 谷歌正式發布TensorFlow 1.5,究竟提升了哪些功能?
    GitHub 地址:https://github.com/tensorflow/tensorflow/releases/tag/v1.5.0原始碼(zip):https://github.com/tensorflow/tensorflow/archive/v1.5.0.zip原始碼(tar.gz):https://github.com/tensorflow/tensorflow
  • 5個簡單的步驟掌握Tensorflow的Tensor
    在這篇文章中,我們將深入研究Tensorflow Tensor的細節。我們將在以下五個簡單步驟中介紹與Tensorflow的Tensor中相關的所有主題:第一步:張量的定義→什麼是張量?我們經常將NumPy與TensorFlow一起使用,因此我們還可以使用以下行導入NumPy:import tensorflow as tfimport numpy as np張量的創建:創建張量對象有幾種方法可以創建tf.Tensor對象。讓我們從幾個例子開始。
  • 終於來了,TensorFlow 新增官方 Windows 支持
    現在你可以使用命令 C:\> pip install tensorflow 安裝 TensorFlow 了。GPU 支持的命令:C:\> pip install tensorflow-gpu有關 TensorFlow Windows 支持的更多細節請閱讀 r0.12 的版本注釋。
  • 關於TensorFlow,你應該了解的9件事
    TensorFlow 下載地址:https://www.tensorflow.org/install/TensorFlow 初始教程:https://www.datacamp.com/community/tutorials/tensorflow-tutorial
  • 玩轉TensorFlow?你需要知道這30功能
    地址是:tensorflow.org/tfx/?網址是:https://www.tensorflow.org/tfx/transform/?網址是:https://www.tensorflow.org/serving/?
  • 機器學習中的embedding原理及tensorflow 相關API的理解
    # 概述本文主要講解tensorflow中涉及embedding的API。之前看了一些文章,寫的雲山霧繞,花了好長時間才搞懂,太笨了。embedding 算法主要用於處理稀疏特徵,應用於NLP、推薦、廣告等領域。所以word2vec 只是embbeding 思想的一個應用,而不是全部。
  • 在Windows中安裝Tensorflow和Kears深度學習框架
    在命令提示符窗口輸入下列命令: 建立Tensorflow Anaconda虛擬環境 conda create --name tensorflow python=3.5 anaconda 執行後屏界面顯示如圖3-9所示。