Processor是包含線上預測邏輯的程式包。EAS已將一些常用的Processor預置為官方Processor,您可以直接使用該官方Processor部署常規模型,節省開發線上預測邏輯的成本。
EAS提供的Processor名稱及Code如下表所示(使用EASCMD部署服務時,需要提供Processor Code)。
Processor名稱 | Processor Code(僅用於EASCMD部署) | 文檔 | |
CPU版 | GPU版 | ||
PMML | pmml | 無 | |
TensorFlow1.12 | tensorflow_cpu_1.12 | tensorflow_gpu_1.12 | |
TensorFlow1.14 | tensorflow_cpu_1.14 | tensorflow_gpu_1.14 | |
TensorFlow1.15 | tensorflow_cpu_1.15 | tensorflow_gpu_1.15 | |
TensorFlow2.3 | tensorflow_cpu_2.3 | 無 | |
PyTorch1.6 | pytorch_cpu_1.6 | pytorch_gpu_1.6 | |
Caffe | caffe_cpu | caffe_gpu | |
PS演算法 | parameter_sever | 無 | |
Alink | alink_pai_processor | 無 | 無 |
xNN | xnn_cpu | 無 | 無 |
EasyVision | easy_vision_cpu_tf1.12_torch151 | easy_vision_gpu_tf1.12_torch151 | |
EasyTransfer | easytransfer_cpu | easytransfer_gpu | |
EasyNLP | easynlp | easynlp | |
EasyCV | easycv | easycv | |
Blade | blade_cpu | blade_cuda10.0_beta | 無 |
MediaFlow | 無 | mediaflow | |
Triton | 無 | triton |
PMML Processor
EAS預置的PMML Processor主要功能包括:
將PMML類型的模型檔案載入為一個服務。
處理對模型服務進行調用的請求。
根據模型計算請求結果,並將其返回至用戶端。
PMML Processor提供預設的缺失值填充策略。如果PMML模型檔案中的特徵欄位無指定isMissing策略,則系統預設以如下值進行填充。
DataType | 預設填儲值 |
BOOLEAN | false |
DOUBLE | 0.0 |
FLOAT | 0.0 |
INT | 0 |
STRING | “” |
您可以通過如下任何一種方式部署PMML模型:
控制台上傳
選擇Processor種類為PMML,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即pmml,樣本如下。
{ "processor": "pmml", "generate_token": "true", "model_path": "http://xxxxx/lr.pmml", "name": "eas_lr_example", "metadata": { "instance": 1, "cpu": 1 #自動為每個CPU配置4 GB記憶體,稱為1 Quota。 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。
TensorFlow1.12 Processor
EAS提供的TensorFlow1.12 Processor可以載入SavedModel(推薦)或SessionBundle格式的TensorFlow模型。對於Keras和Checkpoint模型,需要先將其轉換為SavedModel模型,再進行部署,詳情請參見TensorFlow模型如何匯出為SavedModel。
官方通用Processor不支援TensorFlow自訂OP。
您可以通過如下任何一種方式部署TensorFlow模型:
控制台上傳
選擇Processor種類為TensorFlow1.12,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即tensorflow_cpu_1.12或tensorflow_gpu_1.12(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯),樣本如下。
{ "name": "tf_serving_test", "generate_token": "true", "model_path": "http://xxxxx/savedmodel_example.zip", "processor": "tensorflow_cpu_1.12", "metadata": { "instance": 1, "cpu": 1, "gpu": 0, "memory": 2000 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。
TensorFlow1.14 Processor
EAS提供的TensorFlow1.14 Processor可以載入SavedModel(推薦)或SessionBundle格式的TensorFlow模型。對於Keras和Checkpoint模型,需要先將其轉換為SavedModel模型,再進行部署,詳情請參見TensorFlow模型如何匯出為SavedModel。
官方通用Processor不支援TensorFlow自訂OP。
您可以通過如下任何一種方式部署TensorFlow模型:
控制台上傳
選擇Processor種類為TensorFlow1.14,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即tensorflow_cpu_1.14或tensorflow_gpu_1.14(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯),樣本如下。
{ "name": "tf_serving_test", "generate_token": "true", "model_path": "http://xxxxx/savedmodel_example.zip", "processor": "tensorflow_cpu_1.14", "metadata": { "instance": 1, "cpu": 1, "gpu": 0, "memory": 2000 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。
TensorFlow1.15 Processor(內建PAI-Blade敏捷版最佳化引擎)
EAS提供的TensorFlow1.15 Processor可以載入SavedModel(推薦)或SessionBundle格式的TensorFlow模型。對於Keras和Checkpoint模型,需要先將其轉換為SavedModel模型,再進行部署,詳情請參見TensorFlow模型如何匯出為SavedModel。
官方通用Processor不支援TensorFlow自訂OP。
該Processor內建了PAI-Blade敏捷版最佳化引擎,您可以使用它部署PAI-Blade敏捷版最佳化後的TensorFlow模型。
您可以通過如下任何一種方式部署TensorFlow模型:
控制台上傳
選擇Processor種類為TensorFlow1.15,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即tensorflow_cpu_1.15或tensorflow_gpu_1.15(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯),樣本如下。
{ "name": "tf_serving_test", "generate_token": "true", "model_path": "http://xxxxx/savedmodel_example.zip", "processor": "tensorflow_cpu_1.15", "metadata": { "instance": 1, "cpu": 1, "gpu": 0, "memory": 2000 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。關於服務組態檔中的參數解釋請參見建立服務。
TensorFlow2.3 Processor
EAS提供的TensorFlow2.3 Processor可以載入SavedModel(推薦)或SessionBundle格式的TensorFlow模型。對於Keras和Checkpoint模型,需要先將其轉換為SavedModel模型,再進行部署,詳情請參見TensorFlow模型如何匯出為SavedModel。
官方通用Processor不支援TensorFlow自訂OP。
您可以通過如下任何一種方式部署TensorFlow模型:
控制台上傳
選擇Processor種類為TensorFlow2.3,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即tensorflow_cpu_2.3,樣本如下。
{ "name": "tf_serving_test", "generate_token": "true", "model_path": "http://xxxxx/savedmodel_example.zip", "processor": "tensorflow_cpu_2.3", "metadata": { "instance": 1, "cpu": 1, "gpu": 0, "memory": 2000 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。
PyTorch1.6 Processor(內建PAI-Blade敏捷版最佳化引擎)
EAS提供的PyTorch1.6 Processor可以載入TorchScript格式的模型,詳情請參見TorchScript官方介紹。
官方通用Processor不支援PyTorch擴充、不支援非Tensor類型的模型輸入和輸出。
該Processor內建了PAI-Blade敏捷版最佳化引擎,您可以使用它部署PAI-Blade敏捷版最佳化後的PyTorch模型。
您可以通過如下任何一種方式部署TorchScript模型:
控制台上傳
選擇Processor種類為PyTorch1.6,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即pytorch_cpu_1.6或pytorch_gpu_1.6(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯),樣本如下。
{ "name": "pytorch_serving_test", "generate_token": "true", "model_path": "http://xxxxx/torchscript_model.pt", "processor": "pytorch_gpu_1.6", "metadata": { "instance": 1, "cpu": 1, "gpu": 1, "cuda": "10.0", "memory": 2000 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。關於服務組態檔中的參數解釋請參見建立服務。
Caffe Processor
EAS提供的Caffe Processor可以載入Caffe架構訓練得到的深度學習模型。因為Caffe架構比較靈活,所以部署Caffe模型時,需要指定模型包的Model檔案名稱和Weight檔案名稱。
官方通用Processor不支援自訂DataLayer。
您可以通過如下任何一種方式部署Caffe模型:
控制台上傳
選擇Processor種類為Caffe,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即caffe_cpu或caffe_gpu(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯),樣本如下。
{ "name": "caffe_serving_test", "generate_token": "true", "model_path": "http://xxxxx/caffe_model.zip", "processor": "caffe_cpu", "model_config": { "model": "deploy.prototxt", "weight": "bvlc_reference_caffenet.caffemodel" }, "metadata": { "instance": 1, "cpu": 1, "gpu": 0, "memory": 2000 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。
PS演算法Processor
EAS提供的PS演算法Processor可以載入PS格式的模型。
以下介紹如何使用PS演算法Processor部署模型服務及如何發送服務要求。
您可以通過如下任何一種方式部署PS格式的模型:
控制台上傳
選擇Processor種類為PS演算法,詳情請參見服務部署:控制台。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即parameter_sever,樣本如下。
{ "name":"ps_smart", "model_path": "oss://examplebucket/xlab_m_pai_ps_smart_b_1058272_v0.tar.gz", "processor": "parameter_sever", "metadata": { "region": "beijing", "cpu": 1, "instance": 1, "memory": 2048 } }
DSW部署
類似於本地用戶端部署,編寫服務組態檔service.json,詳情請參見DSW部署。
請求說明
支援單個請求預測或批量請求預測。單個請求和批量請求資料結構相同,即JSON數組裡包含features對象。
單個請求樣本
curl "http://eas.location/api/predict/ps_smart" -d "[ { "f0": 1, "f1": 0.2, "f3": 0.5, } ]"
多個請求樣本
curl "http://eas.location/api/predict/ps_smart" -d "[ { "f0": 1, "f1": 0.2, "f3": 0.5, }, { "f0": 1, "f1": 0.2, "f3": 0.5, } ]"
傳回值
單個請求和批量請求傳回值也相同,即數組裡包含返回對象,且返回的對象位置和請求資料一一對應。
[ { "label":"xxxx", "score" : 0.2, "details" : [{"k1":0.3}, {"k2":0.5}] }, { "label":"xxxx", "score" : 0.2, "details" : [{"k1":0.3}, {"k2":0.5}] } ]
EasyTransfer Processor
EAS提供的EasyTransfer Processor可以載入EasyTransfer架構訓練得到的基於TensorFlow的深度學習NLP模型。
您可以通過如下任何一種方式部署EasyTransfer模型:
控制台上傳
選擇Processor種類為EasyTransfer,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即easytransfer_cpu或easytransfer_gpu(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯)。在model_config的type欄位指定訓練時所使用的模型類型,文本分類模型樣本如下。其他參數的詳細解釋請參見建立服務。
使用GPU部署的配置(以公用資源群組為例)
{ "name": "et_app_demo" "metadata": { "instance": 1 }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c4g1.xlarge" } }, "model_path": "http://xxxxx/your_model.zip", "processor": "easytransfer_gpu", "model_config": { "type": "text_classify_bert" } }
使用CPU部署的配置
{ "name": "et_app_demo", "model_path": "http://xxxxx/your_model.zip", "processor": "easytransfer_cpu", "model_config": { "type":"text_classify_bert" } "metadata": { "instance": 1, "cpu": 1, "memory": 4000 } }
目前支援的任務類型如下表所示。
任務類型
type
文本匹配
text_match_bert
文本分類
text_classify_bert
序列標註
sequence_labeling_bert
文本向量化
vectorization_bert
EasyNLP Processor
EAS提供的EasyNLP Processor可以載入EasyNLP架構訓練得到的,基於PyTorch的深度學習NLP模型。
您可以通過如下任何一種方式部署EasyNLP模型:
控制台上傳
選擇Processor種類為EasyNLP ,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即easynlp。在model_config的type欄位指定訓練時所使用的模型類型,文本分類(單標籤)模型樣本如下。其他參數的詳細解釋請參見建立服務。
{ "name": "easynlp_app_demo", "metadata": { "instance": 1 }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c4g1.xlarge" } }, "model_config": { "app_name": "text_classify", "type": "text_classify" }, "model_path": "http://xxxxx/your_model.tar.gz", "processor": "easynlp" }
目前支援的任務類型如下表所示。
任務類型
type
文本分類(單標籤)
text_classify
文本分類(多標籤)
text_classify_multi
文本匹配
text_match
序列標註
sequence_labeling
文本向量化
vectorization
中文摘要產生(GPU)
sequence_generation_zh
英文摘要產生(GPU)
sequence_generation_en
機器閱讀理解(中文)
machine_reading_comprehension_zh
機器閱讀理解(英文)
machine_reading_comprehension_en
WUKONG_CLIP(GPU)
wukong_clip
CLIP(GPU)
clip
服務部署完成後,在模型線上服務(EAS)頁面,單擊待調用服務服務方式列下的調用資訊,查看服務訪問的Endpoint和用於服務鑒權的Token資訊,參照如下Python樣本調用服務。
import requests
# 替換為已擷取的服務訪問的Endpoint。
url = '<eas-service-url>'
# 替換為已擷取的Token資訊。
token = '<eas-service-token>'
# 輸出需要預測的資料,以下以文本分類為例。
request_body = {
"first_sequence": "hello"
}
headers = {"Authorization": token}
resp = requests.post(url=url, headers=headers, json=request_body)
print(resp.content.decode())
EasyCV Processor
EAS提供的EasyCV Processor可以載入EasyCV架構訓練得到的深度學習模型。
您可以通過如下任何一種方式部署EasyCV模型:
控制台上傳
選擇Processor種類為EasyCV,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即easycv。在model_config的type欄位指定訓練時所使用的模型類型,映像分類模型樣本如下。其他參數的詳細解釋請參見建立服務。
{ "name": "easycv_classification_example", "processor": "easycv", "model_path": "oss://examplebucket/epoch_10_export.pt", "model_config": {"type":"TorchClassifier"}, "metadata": { "instance": 1 }, "cloud": { "computing": { "instance_type": "ecs.gn5i-c4g1.xlarge" } } }
目前支援的任務類型如下表所示。
任務類型
model_config
映像分類
{"type":"TorchClassifier"}
目標檢測
{"type":"DetectionPredictor"}
語義分割
{"type":"SegmentationPredictor"}
yolox目標檢測
{"type":"YoloXPredictor"}
視頻分類
{"type":"VideoClassificationPredictor"}
服務部署完成後,在模型線上服務(EAS)頁面,單擊待調用服務服務方式列下的調用資訊,查看服務訪問的Endpoint和用於服務鑒權的Token資訊,參照如下Python樣本調用服務。
import requests
import base64
import json
resp = requests.get('http://exmaplebucket.oss-cn-zhangjiakou.aliyuncs.com/images/000000123213.jpg')
ENCODING = 'utf-8'
datas = json.dumps( {
"image": base64.b64encode(resp.content).decode(ENCODING)
})
# 替換為已擷取的Token資訊。
head = {
"Authorization": "NTFmNDJlM2E4OTRjMzc3OWY0NzI3MTg5MzZmNGQ5Yj***"
}
for x in range(0,10):
# 替換為已擷取的服務訪問的Endpoint。
resp = requests.post("http://150231884461***.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/test_easycv_classification_example", data=datas, headers=head)
print(resp.text)
其中,需要將映像或視頻資料編碼成Base64格式進行傳輸,映像資料使用關鍵字image,視頻資料使用關鍵字video。
EasyVision Processor
EAS提供的EasyVision Processor可以載入EasyVision架構訓練得到的深度學習模型。
您可以通過如下任何一種方式部署EasyVision模型:
控制台上傳
選擇Processor種類為EasyVision,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即easy_vision_cpu_tf1.12_torch151或easy_vision_gpu_tf1.12_torch151(需要根據部署所用的資源進行選擇,如果processor與資源不匹配,則會導致部署報錯),在model_config的type欄位指定訓練時所使用的模型類型,樣本如下。其他參數的詳細解釋請參見建立服務:
使用GPU部署的配置
{ "name": "ev_app_demo", "processor": "easy_vision_gpu_tf1.12_torch151", "model_path": "oss://path/to/your/model", "model_config": "{\"type\":\"classifier\"}", "metadata": { "resource": "your_resource_name", "cuda": "9.0", "instance": 1, "memory": 4000, "gpu": 1, "cpu": 4, "rpc.worker_threads" : 5 } }
使用CPU部署的配置
{ "name": "ev_app_cpu_demo", "processor": "easy_vision_cpu_tf1.12_torch151", "model_path": "oss://path/to/your/model", "model_config": "{\"type\":\"classifier\"}", "metadata": { "resource": "your_resource_name", "instance": 1, "memory": 4000, "gpu": 0, "cpu": 4, "rpc.worker_threads" : 5 } }
MediaFlow Processor
EAS 提供的MediaFlow Processor是通用的編排引擎,可以進行視頻、音頻及映像分析處理。
您可以通過如下任何一種方式部署MediaFlow模型:
控制台上傳
選擇Processor種類為MediaFlow,詳情請參見控制台上傳部署。
本地用戶端部署
在服務組態檔service.json中,將processor欄位配置為相應的Processor Code,即mediaflow。此外,使用MediaFlow Processor部署模型,還需要增加如下特有欄位,其他欄位說明請參見建立服務:
graph_pool_size:圖池的數量。
worker_threads:調度線程的數量。
樣本如下:
部署視頻分類模型的配置。
{ "model_entry": "video_classification/video_classification_ext.js", "name": "video_classification", "model_path": "oss://path/to/your/model", "generate_token": "true", "processor": "mediaflow", "model_config" : { "graph_pool_size":8, "worker_threads":16 }, "metadata": { "eas.handlers.disable_failure_handler" :true, "resource": "your_resource_name", "rpc.worker_threads": 30, "rpc.enable_jemalloc": true, "rpc.keepalive": 500000, "cpu": 4, "instance": 1, "cuda": "9.0", "rpc.max_batch_size": 64, "memory": 10000, "gpu": 1 } }
部署語音辨識(ASR)模型的配置。
{ "model_entry": "asr/video_asr_ext.js", "name": "video_asr", "model_path": "oss://path/to/your/model", "generate_token": "true", "processor": "mediaflow", "model_config" : { "graph_pool_size":8, "worker_threads":16 }, "metadata": { "eas.handlers.disable_failure_handler" :true, "resource": "your_resource_name", "rpc.worker_threads": 30, "rpc.enable_jemalloc": true, "rpc.keepalive": 500000, "cpu": 4, "instance": 1, "cuda": "9.0", "rpc.max_batch_size": 64, "memory": 10000, "gpu": 1 } }
語音辨識與視頻分類service.json配置的主要差異為model_entry、name及model_path欄位,需要您根據部署的模型類型進行修改。
Triton Processor
Triton Inference Server是NVIDIA公司推出的新一代線上服務架構,它針對GPU上的模型提供了簡單易用的部署和管理介面,且相容KFServing的API標準。此外,Triton Inference Server還具有以下特點:
支援多種開源架構的部署,包括TensorFlow、PyTorch、ONNX Runtime及TensorRT等,同時也支援您提供的自訂服務後端(backend)。
支援多個模型同時運行在GPU上,以提高GPU裝置的利用率。
支援HTTP/gRPC通訊協定,提供二進位格式擴充以壓縮發送請求的大小。
支援Dynamic Batching功能,提升服務吞吐。
Triton Inference Server在EAS上以預置的Triton Processor形式發布。
Triton Processor目前僅在華東2(上海)公測,其他地區暫不支援。
Triton服務部署使用的模型都必須存放在OSS中。因此,您需要提前開通OSS,並將自己的模型相關檔案上傳到OSS中。關於如何上傳檔案到OSS,請參見上傳檔案。
以下介紹如何使用Triton Processor部署模型服務及如何調用該服務:
使用Triton Processor部署模型服務
您只能通過用戶端工具eascmd部署Triton模型服務。關於如何使用用戶端工具eascmd部署模型服務,請參見建立服務。部署模型服務時,使用的服務描述設定檔service.json中,需要將processor欄位配置為相應的Processor Code,即triton。此外,由於Triton需要從OSS中擷取模型,因此還需要使用者配置OSS的相關參數。service.json的樣本如下。
{ "name": "triton_test", "processor": "triton", "processor_params": [ "--model-repository=oss://triton-model-repo/models", "--allow-http=true", ], "metadata": { "instance": 1, "cpu": 4, "gpu": 1, "memory": 10000, "resource":"<your resource id>" } }
部署Triton模型服務需要配置的特有參數的含義如下表所示,其他通用參數含義請參見service.json中的參數詳解。
參數
描述
processor_params
服務啟動時傳遞給Triton Server的參數。對於不支援的參數將被自動過濾,支援傳遞給Triton server的參數集合如下面的支援傳遞給Triton server的參數集合所示。其中model-repository為必填參數,其他選擇性參數請參見main.cc。
oss_endpoint
OSS的Endpoint。如果不傳遞該參數,則系統會自動使用當前EAS服務所在地區的OSS服務。如果需要使用跨地區的OSS服務,則必須指定該參數。該參數的取值請參見訪問網域名稱和資料中心。
metadata
resource
用於部署模型服務的EAS專屬資源群組ID。通過Triton Processor部署模型服務時,使用的資源必須為EAS的專屬資源群組。關於如何建立EAS專屬資源群組,請參見使用專屬資源群組。
表 1. 支援傳遞給Triton server的參數集合 參數
是否必選
描述
model-repository
是
路徑需要指定為OSS路徑,系統不支援直接使用Bucket根目錄作為model-repository,需要指定Bucket下的某個子目錄才可以。
例如,
oss://triton-model-repo/models
,其中triton-model-repo為Bucket名稱,models為Bucket下的一個子目錄。log-verbose
否
參數詳情請參見main.cc。
log-info
否
log-warning
否
log-error
否
exit-on-error
否
strict-model-config
否
strict-readiness
否
allow-http
否
http-thread-count
否
pinned-memory-pool-byte-size
否
cuda-memory-pool-byte-size
否
min-supported-compute-capability
否
buffer-manager-thread-count
否
backend-config
否
使用Triton原生Client調用EAS Triton Processor服務
使用Python Client發出請求,您需要先通過如下命令安裝Triton官方提供的Client。
pip3 install nvidia-pyindex pip3 install tritonclient[all]
下載測試圖片到目前的目錄,命令如下。
wget http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/doc-assets/cat.png
以下樣本中,使用Python Client向Triton Processor服務發送請求,該請求的資料格式是二進位格式。
import numpy as np import time from PIL import Image import tritonclient.http as httpclient from tritonclient.utils import InferenceServerException URL = "<service url>" # 將<service url>替換為服務的訪問地址。 HEADERS = {"Authorization": "<service token>"} # 將<service token>替換為服務的訪問Token。 input_img = httpclient.InferInput("input", [1, 299, 299, 3], "FP32") img = Image.open('./cat.png').resize((299, 299)) img = np.asarray(img).astype('float32') / 255.0 input_img.set_data_from_numpy(img.reshape([1, 299, 299, 3]), binary_data=True) output = httpclient.InferRequestedOutput( "InceptionV3/Predictions/Softmax", binary_data=True ) triton_client = httpclient.InferenceServerClient(url=URL, verbose=False) start = time.time() for i in range(10): results = triton_client.infer( "inception_graphdef", inputs=[input_img], outputs=[output], headers=HEADERS ) res_body = results.get_response() elapsed_ms = (time.time() - start) * 1000 if i == 0: print("model name: ", res_body["model_name"]) print("model version: ", res_body["model_version"]) print("output name: ", res_body["outputs"][0]["name"]) print("output shape: ", res_body["outputs"][0]["shape"]) print("[{}] Avg rt(ms): {:.2f}".format(i, elapsed_ms)) start = time.time()