MaxCompute 离线预测

前置条件:

  • 模型训练

  • 模型导出

离线预测

drop table if exists ctr_test_output;
pai -name easy_rec_ext
-Dcmd=predict
-Dcluster='{"worker" : {"count":5, "cpu":1000,  "memory":40000, "gpu":0}}'
-Darn=acs:ram::xxx:role/aliyunodpspaidefaultrole
-Dbuckets=oss://easyrec/
-Dsaved_model_dir=oss://easyrec/easy_rec_test/experiment/export/1597299619
-Dinput_table=odps://pai_online_project/tables/ctr_test_input
-Doutput_table=odps://pai_online_project/tables/ctr_test_output
-Dexcluded_cols=label
-Dreserved_cols=ALL_COLUMNS
-Dbatch_size=1024
-DossHost=oss-cn-beijing-internal.aliyuncs.com;
  • cluster: 这里cpu:1000表示是10个cpu核;核与内存的关系设置1:4000,一般不超过40000;gpu设置为0,表示不用GPU推理。

  • saved_model_dir: 导出的模型目录

  • output_table: 输出表,不需要提前创建,会自动创建

  • excluded_cols: 预测模型不需要的columns,比如labels

  • selected_cols: 预测模型需要的columns,selected_cols和excluded_cols不能同时使用

  • reserved_cols: 需要copy到output_table的columns, 和excluded_cols/selected_cols不冲突,如果指定ALL_COLUMNS,则所有的column都被copy到output_table

  • batch_size: minibatch的大小

  • arn: rolearn  注意这个的arn要替换成客户自己的。可以从dataworks的设置中查看arn。

  • ossHost: ossHost地址

  • buckets: config所在的bucket和保存模型的bucket; 如果有多个bucket,逗号分割

    • 如果是pai内部版,则不需要指定arn和ossHost, arn和ossHost放在-Dbuckets里面

      -Dbuckets=oss://easyrec/?role_arn=acs:ram::xxx:role/aliyunodpspaidefaultrole&host=oss-cn-beijing-internal.aliyuncs.com
    
  • output_cols: 指定输出表里面的column name和type:

    • 默认是”probs double”

    • 如果有多列,用逗号分割, 如:

        -Doutput_cols='probs double,embedding string'
      
    • 默认column name和saved_model导出字段名称一致

      • 如果不一致, 请使用model_outputs指定对应的导出字段名称

    • 模型导出的字段类型和MaxCompute表字段类型对应关系:

      • float/double : double

      • string : string

      • int32/int64 : bigint

      • array : string(json format)

      • 其他类型: 暂不支持

    • 二分类模型(要求num_class=1),导出字段:logits、probs,对应: sigmoid之前的值/概率

    • 回归模型,导出字段: y,对应: 预测值

    • 多分类模型(num_class > 1),导出字段:

      • logits: string(json), softmax之前的vector, shape[num_class]

      • probs: string(json), softmax之后的vector, shape[num_class]

        • 如果一个分类目标是is_click, 输出概率的变量名称是probs_is_click

        • 多目标模型中有一个回归目标是paytime,那么输出回归预测分的变量名称是:y_paytime

      • logits_y: logits[y], float, 类别y对应的softmax之前的概率

      • probs_y: probs[y], float, 类别y对应的概率

      • y: 类别id, = argmax(probs_y), int, 概率最大的类别

      • 示例:

        -Doutput_cols='logits string,probs string,logits_y double,probs_y double,y bigint'
      
    • 查看导出字段:

      • 如果不确定saved_model的导出字段的信息, 可以通过下面的命令查看:

         saved_model_cli show --all --dir ./data/test/inference/fm_export/
      
      • 输出信息:

         MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
      
         signature_def['serving_default']:
           The given SavedModel SignatureDef contains the following input(s):
             inputs['adgroup_id'] tensor_info:
                 dtype: DT_STRING
                 shape: (-1)
                 name: input_3:0
      
         ...
      
         The given SavedModel SignatureDef contains the following output(s):
           outputs['logits'] tensor_info:
               dtype: DT_FLOAT
               shape: (-1)
               name: Squeeze:0
           outputs['probs'] tensor_info:
               dtype: DT_FLOAT
               shape: (-1)
               name: Sigmoid:0
         Method name is: tensorflow/serving/predict
      
      • 可以看到导出的字段包括:

        • logits, float

        • probs, float

  • model_outputs: 导出saved_model时模型的导出字段,可以不指定,默认和output_cols一致

    • 如果output_cols和model_outputs不一致时需要指定,如:

        -Doutput_cols='score double' -Dmodel_outputs='probs'
      
    • 多列示例:

      -Doutput_cols='scores double,user_embed string'
      -Dmodel_outputs='probs,embedding'
      
      • 格式: “,”分割

      • 顺序: column_name和导出字段名一一对应

  • lifecycle: output_table的lifecycle

输出表schema:

包含reserved_cols和output_cols