本文通過示例為您介紹如何使用Easyrec算法庫進行模型訓練、部署在線服務,并形成例行化Pipeline工作流。

前提條件

  • 已創建DataScience集群,并且選擇了Kubeflow服務,詳情請參見創建集群
  • 本地安裝了PuTTY和文件傳輸工具(SSH Secure File Transfer Client)。
  • 下載dsdemo代碼:請已創建DataScience集群的用戶,使用釘釘搜索釘釘群號32497587加入釘釘群以獲取dsdemo代碼。

操作流程

  1. 步驟一:準備工作
  2. 步驟二:提交任務
  3. (可選)步驟三:制作Hive CLI、Spark CLI、dscontroller、Hue、notebook或httpd鏡像
  4. 步驟四:編譯Pipeline
  5. 步驟五:上傳Pipeline文件
  6. 步驟六:創建并運行Experiments
  7. (可選)步驟七:查看Pipeline狀態
  8. 步驟八:模型預測
  9. 步驟九:通過PairecEngine部署在線服務

步驟一:準備工作

  1. 可選:安裝軟件包。
    1. 通過SSH方式連接集群,詳情請參見登錄集群
    2. 在Header節點執行以下命令,安裝seldon_core kfp。
      pip3.7 install seldon_core kfp configobj
      說明 如果已經安裝seldon_core kfp,可以跳過該步驟。
  2. 登錄容器鏡像服務控制臺,開通個人免費版ACR,并創建命名空間。
    ACR創建命名空間詳情,請參見命名空間的基本操作
    說明 如果您選用的是ACR企業版,則可以設置對VPC開放,以提升安全性。
  3. 修改config文件的REGISTRY地址和experiment命名空間名稱,并登錄ACR。
    1. 執行以下命令,進入ml_on_ds目錄。
      sudo cd /root/dsdemo/ml_on_ds
    2. 修改config文件中的REGISTRY地址。
      # !!! Extremely Important !!!
      # !!! You must use A NEW EXP different from others !!!
      EXP=exp1
      
      #!!! ACR, Make sure NAMESPACE is public !!!
      REGISTRY=registry-vpc.cn-beijing.aliyuncs.com
      NAMESPACE=dsexperiment
      
      #k8s namespace, must be same with username when you are using sub-account.
      KUBERNETES_NAMESPACE=default
      
      #kubernetes dashboard host, header1's public ip or inner ip.
      KUBERNETES_DASHBOARD_HOST=39.104.**.**:32699
      
      #PREFIX, could be a magic code.
      PREFIX=prefix
      
      #sc
      NFSPATH=/mnt/disk1/k8s_pv/default_storage_class/
      #NFSPATH=/mnt/disk1/nfs/ifs/kubernetes/
      
      # region
      REGIONID=cn-default
      
      # emr-datascience clusterid
      CLUSTERID="C-DEFAULT"
      
      #HDFSADDR, train/test dir should be exist under $HDFSADDR, like
      #user
      #└── easy_rec
      #    ├── 20210917
      #    │   ├── test
      #    │   │   ├── test0.csv
      #    │   │   └── _SUCCESS
      #    │   └── train
      #    │       ├── train0.csv
      #    │       └── _SUCCESS
      #    └── 20210918
      #        ├── test
      #        │   ├── test0.csv
      #        │   └── _SUCCESS
      #        └── train
      #            ├── train0.csv
      #            └── _SUCCESS
      HDFSADDR=hdfs://192.168.**.**:9000/user/easy_rec/metric_learning_i2i
      MODELDIR=hdfs://192.168.**.**:9000/user/easy_rec/metric_learning_i2i
      
      REGEX="*.csv"
      SUCCESSFILE="train/_SUCCESS,test/_SUCCESS,hdfs://192.168.**.**:9000/flag"
      
      EVALRESULTFILE=experiment/eval_result.txt
      
      # for allinone.sh development based on supposed DATE & WHEN & PREDATE
      DATE=20220405
      WHEN=20220405190001
      PREDATE=20220404
      
      # for daytoday.sh & multidays training, use HDFSADDR, MODELDIR
      START_DATE=20220627
      END_DATE=20220628
      
      #HIVEINPUT
      DATABASE=testdb
      TRAIN_TABLE_NAME=tb_train
      EVAL_TABLE_NAME=tb_eval
      PREDICT_TABLE_NAME=tb_predict
      PREDICT_OUTPUT_TABLE_NAME=tb_predict_out
      PARTITION_NAME=ds
      
      #DSSM: inference user/item model with user&item feature
      #metric_learning_i2i: infernece model with item feature
      #SEP: user&item feature file use same seperator
      USERFEATURE=taobao_user_feature_data.csv
      ITEMFEATURE=taobao_item_feature_data.csv
      SEP=","
      
      # faiss_mysql: mysql as user_embedding storage, faiss as itemembedding index.
      # holo_holo: holo as user & item embedding , along with indexing.
      VEC_ENGINE=faiss_mysql
      MYSQL_HOST=mysql.bitnami
      MYSQL_PORT=3306
      MYSQL_USER=root
      MYSQL_PASSWORD=emr-datascience
      
      #wait before pod finished after easyrec's python process end.
      #example: 30s 10m 1h
      WAITBEFOREFINISHED=10s
      
      #tf train
      #PS_NUMBER take effect only on training.
      #WORKER_NUMBER take effect on training and predict.
      TRAINING_REPOSITORY=tf-easyrec-training
      TRAINING_VERSION=latest
      PS_NUMBER=2
      WORKER_NUMBER=3
      SELECTED_COLS=""
      EDIT_CONFIG_JSON=""
      #tf export
      ASSET_FILES=""
      
      CHECKPOINT_DIR=
      
      #pytorch train
      PYTORCH_TRAINING_REPOSITORY=pytorch-training
      PYTORCH_TRAINING_VERSION=latest
      PYTORCH_MASTER_NUMBER=1
      PYTORCH_WORKER_NUMBER=3
      
      #jax train
      JAX_TRAINING_REPOSITORY=jax-training
      JAX_TRAINING_VERSION=latest
      JAX_MASTER_NUMBER=2
      JAX_WORKER_NUMBER=3
      
      #easyrec customize action
      CUSTOMIZE_ACTION=easy_rec.python.tools.modify_config_test
      USERDEFINEPARAMETERS="--template_config_path hdfs://192.168.**.**:9000/user/easy_rec/rec_sln_test_dbmtl_v3281_template.config --output_config_path hdfs://192.168.**.**:9000/user/easy_rec/output.config"
      
      #hivecli
      HIVE_REPOSITORY=ds_hivecli
      HIVE_VERSION=latest
      
      #ds-controller
      DSCONTROLLER_REPOSITORY=ds_controller
      DSCONTROLLER_VERSION=latest
      
      #notebook
      NOTEBOOK_REPOSITORY=ds_notebook
      NOTEBOOK_VERSION=latest
      
      #hue
      HUE_REPOSITORY=ds_hue
      HUE_VERSION=latest
      
      #httpd
      HTTPD_REPOSITORY=ds_httpd
      HTTPD_VERSION=latest
      
      #postgist
      POSTGIS_REPOSITORY=ds_postgis
      POSTGIS_VERSION=latest
      
      #customize
      CUSTOMIZE_REPOSITORY=ds_customize
      CUSTOMIZE_VERSION=latest
      
      #faissserver
      FAISSSERVER_REPOSITORY=ds_faissserver
      FAISSSERVER_VERSION=latest
      
      #vscode
      VSCODE_REPOSITORY=ds_vscode
      VSCODE_VERSION=latest
      
      # ak/sk for cluster resize, only support resize TASK now!!!
      EMR_AKID=AAAAAAAA
      EMR_AKSECRET=BBBBBBBB
      HOSTGROUPTYPE=TASK
      INSTANCETYPE=ecs.g6.8xlarge
      NODECOUNT=1
      SYSDISKCAPACITY=120
      SYSDISKTYPE=CLOUD_SSD
      DISKCAPACITY=480
      DISKTYPE=CLOUD_SSD
      DISKCOUNT=4
      
      # pvc_name, may not be changed, cause EXP will make sure that two or more experiment will not conflicts.
      PVC_NAME="easyrec-volume"
      
      SAVEDMODELS_RESERVE_DAYS=3
      
      HIVEDB="jdbc:hive2://192.168.**.**:10000/zqkd"
      
      #eval threshold
      THRESHOLD=0.3
      
      #eval result key, 'auc' 'auc_ctcvr' 'recall@5'
      EVALRESULTKEY="recall@1"
      
      #eval hit rate for vector recall
      ITEM_EMB_TABLE_NAME=item_emb_table
      GT_TABLE_NAME=gt_table
      EMBEDDING_DIM=32
      RECALL_TYPE="u2i"
      TOPK=100
      NUM_INTERESTS=1
      KNN_METRIC=0
      
      # sms or dingding
      ALERT_TYPE=sms
      
      # sms alert
      SMS_AKID=AAAAAAAA
      SMS_AKSECRET=BBBBBBBB
      SMS_TEMPLATEDCODE=SMS_220default
      SMS_PHONENUMBERS="186212XXXXX,186211YYYYY"
      SMS_SIGNATURE="mysignature"
      
      # dingtalk alert
      ACCESS_TOKEN=AAAAAAAA
      
      EAS_AKID=AAAAAAAA
      EAS_AKSECRET=BBBBBBBB
      EAS_ENDPOINT=pai-eas.cn-beijing.aliyuncs.com
      EAS_SERVICENAME=datascience_eastest
      
      # ak/sk for access oss
      OSS_AKID=AAAAAAAA
      OSS_AKSECRET=BBBBBBBB
      OSS_ENDPOINT=oss-cn-huhehaote-internal.aliyuncs.com
      OSS_BUCKETNAME=emrtest-huhehaote
      # !!! Do not change !!!
      OSS_OBJECTNAME=%%EXP%%_faissserver/item_embedding.faiss.svm
      
      # ak/sk for access holo
      HOLO_AKID=AAAAAAAA
      HOLO_AKSECRET=BBBBBBBB
      HOLO_ENDPOINT=hgprecn-cn-default-cn-beijing-vpc.hologres.aliyuncs.com
      
      #tensorboard
      TENSORBOARDPORT=6006
      
      #nni port
      NNIPORT=38080
      
      #jupyter password
      JUPYTER_PASSWORD=emr-datascience
      
      #enable_overwrite
      ENABLE_OVERWRITE=true
      
      #For some users who are running pyspark & meachine learning jobs in jupyter notebook.
      #ports for mapping when notebook enabled, multi-users will conflict on same node.
      HOSTNETWORK=true
      MAPPING_JUPYTER_NOTEBOOK_PORT=16200
      MAPPING_NNI_PORT=16201
      MAPPING_TENSORBOARD_PORT=16202
      MAPPING_VSCODE_PORT=16203
    3. 執行以下命令,登錄您的ACR,以便后續push鏡像。
      docker login --username=<用戶名> <your_REGISTRY>-registry.cn-beijing.cr.aliyuncs.com
      說明 ACR需要開啟匿名訪問并開通公開訪問權限,方便pull鏡像。代碼中的<用戶名>為您在容器鏡像服務ACR控制臺上配置的訪問憑證,配置詳情請參見配置訪問憑證<your_REGISTRY>為您前一步中查看到的REGISTRY地址。
  4. 掛載NAT網關訪問ACR,詳情請參見創建和管理公網NAT網關實例
  5. 準備測試數據。
    重要 您可以將測試數據寫到DataScience集群的HDFS中,也可以按需寫到您自己的HDFS中,但需要保證網絡暢通。
    # 選ppd, prepare test data.
    sh allinlone.sh

    根據返回信息提示,選擇ppd) Prepare data

