為了確保模型在正式部署前達到上線標準,您可以使用模型分析最佳化工具對模型進行效能壓測、模型分析、模型最佳化等操作,對模型的效能進行分析最佳化。本文以PyTorch官方提供的Resnet18模型、GPU類型為V100卡為例,介紹如何使用模型分析最佳化工具。
前提條件
叢集類型為ACK Pro版且版本不低於1.20,叢集中至少包含一個GPU節點。關於升級叢集的具體操作,請參見手動升級叢集。
已建立Bucket空間,並建立PV和PVC。更多資訊,請參見使用OSS靜態儲存卷。
已安裝最新版本Arena。具體操作,請參見配置Arena用戶端。
背景資訊
大部分資料科學家關心模型精度,而研發工程師更關心模型效能。當資料科學家和研發工程師對彼此的領域不熟悉時,容易出現理解偏差,導致模型上線後,出現效能不達標的情況。因此,在模型部署前,通常需要對模型的效能進行測試。如果不達標,則需要對模型進行分析,找到效能瓶頸,最佳化後才能線上上進行部署。
模型分析工具簡介
AI套件提供了模型分析最佳化工具,在模型正式部署前,對模型進行效能壓測,分析模型網路結構、每個運算元耗時、GPU使用方式等,找到效能瓶頸,然後使用TensorRT等工具對模型進行最佳化,等模型達到上線標準後再進行部署。模型分析最佳化工具的生命週期如下圖所示。
Model Training: 模型訓練,通過資料集訓練出模型。
Model Benchmark:模型壓測,測試模型的Latency、Throughout、GPU利用率等效能指標。
Model Profile: 模型分析,分析模型中可最佳化效能的地方。
Model Optimize:模型最佳化,通過TensorRT等方式,最佳化模型在GPU上的推理效能。
Model Serving:模型服務,將模型部署為線上服務。
若您的模型經過一次最佳化後未達到上線標準,您可以持續對模型進行壓測、分析和最佳化操作。
互動方式
模型分析最佳化工具通過Arena命令列方式進行互動,支援在ACK Pro版叢集中提交分析、最佳化、壓測和評測任務。您可以通過執行arena model analyze --help
命令,查看相應的操作。
$ arena model analyze --help
submit a model analyze job.
Available Commands:
profile Submit a model profile job.
evaluate Submit a model evaluate job.
optimize Submit a model optimize job.
benchmark Submit a model benchmark job
Usage:
arena model analyze [flags]
arena model analyze [command]
Available Commands:
benchmark Submit a model benchmark job
delete Delete a model job
evaluate Submit a model evaluate job
get Get a model job
list List all the model jobs
optimize Submit a model optimize job, this is a experimental feature
profile Submit a model profile job
步驟一:準備模型
PyTorch模型部署推薦使用TorchScript的方式。本文以使用PyTorch官方提供的Resnet18模型為例。
模型轉換。將Resnet18模型轉換為TorchScript格式,並進行儲存。
import torch import torchvision model = torchvision.models.resnet18(pretrained=True) # Switch the model to eval model model.eval() # An example input you would normally provide to your model's forward() method. dummy_input = torch.rand(1, 3, 224, 224) # Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing. traced_script_module = torch.jit.trace(model, dummy_input) # Save the TorchScript model traced_script_module.save("resnet18.pt")
參數
說明
model_name
模型名稱。
model_platform
模型平台或架構,如
torchscript
、onnx
。model_path
模型儲存路徑。
inputs
輸入參數,支援一個或多個參數。
outputs
輸出參數,支援一個或多個參數。
模型轉換完成後,將
resnet18.pt
上傳至OSS,路徑為oss://bucketname/models/resnet18/resnet18.pt
。具體操作,請參見控制台上傳檔案。
步驟二:壓測效能
在模型正式部署前,需要對模型進行效能壓測,查看是否符合效能要求,本文使用Arena提供的效能壓測工具,以叢集default
命名空間下名為oss-pvc
的PVC為例。更多資訊,請參見使用OSS靜態儲存卷。
準備並上傳模型設定檔。
建立模型設定檔,本文以名為
config.json
的模型設定檔為例。{ "model_name": "resnet18", "model_platform": "torchscript", "model_path": "/data/models/resnet18/resnet18.pt", "inputs": [ { "name": "input", "data_type": "float32", "shape": [1, 3, 224, 224] } ], "outputs": [ { "name": "output", "data_type": "float32", "shape": [ 1000 ] } ] }
將模型設定檔上傳至OSS,路徑為
oss://bucketname/models/resnet18/config.json
。
使用以下命令在ACK Pro版叢集提交模型壓測任務。
arena model analyze benchmark \ --name=resnet18-benchmark \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --model-config-file=/data/models/resnet18/config.json \ --report-path=/data/models/resnet18 \ --concurrency=5 \ --duration=60
參數
說明
--gpus
使用的GPU卡數。
--data
叢集PVC及掛載到容器後的路徑。
--model-config-file
設定檔路徑。
--report-path
測試報告儲存路徑。
--concurrency
並發請求數量。
--duration
壓測的具體時間,單位為秒。
重要--requests
和--duration
兩個參數互斥,效能壓測時只能指定其中一個。如果同時配置兩個參數,系統預設使用--duration
參數。如果需要指定壓測的總請求數量,請配置
--requests
參數。
使用以下命令查看任務狀態。
arena model analyze list -A
預期輸出:
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-benchmark COMPLETE Benchmark 0s 2d 1
查看壓測報告。當
STATUS
顯示為COMPLETE
時,代表壓測完成。此時,可以在上一步中配置的測試報告儲存路徑--report-path
下查看名為benchmark_result.txt
的壓測報告。預期輸出:
{ "p90_latency":7.511, "p95_latency":7.86, "p99_latency":9.34, "min_latency":7.019, "max_latency":12.269, "mean_latency":7.312, "median_latency":7.206, "throughput":136, "gpu_mem_used":1.47, "gpu_utilization":21.280 }
壓測報告中的各項指標資訊如下表所示。
指標名稱
說明
單位
p90_latency
90%請求耗時
毫秒
p95_latency
95%請求耗時
毫秒
p99_latency
99%請求耗時
毫秒
min_latency
最小請求耗時
毫秒
max_latency
最大請求耗時
毫秒
mean_latency
平均值
毫秒
median_latency
中值
毫秒
throughput
輸送量
次
gpu_mem_used
GPU顯存使用
GB
gpu_utilization
GPU利用率
百分比
步驟三:分析模型
當壓測完成後,如果發現效能不達標,可以使用arena model analyze profile
命令分析模型,找到效能瓶頸和可最佳化點。
使用以下命令在ACK Pro版叢集提交模型分析任務。
arena model analyze profile \ --name=resnet18-profile \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --model-config-file=/data/models/resnet18/config.json \ --report-path=/data/models/resnet18/log/ \ --tensorboard \ --tensorboard-image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2
參數
說明
--gpus
使用的GPU卡數。
--data
叢集PVC及掛載到容器後的路徑。
--model-config-file
設定檔路徑。
--report-path
分析結果儲存路徑。
--tensorboard
是否啟用TensorBoard查看分析結果。
--tensorboard-image
Tensorboard鏡像地址。
使用以下命令查看任務狀態。
arena model analyze list -A
預期輸出:
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-profile COMPLETE Profile 13s 2d 1
使用以下命令查看TensorBoard狀態。
kubectl get service -n default
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE resnet18-profile-tensorboard NodePort 172.16.158.170 <none> 6006:30582/TCP 2d20h
使用以下命令進行連接埠轉寄,訪問TensorBoard。
kubectl port-forward svc/resnet18-profile-tensorboard -n default 6006:6006
預期輸出:
Forwarding from 127.0.X.X:6006 -> 6006 Forwarding from [::1]:6006 -> 6006
在瀏覽器中通過
http://localhost:6006
查看分析結果。在左側導覽列單擊Views,可查看不同維度分析結果。您可以根據分析結果找到模型的可最佳化點。
步驟四:最佳化模型
Arena提供模型最佳化工具。
使用以下命令在ACK Pro版叢集提交模型最佳化任務。
arena model analyze optimize \ --name=resnet18-optimize \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --optimizer=tensorrt \ --model-config-file=/data/models/resnet18/config.json \ --export-path=/data/models/resnet18
參數
說明
--gpus
使用的GPU卡數。
--data
叢集PVC及掛載到容器後的路徑。
--optimizer
指定最佳化方式。最佳化方式:
(預設)
tensorrt
。aiacc-torch
。
--model-config-file
設定檔路徑。
--export-path
最佳化後的模型儲存路徑。
使用以下命令查看任務狀態。
arena model analyze list -A
預期輸出:
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-optimize COMPLETE Optimize 16s 2d 1
查看最佳化後的模型檔案。當
STATUS
顯示為COMPLETE
時,表示最佳化任務執行完成。此時,可以在--export-path
目錄下查看名為opt_resnet18.pt
的模型檔案。修複模型壓測設定檔中的
--model_path
,再次進行壓測。關於壓測效能的具體操作,請參見步驟二:壓測效能。最佳化前後模型的效能指標如下表所示。
指標
最佳化前
最佳化後
p90_latency
7.511毫秒
5.162毫秒
p95_latency
7.86毫秒
5.428毫秒
p99_latency
9.34毫秒
6.64毫秒
min_latency
7.019毫秒
4.827毫秒
max_latency
12.269毫秒
8.426毫秒
mean_latency
7.312毫秒
5.046毫秒
median_latency
7.206毫秒
4.972毫秒
throughput
136次
198次
gpu_mem_used
1.47 GB
1.6 GB
gpu_utilization
21.280%
10.912%
對比最佳化前後的各項指標資料,可以發現模型經過最佳化後,模型的效能有了較大的提升,且GPU利用率降低。如果模型效能仍不達標,可繼續進行模型分析和模型最佳化。
步驟五:部署模型
模型效能達到要求後,可線上上進行部署操作。Arena支援使用Nvidia Triton Server部署TorchScript模型。關於Nvidia Triton Server的更多資訊,請參見Nvidia Triton Server。
建立名為
config.pbtxt
的設定檔。重要這個檔案名稱不能修改。
name: "resnet18" platform: "pytorch_libtorch" max_batch_size: 1 default_model_filename: "opt_resnet18.pt" input [ { name: "input__0" format: FORMAT_NCHW data_type: TYPE_FP32 dims: [ 3, 224, 224 ] } ] output [ { name: "output__0", data_type: TYPE_FP32, dims: [ 1000 ] } ]
說明關於設定檔的參數說明,請參見Nvidia Triton Server模型倉庫。
在OSS上按照如下結構組織目錄。
oss://bucketname/triton/model-repository/ resnet18/ config.pbtxt 1/ opt_resnet18.pt
說明1/
是Nvidia Triton Server的規範,表示版本號碼。一個模型目錄下可以有多個版本。更多資訊,請參見 Nvidia Triton Server模型倉庫。使用Arena進行部署。模型部署支援GPU獨佔和共用兩種方式。
GPU獨佔:對於穩定性要求特別高的推理服務,可以採用獨佔的方式,一個卡上只部署一個模型,不會出現資源競爭。您可以使用以下命令以GPU獨佔的方式進行部署。
arena serve triton \ --name=resnet18-serving \ --gpus=1 \ --replicas=1 \ --image=nvcr.io/nvidia/tritonserver:21.05-py3 \ --data=oss-pvc:/data \ --model-repository=/data/triton/model-repository \ --allow-metrics=true
GPU共用:對於一些長尾推理服務,或者對成本比較敏感的推理服務,可以使用GPU共用,在一個卡上部署多個模型,每個模型限定顯存使用量。您可以使用以下命令以GPU共用的方式進行部署。
GPU共用部署時,需要指定
--gpumemory
參數,即每個Pod佔用的顯存大小,此參數值可以根據模型效能壓測結果中的gpu_mem_used
進行設定。例如,壓測結果中gpu_mem_used
參數為1.6 GB,由於--gpumemory
只能是正整數,單位為GB,因此設為2。arena serve triton \ --name=resnet18 \ --gpumemory=2 \ --replicas=1 \ --image=nvcr.io/nvidia/tritonserver:21.12-py3 \ --data=oss-pvc:/data \ --model-repository=/data/triton/model-repository \ --allow-metrics=true
使用以下命令查看部署情況。
arena serve list -A
預期輸出:
NAMESPACE NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU default resnet18-serving Triton 202202141817 1 1 172.16.147.248 RESTFUL:8000,GRPC:8001 1
當
AVAILABLE
的執行個體數等於DESIRED
,表示模型部署成功。