背景本文示范如何应用 OpenMLDB 和 Byzer-lang 联结实现一个残缺的机器学习利用。Byzer-lang 作为面向大数据和 AI 的一门语言,通过 Byzer-Notebook 和用户进行交互,用户能够轻松实现数据的抽取、ETL、特色/模型训练、保留、部署到最初预测等整个端到端的机器学习流程。OpenMLDB 在本例中接管 Byzer 发送的指令和数据,实现数据的实时特色计算,并经特色工程解决后的数据集返回 Byzer,供其进行后续的机器学习训练和预测。筹备心理准备:因为操作系统环境的千差万别,装置部署经常是最繁琐的和耗费工夫的局部。请大家急躁筹备,在遇到问题时及时寻求两个社区的帮忙。用户须要找一台 Linux 机器(虚拟机也行),而后部署如下几个利用(都很简略,根本都是下载、解压、运行即可):Byzer-lang: Byzer-lang 部署Byzer-Notebook:Byzer-Notebook 部署OpenMLDB 0.5.2:OpenMLDB 部署,留神是集群版的部署模式,并且 zk 门路要配置成 /openmldb值得注意的是,如果没有应用对象存储这种共享存储,那么 Byzer-lang, OpenMLDB 须要部署在一台服务器,这样能力相互拜访单方产出的文件。部署时须要留神的几个小问题:部署好 JDK8请确保一些根底的命令,诸如有 curl、ipconfig 等命令。个别部署脚本里会用到,如果没有,按报错提醒装置即可。最好应用 bash 执行脚本而不是默认的 sh对于最初确认是不是装置实现,能够按如下形式进行查看。首先是查看 OpenMLDB, 用户能够在 OpenMLDB 装置目录里执行如下指令:./bin/openmldb --zk_cluster=192.168.3.14:7181 --zk_root_path=/openmldb --role=sql_client顺利连贯上后阐明是可行的,此时须要初始化一个数据库和表:> CREATE DATABASE demo_db;> USE demo_db;> CREATE TABLE t1(id string, vendor_id int, pickup_datetime timestamp, dropoff_datetime timestamp, passenger_count int, pickup_longitude double, pickup_latitude double, dropoff_longitude double, dropoff_latitude double, store_and_fwd_flag string, trip_duration int);执行实现后大略这个样子:

其次是查看 Byzer ,能够拜访服务器的 9002 端口,如果你顺利进入 Byzer-Notebook 显示如下界面,则证实是可行的:

数据筹备首先,从 New York City Taxi Trip Duration 下载出租车的数据,解压失去如下数据集:

接着进入 Byzer-Notebook 首页,通过 上传 性能上传这个文件:

上传后你应该能够在 Byzer-Notebook 的文件系统里看到这个文件:

这样,咱们数据就筹备好了。接下来,咱们会分成三个步骤进行:特色/模型训练特色部署和模型部署端到端的预测能力这三个步骤对应成三个 Notebook:

装置 Byzer-openmldb-3.0 插件Byzer 和 OpenMLDB 通信须要一个 Byzer 插件,能够在 Byzer-notebook 里间接执行一条指令来装置:!plugin app add - "byzer-openmldb-3.0";注:如果是 sandbox 模式部署的 Byzer, 目前这个形式是有效的。网速被限定 100k 以内,因为这个插件比拟大,所以下载工夫较长,须要大家急躁期待。另外,在 Log Message 标签页会显示 下载进度信息。

特色/模型训练局部第一步,加载咱们训练的 csv 文件看看:load csv.`/tmp/upload/train.csv` where header="true" and inferSchema="true"as taxi_csv_data;执行后输入后果如下:

为了不便,咱们把这个数据保留到数据湖里,而后再次从数据湖里加载成一张表叫 taxi_tour_table_train_simplesave overwrite taxi_csv_data as delta.public.taxi_tour_table_train_simple ;load delta.public.taxi_tour_table_train_simple as taxi_tour_table_train_simple;这样咱们的数据就通过 数据湖 治理起来了。数据湖具备版本治理等性能,速度相比 csv 文件也更快。然而 OpenMLDB 并不能间接拜访数据湖,所以,咱们还须要把数据导出一份到文件系统中,供 OpenMLDB 应用。save overwrite taxi_tour_table_train_simple as parquet./sample_data/data/taxi_tour_table_train_simple;保留实现后,在侧面的文件系统里是能够看到下列内容:

