DTeam 团队日志

Doer、Delivery、Dream

TensorFlow端到端旋风教程

胡键 Posted at — Sep 15, 2017 阅读

因为目前正在给师兄做一个设备异常检测的项目,开始有机会接触到TF。这篇教程既可以说是这段时间以来的笔记,同时也希望给项目组的其他小伙伴或后来者提供一个快速上手的索引。

所谓“端到端(End-to-End)”,指的是从环境搭建、模型开发、部署上线,一直到客户端使用这整个过程。就目前而言,我还没有看到一个完整的文章贯穿始终。本文的目的就是要将整个链路打通,帮助TF初学者能够迅速了解全貌,而非限于具体模型的实现细节之中。

OK,Let’s go!

TF安装

就此步而言,其实没有什么太多可说的,按照TF官网的安装指南即可。唯一需要注意的就是,在安装开始之前,请先配好你的pypi镜像。否则,速度可想而知。

模型开发

TF的开发分为两步:算法开发和模型导出。

对于开发部分,网上的文章几乎清一色以MNIST数据集为例子来讲解。但作为过来人,我个人并不推荐小白一上来就整这么复杂的例子。将精力先花在理解TF的基本概念之上即可,然后迅速切换到后续步骤,建立起ML开发和应用的整体印象和概念。

故,我推荐大家先看看O’Reilly的Hello, TensorFlow!。此文不仅讲解了TF的基本概念,同时还对TensorBoard有简单的介绍。唯一不足之处在于,因为TF API前后变化较大,示例代码需要调整一下。

TF模型开发完毕之后需要导出才能用到生产环境之中,遗憾的是,上文中并未提到。这里可参考我在github上的例子,它不仅调整了上文的例子代码,而且还有模型导出的代码示例。这又是一般文章中少有提及的。

运行环境

这里指的运行环境是本机运行环境,毕竟这样对于开发工作来讲更方便嘛。

在此步,用docker当然是最简单的做法啦。而且Tensor Serving也有现成的image可以用,文档在这里

这里有一些快速命令可以参考:

/bitnami/model-data是这个image的模型基本目录,进入contianer之后可以看到这一点(从container中的TF Serving启动的命令行参数可以找到其所用的配置文件:/opt/bitnami/tensorflow-serving/conf/tensorflow-serving.conf,其中包含了base_path。而且,你还可以发现,缺省包含的模型名字为“inception”)。

同时,不要忘了将端口暴露出来。

模型启动

其实上面已经提到了模型启动的问题,但我觉得还得单独强调一下。

有心的读者从上面的命令中应该可以猜出,所谓启动模型,无非就是将包含导出模型的目录让TF Serving知道而已。如:

tensorflow_model_server --model_name=mnist --port=9000 --model_base_path= /home/ml/modules/export/

若启动多个模型,则需要编写模型配置文件,例子如下:

model_config_list: {
  config: {
    name: "mnist",
    base_path: "/tmp/mnist_model",
    model_platform: "tensorflow"
  },
  config: {
    name: "inception",
    base_path: "/tmp/inception_model",
    model_platform: "tensorflow"
  }
}

启动时,命令就变成:

tensorflow_model_server --port=9000 --model_config_file=配置文件

但是很遗憾,在多模型时,TF Serving目前无法动态刷新配置文件。这无疑给部署新模型和更新模型造成了麻烦。

若使用上面的Docker Image,直接使用上面的docker run就实现了模型启动。小伙伴可以自行去container内部了解相关的命令细节(进入之后,ps -ef)。

调用模型

终于到了最后检验咱们成果的时候了!

遗憾的是,tensorflow-serving-api目前并不支持Python 3。而我又懒得维护两个环境,故剑走偏锋:尝试用Java来调用模型,毕竟都是走gRPC嘛。

这篇文件文章(此文同样是一篇很好的入门文章)的启发下终于得以完成:

列为看官可以参考我的例子。至于本文完整的例子,可以参考我的例子工程(它同样也是一个vertx gRPC的例子)。

至此,TensorFlow的开发全线贯通,剩下的就是专心去开发模型啦!