步驟二:提交任務

重要 需要修改config的REPOSITORY地址為您自己的ACR倉庫地址、VERSION版本號以及experiment命名空間名稱。
  1. 執行allinone.sh文件。
    sh allinone.sh -d
    返回信息如下。
    loading ./config
    
    You are now working on k8snamespace: default
    
    *** Welcome to DataScience ***
    0)        Exit                                                                 k8s: default
    ppd)      Prepare data           ppk)      Prepare DS/K8S config   cacr)     checking ACR
    1|build)  build training image   bnt)      build notebook image    buildall) build all images(slow)
    dck)      deletecheckpoint       ser)      showevalresult
    apc)      applyprecheck          dpc)      deleteprecheck
    2)        applytraining          3)        deletetraining
    4)        applyeval              5)        deleteeval
    4d)       applyevaldist          5d)       deleteevaldist
    4hr)      applyevalhitrate       5hr)      deleteevalhitrate
    6)        applyexport            7)        deleteexport
    8)        applyserving           9)        deleteserving
    10)       applypredict           11)       deletepredict
    12)       applyfeatureselection  13)       deletefeatureselection
    14)       applycustomizeaction   15)       deletecustomizeaction
    16)       applypytorchtraining   17)       deletepytorchtraining
    mt)       multidaystraining      dmt)      deletemultidaystraining
    me)       multidayseval          dme)      deletemultidayseval
    cnt)      createnotebook         dnt)      deletenotebook          snt)      shownotebooklink
    cft)      createsftp             dft)      deletesftp              sft)      showsftplink
    che)      createhue              dhe)      deletehue               she)      showhuelink
    chd)      createhttpd            dhd)      deletehttpd             shd)      showhttpdlink
    cvs)      createvscode           dvs)      deletevscode            svs)      showvscodelink
    a)        kubectl get tfjobs     b)        kubectl get sdep        c)        kubectl get pytorchjobs
    mp|mpl)   compile mlpipeline     bp|bpl)   compile bdpipeline      bu)       bdupload
    tb)       tensorboard            vc)       verifyconfigfile        spl)      showpaireclink
    tp)       kubectl top pods       tn)       kubectl top nodes       util)     show nodes utils
    logs)     show pod logs          setnl)    set k8s node label
    e|clean)  make clean             cleanall) make cleanall           sml)      showmilvuslink
    sall)     show KubeFlow/Grafana/K8SOverview/Spark/HDFS/Yarn/EMR link
    99)       kubectl get pods       99l)      kubectl get pods along with log url
    >
  2. 輸入選項并單擊回車。
    您可以通過Tensorboard查看訓練過程中的auc曲線:
    1. 執行以下命令,進入ml_on_ds目錄。
      sudo cd /root/dsdemo/ml_on_ds
    2. 執行以下命令,運行Tensorboard。
      sh run_tensorboard.sh

      選擇tb, 會顯示當前實驗的ckpt的Tensorboard信息,或者執行sh run_tensorboard.sh 20211209命令,查看20211209訓練ckpt的Tensorboard信息。

      說明
      • 默認使用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

