我不會用 Triton 系列:上手指北


摘要

本篇文章介紹了如何上手使用 Triton,本文將使用 Pytorch 導出 Resnet50 模型,將其部署到 Triton。Resnet50 是一個預訓練模型,我們可以直接使用它預訓練時的任務,即圖像分類。部署好了之后,會介紹如何使用 Python 客戶端進行請求,客戶端發送一張圖片,Triton 返回分類的結果。之后我們會使用 Triton 提供的客戶端工具 model_analyzer 來分析不同配置下的延遲和吞吐,暴力搜索出延遲最小的方案。

這篇文章剩下的部分,將會簡單介紹如何使用 Triton 的其他特性,比如模型熱更新的方法和規則。另外,還有一些 Triton 文檔中沒有寫的小細節,這些東西可以通過 ModelConfig 的 protobuf 定義 看到,本文將會一一介紹。

代碼:https://github.com/zzk0/triton/tree/master/quick

服務端部署

首先,我們需要一個模型,以 Resnet50 為例子。

Pytorch 導出模型

咱們先使用 Pytorch 導出 Resnet50 模型,Resnet50 是一個圖片分類模型,模型的類別有 1000 類。使用 torchscript 保存模型。

保存模型的代碼如下,非常的簡單。這個模型可以接受的圖片大小是可變的,不一定是 244, 244。

import torch
import torchvision.models as models


resnet50 = models.resnet50(pretrained=True)
resnet50.eval()
image = torch.randn(1, 3, 244, 244)
resnet50_traced = torch.jit.trace(resnet50, image)
resnet50(image)
resnet50_traced.save('model.pt')

使用 Triton 部署模型

現在我們已經有了模型文件了,接下來我們把它部署到 Triton 上面。

第一步,拉取 Triton 鏡像

以 r21.10 版本為例子,運行下面的命令拉取鏡像。

docker pull nvcr.io/nvidia/tritonserver:21.10-py3

第二步,配置模型

按照下面的方式組織文件目錄結構。

quick/
└── resnet50_pytorch            # 模型名字,需要和 config.txt 中的名字對上
    ├── 1                       # 模型版本號
    │   └── model.pt            # 上面保存的模型
    ├── config.pbtxt            # 模型配置文件
    ├── labels.txt              # 可選,分類標簽信息,注意格式
    ├── resnet_client.py        # 客戶端腳本,可以不放在這里
    └── resnet_pytorch.py       # 生成 model.pt 的腳本,可以不放在這里

下面給出模型的配置信息 config.pbtxt。模型的輸入是,[ N, 3, -1, -1 ] 的圖片,輸出是 [ N, 1000 ] 維度的分類向量,還指定了分類的文件名,用於獲取分類結果。

name: "resnet50_pytorch"
platform: "pytorch_libtorch"
max_batch_size: 128
input [
  {
    name: "INPUT__0"
    data_type: TYPE_FP32
    dims: [ 3, -1, -1 ]
  }
]
output [
  {
    name: "OUTPUT__0"
    data_type: TYPE_FP32
    dims: [ 1000 ]
    label_filename: "labels.txt"
  }
]

第三步,啟動服務

啟動服務的方法有兩種,一種是用 docker 啟動並執行命令,一種是進入 docker 中然后手動調用命令。

第一種,docker 啟動並執行命令:

docker run --gpus=all --rm -p8000:8000 -p8001:8001 -p8002:8002 -v/home/percent1/triton/triton/quick:/models nvcr.io/nvidia/tritonserver:21.10-py3 tritonserver --model-repository=/models

第二種,進入 docker,然后運行命令:

docker run --gpus=all --network=host --shm-size=2g -v/home/percent1/triton/triton/quick:/models  -it nvcr.io/nvidia/tritonserver:21.10-py3  # 進入 docker
./bin/tritonserver --model-store=/models  # 啟動 triton

啟動之后,我們可以看到以下輸出,表明我們已經啟動完成。

使用下面的命令,檢查是否已經准備好了

