本文通过示例为您介绍如何使用Easyrec算法库进行模型训练、部署在线服务,并形成例行化Pipeline工作流。

背景信息

Kubeflow支持通过Easyrec算法库和自定义模型两种方式,形成例行化Pipeline工作流。本文为您介绍通过Easyrec算法库形成例行化Pipeline工作流。通过自定义模型的训练和在线服务形成例行化Pipeline工作流,请参见Kubeflow MNist Pipeline示例

前提条件

操作流程

  1. 步骤一:准备工作
  2. 步骤二:提交任务
  3. 可选:步骤三:制作Hive CLI、Spark CLI或dscontroller镜像
  4. 步骤四:编译Pipeline
  5. 步骤五:上传Pipeline文件
  6. 步骤六:创建并运行Experiments
  7. 步骤七:查看Pipeline状态
  8. 步骤八:模型预测

步骤一:准备工作

  1. 安装软件包。
    1. 通过SSH方式连接集群,详情请参见登录集群
    2. 执行以下命令,安装seldon_core、kfp和configobj。
      pip3.7 install seldon_core kfp configobj
      注意 请先登录Kubeflow UI,使用默认的anonymous空间,再执行以下命令。
    3. 执行以下命令,去除默认anonymous空间的Label。
      kubectl label ns anonymous istio-injection-
      返回如下类似信息。
      namespace/anonymous labeled
    4. 执行以下命令,在anonymous空间创建Service Account。
      kubectl create serviceaccount mlpipeline-admin -n anonymous
      返回如下类似信息。
      serviceaccount/mlpipeline-admin created
    5. 执行以下命令,给Service Account绑定cluster-admin权限。
      kubectl create clusterrolebinding mlpipeline-admin --clusterrole=cluster-admin --serviceaccount=anonymous:mlpipeline-admin
  2. 登录容器镜像服务控制台,开通个人免费版ACR,并创建命名空间。
    ACR创建命令空间详情,请参见命名空间的基本操作
  3. 修改config文件的REGISTRY地址和experiment命名空间名称,并登录ACR。
    1. 执行以下命令,进入easyrec_on_ds目录。
      cd /root/dsdemo/kubeflow_samples/mlpipeline/easyrec_on_ds
    2. 执行以下命令,查看config文件中的REGISTRY地址。
      cat config
      返回如下类似信息。
      # ACR
      REGISTRY=datascience-registry.cn-beijing.cr.aliyuncs.com
      NAMESPACE=experiment
      EXP=exp1
      
      # PREFIX
      PREFIX=XXX
      
      # train
      TRAINING_REPOSITORY=tf-easyrec-training
      TRAINING_VERSION=latest
      
      # hivecli
      HIVE_REPOSITORY=ds_hivecli
      HIVE_VERSION=latest
      
      # sparkcli
      SPARK_REPOSITORY=ds_sparkcli
      SPARK_VERSION=latest
      
      #ds-controller
      DSCONTROLLER_REPOSITORY=ds_controller
      DSCONTROLLER_VERSION=latest
      
      # ak/sk for cluster resize
      AKID=AAAAAAAAAAAAAAA
      AKSECRET=BBBBBBBBBBBBBBBBBBB
      
      # region
      REGIONID=cn-huhehaote
      
      # datascience clusterid
      CLUSTERID='C-7BD5F08XXXXXXX'
      
      # model is export into pvc
      PVC_NAME='easyrec-volume'
      
      SAVEDMODELS_RESERVE_DAYS=7
      
      HIVEDB='jdbc:hive2://192.168.**.**:10000/zqkd'
      
      # for spark, run `cat /etc/hosts|grep header-` for multiple master.
      HOST1='192.168.**.**  emr-header-1.cluster-60502 emr-header-1'
      HOST2='192.168.**.**  emr-header-1.cluster-60502 emr-header-1'
      HOST3='192.168.**.**  emr-header-1.cluster-60502 emr-header-1'
      # auc threshold
      THRESHOLD=0.3
      
      # HDFSADDR, train/test dir should be exist under $HDFSADDR, like
      #user
      #└── easy_rec
      #    ├── 20210907
      #    │   ├── test
      #    │   │   ├── test0.csv
      #    │   │   ├── test1.csv
      #    │   │   └── _SUCCESS
      #    │   └── train
      #    │       ├── train0.csv
      #    │       └── _SUCCESS
      #    └── 20210908
      #        ├── test
      #        │   ├── test0.csv
      #        │   └── _SUCCESS
      #        └── train
      #            ├── train0.csv
      #            ├── train1.csv
      #            └── _SUCCESS
      TODAY_HDFSADDR=hdfs://192.168.**.**:9000/user/easy_rec/
      TODAY_MODELDIR=hdfs://192.168.**.**:9000/user/easy_rec/
      YESTERDAY_MODELDIR=hdfs://192.168.**.**:9000/user/easy_rec/19990101/
      SUCCESSFILE=_SUCCESS
      
      # for daytoday.sh, HDFSADDR use TODAY_HDFSADDR, MODELDIR use TODAY_MODELDIR
      START_DATE=20210915
      END_DATE=20210919
      
      # sms alert
      SMS_AKID=AAAAAAAAA
      SMS_AKSECRET=BBBBBBBBBBB
      TEMPLATEDCODE=SMS_2206XXXX
      PHONENUMBERS="186212XXXXX,186211YYYYY"
      SIGNNAME="smssignature"
    3. 执行以下命令,登录您的ACR,以便后续push镜像。
      docker login --username=<your_REGISTRY> <your_REGISTRY>-registry.cn-beijing.cr.aliyuncs.com
      说明 代码中的<your_REGISTRY>为您前一步中查看到的REGISTRY地址。ACR需要开启匿名访问并开通公开访问权限,方便pull镜像。
  4. 挂载NAT访问ACR,详情请参见挂载NAT访问ACR资源
  5. 准备测试数据。
    注意 您可以将测试数据写到DataScience集群的HDFS中,也可以按需写到您自己的HDFS中,但需要保证网络畅通。
    1. 执行以下命令,进入deepfm目录。
      cd /root/dsdemo/kubeflow_samples/mlpipeline/easyrec_on_ds/testdata/deepfm
    2. 执行以下命令,运行prepare.sh文件。
      sh prepare.sh

