# 十、部署
在本章中,我们将学习如何在各种平台上部署经过训练的模型,以实现最大吞吐量和最小延迟。 我们将了解 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 可以用于不同的应用,例如对象检测,地标识别,人脸属性,细粒度分类,如下所示:
![](https://img.kancloud.cn/78/4c/784c288b828217223d32748e1511f102_566x222.png)
转载自霍华德等人
MobileNets 通过用深度(**b**)和点向卷积(**c**)替换标准卷积过滤器(**a**)和点卷积(**c**)来减少模型的大小和计算量,如下所示:
![](https://img.kancloud.cn/c0/14/c014e170fe503e2a41a15433e02fba20_566x749.png)
转载自霍华德等人
批量归一化和激活层被添加到深度和点积卷积中,如下所示:
![](https://img.kancloud.cn/10/69/1069f9c116e38a590b75974534eca187_566x340.png)
转载自霍华德等人
有两个参数会影响模型的选择:
* **乘法和加法次数**:精度和多加法之间的权衡如下所示:
![](https://img.kancloud.cn/4c/b3/4cb313b67c5f91b1d923a738696dd18f_566x401.png)
转载自霍华德等人
* **模型**中的参数数量:此处显示权衡:
![](https://img.kancloud.cn/62/57/62570d838c435b53d8a2bfe672471cf9_566x408.png)
转载自霍华德等人
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. 从登录页面选择虚拟机来启动:
![](https://img.kancloud.cn/57/77/5777cf9aec268e7a45c2d78b1ba8ea61_566x199.png)
3. 在下一个窗口中,单击入门,选择 EC2 实例,如下所示:
![](https://img.kancloud.cn/a4/29/a42994895e08c8d1f23d50868244e025_566x622.png)
4. 为 EC2 实例命名:
![](https://img.kancloud.cn/d1/40/d1400c55573179c1c6b5bcccfe5a449f_566x200.png)
5. 选择操作系统的类型:
![](https://img.kancloud.cn/df/98/df98b6dfc1efb77213b002035d9c74e9_566x311.png)
6. 选择实例类型。 实例类型指示 RAM 和 CPU 大小不同的配置类型。 也有两个选项可供选择。 选择实例类型,然后单击“下一步”按钮:
![](https://img.kancloud.cn/42/c3/42c33e1f29d541a5bd4a35be3cca1932_566x340.png)
7. 创建一个隐私增强型邮件安全证书(PEM)文件,该文件将用于登录,如下所示:
![](https://img.kancloud.cn/97/9f/979fc92be3eaaeaa0a98d9cfdc045515_566x143.png)
8. 创建实例将花费一些时间,最后,将显示完成状态:
![](https://img.kancloud.cn/30/b0/30b0057423d9261e25646b478f2350f9_566x108.png)
9. 接下来,单击进入 EC2 控制台按钮:
![](https://img.kancloud.cn/ab/ba/abba4c14eb1e6d1dec0fe8687fe8f0d2_532x182.png)
10. 现在将创建实例; 单击连接按钮,如下所示:
![](https://img.kancloud.cn/b6/8e/b68e66cbeaea7120a093c256187e36fa_566x241.png)
11. 接下来,必须将实例连接到虚拟机的命令提示符。 连接所需的说明在此步骤中给出。 您需要在之前的步骤中下载 PEM 文件。 按照显示的说明连接到系统:
![](https://img.kancloud.cn/8e/56/8e56e0655590503560a170afe0200f74_566x435.png)
12. 完成后,通过单击操作|实例状态|终止来终止实例:
![](https://img.kancloud.cn/8a/69/8a695d68b9142fa2f88de302b3636c28_566x482.png)
安装和执行步骤可以遵循第 1 章,“入门”。
# Google Cloud Platform
Google Cloud Platform(GCP)是 Google 提供的云平台,具有与 AWS 类似的功能。 通过执行以下步骤,可以使用一个简单的虚拟机来训练诸如 AWS 之类的模型:
1. 使用 [cloud.google.com](https://cloud.google.com/) 转到 Google Cloud Platform,然后使用您的 Gmail 帐户登录到该平台。
2. 现在,通过单击“转到控制台”按钮进入控制台:
![](https://img.kancloud.cn/da/04/da0449ee438275a6b4b46c64cb8fbdfa_440x124.png)
3. 进入控制台后,通过单击**计算引擎**进入 **VM 创建页面**。 右上角菜单中的 VM 实例,如以下屏幕截图所示:
![](https://img.kancloud.cn/79/da/79dad45f4ad4e69c73d4929cd705ba98_359x751.png)
4. 然后单击`CREATE INSTANCE`按钮,以创建所需的实例:
![](https://img.kancloud.cn/80/33/8033cfb2425cfd299bf56129b38f9cb3_312x72.png)
5. 接下来,可以通过配置选择实例类型。 Zone 参数通知区域将部署实例。 通过选择靠近用户的区域,可以节省等待时间。 可以使用所需的 RAM 和 CPU 定制机器类型。 还可以选择 GPU,以进行更快的训练。 选择实例的大小,然后单击“创建”按钮,如以下屏幕截图所示:
![](https://img.kancloud.cn/a8/0b/a80b0d827bbcfc89df06f1b5cf71a538_421x751.png)
6. 创建实例将需要几分钟。 然后,单击实例的 SSH 下拉列表,然后选择“在浏览器窗口中打开”选项,如下所示,以在浏览器中打开控制台:
![](https://img.kancloud.cn/78/68/78689efe84bcd3a336f65dd184bb41f8_566x97.png)
使用该外壳,您可以安装 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
- 六、自编码器,变分自编码器和生成对抗网络
- 七、迁移学习
- 八、机器学习最佳实践和故障排除
- 九、大规模训练
- 十、参考文献