root@oneflow-15:/workspace# curl -v localhost:8000/v2/health/ready
*   Trying 127.0.0.1:8000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8000 (#0)
> GET /v2/health/ready HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 0
< Content-Type: text/plain
< 
* Connection #0 to host localhost left intact

客戶端請求

請求例子

客戶端腳本如下,我們先讀取一張圖片的數據,然后轉換成 [ N, 3, -1, -1 ] 的格式,之后發送請求做分類。因為在模型配置文件中,我們指定了標簽信息的文件,所以我們可以在分類的時候指定是否獲取分類結果。在 InferRequestedOutput 類中,我們可以指定 class_count 參數,設置數量,表示獲取 topN 分類結果。

腳本有幾個步驟組成:設置客戶端,讀取數據,設置一次請求的輸入和輸出,發起請求,獲取結果,輸出結果。

import numpy as np
import tritonclient.http as httpclient
import torch
from PIL import Image


if __name__ == '__main__':
    triton_client = httpclient.InferenceServerClient(url='127.0.0.1:8000')

    image = Image.open('./cat.jpg')
    
    image = image.resize((224, 224), Image.ANTIALIAS)
    image = np.asarray(image)
    image = image / 255
    image = np.expand_dims(image, axis=0)
    image = np.transpose(image, axes=[0, 3, 1, 2])
    image = image.astype(np.float32)

    inputs = []
    inputs.append(httpclient.InferInput('INPUT__0', image.shape, "FP32"))
    inputs[0].set_data_from_numpy(image, binary_data=False)
    outputs = []
    # outputs.append(httpclient.InferRequestedOutput('OUTPUT__0', binary_data=False, class_count=3))  # class_count 表示 topN 分類
    outputs.append(httpclient.InferRequestedOutput('OUTPUT__0', binary_data=False))  # 獲取 1000 維的向量

    results = triton_client.infer('resnet50_pytorch', inputs=inputs, outputs=outputs)
    output_data0 = results.as_numpy('OUTPUT__0')
    print(output_data0.shape)
    print(output_data0)

以下是請求的結果,是一只貓 meow~

客戶端接口實例

因為 Triton 沒有提供相關的 API 文檔,我們只好自己看代碼了。

下面展示客戶端的其他接口使用方法。

import tritonclient.http as httpclient

if __name__ == '__main__':
    triton_client = httpclient.InferenceServerClient(url='127.0.0.1:8000')

    model_repository_index = triton_client.get_model_repository_index()
    server_meta = triton_client.get_server_metadata()
    model_meta = triton_client.get_model_metadata('resnet50_pytorch')
    model_config = triton_client.get_model_config('resnet50_pytorch')
    statistics = triton_client.get_inference_statistics()
    shm_status = triton_client.get_cuda_shared_memory_status()
    sshm_status = triton_client.get_system_shared_memory_status()
    
    server_live = triton_client.is_server_live()
    server_ready = triton_client.is_server_ready()
    model_ready = triton_client.is_model_ready('resnet50_pytorch')

    # 啟動命令: ./bin/tritonserver --model-store=/models --model-control-mode explicit --load-model resnet50_pytorch
    # Triton 允許我們使用客戶端去加載/卸載模型
    triton_client.unload_model('resnet50_pytorch')
    triton_client.load_model('resnet50_pytorch')
    
    triton_client.close()

    with httpclient.InferenceServerClient(url='127.0.0.1:8000'):
        pass

性能測量和優化

這一節會介紹 Triton 提供的性能相關的客戶端接口,客戶端工具,僅僅是介紹作用,沒有實操。下一節,我們將選擇其中一個工具進行性能調優。

Triton 提供了兩個接口,直接使用上面的 Python 客戶端就可以獲取到這些數據了。

  • metrics,Triton 以 Prometheus 的格式將測量的數據暴露出來。文檔
  • statistics,請求相關的統計數據。文檔

Triton 到底提供了哪些客戶端工具呢?熟練使用這些客戶端工具可以幫助我們做好性能測量和優化。從軟件演進的角度來看,下面的工具一個比一個更加自動化。

  • perf_analyzer,可以測量吞吐延遲等。文檔
  • model_analyzer,利用 perf_analyzer 來進行性能分析,測量 GPU 內存和利用率。倉庫
  • model_navigator,自動化部署模型。倉庫

Metrics

文檔:https://github.com/triton-inference-server/server/blob/main/docs/metrics.md

Metrics 提供了四類數據:GPU 使用率;GPU 內存情況;請求次數統計,請求延遲數據。其中 GPU 使用情況是每個 GPU 每秒的情況,因此向 metrics 接口獲取數據的時候,可以獲取到當前秒 GPU 的使用情況。

statistics

文檔:https://github.com/triton-inference-server/server/blob/main/docs/protocol/extension_statistics.md

Statistics 統計信息可以使用客戶端工具獲得,它記錄了從 Triton 啟動以來發生的所有活動。

性能測量工具 perf_analyzer

文檔:https://github.com/triton-inference-server/server/blob/main/docs/perf_analyzer.md

這個工具藏在哪里了呢?文檔也沒告訴你。我是在另一個項目中,看見了別人是怎么用的才知道的。

模型分析工具 model_analyzer

英偉達的開發者專門寫了一篇文章介紹這個工具:https://developer.nvidia.com/blog/maximizing-deep-learning-inference-performance-with-nvidia-model-analyzer/

model_analyzer 可以通過 pip 安裝,輸入 model-analyzer --help 我們可以看到如下輸出。model_analyzer 實際上是由三個子命令 (subcommand) 組成的。

root@oneflow-15:/workspace# model-analyzer --help
usage: model-analyzer [-h] [-q] [-v] [-m {online,offline}] {profile,analyze,report} ...

positional arguments:
  {profile,analyze,report}
                        Subcommands under Model Analyzer
    profile             Run model inference profiling based on specified CLI or config options.
    analyze             Collect and sort profiling results and generate data and summaries.
    report              Generate detailed reports for a single config

optional arguments:
  -h, --help            show this help message and exit
  -q, --quiet           Suppress all output except for error messages.
  -v, --verbose         Show detailed logs, messags and status.
  -m {online,offline}, --mode {online,offline}
                        Choose a preset configuration mode.

模型自動化部署 model_navigator

倉庫地址:https://github.com/triton-inference-server/model_navigator

官方的介紹稱這是一個自動化工具。第一步,會將模型轉換成可用的格式,並應用一些 Triton 后端優化。第二步,它使用 Triton Model Analyzer 來找到最好的模型配置,以提供性能。

性能測量

上一節我們介紹了有哪些客戶端接口和工具幫助我們做性能測量,這一節我們將選擇一個工具來實際測量一下模型的性能。NVIDIA 提供了三個工具,perf_analyzer, model_analyzer, model_nagivator。perf_analyzer 只能測量吞吐和延遲,model_analyzer 在這基礎上還可以獲得 GPU 內存和使用率。因此,這一節將采用 model_analyzer 來分析測量模型的性能。

安裝

英偉達的文檔中講到了如何安裝 model_analyzer: https://github.com/triton-inference-server/model_analyzer/blob/main/docs/install.md

不過其實有點小坑。文檔中說你可以通過拉取 Docker,在 Docker 中使用 model_analyzer。你可以拉取到 tritonserver:21.10-py3-sdk 這個鏡像,但是在這個鏡像里面沒有 tritonserver,而 model_analyzer 使用本地模式需要依賴 tritonserver,所以這種方式可以說你根本就沒安裝hhh

這里我們直接進入 docker 里面,使用 pip 進行安裝,文檔說要安裝 DCGM,在 docker 里面早就裝好了,別聽他的。

nvidia-docker run --rm --runtime=nvidia --shm-size=2g --network=host -it --name triton-server -v `pwd`:/triton nvcr.io/nvidia/tritonserver:21.10-py3 bash
pip3 install triton-model-analyzer -i https://pypi.tuna.tsinghua.edu.cn/simple

測量

運行下面的命令,測量指定模型

model-analyzer profile --model-repository /triton/triton/quick/ --profile-models resnet50_pytorch

接下來就會遇到錯誤:

2021-11-17 13:58:54.831 INFO[perf_analyzer.py:258] Running perf_analyzer ['perf_analyzer', '-m', 'resnet50_pytorch_i5', '-b', '1', '-u', 'localhost:8001', '-i', 'grpc', '--concurrency-range', '1', '--measurement-mode', 'count_windows'] failed with exit status 1 : error: failed to create concurrency manager: input INPUT__0 contains dynamic shape, provide shapes to send along with the request

因為我們的模型使用了 dynamic shape,所以導致 triton 不知道應該發送怎么樣的向量給 server。所以這里我們把 shape 從 [3, -1, -1] 改為 [3, 224, 224] 就好。model_analyzer 會設置 \(2^n\) 的並發度做性能測試,這個 concurrency 我猜測應該是線程數量。之后會不斷提高模型實例的數量來測,直到 GPU 利用率或者顯存滿了。另外會分別再測試一組是否開啟 dynamic batching 這個選項,之后還會測試 preferred batch size 大小。

輸入上面的命令,重新啟動測試。之后需要挺長時間的,先睡個覺吧。

測試好了之后,先輸入下面的命令安裝依賴。生成分析報告和詳細報告。

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb
apt update
apt install ./wkhtmltox_0.12.6-1.focal_amd64.deb -f
mkdir analysis_results
model-analyzer analyze --analysis-models resnet50_pytorch -e analysis_results
model-analyzer report --report-model-configs resnet50_pytorch_i15,resnet50_pytorch_i30 -e analysis_results

model_analyzer 會嘗試搜索兩種不同的配置,一種是最小化延遲的 online mode,一種是最大化吞吐的 offline mode。默認情況下搜索延遲最小化的方案。

model_analyzer 相關鏈接

model_analyzer 通過暴力搜索選項來找到最好的配置,這些選項有些是 triton 自動配置的,一些是需要你手動配置才會搜索的。

更多的模型配置選項可以參考這個 模型配置搜索文檔

上面那個文檔的缺點就是沒有告訴你啟動的時候,怎么才可以使用那些配置文件,所以你需要去翻一翻這個 CLI 文檔

詳細報告

我們可以看看 online mode 下,最好的兩個配置的詳細報告。因為這是個多目標優化問題,所以究竟該選擇怎么樣的配置取決於業務場景的約束。triton 對這個的處理過於簡單,比如 online mode 直接選擇延遲最小的那個配置。實際上是因為這個問題和業務場景太相關,並且需要的配置項太多了,以至於只能簡化處理。復雜的邏輯、業務相關的邏輯需要交給用戶自己去做選擇。

Server: Preferred Batch size 2, Instance Group 1/GPU

Server: Preferred Batch size 16, Instance Group 1/GPU

至此,基本的流程已經走完了。下面是其他相關東西的簡介。

性能調優選項和指標

選項

上面 model_analyzer 在幫我們測量性能的時候,會嘗試搜索不同配置下的性能。影響性能的選項有哪些呢?

  • Instance Group,每個設備上使用多少個模型實例。模型實例占內存,但可以提高利用率
  • Dynamic Batching,是否開啟 batching。將請求積攢到一定數量后,再做推理。
  • Preferred Batch Sizes,可以設置不同的數值,在一定的排隊時間內,如果達到了其中一個數值,就馬上做請求,而不用等待其他請求。
  • Model Rate Limiter,約束模型的執行。
  • Model Queue Policy,排隊時間等待策略。
  • Model Warmup,避免第一次啟動的延遲。
  • Model Response Cache,這是最近增加的特性,是否開啟緩存。如果遇到了相同的請求,就會使用緩存。

指標

Serving 在不同的場景,需要不同的優化目標。目標是多個的,復雜的,並不是那么的單一。大家都想最小化延遲的同時,又要最大化吞吐。目標嚴重依賴於應用場景,因此只有確立目標,才可以往那個方向盡可能的優化。

  • 延遲
  • 吞吐
  • GPU 利用率
  • GPU 內存占用
  • GPU 功耗
  • 業務相關的指標:比如在盡可能少的設備上放盡可能多的模型

Triton 其他特性簡介

模型熱更新

在啟動 tritonserver 的時候,帶上選項 --model-control-mode=poll 就可以啟動模型熱更新了。另外還可以指定 --repository-poll-secs 設置輪詢模型倉庫的時間。

Agent

https://www.cnblogs.com/zzk0/p/15553394.html

Agent 擴展了 Triton 在加載卸載 “模型” 時候的功能。比如可以在加載模型的時候,進行 md5 校驗。再比如對模型進行解密。

Rate Limiter

https://www.cnblogs.com/zzk0/p/15542015.html

從效果上來說,Rate Limiter 的作用是限制了請求分發到模型實例上。從實現上來說,Rate Limiter 引入了 “Resource” 的概念,表示一個模型實例需要的資源,當系統中存在足夠的資源,這個模型就會執行。如果資源不夠,那么一個請求需要等待其他模型實例釋放資源。最終的表現就是好像限制了速度一樣。

Model Warmup

https://www.cnblogs.com/zzk0/p/15538894.html

啟動的時候進行一次前向傳播,Warmup。避免來自客戶端的第一次請求因為 Backend 啟動造成的延遲。

很簡單,在 config.pbtxt 中加入以下配置即可,不過模型的輸入名字,輸入的向量維度需要按照需要進行適當調整。

model_warmup  [
  {
    name: "random_input"
    batch_size: 1
    inputs: {
      key: "INPUT0"
      value: {
        data_type: TYPE_FP32
        dims: [224, 224, 3]
        random_data: true
      }
    }
  }
]

Stateful Model

https://www.cnblogs.com/zzk0/p/15510825.html

Sequence Batching,將來自同一批的請求定向到同一個模型實例,以保證模型的狀態可以持續更新。Python Backend 也支持 Stateful Model(ps. 第一次在 issue 里面嘗試回答問題,幫助他人。結果翻車了hhh

Ensemble Model

https://www.cnblogs.com/zzk0/p/15517120.html

模型流水線(pipeline),將模型的輸入輸出串聯起來。不過因為模型配置的方式太過於死板,不能支持靈活的數據格式、不能支持控制流,這種方式不能很好的支持業務需要,此時可以嘗試使用 Python Backend。

perf_analyzer 的使用

具體使用參考文檔:https://github.com/triton-inference-server/server/blob/main/docs/perf_analyzer.md

使用下面命令啟動 Docker。

docker run --rm --runtime=nvidia --shm-size=2g --network=host -it --name triton-server-sdk -v `pwd`:/triton nvcr.io/nvidia/tritonserver:21.10-py3-sdk bash

性能測量:

perf_analyzer -m resnet50_pytorch --shape INPUT__0:3,224,224  # 數字之間不要有空格
perf_client  # 就是 perf_analyzer

常用參數:

  • --percentile=95,一般置信度是和置信區間一起使用的,比如結果落在某個置信區間上的概率是 95% 這樣子。這里的置信度應該是有別於 “置信區間的置信度” 的。它是用來測量延遲的,如果沒有指定,會使用所有的請求算延遲的平均值,如果指定了,那么會使用 95% 的請求來計算。(至於是哪個 95% 文檔沒說,應該是去掉高的和低的,中間的 95%)
  • --concurrency-range 1:4,concurrency 表示並行度,每次請求需要等待服務器響應才會開始下一次。並行度為 4,則表示會同時有四個請求一起發送,一起等待,這樣子。這個參數將會使用 1 到 4 的並行度去測量吞吐和延遲。
  • -f perf.csv,輸出 CSV
  • --shape INPUT__0:3,224,224,設定輸入的測試數據形狀。

其他參數使用 -h 選項查看吧。

問:perf_analyzer 是如何測量的?

測區間內的吞吐和延遲,不斷重復直到獲得一個穩定的值。什么是穩定?從 --stability-percentage 的幫助信息我們可以看到,“最近三次的測量都在穩定值范圍內” 判定為穩定。另外還要看 --percentile 這個參數,因為需要使用這個參數來計算延遲,比如指定了 95,那么會使用 95% 的請求來計算參數。

下面附上 resnet50 的單個模型實例壓測數據,單個模型實例,放在 0 號 gpu 上,gpu 是 V100:

Inferences/Second vs. Client Average Batch Latency
Concurrency: 1, throughput: 68.4 infer/sec, latency 14600 usec
Concurrency: 2, throughput: 119.6 infer/sec, latency 16677 usec
Concurrency: 3, throughput: 252.6 infer/sec, latency 11868 usec
Concurrency: 4, throughput: 287.4 infer/sec, latency 13893 usec

Custom Operations

自定義算子,自定義 layer:https://github.com/triton-inference-server/server/blob/main/docs/custom_operations.md

如果 Backend 支持自定義算子、layer,可以通過設置 LD_PRELOAD 環境變量的方式來預加載。

Model Configuration

https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md

輸入輸出形狀

  • -1 表示可變
  • shape 的 rank >= 1,即不允許 0-dim 向量
  • max_batch_size 會和聲明的 shape 組成輸入
  • 不支持 batching 的 backend, max_batch_size 必須為 0
  • reshape,可以將 triton 接收的輸入變成模型需要的輸入。可以將 [batch-size, 1] 變成 [batch-size]。前者的產生是因為 triton 不支持 0-dim 向量,后者是模型需要的。通過設置 reshape: { shape: [] } 來去掉多余的維度。
  • is_shape_tensor: 看文檔的意思,客戶端請求的時候,不需要帶上 batch 維度,triton 會將 batch 維填充到 shape tensor 前。
  • allow_ragged_batch: 輸入的向量形狀可以不一樣

batching

  • dynamic_batching,開啟 batching
  • preferred_batch_size,設置大小,當達到其中一個大小,就馬上進行推理
  • max_queue_delay_microseconds,batching 的排隊等待時間

instance group

  • 默認情況下,每個 gpu 都有模型實例,指定 gpu 則不會每個 gpu 都開模型實例。
  • Name, Platform and Backend,名字要和文件夾對上,platform 和 backend 取決於后端是否在 triton 的列表中

For TensorRT, 'backend' must be set to tensorrt or 'platform' must be set to tensorrt_plan.
For PyTorch, 'backend' must be set to pytorch or 'platform' must be set to pytorch_libtorch.
For ONNX, 'backend' must be set to onnxruntime or 'platform' must be set to onnxruntime_onnx.
For TensorFlow, 'platform must be set to tensorflow_graphdef or tensorflow_savedmodel. Optionally 'backend' can be set to tensorflow.
For all other backends, 'backend' must be set to the name of the backend and 'platform' is optional.

model control mode

https://github.com/triton-inference-server/server/blob/main/docs/model_management.md

啟動的時候,指定 --model-control-mode 設置模型控制模式。

  • NONE,默認啟動所有的模型。
  • EXPLICIT,可以使用客戶端來啟動、卸載模型。啟動的時候,可以帶上參數 --load-model 設置需要加載的模型
  • POLL,模型熱更新。

ragged batching

https://github.com/triton-inference-server/server/blob/main/docs/ragged_batching.md

允許將不同形狀的輸入組成一個 batch。出發點是,變長輸入,在客戶端發送請求的時候,需要 padding。為了避免 padding,triton 提供了相關的選項允許客戶端發送變長的輸入。

這些變長的輸入會組成一個向量。比如 [1, 3], [1, 4], [1, 5] 三個向量會變成一個 [12] 的一維向量,並且 triton 提供了一個額外的輸入 INDEX(名字可以自定義) 來保存額外的信息,以重建原始的輸入。這個額外的輸入有四種模式。

比如 BATCH_ACCUMULATED_ELEMENT_COUNT 模式,INDEX 可以是 [3, 7, 12] 這樣的一個向量,表示每個輸入向量結束的位置。(這個下標應該是從 1 開始的hhh,在模型的配置文件中可以看到 BATCH_ACCUMULATED_ELEMENT_COUNT_WITH_ZERO 開始是 0, BATCH_ACCUMULATED_ELEMENT_COUNT 開始是 1.

另外還有兩種模式,BATCH_ELEMENT_COUNT 表示 INDEX 的元素表示每個輸入的大小。BATCH_MAX_ELEMENT_COUNT_AS_SHAPE INDEX 將表示輸入向量的最大值。

Shared Memory

https://github.com/triton-inference-server/server/blob/main/docs/protocol/extension_shared_memory.md

Shared Memory 允許客戶端使用共享內存的數據,無需通過 HTTP 或者 gRPC 來進行數據通信。共享內存需要注冊、注銷操作,另外還可以獲取狀態。

模型放置

這個其實就是 instance group 的作用,比如下面的配置,將會在 2,3 兩張卡上各放置一個模型。

instance_group [
  {
    count: 1
    kind: KIND_GPU
    gpus: [ 2, 3 ]
  }
]

總結

這篇文章前半部分是一個上手介紹,包括導出模型、部署到 Triton、性能測量等。后半部分是 Triton 中一些瑣碎的細節,主要是模型配置的細節,而不少細節是服務於實際業務需求的,這一點一定要想明白。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM