離線預(yù)測通用說明
預(yù)測組件可以使用PAI-EasyVision訓(xùn)練出的模型進(jìn)行離線預(yù)測。本文介紹離線預(yù)測通用的輸入數(shù)據(jù)格式及PAI命令參數(shù)。
概述
PAI-EasyVision支持讀取MaxCompute表數(shù)據(jù)并將結(jié)果寫回MaxCompute表內(nèi)。 同時(shí),支持讀取OSS文件列表進(jìn)行預(yù)測,并將結(jié)果寫回OSS文件中。整個(gè)離線處理過程被抽象為一個(gè)流水線處理流程,每個(gè)原子過程在每個(gè)Worker上異步多線程并發(fā)處理。不同Worker在IO時(shí),通過數(shù)據(jù)分片獲取對應(yīng)的輸入數(shù)據(jù),寫出對應(yīng)的輸出分片。例如,從表中讀取圖片進(jìn)行模型預(yù)測,系統(tǒng)根據(jù)Worker數(shù)量對輸入表進(jìn)行數(shù)據(jù)分片,每個(gè)Worker首先讀取屬于自己的分片數(shù)據(jù),然后經(jīng)過Base64解碼和模型預(yù)測,最后將結(jié)果寫入輸出表。 其中Base64解碼和模型預(yù)測均是多線程異步執(zhí)行,可以充分利用CPU和GPU算力進(jìn)行流水線并行處理。處理過程如下圖所示。
對于視頻數(shù)據(jù),PAI-EasyVision提供了視頻級別的預(yù)測模型,同時(shí)支持用戶調(diào)用圖像相關(guān)的模型進(jìn)行視頻幀圖像預(yù)測,PAI-EasyVision的離線處理框架會自動進(jìn)行視頻解碼、單幀圖像預(yù)測及所有視頻幀結(jié)果的匯總。
考慮到一部分用戶需要加載自己訓(xùn)練的模型進(jìn)行離線預(yù)測,PAI-EasyVision默認(rèn)提供的預(yù)測代碼無法滿足需求。因此,PAI-EasyVision支持用戶自定義預(yù)測代碼,復(fù)用ev_predict已有的IO功能。例如,通過數(shù)據(jù)下載和數(shù)據(jù)解碼完成自己模型的離線預(yù)測。 此外,PAI-EasyVision也支持在預(yù)測前插入用戶自定義的處理過程,先對輸入數(shù)據(jù)進(jìn)行處理,再送入預(yù)測器,詳情請參見自定義離線預(yù)測。
輸入數(shù)據(jù)格式
讀MaxCompute表
輸入表可以是一列或多列,其中一列為圖像的URL或圖像編碼后的二進(jìn)制數(shù)據(jù)經(jīng)過Base64編碼的數(shù)據(jù),Type為STRING類型。Schema示例如下。
+------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | id | string | | | | url | string | | | +------------------------------------------------------------------------------------+
讀OSS文件
OSS輸入文件的每一列為一個(gè)URL或OSS地址,示例如下。
oss://your/path/to/image.jpg http://your.path/to/image.jpg
自定義輸入數(shù)據(jù)
讀取MaxCompute表的輸入數(shù)據(jù)只有圖片的URL或圖片的Base64編碼,讀取OSS文件的輸入數(shù)據(jù)只有圖片的URL,進(jìn)行圖片下載解碼,這兩種方式都只能獲得圖像的Numpy Array,以{"image": np.ndarray}的形式在整個(gè)預(yù)測過程中供各個(gè)Process和Predictor使用。 隨著越來越多的用戶使用自定義Predictor和自定義Process,這種單一的輸入格式已經(jīng)無法滿足用戶的需求。因此改進(jìn)了OSS讀取方式,從而支持用戶自定義格式。
自定義格式支持原有的OSS文件格式,同時(shí)支持JSON字符串格式,文件的每行是一個(gè)JSON字符串。用戶可以傳入多個(gè)KV對,所有的KV對保存到一個(gè)DICT中,傳遞給自定義Predictor和自定義Process,用戶可以方便地根據(jù)自定義的Key獲取對應(yīng)的Value。
如果Value為OSS路徑或URL,則系統(tǒng)自動使用多線程下載文件內(nèi)容,并將Value轉(zhuǎn)換為一個(gè)Python file-like Object,用戶可以直接調(diào)用
read()
或readlines()
等文件方法獲取對應(yīng)內(nèi)容。如果Value指向一個(gè)文件,且擴(kuò)展名為圖片類型,則系統(tǒng)自動進(jìn)行圖像解碼,用戶從input_data這個(gè)DICT中根據(jù)Key獲取對應(yīng)的Value,類型為numpy.ndarray。輸入數(shù)據(jù)示例如下所示。
{"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"}}
上述的輸入數(shù)據(jù)會被轉(zhuǎn)換為input_data的DICT,其中:
image字段對應(yīng)的值為一個(gè)圖像解碼后的數(shù)據(jù)。
prior字段對應(yīng)的值為文件對象。
config字段對應(yīng)一個(gè)DICT,即JSON字符串內(nèi)容。
input_data的DICT格式如下所示,用戶在自定義process和predictor中均可以通過Key獲取對應(yīng)的數(shù)據(jù)。
input_dict = { "image": np.ndarray, "prior" : file_like_object, "config": {"key1":1, "key2":"value2"} }
重要所有內(nèi)置的PAI-EasyVision Predictor會使用image這個(gè)Key獲取輸入圖像。如果需要使用自定義輸入格式調(diào)用PAI-EasyVision自帶的Predictor,則圖像數(shù)據(jù)的key必須使用image。
參數(shù)說明
參數(shù)名稱 | 是否必選 | 描述 | 類型 | 默認(rèn)值 |
model_path | 是 | 模型OSS路徑。例如"oss://your_bucket/your_model_dir"。 | STRING | 無 |
model_type | 是 | 模型類型,取值范圍如下:
當(dāng)model_type為self_define時(shí),會Load user_predictor_cls指定的預(yù)測類。 | STRING | 無 |
buckets | 是 | OSS Bucket信息。如果您使用自己的模型預(yù)測,則需要指定存儲模型的OSS Bucket信息,例如"oss://{bucket_name}.{oss_host}/{path}"。 | STRING | 無 |
arn | 是 | 訪問OSS的授權(quán),其獲取方式請參見PAI-TF任務(wù)參數(shù)介紹的IO相關(guān)參數(shù)說明部分。 | STRING | 無 |
feature_name | 否 | 抽取特征名稱。當(dāng)model_type為feature_extractor時(shí),需要指定該參數(shù)。例如resnet_v1_50/logits。 | STRING | 空字符串("") |
input_table | 否 | 輸入表。例如,非分區(qū)表"odps://prj_name/tables/table_name",分區(qū)表"odps://prj_name/tables/table_name/pt=xxx"。 | STRING | 空字符串("") |
image_col | 否 | 圖片數(shù)據(jù)所在列名。 | STRING | "image" |
image_type | 否 | 圖片數(shù)據(jù)格式,取值范圍如下:
| STRING | "base64" |
reserved_columns | 否 | 保留數(shù)據(jù)列名,多個(gè)列名間使用英文逗號(,)分隔。例如"col1,col2,col3"。 | STRING | 空字符串("") |
result_column | 否 | 結(jié)果列名。 | STRING | "prediction_result" |
output_table | 否 | 輸出表,同輸入表格式。如果不存在該表,則PAI命令會自動創(chuàng)建輸出表并建立分區(qū)。用戶也可以提前自行建立表和分區(qū)。 | STRING | 空字符串("") |
lifecycle | 否 | 輸出表生命周期。 | INT | 10 |
num_worker | 否 | 預(yù)測Worker數(shù)目。增加Worker數(shù)目可以加速離線預(yù)測整體速度。 | INT | 2 |
cpuRequired | 否 | 每個(gè)Worker CPU資源,取值100表示一個(gè)CPU。 | INT | 1600 |
gpuRequired | 否 | 每個(gè)Worker GPU資源,取值100表示一張GPU卡,不能超過100張GPU卡。如果取值為0,則使用CPU集群。 | INT | 100 |
input_oss_file | 否 | 輸入OSS文件路徑。文件內(nèi)每行的格式支持以下兩種:
| STRING | 空字符串("") |
output_oss_file | 否 | 輸出OSS文件路徑,存放預(yù)測結(jié)果。系統(tǒng)會以該文件名為前綴,生成num_worker個(gè)結(jié)果文件,后續(xù)會將這些文件Merge成一個(gè)結(jié)果文件。 | STRING | 空字符串("") |
output_dir | 否 | 輸出文件目錄,例如"oss://your_bucket/dir"。如果使用自定義的輸出格式,所有的結(jié)果圖片文件都會保存至該文件夾。 | 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中實(shí)現(xiàn)了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 | 否 | 緩存隊(duì)列長度。 | INT | 1024 |
batch_size | 否 | 預(yù)測Batch Size。 | INT | 1 |
preprocess_thread_num | 否 | 預(yù)處理(圖片解碼、下載)并發(fā)線程數(shù)。 | INT | 4 |
predict_thread_num | 否 | 預(yù)測并發(fā)線程數(shù)。 | INT | 2 |
is_input_video | 否 | 輸入是否為視頻,取值范圍如下:
| BOOL | false |
use_image_predictor | 否 | 使用的預(yù)測器是否只支持圖像輸入。 | 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的幀數(shù)量。 | INT | 0 |
enableDynamicCluster | 否 | 打開Dynamic Cluster,允許單個(gè)Worker Failover。如果任務(wù)經(jīng)常異常出錯(cuò),則可以打開該開關(guān)。取值范圍如下:
| BOOL | false |
useSparseClusterSchema | 否 | enableDynamicCluster設(shè)置為true時(shí),需要將該參數(shù)設(shè)置為true。取值范圍如下:
| BOOL | false |