全部產品
Search
文件中心

Container Service for Kubernetes:模型分析最佳化

更新時間:Aug 23, 2024

為了確保模型在正式部署前達到上線標準,您可以使用模型分析最佳化工具對模型進行效能壓測、模型分析、模型最佳化等操作,對模型的效能進行分析最佳化。本文以PyTorch官方提供的Resnet18模型、GPU類型為V100卡為例,介紹如何使用模型分析最佳化工具。

前提條件

  • 叢集類型為ACK Pro版且版本不低於1.20,叢集中至少包含一個GPU節點。關於升級叢集的具體操作,請參見手動升級叢集

  • 已建立Bucket空間,並建立PV和PVC。更多資訊,請參見使用OSS靜態儲存卷

  • 已安裝最新版本Arena。具體操作,請參見配置Arena用戶端

背景資訊

大部分資料科學家關心模型精度,而研發工程師更關心模型效能。當資料科學家和研發工程師對彼此的領域不熟悉時,容易出現理解偏差,導致模型上線後,出現效能不達標的情況。因此,在模型部署前,通常需要對模型的效能進行測試。如果不達標,則需要對模型進行分析,找到效能瓶頸,最佳化後才能線上上進行部署。

模型分析工具簡介

AI套件提供了模型分析最佳化工具,在模型正式部署前,對模型進行效能壓測,分析模型網路結構、每個運算元耗時、GPU使用方式等,找到效能瓶頸,然後使用TensorRT等工具對模型進行最佳化,等模型達到上線標準後再進行部署。模型分析最佳化工具的生命週期如下圖所示。生命週期

  1. Model Training: 模型訓練,通過資料集訓練出模型。

  2. Model Benchmark:模型壓測,測試模型的Latency、Throughout、GPU利用率等效能指標。

  3. Model Profile: 模型分析,分析模型中可最佳化效能的地方。

  4. Model Optimize:模型最佳化,通過TensorRT等方式,最佳化模型在GPU上的推理效能。

  5. 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模型為例。

  1. 模型轉換。將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

    模型平台或架構,如torchscriptonnx

    model_path

    模型儲存路徑。

    inputs

    輸入參數,支援一個或多個參數。

    outputs

    輸出參數,支援一個或多個參數。

  2. 模型轉換完成後,將resnet18.pt上傳至OSS,路徑為oss://bucketname/models/resnet18/resnet18.pt。具體操作,請參見控制台上傳檔案

步驟二:壓測效能

在模型正式部署前,需要對模型進行效能壓測,查看是否符合效能要求,本文使用Arena提供的效能壓測工具,以叢集default命名空間下名為oss-pvc的PVC為例。更多資訊,請參見使用OSS靜態儲存卷

  1. 準備並上傳模型設定檔。

    1. 建立模型設定檔,本文以名為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 ]
          }
        ]
      }
    2. 將模型設定檔上傳至OSS,路徑為oss://bucketname/models/resnet18/config.json

  2. 使用以下命令在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參數。

  3. 使用以下命令查看任務狀態。

    arena model analyze list -A

    預期輸出:

    NAMESPACE      NAME                        STATUS    TYPE       DURATION  AGE  GPU(Requested)
    default        resnet18-benchmark          COMPLETE  Benchmark  0s        2d   1
  4. 查看壓測報告。當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命令分析模型,找到效能瓶頸和可最佳化點。

  1. 使用以下命令在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鏡像地址。

  2. 使用以下命令查看任務狀態。

    arena model analyze list -A

    預期輸出:

    NAMESPACE      NAME                        STATUS    TYPE       DURATION  AGE  GPU(Requested)
    default        resnet18-profile            COMPLETE  Profile    13s       2d   1
  3. 使用以下命令查看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
  4. 使用以下命令進行連接埠轉寄,訪問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
  5. 在瀏覽器中通過http://localhost:6006查看分析結果。在左側導覽列單擊Views,可查看不同維度分析結果。您可以根據分析結果找到模型的可最佳化點。查看分析結果

步驟四:最佳化模型

Arena提供模型最佳化工具。

  1. 使用以下命令在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

    最佳化後的模型儲存路徑。

  2. 使用以下命令查看任務狀態。

    arena model analyze list -A

    預期輸出:

    NAMESPACE      NAME                        STATUS    TYPE       DURATION  AGE  GPU(Requested)
    default        resnet18-optimize           COMPLETE  Optimize   16s       2d   1
  3. 查看最佳化後的模型檔案。當STATUS顯示為COMPLETE時,表示最佳化任務執行完成。此時,可以在--export-path目錄下查看名為opt_resnet18.pt的模型檔案。

  4. 修複模型壓測設定檔中的--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

  1. 建立名為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模型倉庫

  2. 在OSS上按照如下結構組織目錄。

    oss://bucketname/triton/model-repository/
        resnet18/
          config.pbtxt
          1/
            opt_resnet18.pt
    說明

    1/是Nvidia Triton Server的規範,表示版本號碼。一個模型目錄下可以有多個版本。更多資訊,請參見 Nvidia Triton Server模型倉庫

  3. 使用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
  4. 使用以下命令查看部署情況。

    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 ,表示模型部署成功。