背景
在UI自动化测试中,界面控件识别是基石。在计算机视觉领域中,有很多经典的目标识别模型,我们尝试将YOLO模型迁移至自动化测试领域界面控件识别中。迁移训练后的模型需要部署到生产环境,TensorFlow Serving是一种模型部署方法,只需几行简单的代码就可以维护模型的整个生命周期。下面将以原YOLO V3 tensorflow版模型为例从环境准备、模型格式转换、服务部署和调用以及最后的性能对比四个方面介绍TensorFlow Serving在模型部署中的应用。
环境准备
官网推荐TensorFlow Serving 在docker容器中运行,因此安装TensorFlow Serving之前需要先安装docker。
安装TensorFlow Serving cpu版本步骤:
从docker仓库中获取cpu版本的镜像:
启动容器:
启动成功示意图如下图所示:
安装Tensorflow Serving GPU版本步骤:
安装nvidia-docker
从docker仓库中获取GPU版本的镜像:
启动容器:
启动成功的示意图如下图所示:
YOLO模型格式转换
YOLOV3 tensorflow版本保存的模型格式是ckpt格式,tensorflow serving需要的格式是savedmodel格式,因此需要进行模型格式转换。ckpt格式的模型只存储一些权重,我们需要创建一个session,将计算图搭建好,并恢复ckpt中保存的参数,定义标记模型的输入和输出参数签名,从而得到savedmodel格式的模型,具体实现代码如下图所示:
YOLO服务部署和调用
由于tensorflow有些组件是懒加载模式,因此第一次请求预测会有很严重的延迟,为了降低懒加载的影响,需要在服务初始启动的时候给一些小的请求样本,调用模型的预测接口,预热模型。
Warmup Model的步骤如下所示:
- Warmup数据的生成代码如下图所示,运行后生成
tf_serving_warmup_requests.TFRecord。
- 将生成的tf_serving_warmup_requests文件放到对应模型和版本所在目录assets.extra文件夹下
- 启动模型时,模型会自动加载tf_serving_warmup_requests中的数据预热模型,预热模型的日志输出示意图如下图所示:
版本维护
tf serving可以维护模型的多个版本,当在模型目录下放入新版本模型,tf serving监听到有新版本模型加入后,会将新版本模型加载进内存中同时卸载之前加载的旧模型,日志输出示意图如下图所示:
服务调用:
调用部署好的yolo模型,tf serving提供了两种方式,一种是grpc方式(默认端口是8500),另一种是http接口调用方式(默认端口是8501)。grpc和http请求对应的代码片段分别如下图所示:
CPU&GPU性能对比
我们对比了TensorFlow Serving 仅使用CPU和使用GPU加速两种情况下YOLO服务的性能,对比发现,使用GPU加速后处理一次请求的时间是50ms左右,不使用GPU加速处理一起请求需要280ms左右。响应速度提升5~6倍左右。
参考文献
www.tensorflow.org/tfx/guide/s…
www.tensorflow.org/guide/saved…