步骤二:提交任务

注意
  • 需要修改config的REPOSITORY地址为您自己的ACR仓库地址、VERSION版本号以及experiment命名空间名称。
  • 请根据您实际需求配置dwd_avazu_ctr_deepmodel.config中的特征字段,,并且需要与测试数据匹配。
  • 修改dwd_avazu_ctr_deepmodel.config中HDFS的IP地址为emr-header-1的内网地址,您可以通过命令ifconfig eth0获取。
  • 请根据您实际需求调整Dockerfile.export中的导出目录,默认写到PVC中。

支持以下两种方式提交任务:

方式一:提交任务

此方式需要按照以下步骤顺序执行来提交任务。

  1. 提交Training训练任务。
    1. 执行以下命令,编译镜像。
      make build
    2. 执行以下命令,push编译好的镜像到ACR。
      make push
    3. 执行以下命令,提交训练。
      make applytraining
      其他操作命令如下:
      • 删除提交的训练任务
        make deletetraining
      • 删除冗余配置信息
        make clean
    您可以通过Tensorboard查看训练过程中的auc曲线:
    1. 执行以下命令,进入easyrec_on_ds目录。
      cd /root/dsdemo/kubeflow_samples/mlpipeline/easyrec_on_ds
    2. 执行以下命令,运行Tensorboard并打开6006端口。
      sh run_tensorboard.sh
      说明
      • 默认使用config里TODAY_MODELDIR的modeldir。您也可以指定日期的modeldir,例如sh run_tensorboard.sh hdfs://192.168.**.**:9000/user/easy_rec/20210923/
      • 您可以自行修改run_tensorboard.sh脚本内容,调整相应的参数。
    3. 您可以在浏览器访问http://<yourPublicIPAddress>:6006,查看auc曲线。auc
  2. 执行以下命令,提交Evaluate评估任务。
    make applyeval
    其他操作命令如下:
    • 删除提交的评估任务
      make deleteeval
    • 删除冗余配置信息
      make clean
  3. 执行以下命令,提交Export导出任务
    make applyexport
    其他操作命令如下:
    • 删除提交的导出任务
      make deleteexport
    • 删除冗余配置信息
      make clean
    您可以在类似如下目录查看模型导出文件。
    ll /mnt/disk1/k8s_pv/default_storage_class/default-strategy-easyrec-volume-pvc-2b8310b2-9bc3-47b4-8a5f-a75419b9749a/
    total 8
    drwxr-xr-x 4 root root 4096 Jul 14 14:20 1626243625
    drwxr-xr-x 4 root root 4096 Jul 15 12:03 1626321824
  4. 执行以下命令,提交Serving任务。
    说明 请根据您实际需求修改serving_easyrec_rest.yaml.template中replicas的数量。
    make applyserving
    其他操作命令如下:
    • 删除提交的Serving任务
      make deleteserving
    • 清除Serving任务信息
      make clean

