AI系统构建的简要总结,包括业务模型训练及在线serving的关系。

背景

随着AI算法和相关硬件设施的日渐成熟,业界的AI算法应用已逐步走向产业化。如何快速构建/部署某个领域的AI系统,业界有没有什么规律可循呢?本文希望可以提供一些思路以供讨论。

构建业务模型

在具体的业务中,根据神经网络模型所擅长的抽象方式,比如检测、语音等感知模型,构建一个业务功能模型。进而得到,比如异常行人检测,家庭机器人的语音识别系统。

有了一个业务模型的目标之后,1)如果我们具备专业的DL/ML算法工程师,那么我们只需要给TA一批数据(尽管现在的半/自监督学习确实性能也不错,但是目前的主流仍然是在监督学习上),用于训练你的算法模型;2)如果你没有专业的DL资源,可能就需要借助于开源的一些经典算法,然后在开源算法的基础上,开展你自己业务模型的训练过程,Andrew NG 的Yearning提供了一些帮助,值得参考。

云侧服务部署

如果你使用的是PyTorch开发模型,那么部署使用Caffe2就好了(遥想曾经使用caffe开发和部署的场景); 如果你用的开发环境是tensorflow, 那么Tensorflow Serving(TFS),可能是一个现成的部署参考。后文也主要是基于TFS做相关介绍。

TFS有一些比较好的特性可以使用:

  • TFS可以在单GPU卡上面部署多个模型,支持自动更新指定的多个版本, 并且可以自带调度
  • TFS 兼容GPU显存不足的情况下,部署模型
  • 模型的存储位置可以放在S3或HDFS。为避免在更新模型权重文件的时候,TFS刚好拉取,可以把模型的权重,先压缩再解压
  • TFS支持用户自定义的OP算子
  • TFS很方便地集群化,直接使用docker 镜像挂载在K8s集群,使用负载均衡器,如Traefik,即可以快速搭建高吞吐量的服务集群,当然这里面需要处理一些异步和同步的问题。
  • TFS自带RestAPI 和gRPC接口,经测试gRPC是要更快一些。这里有一个优化的例子参考
  • 自带base64压缩,在视频、图片类的系统上,压缩是很有必要的。我们还可以使用缓存,比如Redis共享。当然,数据流的管理,以保障数据只出现在它该出现的地方,是一个更大的话题了。
  • TFS1.12之后,自带TensorRT。

有了推理处理的工具后,可以使用PostgreSQL等关系型数据库和Celery、Kafka等消息队列,以及S3、HDFS等存储设施等,构建数据存储、管理、读取的Pipeline,值得注意的是Celery支持构建Workflow,可以构建用户的自定义操作,内嵌在Pipeline中。具体都可以参见各自的官方文档。当然,曾经我们也测试过,MPI, Queue, 外加 tensorflow.graph等hard-code的方式构建多层级工作流,性能是很快的,但是工作量巨大,可扩展性也是一大问题。所有,建议把消息和通信层应该独立出来,作为基础设施比较合理。

那么有了推理侧的执行器,也有了“管控大脑”,剩下的就是怎么暴露应用接口,以及呈现给用户的UI系统了。

WebAPI 接口一般可以用Django,Flask,gunicorn,Nginx等成熟的方案构建。UI的设计亦不在本文的讨论范围之内。

那么为保障系统的可拓展性,一般会把上面的所有模块微服务化,可以通过K8S来守护; 为保障系统的稳定性,在控制流量上,需要在前端,到pipeline,到推理执行侧,构建多层容错措施,类似”沙漏式“的管道,以避免用户的不必要、某些“脏”数据,直接灌入到系统的最底层。

那么这些组件本身的稳定性我们如何保障呢?如果没有集群管理的能力,可以直接使用相关云服务,国内各大云厂商都有相对应的云产品,开箱即用。

端侧应用推理

端侧的推理,目前已经有一些开源方案可以参考,比如MDLC的TVM,腾讯的NCNN,阿里的MNN等等。期待更加优秀的端侧推理方案开源。

优化应用模型

有了“基础版”系统上线,我们往往需要不断优化业务算法模型,以支撑更好的服务,这时候我们可以使用online学习的机制,比如Human-in-loop,强化学习等等。 更加重要的是,如何保障整个系统的鲁棒性、可扩展性以及易用性,这也是我们正致力解决的问题。 再续 : )