OpenMLDB + OneFlow:手把手教你快速链接特征工程到模型训练

如何从历史数据中找出规律,去预测用户未来的购买需求,让最合适的商品遇见最需要的人,是大数据应用在精准营销中的关键问题,也是所有电商平台在做智能化升级时所需要的核心技术。

京东作为中国最大的自营式电商,沉淀了数亿的忠实用户,积累了海量的真实数据。本案例以京东商城真实的用户、商品和行为数据(脱敏后)为基础,通过数据挖掘的技术和机器学习的算法,构建用户购买商品的预测模型,输出高潜用户和目标商品的匹配结果,为精准营销提供高质量的目标群体,挖掘数据背后潜在的意义,为电商用户提供更简单、快捷、省心的购物体验。

本案例以京东高潜用户购买意向预测问题为例,使用 OpenMLDB 进行数据挖掘,使用 OneFlow 中的 DeepFM 模型进行高性能训练推理,提供精准的商品推荐,从而打造一个完整的机器学习应用。

本案例基于 OpenMLDB 集群版进行教程演示。注意,本文档使用的是预编译好的 docker 镜像。如果希望在自己编译和搭建的 OpenMLDB 环境下进行测试,推荐针对 OpenMLDB 优化的 Spark 发行版。(参考章节:

https://openmldb.ai/docs/zh/main/deploy/compile.html

1

环境准备和预备知识

OneFlow 工具包安装

OneFlow 工具依赖 GPU 的强大算力,所以请确保部署机器具备 Nvidia GPU,并且保证驱动版本 >=460.X.X 驱动版本需支持 CUDA 11.0。


使用以下指令安装 OneFlow:

 
 
conda activate oneflow
python3 -m pip install --pre oneflow -f https://staging.oneflow.info/branch/support_oneembedding_serving/cu102

还需要安装以下 Python 工具包:

 
 
pip install psutil petastorm pandas sklearn

拉取和启动 OpenMLDB Docker 镜像

  • 注意,请确保 Docker Engine 版本号 >= 18.03

  • 拉取 OpenMLDB docker 镜像,并且运行相应容器

  • 映射demo文件夹至/root/project,这里我们使用的路径为demodir=/home/gtest/demo

  • export demodir=/home/gtest/demo
    docker run -dit --name=demo --network=host -v $demodir:/root/project 4pdosc/openmldb:0.5.2 bash
    docker exec -it demo bash
  • 上述镜像预装了OpenMLDB的工具等,我们需要进一步安装Oneflow推理所需依赖。

因为我们将在OpenMLDB的服务中嵌入OneFlow模型推理的预处理及调用,需要安装以下的依赖。

 
 
pip install tritonclient[all] xxhash geventhttpclient
注意,本教程以下的 OpenMLDB 部分的演示命令默认均在该已经启动的 docker 容器内运行。OneFlow 命令默认在 1.1 安装的 OneFlow 环境下运行。
 
 

初始化环境

./init.sh

我们在镜像内提供了init.sh脚本帮助用户快速初始化环境,包括:

  • 配置 zookeeper

  • 启动集群版 OpenMLDB

启动 OpenMLDB CLI 客户端

 
 
/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client
注意,本教程大部分命令在 OpenMLDB CLI 下执行,为了跟普通 shell 环境做区分,在 OpenMLDB CLI 下执行的命令均使用特殊的提示符  `>`  。

预备知识:集群版的非阻塞任务

集群版的部分命令是非阻塞任务,包括在线模式的 LOAD DATA,以及离线模式的 LOAD DATA ,SELECTSELECT INTO 命令。提交任务以后可以使用相关的命令如 SHOW JOBSSHOW JOB 来查看任务进度,详情参见离线任务管理文档。

2

机器学习训练流程

使用OpenMLDB+OneFlow进行机器学习训练可总结为以下大致步骤。

接下来会介绍每一个步骤的具体操作细节。

使用OpenMLDB进行离线特征抽取

创建数据库和数据表

以下命令均在 OpenMLDB CLI 环境下执行。

> CREATE DATABASE JD_db;
> USE JD_db;
> CREATE TABLE action(reqId string, eventTime timestamp, ingestionTime timestamp, actionValue int);
> CREATE TABLE flattenRequest(reqId string, eventTime timestamp, main_id string, pair_id string, user_id string, sku_id string, time bigint, split_id int, time1 string);
> CREATE TABLE bo_user(ingestionTime timestamp, user_id string, age string, sex string, user_lv_cd string, user_reg_tm bigint);
> CREATE TABLE bo_action(ingestionTime timestamp, pair_id string, time bigint, model_id string, type string, cate string, br string);
> CREATE TABLE bo_product(ingestionTime timestamp, sku_id string, a1 string, a2 string, a3 string, cate string, br string);
> CREATE TABLE bo_comment(ingestionTime timestamp, dt bigint, sku_id string, comment_num int, has_bad_comment string, bad_comment_rate float);

也可使用 sql 脚本(/root/project/create_tables.sql)运行:

/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client < /root/project/create_tables.sql

离线数据准备

首先,切换到离线执行模式。接着,导入数据作为离线数据,用于离线特征计算。

以下命令均在 OpenMLDB CLI 下执行。

> USE JD_db;> SET @@execute_mode='offline';> LOAD DATA INFILE '/root/project/data/JD_data/action/*.parquet' INTO TABLE action options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/flattenRequest_clean/*.parquet' INTO TABLE flattenRequest options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_user/*.parquet' INTO TABLE bo_user options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_action/*.parquet' INTO TABLE bo_action options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_product/*.parquet' INTO TABLE bo_product options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_comment/*.parquet' INTO TABLE bo_comment options(format='parquet', header=true, mode='append');

或使用脚本执行:

/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client < /root/project/load_data.sql

并通过以下命令快速查询 jobs 状态:

echo "show jobs;" | /work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client
注意,集群版 `LOAD  DATA` 为非阻塞任务,可以使用命令 `SHOW  JOBS` 查看任务运行状态,请等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作 。

特征设计</

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值