方式二:极简模式提交任务

此方式可以减少您需要输入的命令,提交任务更简单。

  1. 执行allinone.sh文件。
    sh allinone.sh
    说明 模式使用default空间,您也可以执行sh allinone.sh anonymous命令,使用anonymous空间。
    返回信息如下。
    ***Welcome to dsdemo***
    0)    Exit
    1)    build & push image to ACR
    2)    applytraining       3) deletetraining
    4)    applyeval           5) deleteeval
    6)    applyexport         7) deleteexport
    8)    applyserving        9) deleteserving
    a)    kubectl get tfjob
    b)    kubectl get sdep(online serving)
    c)    kubectl top pods
    p)    compile pipelines
    e)    make clean
    t)    tensorboard
    99)   kubectl get pods
    >
    输入相应数字,点击回车
  2. 输入相应的数字,单击回车。

    按照顺序,分别输入2468。其中,2对应提交Training训练任务,4对应提交Evaluate评估任务,6对应提交Export导出任务,8对应提交Serving任务。

步骤三:制作Hive CLI、Spark CLI或dscontroller镜像

说明
  • 制作Hive CLI或Spark CLI镜像的目的是提交Hive或Spark任务进行大数据处理,生成待训练的数据,如果您已经自行准备好数据,可以跳过本步骤。如果是Spark任务,则会直接使用DataScience集群自带的Spark集群,如果是Hive任务,需要使用单独的Hadoop或Hive集群。
  • dscontroller镜像用来进行动态扩缩容。

您可以按照以下操作,制作Hive CLI或Spark CLI镜像。

  • Hive CLI
    进入Hive CLI目录并制作镜像。
    cd hivecli && make
  • Spark CLI
    进入Spark CLI目录并制作镜像。
    cd sparkcli && make
  • dscontroller
    进入dscontroller目录并制作镜像。
    cd dscontroller && make

步骤四:编译Pipeline

  1. 执行以下命令,进入/easyrec_on_ds目录。
    cd /root/dsdemo/kubeflow_samples/mlpipeline/easyrec_on_ds
  2. 执行以下命令,编译Pipeline。
    make pipeline
    说明 您也可以使用命令make pl来编译Pipeline。

    编译成功后生成datascience_mlpipeline.tar.gz文件。您可以使用文件传输工具将编译出来的datascience_mlpipeline.tar.gz文件,下载到本地PC,便于后续上传。

