最近升级到了Tensorflow Serving 2.6,一些新特性这里记录下使用方式,之前写的Tensorflow Serving踩坑指南基本上还是可用的,没有太大变化。升级过程其实没什么可说,和之前的一样,只是用新版代码进行编译就可以,新版代码编译十分顺滑,也不需要特别指定bazel版本,它已经都搞好了,如果编译的时候半路崩了通常都是内存不够导致的,建议用性能好一点的机器跑编译。

升级体验,这个2.6这个版本与之前用的1.15相比,性能方面没看出太大差别。TFS1能正常加载的SavedModel格式的模型,只要没用什么特殊的OP,基本上可以平滑迁移,直接用TFS2来加载使用。

新的监控指标

之前的监控比较鸡肋,最近的版本里,metrics增加了新的监控指标,终于可以看模型的请求耗时了。

我这里主要常用这几个指标,直接贴PromQL了。

这里要注意,runtime耗时指标,它把模型warmup产生的请求也统计在里面了,因此在新模型热更新warmup的时候,可能会有耗时异常高的点展示出来。

各模型 RPS:

sum(irate(:tensorflow:serving:request_count[2m])) by (model_name)

各模型 请求耗时 99分位 和 99分位:

histogram_quantile(0.95, sum(irate(:tensorflow:serving:request_latency_bucket[2m])) by (model_name, le)) / 1000

histogram_quantile(0.99, sum(irate(:tensorflow:serving:request_latency_bucket[2m])) by (model_name, le)) / 1000

各模型 runtime耗时(可以理解为底层tf的耗时) 99分位 和 99分位:

histogram_quantile(0.95, sum(irate(:tensorflow:serving:runtime_latency_bucket[2m])) by (model_name, le)) / 1000

histogram_quantile(0.99, sum(irate(:tensorflow:serving:runtime_latency_bucket[2m])) by (model_name, le)) / 1000

开启XLA

这玩意可以简单理解为JIT功能。我这边简单试了下,发现开启之后在我们的batch预测场景耗时变得飘忽不定,所以最终没有采用,StackOverflow上面有对于这个问题的解释Tensorflow Serving with XLA,这里只是记录一下开启方式,有需要的可以参考开启。

需要注意两点:

  1. 目前2.6版本,这个功能仍然是EXPERIMENTAL状态,有可能被移除
  2. 开启XLA将消耗更多的内存(JIT嘛,你懂的)

设置环境变量:

TF_XLA_FLAGS="--tf_xla_clustering_debug --tf_xla_auto_jit=2"

在serving的启动参数里加上:

--xla_cpu_compilation_enabled=true

如果开启成功,可以在log里看到xla相关的信息。

总结

Tensorflow Serving在2.6这个版本,基本上还算是比较成熟了。但如果你刚刚起步,在寻找一个项目用来部署你的机器学习模型到生产环境,也许可以试试核弹厂NVIDIA开发的Triton Inference Server,它能支持TensorFlow,Pytorch等多种机器学习框架的模型部署,比TFS的适用性更强一些,而且迭代得也更积极。

参考