# 十、部署
在本章中,我們將學習如何在各種平臺上部署經過訓練的模型,以實現最大吞吐量和最小延遲。 我們將了解 GPU 和 CPU 等各種硬件的性能。 我們將遵循在 Amazon Web Services,Google Cloud Platform 等平臺以及 Android,iOS 和 Tegra 等移動平臺上部署 TensorFlow 的步驟。
我們將在本章介紹以下主題:
* 了解影響深度學習模型訓練和推理性能的因素
* 通過各種方法提高性能
* 查看各種硬件的基準并學習調整它們以實現最佳性能的步驟
* 將各種云平臺用于部署
* 將各種移動平臺用于部署
# 模型表現
性能對于深度學習模型的訓練和部署都很重要。 由于大數據或大模型架構,訓練通常需要更多時間。 結果模型可能更大,因此在 RAM 受限的移動設備中使用時會出現問題。 更多的計算時間導致更多的基礎架構成本。 推理時間在視頻應用中至關重要。 由于前面提到了性能的重要性,因此在本節中,我們將研究提高性能的技術。 降低模型復雜度是一個簡單的選擇,但會導致精度降低。 在這里,我們將重點介紹一些方法,這些方法可以提高性能,而準確率卻沒有明顯的下降。 在下一節中,我們將討論量化選項。
# 量化模型
深度學習模型的權重具有 32 位浮點值。 當權重量化為 8 位時,精度下降很小,因此在部署中不會注意到。 結果權重的精度似乎對深度學習模型的精度性能影響較小。 這個想法對深度學習很有趣,并且在模型大小變得至關重要時很有用。 通過用 8 位值替換 32 位浮點值,可以顯著減小模型大小并提高推理速度。 實現模型量化時有很多選擇。 權重可以存儲在 8 位中,但推理操作可以以 32 位浮點值執行。 架構的每個組件在量化大小上的行為可能有所不同,因此,取決于層,可以選擇 32 或 16 或 8 位值。
量化工作有多種原因。 通常,深度學習模型經過訓練可以解決圖像中的噪聲,因此可以被認為是健壯的。 推理計算可以具有冗余信息,并且可以由于量化而去除冗余信息。
最新的 CPU 和 RAM 硬件已針對浮點計算進行了調整,因此在此類硬件中量化效果可能不太明顯。 隨著為此目的引入越來越多的硬件,這種情況正在改變。 在 GPU 中,由于內存和速度現已適應較低的精確浮點運算,因此它們在內存和速度上存在明顯差異。 還有其他特殊硬件可用于運行不太精確的浮動操作。
# MobileNet
[霍華德(Howard)和其他人](https://arxiv.org/pdf/1704.04861.pdf)引入了一種稱為 **MobileNets** 的新型模型,可用于移動和嵌入式應用。 MobileNets 可以用于不同的應用,例如對象檢測,地標識別,人臉屬性,細粒度分類,如下所示:

轉載自霍華德等人
MobileNets 通過用深度(**b**)和點向卷積(**c**)替換標準卷積過濾器(**a**)和點卷積(**c**)來減少模型的大小和計算量,如下所示:

轉載自霍華德等人
批量歸一化和激活層被添加到深度和點積卷積中,如下所示:

轉載自霍華德等人
有兩個參數會影響模型的選擇:
* **乘法和加法次數**:精度和多加法之間的權衡如下所示:

轉載自霍華德等人
* **模型**中的參數數量:此處顯示權衡:

轉載自霍華德等人
MobileNets 已顯示,可以在移動和嵌入式設備上使用的精度有所降低的情況下,可以減少模型的計算和尺寸。 在霍華德等人的文章中可以看到模型與精度之間的確切權衡。
# 云端部署
必須將這些模型部署在云中以用于多個應用。 我們將為此目的尋找主要的云服務提供商。
# AWS
Amazon Web Services(AWS)將支持擴展到基于 TensorFlow 的模型的開發和部署。 在 [Amazon](https://aws.amazon.com/) 上注冊 AWS,然后選擇 **Amazon 機器映像**(**AMI**)之一。 AMI 是安裝了所有必需軟件的計算機的映像。 您不必擔心安裝包。 **AWS 提供了深度學習 AMI**(**DLAMI**),以簡化訓練和部署深度學習模型。 有幾種選擇。 在這里,我們將使用 Conda,因為它帶有運行 TensorFlow 所需的幾個包。 Python 有兩個選項:版本 2 和版本 3。以下代碼將在 CUDA 8 的 Python 3 上使用 Keras 2 激活 TensorFlow:
```py
source activate tensorflow_p36
```
以下代碼將在 CUDA 8 的 Python 2 上使用 Keras 2 激活 TensorFlow:
```py
source activate tensorflow_p27
```
您可以訪問[這里](https://aws.amazon.com/tensorflow/)了解更多詳細信息和教程。
還可以通過執行以下給定的步驟來啟動**虛擬機**(**VM**):
1. 轉到 [Amazon AWS](https://aws.amazon.com/),然后使用您的 Amazon 帳戶登錄。
2. 從登錄頁面選擇虛擬機來啟動:

3. 在下一個窗口中,單擊入門,選擇 EC2 實例,如下所示:

4. 為 EC2 實例命名:

5. 選擇操作系統的類型:

6. 選擇實例類型。 實例類型指示 RAM 和 CPU 大小不同的配置類型。 也有兩個選項可供選擇。 選擇實例類型,然后單擊“下一步”按鈕:

7. 創建一個隱私增強型郵件安全證書(PEM)文件,該文件將用于登錄,如下所示:

8. 創建實例將花費一些時間,最后,將顯示完成狀態:

9. 接下來,單擊進入 EC2 控制臺按鈕:

10. 現在將創建實例; 單擊連接按鈕,如下所示:

11. 接下來,必須將實例連接到虛擬機的命令提示符。 連接所需的說明在此步驟中給出。 您需要在之前的步驟中下載 PEM 文件。 按照顯示的說明連接到系統:

12. 完成后,通過單擊操作|實例狀態|終止來終止實例:

安裝和執行步驟可以遵循第 1 章,“入門”。
# Google Cloud Platform
Google Cloud Platform(GCP)是 Google 提供的云平臺,具有與 AWS 類似的功能。 通過執行以下步驟,可以使用一個簡單的虛擬機來訓練諸如 AWS 之類的模型:
1. 使用 [cloud.google.com](https://cloud.google.com/) 轉到 Google Cloud Platform,然后使用您的 Gmail 帳戶登錄到該平臺。
2. 現在,通過單擊“轉到控制臺”按鈕進入控制臺:

3. 進入控制臺后,通過單擊**計算引擎**進入 **VM 創建頁面**。 右上角菜單中的 VM 實例,如以下屏幕截圖所示:

4. 然后單擊`CREATE INSTANCE`按鈕,以創建所需的實例:

5. 接下來,可以通過配置選擇實例類型。 Zone 參數通知區域將部署實例。 通過選擇靠近用戶的區域,可以節省等待時間。 可以使用所需的 RAM 和 CPU 定制機器類型。 還可以選擇 GPU,以進行更快的訓練。 選擇實例的大小,然后單擊“創建”按鈕,如以下屏幕截圖所示:

6. 創建實例將需要幾分鐘。 然后,單擊實例的 SSH 下拉列表,然后選擇“在瀏覽器窗口中打開”選項,如下所示,以在瀏覽器中打開控制臺:

使用該外殼,您可以安裝 TensorFlow 并可以訓練或部署模型。 有許多選項可從虛擬機的配置中選擇。 根據成本和時間的權衡,可以選擇配置。
GCP 具有**云機器學習引擎**,可在使用 TensorFlow 時為我們提供幫助。 GCP 的三個組件可以一起用于構建訓練和部署基礎架構:
1. 用于預處理圖像的 Cloud DataFlow
2. 用于訓練和部署模型的云機器學習引擎
3. 用于存儲訓練數據,代碼和結果的 Google Cloud Storage
可以在[這個頁面](https://cloud.google.com/ml-engine/docs/flowers-tutorial)上找到使用云機器學習引擎建立自定義圖像分類模型的出色教程。
# 在設備中部署模型
TensorFlow 模型也可以部署在移動設備中。 移動設備包括智能手機,無人機,家用機器人等。 數十億智能手機可以具有可以使用深度學習的計算機視覺應用。 可以拍照并搜索,流化帶有標記場景的視頻等。 在移動設備中進行部署意味著深度學習模型存在于設備上,并且推斷發生在設備上。 設備上部署的模型有助于解決隱私問題。 在以下主題中,我們將討論如何在各種移動平臺上部署它們。
# Jetson TX2
Jetson TX2 是由 NVIDIA 提供的嵌入式設備,專門用于高效 AI 計算。 Jetson TX2 輕巧,緊湊,因此適合在無人機,公共場所等中部署。 它還附帶預裝的 TensorRT,這是 TensorFlow 的運行時。 您可以購買 Jetson 并在安裝 TensorFlow 之前快速安裝 Ubuntu,CUDA,CUDNN。 克隆[這個頁面](https://github.com/jetsonhacks/installTensorFlowTX2),然后在命令提示符下輸入以下命令。
1. 首先,在以下代碼的幫助下安裝必備組件:
```py
./installPrerequisites.sh
```
2. 現在,使用以下代碼克隆 TensorFlow:
```py
./cloneTensorFlow.sh
```
3. 接下來,使用以下代碼設置所需的環境變量:
```py
./setTensorFlowEV.sh
```
4. 現在我們將使用以下代碼構建 TensorFlow :
```py
./buildTensorFlow.sh
```
5. 現在,我們將使用以下代碼將打包文件處理為 Wheel 文件:
```py
./packageTensorFlow.sh
```
6. 現在,我們將使用以下代碼安裝 Tensorflow:
```py
pip install $HOME/tensorflow-1.0.1-cp27-cp27mu-linux_aarch64.whl
```
借助這些步驟,我們可以在 Jetson TX2 中安裝 TensorFlow。
# 安卓
任何 Android 應用都可以使用 TensorFlow,其構建細節可以在[這個頁面](https://www.tensorflow.org/mobile/android_build)中找到。 關于此的官方示例可以在[這個頁面](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)中找到。 假設讀者具有 Android 編程經驗,則在 Android 設備中實現 Tensorflow 的步驟如下:
1. 使用第 3 章“圖像檢索”中介紹的步驟,將 TensorFlow 模型導出到`.pb`文件。
2. 生成二進制文件`.so`和`.jar`。
3. 編輯`gradle`文件以啟用庫加載。
4. 加載并運行 Android 應用文件
# iPhone
蘋果使用 CoreML 框架將機器學習集成到 iPhone 應用中。 Apple 提供了可以直接集成到應用中的標準模型列表。 您可以使用 TensorFlow 訓練自定義深度學習模型并將其在 iPhone 中使用。 為了部署自定義模型,您必須在 CoreML 框架模型中隱藏 TensorFlow。 谷歌發布了 [tf-coreml](https://github.com/tf-coreml/tf-coreml),用于將 TensorFlow 模型轉換為 CoreML 模型。 可以使用以下代碼安裝 TFcoreML:
```py
pip install -U tfcoreml
```
可以使用以下代碼導出模型:
```py
import tfcoreml as tf_converter
tf_converter.convert(tf_model_path='tf_model_path.pb',
mlmodel_path='mlmodel_path.mlmodel',
output_feature_names=['softmax:0'],
input_name_shape_dict={'input:0': [1, 227, 227, 3]})
```
iPhone 可以使用導出的模型進行預測。
# 總結
在本章中,我們了解了如何在各種平臺和設備上部署經過訓練的深度學習模型。 我們已經介紹了為這些平臺獲得最佳性能的步驟和準則。 我們已經看到了 MobileNets 的優勢,它以很小的精度權衡來減少推理時間。
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