• 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:

     
     
    1. conda activate oneflow
    2. 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

      1. export demodir=/home/gtest/demo
      2. docker run -dit --name=demo --network=host -v $demodir:/root/project 4pdosc/openmldb:0.5.2 bash
      3. 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 环境下执行。

    1. > CREATE DATABASE JD_db;
    2. > USE JD_db;
    3. > CREATE TABLE action(reqId string, eventTime timestamp, ingestionTime timestamp, actionValue int);
    4. > 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);
    5. > CREATE TABLE bo_user(ingestionTime timestamp, user_id string, age string, sex string, user_lv_cd string, user_reg_tm bigint);
    6. > CREATE TABLE bo_action(ingestionTime timestamp, pair_id string, time bigint, model_id string, type string, cate string, br string);
    7. > CREATE TABLE bo_product(ingestionTime timestamp, sku_id string, a1 string, a2 string, a3 string, cate string, br string);
    8. > 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` 状态),再进行下一步操作 。

    特征设计

  • 相关阅读:
    TCP/UDP/Socket 通俗讲解
    查询 (Tcode)跳转ID方法:(SET PARAMETER ID)
    一本通2073;三角形面积
    内网穿透隐秘隧道搭建
    Delphi的函数指针传递和调用
    通过cpolar内网穿透,在家实现便捷的SSH远程连接公司内网服务器教程
    【python基础】——Anaconda下包更新的坑及安装与卸载、及安装后Jupyter Notebook没反应的解决方法
    15:00面试,15:06就出来了,问的问题有点变态。。。
    表内容的操作(增删查改)【MySQL】
    用DOM来读取XML时要注意的一些概念
  • 原文地址:https://blog.csdn.net/OneFlow_Official/article/details/126377330