离线预测通用说明

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

概述

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

image

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

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

输入数据格式

  • MaxCompute

    输入表可以是一列或多列,其中一列为图像的URL或图像编码后的二进制数据经过Base64编码的数据,TypeSTRING类型。Schema示例如下。

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | id              | string     |       |                                             |
    | url             | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  • OSS文件

    OSS输入文件的每一列为一个URLOSS地址,示例如下。

    oss://your/path/to/image.jpg
    http://your.path/to/image.jpg
  • 自定义输入数据

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

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

    如果ValueOSS路径或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_dataDICT,其中:

    • image字段对应的值为一个图像解码后的数据。

    • prior字段对应的值为文件对象。

    • config字段对应一个DICT,即JSON字符串内容。

    input_dataDICT格式如下所示,用户在自定义processpredictor中均可以通过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

访问OSS的授权,其获取方式请参见PAI-TF任务参数介绍IO相关参数说明部分。

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:表示图片以Base64编码存放在表内。

  • url:表示图片的URLOSS路径存放在表内。

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卡,不能超过100GPU卡。如果取值为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、ZIPPython文件。支持OSS路径或HTTP URL。例如oss://xxx/a.tar.gzhttp://example.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

不同BatchOverlap的帧数量。

INT

0

enableDynamicCluster

打开Dynamic Cluster,允许单个Worker Failover。如果任务经常异常出错,则可以打开该开关。取值范围如下:

  • true:打开Dynamic Cluster

  • false:关闭Dynamic Cluster

BOOL

false

useSparseClusterSchema

enableDynamicCluster设置为true时,需要将该参数设置为true。取值范围如下:

  • true:打开稀疏集群

  • false:关闭稀疏集群

BOOL

false