1. Docker Image

perf_analyzer를 사용하기 위해서는 nvcr.io/nvidia/tritonserver:<RELEASE>-py3-sdk를 사용해야 한다. 인퍼런스 서버 구성을 위해서는 sdk가 붙지 않은 버전을 이용해도 문제가 없으나 해당 버전들에서는 perf_analyzer를 위한 환경이 구성되어 있지 않아 권장되지 않는다.

  • <RELEASE>는 23.03 이후 버전만 가능하다.

2. Docker Compose로 구성해서 사용하기

triton_server:
    image: nvcr.io/nvidia/tritonserver:23.08-py3
    networks:
        - tis_net
    
    ports:
      - 8000:8000 # HTTP 포트

인퍼런스를 담당하는 서버의 http나 grpc 중 사용하는 포트를 원하는 포트로 바인딩 해주면 된다. 같은 네트워크 내에선 크게 문제 없이 사용할 수 있다. 해당 예제에서는 tis_net이라는 이름으로 네트워크를 만들어서 할당해 주었다. perf_analyzer에게도 같은 네트워크를 할당해 통신 할 수 있게 했다.

 perf_analyzer:
    image: nvcr.io/nvidia/tritonserver:23.08-py3-sdk
    networks:
        - tis_net
    
    volumes:
    - ./dataset:/workspace/dataset
    
    entrypoint: "/bin/bash"

sdk 이미지를 사용해서 컨테이너를 실행하면 기본 위치는 workspace이다. 랜덤 값을 이용해 성능 테스트를 할 예정이 아니기에 인풋데이터를 마운트해서 사용하다.

3. perf_analyzer 사용하기

perf_analyzer -m <model_name> -u <triton_server_url:port>

위 형태가 가장 기본적인 사용 형태이다. <model_name>에는 성능 분석을 하고자하는 모델의 이름을 넣으면 된다. -u옵션은 트리톤 서버의 주소를 입력하는 옵션이다. <triton_server_url>에는 docker compose로 구성을 전제하면 인퍼런스 서버를 담당하는 컨데이터 이름을 넣어주면 된다. <port>에는 현재 예제에서는 http를 이용할 예정이기 때문에 8000을 입력하면 된다.

모델 구성에 따라서는 명시적인 인풋이 필요한 경우가 있다. 그 경우에는 뒤에 --input-data <JSON File>을 추가해주면 된다. dataset/input.json에 내용이 구성되어 있다면 다음과 같은 명령어를 입력하면 된다.

perf_analyzer -m <model_name> -u <triton_server_url:port> --input-data dataset/input.json

--input-data는 명령어를 실행하는 위치에서 상대 경로로 입력하거나 절대 경로를 이용해 사용할 수 있다.

input.json 구성하기

입력을 위한 JSON 파일은 사용하는 모델의 최초 인풋에 맞춰 구성하면 된다. 나의 경우 별도 마운트 된 볼륨에 저장되는 파일을 읽어 인퍼런스를 하는 형태를 취해 아래와 같은 인풋 구조가 필요했다.

input [
    {
        name: "data_path"
        data_type: TYPE_STRING
        dims: [-1]
    },
    {
        name: "age"
        data_type: TYPE_FP32
        dims: [-1]
    },
    {
        name: "gender"
        data_type: TYPE_FP32
        dims: [-1]
    },
    {
        name: "name"
        data_type: TYPE_STRING
        dims: [-1]
    }
]

이런 형태의 인풋을 받는 경우 라면 다음과 같이 구성하면 된다.

{
    "data":
    [
        {
            "data_path":["file_path"],
            "age": [32.0],
            "gender": [0.0],
            "name":["kim"]
        }
    ]
}

이 처럼 단건의 내용만 있거나 배열 형태로 여러 데이터를 추가해도 된다. 인풋에 정의한것과 동일한 데이터 형으로 내용을 구성하면된다.

이렇게 데이터를 줂비해서 3절에 있는 명령어를 입력해도 실행이 되지 않고 오류를 만나게 된다.

error: Failed to init manager inputs: The variable-sized tensor "age" with model shape [-1] needs to have its shape fully defined. See the --shape option.

이유는 인풋을 구성을 보면 dims:[-1]로 되어있다. 그래서 명시적인 차원을 --shape 옵션으로 요구하는 것이다.

–shape

perf_analyzer -m <model_name> -u <triton_server_url:port> --input-data dataset/input.json  --shape age:1 --shape gender:1 --shape name:1 --shape data_path:1

--shape 옵션은 각 인풋 변수의 이름을 적고 해당 콜른(:) 뒤에 차원을 기재하면 된다. 즉 --shape input_0:dim --shape input_1 dim ... input_9:dim 이런 형태로 사용하면 된다.