预测组件可以使用PAI-EasyVision训练出的模型进行离线预测。本文介绍离线预测通用的输入数据格式及PAI命令参数。

概述

PAI-EasyVision支持读取MaxCompute表数据并将结果写回MaxCompute表内。 同时,支持读取OSS文件列表进行预测,并将结果写回OSS文件中。整个离线处理过程被抽象为一个流水线处理流程,每个原子过程在每个Worker上异步多线程并发处理。不同Worker在IO时,通过数据分片获取对应的输入数据,写出对应的输出分片。例如,从表中读取图片进行模型预测,系统根据Worker数量对输入表进行数据分片,每个Worker首先读取属于自己的分片数据,然后经过Base64解码和模型预测,最后将结果写入输出表。 其中Base64解码和模型预测均是多线程异步执行,可以充分利用CPU和GPU算力进行流水线并行处理。处理过程如下图所示。 离线预测处理流程

对于视频数据,PAI-EasyVision提供了视频级别的预测模型,同时支持用户调用图像相关的模型进行视频帧图像预测,PAI-EasyVision的离线处理框架会自动进行视频解码、单帧图像预测及所有视频帧结果的汇总。

考虑到一部分用户需要加载自己训练的模型进行离线预测,PAI-EasyVision默认提供的预测代码无法满足需求。因此,PAI-EasyVision支持用户自定义预测代码,复用ev_predict已有的IO功能。例如,通过数据下载和数据解码完成自己模型的离线预测。 此外,PAI-EasyVision也支持在预测前插入用户自定义的处理过程,先对输入数据进行处理,再送入预测器,详情请参见自定义离线预测。

输入数据格式

  • 读MaxCompute表
    输入表可以是一列或多列,其中一列为图像的URL或图像编码后的二进制数据经过Base64编码的数据,Type为STRING类型。Schema示例如下。
    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | id              | string     |       |                                             |
    | url             | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  • 读OSS文件
    OSS输入文件的每一列为一个URL或OSS地址,示例如下。
    oss://your/path/to/image.jpg
    http://your.path/to/image.jpg
  • 自定义输入数据

    读取MaxCompute表的输入数据只有图片的URL或图片的Base64编码,读取OSS文件的输入数据只有图片的URL,进行图片下载解码,这两种方式都只能获得图像的Numpy Array,以{"image": np.ndarry}的形式在整个预测过程中供各个Process和Predictor使用。 随着越来越多的用户使用自定义Predictor和自定义Process,这种单一的输入格式已经无法满足用户的需求。因此改进了OSS读取方式,从而支持用户自定义格式。

    自定义格式支持原有的OSS文件格式,同时支持JSON字符串格式,文件的每行是一个JSON字符串。用户可以传入多个KV对,所有的KV对保存到一个DICT中,传递给自定义Predictor和自定义Process,用户可以方便的根据自定义的Key获取对应的Value。

    如果Value为OSS路径或URL,则系统自动使用多线程下载文件内容,并将Value转换为一个Python file-like Object,用户可以直接调用read()readlines()等文件方法获取对应内容。如果Value指向一个文件,且扩展名为图片类型,则系统自动进行图像解码,用户从input_data这个DICT中根据Key获取对应的Value,类型为numpy.ndarray

    输入数据示例如下所示。
    {"image":"http://your/path/to/image.jpg", "prior":"oss://your/path/to/prior.txt", "config": {"key1":1, "key2":"value2"}}
    {"image":"http://your/path/to/image.jpg", "prior":"oss://your/path/to/prior.txt", "config": {"key2":1, "key2":"value2"}}
    上述的输入数据会被转换为 input_data的DICT,其中:
    • image字段对应的值为一个图像解码后的数据。
    • prior字段对应的值为文件对象。
    • config字段对应一个DICT,即JSON字符串内容。
    input_data的DICT格式如下所示,用户在自定义process和predictor中均可以通过Key获取对应的数据。
    input_dict = {
      "image": np.ndarray,
      "prior" : file_like_object,
      "config": {"key1":1, "key2":"value2"}
    }
    说明 所有内置的PAI-EasyVision Predictor会使用 image这个Key获取输入图像。如果需要使用自定义输入格式调用PAI-EasyVision自带的Predictor,则图像数据的key必须使用 image

参数说明

参数名称 是否必选 描述 类型 默认值
model_path 模型OSS路径。例如"oss://your_bucket/your_model_dir" STRING
model_type 模型类型,取值范围如下:
  • feature_extractor:特征抽取
  • classifier:图像分类
  • multilabel_classifier:多标签分类
  • detector:物体检测
  • text_detector:文字检测
  • text_recognizer:文字行识别
  • text_detection_recognition:文字检测识别
  • text_spotter:文字端到端识别
  • segmentor:图像分割
  • self_define:自定义预测