步骤五:上传Pipeline文件

  1. 进入集群详情页面。
    1. 登录阿里云E-MapReduce控制台
    2. 在顶部菜单栏处,根据实际情况选择地域和资源组
    3. 单击上方的集群管理页签。
    4. 集群管理页面,单击相应集群所在行的详情
  2. 集群基础信息页面的主机信息区域,查看公网IP地址。
    header_ip
  3. 在地址栏中,输入http://<yourPublicIPAddress>:31380,按回车键。
    说明 <yourPublicIPAddress>为您前一步骤中,获取的公网IP地址。
    使用默认的anonymous空间即可。进入后,默认页面如下。Kubeflow_index
  4. 在左侧导航栏,单击Pipelines
  5. Pipelines页面,单击Upload pipelineupload
  6. Upload Pipeline or Pipeline Version,输入Pipeline Name,选择编译出的datascience_mlpipeline.tar.gz
    upload
  7. 单击Create

步骤六:创建并运行Experiments

  1. 在Kubeflow的左侧导航栏,单击Experiments
  2. 单击上方的Create experiment
  3. New experiment页面,输入Experiment name
  4. 单击Next
  5. Start a run页面,配置参数。
    1. 选择步骤四:编译Pipeline下载到本地的datascience_mlpipeline.tar.gz文件。
      Select_JAR
    2. 单击Recurring
      run type
  6. 单击Start

步骤七:查看Pipeline状态

您可以在Experiments中查看Pipeline状态,模型示例展示如下。see_pipeline

步骤八:模型预测

  • (推荐)使用HTTP请求方式

    此方式支持任何开发语言。预测代码请参见predict_rest.sh文件。

    您可以执行以下命令进行模型预测。
    注意 代码中的default是default命令空间,easyrec-tfserving为部署Serving用的默认名称, 请您按需调整。
    !/bin/sh
    curl -X POST http://127.0.0.1:31380/seldon/default/easyrec-tfserving/api/v1.0/predictions -H 'Content-Type: application/json' -d '
    { 
    "jsonData": { 
        "inputs": {
            "app_category":["10","10"],
            "app_domain":["1005","1005"],
            "app_id":["0","0"],
            "banner_pos":["85f751fd","4bf5bbe2"],
            "c1":["c4e18dd6","6b560cc1"],
            "c14":["50e219e0","28905ebd"],
            "c15":["0e8e4642","ecad2386"],
            "c16":["b408d42a","7801e8d9"],
            "c17":["09481d60","07d7df22"],
            "c18":["a99f214a","a99f214a"],
            "c19":["5deb445a","447d4613"],
            "c20":["f4fffcd0","cdf6ea96"],
            "c21":["1","1"],
            "device_conn_type":["0","0"],
            "device_id":["2098","2373"],
            "device_ip":["32","32"],
            "device_model":["5","5"],
            "device_type":["238","272"],
            "hour":["0","3"],
            "site_category":["56","5"],
            "site_domain":["0","0"],
            "site_id":["5","3"]
        }
    }
    }'
    返回结果如下。
    {"jsonData":{"outputs":{"logits":[-7.20718098,-4.15874624],"probs":[0.000740694755,0.0153866885]}},"meta":{}}
  • 使用Seldon库方式
    1. 执行以下命令,获取istio-gateway的IP地址。
      sh get_clusterip.sh
      返回如下类似信息。
      NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
      istio-ingressgateway   NodePort   10.101.**.**   <none>        15020:30435/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:32038/TCP,15030:30582/TCP,15031:31438/TCP,15032:32025/TCP,15443:30767/TCP   8h
      说明 CLUSTER-IP对应的值即为istio-gateway的IP地址。
    2. 模型预测REST协议。
      python3.7 predict_rest.py
      返回信息如下。
      Response:
      {'jsonData': {'outputs': {'logits': [-2.66068792, 0.691401482], 'probs': [0.0653333142, 0.66627866]}}, 'meta': {}}
      说明
      • 预测代码请参见predict_rest.py文件。
      • 请根据实际需求修改predict_rest.pyminikube_ambassador_endpoint地址,修改为前一步中获取到的istio-gateway的IP地址。
      • 请根据实际需求调整namespace、default或anonymous等参数。

问题反馈

如果您在使用DataScience集群的过程中有任何疑问,欢迎您扫描下面的二维码加入钉钉群进行反馈。DataScience_dingding