做算法训练 如果了解套路后,其实就那些步骤,当我们如果想把模型发布成为服务,这就是工程学的内容,model serving,从现在来看 把模型部署成服务 接受前端实时请求调用预测,其实就跟 后端查数据库有点类似。模型训练简单 ,部署成服务还真不太容易。模型调参 特征工程 rawdata convert to vector ,模型热部署 模型切换 模型定时调参 模型的存储 模型的版本控制 模型的特征存储 多个模型同时发布服务 同时在线做预测 ,多种算法切换和集成 串行 并行,模型的监控 跟踪 预测请求的存储和监控 效果监控,在线的训练 并发请求 抗压性能等等,所以你看其实挺不简单的。
接着我们调研了看市面上有没有像样的model serving的开源工具,当然我之前对predictionio 有印象 ,其实还有其他的
然后 开始调研 preditionio ,查看他官网的英文文档,我发现毫无标准 目标的看 官方tutorial ,其实效率蛮低的,看完就忘记了,后来和leader 沟通,就咨询他对于 他想要的model serving 要达到哪些指标 哪些性能符合了才会选型,也幸亏问了,如果没问,leader 再回头问我 调研的如何了,我可能还会吱吱呜呜 说不出来,但是leader 讲了他的想法 ,他认为他哪些功能特性是比较重要的,比如说 是否支持 pmml 文件部署 ,是否支持python stack 开发调用,是否支持实时预测,是否支持 监控跟踪 是否支持模型的存储和版本控制 ,是否支持多个模型同事在线部署服务。。。 我就照着领导的要求 有重点的去翻看tutorial中的具体体现,寻找到答案我就记下来,最后当然按照 leader的想法我找到了大部分答案,没有找到答案的,我就开始使用官方给的安装使用介绍,去安装服务 使用template demo 展开测试。
自己用了用 ,感觉也熟了 ,就有了操作的敏感性,对他有了更深层次的印象。
为了查看在官方没有找到的答案,我只能去看源码,在带着问题思考不断翻看源码找到了 一部分答案,更加确认 predictionio 执行调用过程 架构原理
而且我还是把调研的结果写成了一个word 文档,不过最后 leader并不太满意 predictionio ,因为predictionio 一部分不太符合我们的业务场景
比如说predictionio 服务端暂时只有java scala ,团队都是python技术栈
prediction 依赖spark 太重,predictionio 对多个模型同时部署还不够友好
prediction的model存储 版本控制比较简陋
predictionio 还不支持 pmml 文件的热部署,等等
不过我看网上 ,台湾竟然有predictionio 的培训,三万新台币培训费 三天
predictionio
支持 多种数据库 mysql postgresql hbase elasticsearch,模型最后是存储在数据库中
以大数据格式存储
可以接受 curl post restful 请求调用预测
接受client 程序 编码调用 支持 scala 和python
支持 batchpredict 批量文件的请求调用
操作由 串行命令组成
先run eventserver 监听服务 pio eventserver --ip 127.0.0.1 --port 7070 &
然后 importdata 批量导入训练数据 python3 ./data/import_sever.py
然后 将本地的模型项目 build 打成 jar 包, pio build
然后执行训练,训练在spark 上进行,pio build
训练成功后 会生成模型 并将模型存储持久化,
之后 deploy 部署模型在线服务 pio deploy
之后展开预测
pio batachpredict --input bp.json --output batchpredict.json
curl -H "Content-Type: application/json" -d '{ "attr0" :59,"attr1" :30,"attr2" : 18}' \http://localhost:8000/queries.json
或者程序化 集成client 发送 预测请求
predictionio 最大的特点就是将模型 部署成在线服务可以被实时调用预测,压测还没有做,不过认为 异步编程 future调用是比较符合场景的
算法 原生支持spark 的所有算法,predictionio 最开始主要是针对 推荐系统做的,现在是 基本支持集成所有算法,spark mllib xgboost deeplearning4j libtensorflow
并且支持同时多个算法串行预测
算法训练的超参数是写在 配置文件json中,遇到模型修改 ,直接修改配置文件的模型超参数即可然后重新build train deploy 即可
pio 默认在8000 端口会有监控】
pio 可以和 已有的监控软件集成监控 moint
pio 服务端开发 暂时只支持 java scala ,客户端预测 支持 python scala java ruby
predictionio 环境 在 linux centos7 和mac 上都进行了末班代码的尝试,均成功, predictionio 暂时不支持windows
以下较为重要的是
pio 是否支持支持 多个模型在线服务 同时在线,在进行预测的时候如何指定 使用哪个模型预测, 只要 pio deploy 可以指定端口基本就没有问题
pio 是否支持 模型的热切换, 同一个端口,更换模型,一 即支持数据库已有模型的回溯部署 2 又支持新的模型训练后即部署 中间可以不停止服务 这个原理抓请 每个 app 与模型的对应关系,如何去数据库去load 模型部署原理
pio 是如何唤起选择数据库的哪个模型部署的原理 步骤
pio 在训练时候是如何选择spark 做训练 是否可以支持其他原生训练 比如 xgb lgbm sklearn
pio 是否可以跳过训练过程 直接将pmml 文件转换成模型 持久化 并部署 进行预测
Predictionio 大致分为五大组件
DataSource
作为读取数据 支持 本地数据 hdfs 数据 和elasticSearch hbase数据
DATA preparatory
主要是把DataSource中读到的数据转换为模型可以使用数据格式 ,特征工程可以在这里做
Algorithm 主要是算法的训练和预测的,可以集成多种算法实现
Serving 是在 deploy 后执行在线预测服务的
Evaluation Metrics 作为 评估模型效果
最终使用 Engine 串联起这些组件来
个人认为如果要使用predictionio 1.可以减小研发工期 2.监控可以触达3.需要了解相应 组件的调用关系 原理 4.使用中可能需要面临二次开发 中间灵活调用各个过程组件