预测组件可以使用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.ndarray}的形式在整个预测过程中供各个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 | 是 | 模型类型,取值范围如下:
当model_type为self_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_type为feature_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 | 否 | 图片数据格式,取值范围如下:
| 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文件路径。文件内每行的格式支持以下两种:
| 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.gz或http://example.com/c.zip。 | STRING | 空字符串("") |
user_predictor_cls | 否 | 用户自定义predictor类模块路径。例如用户在module.py中实现了Process A,则A的模块路径为module.A。 | STRING | 空字符串("") |
user_process_config | 否 | 用户自定义process配置信息。其中如下字段用以配置process,用户也可增加其他自定义配置字段:
示例:'{["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 | 否 | 输入是否为视频,取值范围如下:
| BOOL | false |
use_image_predictor | 否 | 使用的预测器是否只支持图像输入。 | BOOL | true |
decode_type | 否 | 视频解码方式,取值范围如下:
| 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。如果任务经常异常出错,则可以打开该开关。取值范围如下:
| BOOL | false |
useSparseClusterSchema | 否 | enableDynamicCluster设置为true时,需要将该参数设置为true。取值范围如下:
| BOOL | false |