Tensorflow教程笔记
-
基础
TensorFlow 基础
TensorFlow 模型建立与训练
基础示例:多层感知机(MLP)
卷积神经网络(CNN)
循环神经网络(RNN)
深度强化学习(DRL)
Keras Pipeline
自定义层、损失函数和评估指标
常用模块 tf.train.Checkpoint :变量的保存与恢复
常用模块 TensorBoard:训练过程可视化
常用模块 tf.data :数据集的构建与预处理
常用模块 TFRecord :TensorFlow 数据集存储格式
常用模块 tf.function :图执行模式
常用模块 tf.TensorArray :TensorFlow 动态数组
常用模块 tf.config:GPU 的使用与分配 -
大规模训练与加速
TensorFlow 分布式训练
使用 TPU 训练 TensorFlow 模型 -
附录
强化学习基础简介
目录
当我们将模型训练完毕后,往往需要将模型在生产环境中部署。最常见的方式,是在服务器上提供一个 API,即客户机向服务器的某个 API 发送特定格式的请求,服务器收到请求数据后通过模型进行计算,并返回结果。如果仅仅是做一个 Demo,不考虑高并发和性能问题,其实配合 Flask 等 Python 下的 Web 框架就能非常轻松地实现服务器 API。不过,如果是在真的实际生产环境中部署,这样的方式就显得力不从心了。这时,TensorFlow 为我们提供了 TensorFlow Serving 这一组件,能够帮助我们在实际生产环境中灵活且高性能地部署机器学习模型。
TensorFlow Serving 安装
TensorFlow Serving 可以使用 apt-get 或 Docker 安装。在生产环境中,推荐 使用 Docker 部署 TensorFlow Serving 。不过此处出于教学目的,介绍依赖环境较少的 apt-get 安装 。
首先设置安装源:
# 添加Google的TensorFlow Serving源
echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list
# 添加gpg key
curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -
更新源后,即可使用 apt-get 安装 TensorFlow Serving
sudo apt-get update
sudo apt-get install tensorflow-model-server
在运行 curl 和 apt-get 命令时,可能需要设置代理。
curl 设置代理的方式为 -x
选项或设置 http_proxy
环境变量,即
export http_proxy=http://代理服务器IP:端口
或
curl -x http://代理服务器IP:端口 URL
apt-get 设置代理的方式为 -o
选项,即
sudo apt-get -o Acquire::http::proxy="http://代理服务器IP:端口" ...
Windows 10 下,可以在 Linux 子系统(WSL) 内使用相同的方式安装 TensorFlow Serving。
TensorFlow Serving 模型部署
TensorFlow Serving 可以直接读取 SavedModel 格式的模型进行部署(导出模型到 SavedModel 文件的方法见 前文 )。使用以下命令即可:
tensorflow_model_server \
--rest_api_port=端口号(如8501) \
--model_name=模型名 \
--model_base_path="SavedModel格式模型的文件夹绝对地址(不含版本号)"
TensorFlow Serving 支持热更新模型,其典型的模型文件夹结构如下:
/saved_model_files
/1 # 版本号为1的模型文件
/assets
/variables
saved_model.pb
...
/N # 版本号为N的模型文件
/assets
/variables
saved_model.pb
上面 1~N 的子文件夹代表不同版本号的模型。当指定 --model_base_path
时,只需要指定根目录的 绝对地址 (不是相对地址)即可。例如,如果上述文件夹结构存放在 home/snowkylin
文件夹内,则 --model_base_path
应当设置为 home/snowkylin/saved_model_files
(不附带模型版本号)。TensorFlow Serving 会自动选择版本号最大的模型进行载入。
Keras Sequential 模式模型的部署
由于 Sequential 模式的输入和输出都很固定,因此这种类型的模型很容易部署,无需其他额外操作。例如,要将 前文使用 SavedModel 导出的 MNIST 手写体识别模型 (使用 Keras Sequential 模式建立)以 MLP
的模型名在 8501
端口进行部署,可以直接使用以下命令:
tensorflow_model_server \
--rest_api_port=8501 \
--model_name=MLP \
--model_base_path="/home/.../.../saved" # 文件夹绝对地址根据自身情况填写,无需加入版本号
然后就可以按照 后文的介绍 ,使用 gRPC 或者 RESTful API 在客户端调用模型了。
自定义 Keras 模型的部署
使用继承 tf.keras.Model
类建立的自定义 Keras 模型的自由度相对更高。因此当使用 TensorFlow Serving 部署模型时,对导出的 SavedModel 文件也有更多的要求:
- 需要导出到 SavedModel 格式的方法(比如
call
)不仅需要使用@tf.function
修饰,还要在修饰时指定input_signature
参数,以显式说明输入的形状。该参数传入一个由tf.TensorSpec
组成的列表,指定每个输入张量的形状和类型。例如,对于 MNIST 手写体数字识别,我们的输入是一个[None, 28, 28, 1]
的四维张量(None
表示第一维即 Batch Size 的大小不固定),此时我们可以将模型的call
方法做以下修饰:
class MLP(tf.keras.Model):
...
@tf.function(input_signature=[tf.TensorSpec([None, 28, 28, 1], tf.float32)]