(可選)步驟三:制作Hive CLI、Spark CLI、dscontroller、Hue、notebook或httpd鏡像

說明
  • 制作Hive CLI或Spark CLI鏡像的目的是提交Hive或Spark任務進行大數據處理,生成待訓練的數據,如果您已經自行準備好數據,可以跳過本步驟。如果是Spark任務,則會直接使用DataScience集群自帶的Spark集群,如果是Hive任務,需要使用單獨的Hadoop或Hive集群。
  • dscontroller鏡像用來進行動態擴縮容。
  • Hive CLI
    進入Hive CLI目錄并制作鏡像。
    cd hivecli && make
  • Spark CLI
    進入Spark CLI目錄并制作鏡像。
    cd sparkcli && make
  • dscontroller
    進入dscontroller目錄并制作鏡像。
    cd dscontroller && make
  • Hue
    進入Hue目錄并制作鏡像。
    cd hue && make
  • notebook
    進入notebook目錄并制作鏡像。
    cd notebook && make
  • httpd
    進入httpd目錄并制作鏡像。
    cd httpd && make

步驟四:編譯Pipeline

Pipeline代碼具體請參見mlpipeline.py

  1. 執行以下命令,進入/ml_on_ds目錄。
    sudo cd /root/dsdemo/ml_on_ds
  2. 執行以下命令,編譯Pipeline。
    make mpl
    說明 您也可以執行命令sh allinone.sh,選擇mpl來編譯Pipeline。

    編譯成功后生成***_mlpipeline.tar.gz文件。您可以使用文件傳輸工具將編譯出來的***_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,選擇編譯出的文件。
    upload
  7. 單擊Create

步驟六:創建并運行Experiments

  1. 在Kubeflow的左側導航欄,單擊Experiments
  2. 單擊上方的Create experiment
  3. New experiment頁面,輸入Experiment name
  4. 單擊Next
  5. Start a run頁面,配置參數。
    1. 選擇步驟四:編譯Pipeline下載到本地的文件。
      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庫方式
    執行以下命令,模型預測REST協議。
    python3.7 predict_rest.py
    返回信息如下。
    Response:
    {'jsonData': {'outputs': {'logits': [-2.66068792, 0.691401482], 'probs': [0.0653333142, 0.66627866]}}, 'meta': {}}
    說明 預測代碼請參見predict_rest.py文件。

步驟九:通過PairecEngine部署在線服務

詳細信息,請參見PAI-Rec使用示例

問題反饋

如果您在使用DataScience集群過程中有任何疑問或問題,請聯系我們的技術人員協助處理,同時也歡迎您使用釘釘搜索釘釘群號32497587加入釘釘群進行反饋或交流。