model_typeself_define时,会Load user_predictor_cls指定的预测类。
STRING
buckets OSS Bucket信息。如果您使用自己的模型预测,则需要指定存储模型的OSS Bucket信息,例如"oss://{bucket_name}.{oss_host}/{path}" STRING
arn RAMi信息,例如"acs:ram::*********:role/aliyunodpspaidefaultrole" STRING
feature_name 抽取特征名称。当model_typefeature_extractor时,需要指定该参数。例如resnet_v1_50/logits STRING 空字符串("")
input_table 输入表。例如,非分区表"odps://prj_name/tables/table_name",分区表"odps://prj_name/tables/table_name/pt=xxx" STRING 空字符串("")
image_col 图片数据所在列名。 STRING "image"
image_type 图片数据格式,取值范围如下:
  • base64:表示图片以Base 64编码存放在表内。
  • url:表示图片的URL或OSS路径存放在表内。
STRING "base64"
reserved_columns 保留数据列名,多个列名间使用英文逗号(,)分隔。例如"col1,col2,col3" STRING 空字符串("")
result_column 结果列名。 STRING "prediction_result"
output_table 输出表,同输入表格式。如果不存在该表,则PAI命令自动创建输出表并建立分区。用户也可以提前自行建立表和分区。 STRING 空字符串("")
lifecycle 输出表生命周期。 INT 10
num_worker 预测Worker数目。增加Worker数目可以加速离线预测整体速度。 INT 2
cpuRequired 每个Worker CPU资源,取值100表示一个CPU。 INT 1600
gpuRequired 每个Worker GPU资源,取值100表示一张GPU卡,不能超过100张GPU卡。如果取值为0,则使用CPU集群。 INT 100
input_oss_file 输入OSS文件路径。文件内每行的格式支持以下两种:
  • 一个待预测的图片OSS路径或URL,例如oss://your_bucket/filelist.txt
  • 一个JSON字符串,详情请参见自定义输入格式部分。
STRING 空字符串("")
output_oss_file 输出OSS文件路径,存放预测结果。系统会以该文件名为前缀,生成num_worker个结果文件,后续会将这些文件Merge成一个结果文件。 STRING 空字符串("")
output_dir 输出文件目录,例如"oss://your_bucket/dir"。如果使用自定义的输出格式,所有的结果图片文件都会保存至该文件夹。 STRING 空字符串("")
user_resource 用户上传资源路径,可以为TAR.GZ、ZIP或Python文件。支持OSS路径或HTTP URL。例如oss://xxx/a.tar.gzhttp://a.com/c.zip STRING 空字符串("")
user_predictor_cls 用户自定义predictor类模块路径。例如用户在module.py中实现了Process A,则A的模块路径为module.A STRING 空字符串("")
user_process_config 用户自定义process配置信息。其中如下字段用以配置process,用户也可增加其他自定义配置字段:
  • job_name:自定义process名称。
  • num_threads:自定义process并发运行线程数。
  • batch_size: 处理数据的batch_size。
  • user_process_cls:用户自定义process类模块路径。例如,用户在module.py中实现了Process A,则A的模块路径为module.A
示例:'{["job_name":"myprocess","user_process_cls": module.ClassA"num_threads":2, "batch_size":1]}'
JSON字符串 空字符串("")
queue_size 缓存队列长度。 INT 1024
batch_size 预测Batch Size。 INT 1
preprocess_thread_num 预处理(图片解码、下载)并发线程数。 INT 4
predict_thread_num 预测并发线程数。 INT 2
is_input_video 输入是否为视频,取值范围如下:
  • true:输入为视频
  • false:输入为非视频。
BOOL false
use_image_predictor 使用的预测器是否只支持图像输入。 BOOL true
decode_type 视频解码方式,取值范围如下:
  • 1:Intra only
  • 2:Keyframe only
  • 3:Without bidir
  • 4:Decode all
INT 4
sample_fps 抽帧频率。 FLOAT 5
reshape_size 输出帧的大小,-1表示使用原始大小。 INT -1
decode_batch_size 每次Decode步骤中的Batch大小。 INT 10
decode_keep_size 不同Batch中Overlap的帧数量。 INT 0
enableDynamicCluster 打开Dynamic Cluster,允许单个Worker Failover。如果任务经常异常出错,则可以打开该开关。取值范围如下:
  • true:打开Dynamic Cluster
  • false:关闭Dynamic Cluster
BOOL false
useSparseClusterSchema enableDynamicCluster设置为true时,需要将该参数设置为true。取值范围如下:
  • true:打开稀疏集群
  • false:关闭稀疏集群
BOOL false