当初,咱们须要让 OpenMLDB 把这个数据加载进去:-- load the data to FeatureStore offline-- /home/williamzhu/byzer-home/allwefantasyrun command as FeatureStoreExt.` where zkAddress="192.168.3.14:7181"and sql-0='''SET @@execute_mode='offline';'''and sql-1='''SET @@job_timeout=20000000;'''and sql-2`='''LOAD DATA INFILE '${HOME}/sample_data/data/taxi_tour_table_train_simple' INTO TABLE t1 options(format='parquet', header=true, mode='append');'''and db="demo_db"and action="ddl";点击执行后成果如下:

这里有点小遗憾, 测试的 OpenMLDB 版本的最初输入是一个格式化的字符串,所以显示比拟凌乱。值得注意的是,sql-2 是让 OpenMLDB 加载后面咱们产生的文件,这里咱们须要传递 ${HOME} 做前缀,因为 Byzer 是多租户的引擎,目录是虚拟目录,只有这样不同用户的目录才不会笼罩。OpenMLDB 要拜访 Byzer 的目录,须要增加 ${HOME} 这个前缀。正文,如果发现 ${HOME} 这个有效,请应用 Byzer Notebook 配置文件中的 notebook.user.home 进行代替。比方我试验的时候的配置是这个: notebook.user.home=/home/williamzhu/byzer-homeOpenMLDB 是异步模式的,所以零碎返回给 Byzer 的是一个工作 ID 号。咱们能够应用如下代码看看工作是不是实现了:run command as FeatureStoreExt.` where zkAddress="192.168.3.14:7181"and sql-0='''SET @@execute_mode='offline';'''and sql-1='''SET @@job_timeout=20000000;'''and sql-2`='''show jobs;'''and db="demo_db"and action="ddl";!lastCommand named jobs;select application_id, id, state,end_time from jobs order by id desc as output;输入后果如下:

能够察看下 state 状态从 Running 变成 FINISHED, 而后能够持续往下走。数据被加载到 OpenMLDB 后,当初就能够利用它计算特色,计算的特色咱们会保留到 /tmp/feature_data 目录中供 Byzer 后续建模应用。-- compute feature with OpenMLDBrun command as FeatureStoreExt.` where zkAddress="192.168.3.14:7181"and sql-0='''SET @@execute_mode='offline';'''and sql-1='''SET @@job_timeout=20000000;'''and sql-2`='''SELECT trip_duration, passenger_count,sum(pickup_latitude) OVER w AS vendor_sum_pl,max(pickup_latitude) OVER w AS vendor_max_pl,min(pickup_latitude) OVER w AS vendor_min_pl,avg(pickup_latitude) OVER w AS vendor_avg_pl,sum(pickup_latitude) OVER w2 AS pc_sum_pl,max(pickup_latitude) OVER w2 AS pc_max_pl,min(pickup_latitude) OVER w2 AS pc_min_pl,avg(pickup_latitude) OVER w2 AS pc_avg_pl,count(vendor_id) OVER w2 AS pc_cnt,count(vendor_id) OVER w AS vendor_cntFROM t1WINDOW w AS (PARTITION BY vendor_id ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW),w2 AS (PARTITION BY passenger_count ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW) INTO OUTFILE '${HOME}/tmp/feature_data';'''and db="demo_db"and action="ddl";执行后果:

而后咱们到 Byzer-Notebook 侧边的文件系统里,能够看到生成了对应的目录:

当初,咱们能够用 Byzer 加载 OpenMLDB 产生的特色数据了:load csv./tmp/feature_data whereheader="true"and inferSchema="true"as feature_data;-- !desc feature_data;执行成果如下:

对特色在做一些解决,比方类型转换之类的:select *, cast(passenger_count as double) as passenger_count_d,cast(pc_cnt as double) as pc_cnt_d, cast(vendor_cnt as double) as vendor_cnt_d from feature_dataas new_feature_data;-- !desc new_feature_data;

还能够看看特色之间的关系(这是个可选步骤,须要用到 Byzer 可视化插件,用户感兴趣能够参考文章——《祝威廉:Byzer-yaml-visualiaztion 插件介绍》 ,详见知乎):select passenger_count_d,vendor_sum_pl,vendor_max_pl,vendor_min_pl,vendor_avg_pl,pc_sum_pl,pc_max_pl,pc_min_pl,pc_avg_pl,pc_cnt_d,vendor_cnt, trip_duration as labelfrom new_feature_data as visual_data1;-- 每个 label 按比例抽样run visual_data1 as RateSampler.`` where sampleRate="0.9,0.1"as visual_data2;-- 取得 10% 的数据select * from visual_data2 where __split__=1 as visual_data;!visualize visual_data '''runtime:   env: source /home/williamzhu/miniconda3/bin/activate ray-1.12.0   cache: falsecontrol:   ignoreSort: truefig:   scatter_matrix:           color: label     dimensions:       vv_type: code       vv_value: >-           ["passenger_count_d","vendor_sum_pl","pc_sum_pl"]''';执行后果如下:

最初,咱们来生成最初能够给算法间接用的数据:select vec_dense(array(passenger_count_d,vendor_sum_pl,vendor_max_pl,vendor_min_pl,vendor_avg_pl,pc_sum_pl,pc_max_pl,pc_min_pl,pc_avg_pl,pc_cnt_d,vendor_cnt)) as features, cast(trip_duration as double) as labelfrom new_feature_data as trainning_table;执行后果如下:

接着咱们开始训练模型,应用 线性回归 算法来训练:train trainning_table as LinearRegression./model/tax-trip where-- once set true,every time you run this script, MLSQL will generate new directory for you modelkeepVersion="true"-- specify the test dataset which will be used to feed evaluator to generate some metrics e.g. F1, Accurateand evaluateTable="trainning_table"-- specify group 0 parametersand fitParam.0.labelCol="label"and fitParam.0.featuresCol="features"and fitParam.0.maxIter="30";模型会被保留在 /model/tax-trip目录里。执行后果如下:

到此,咱们模型训练局部完结。特色部署和模型部署既然是端到端,那么咱们必定须要把特色和模型代码都进行部署。部署仍然很简略。第一步部署特色工程:-- deploy feature logical for onlinerun command as FeatureStoreExt. where zkAddress="192.168.3.14:7181"and `sql-0`='''SET @@execute_mode='online';'''and `sql-1`='''SET @@job_timeout=20000000;'''and `sql-2`='''DEPLOY demo SELECT trip_duration, passenger_count,sum(pickup_latitude) OVER w AS vendor_sum_pl,max(pickup_latitude) OVER w AS vendor_max_pl,min(pickup_latitude) OVER w AS vendor_min_pl,avg(pickup_latitude) OVER w AS vendor_avg_pl,sum(pickup_latitude) OVER w2 AS pc_sum_pl,max(pickup_latitude) OVER w2 AS pc_max_pl,min(pickup_latitude) OVER w2 AS pc_min_pl,avg(pickup_latitude) OVER w2 AS pc_avg_pl,count(vendor_id) OVER w2 AS pc_cnt,count(vendor_id) OVER w AS vendor_cntFROM t1WINDOW w AS (PARTITION BY vendor_id ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW),w2 AS (PARTITION BY passenger_count ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW);'''and db="demo_db"and action="ddl";接着模仿一个线上实时数据,不便部署后的应用:-- mock online datarun command as FeatureStoreExt. where zkAddress="192.168.3.14:7181"and `sql-0`='''SET @@execute_mode='online';'''and `sql-1`='''SET @@job_timeout=20000000;'''and `sql-2`='''LOAD DATA INFILE '${HOME}/sample_data/data/taxi_tour_table_train_simple' INTO TABLE t1 options(format='parquet', header=true, mode='append');'''and db="demo_db"and action="ddl";最初部署下咱们的线性回归模型:--%deployModel--%url=http://192.168.3.14:9003register LinearRegression./model/tax-trip as tax_trip_model_predict;这些代码都在 tax_trip_deploy.bznb 文件里:

好了,当初咱们来验证下咱们部署的 API 服务。API 预测这里,咱们能够用 Byzer 的 Shell 插件来应用 curl 来进行预测:!sh curl -XPOST 'http://192.168.3.14:9003/mode...' -d 'dataType=row&sql=select tax_trip_model_predict(vec_dense(slice(from_json(get_json_object(string(rest_request("http://192.168.3.14:9080/dbs/demo_db/deployments/demo","POST", map("body","{\"input\":[[\"id0376262\",1,1467302350000,1467304896000,2,-73.873093,40.774097,-73.926704,40.856739,\"N\",1]]}"),map("Content-Type" , "application/json"),map())),"$.data.data[0]"),"array<double>"),2,12))) as tax_duration&data=[{doc:[]}]';执行后果:

随便给一条数据,就能预测出租车的工夫了。总结通过整合 Byzer 和 OpenMLDB,咱们岂但能实现端到端的机器学习流程,同时还能实现实时特色工程,而且整个流程操作起来简略高效。Byzer+OpenMLDB,将来前景不可限量。相干链接✦OpenMLDB 官网https://openmldb.ai/OpenMLDB github 主页https://github.com/4paradigm/... 微信交换群