확장 가능한 TensorFlow 추론 시스템 배포

Last reviewed 2023-11-02 UTC

이 문서에서는 확장 가능한 TensorFlow 추론 시스템에 설명된 참조 아키텍처를 배포하는 방법을 설명합니다.

이 시리즈는 TensorFlow 및 NVIDIA TensorRT를 포함하여 Google Kubernetes Engine 및 머신러닝(ML) 프레임워크에 익숙한 개발자를 대상으로 합니다.

이 배포를 완료한 후에는 TensorFlow 추론 시스템의 성능 측정 및 조정을 참조하세요.

아키텍처

다음 다이어그램은 추론 시스템의 아키텍처를 보여줍니다.

추론 시스템의 아키텍처입니다.

Cloud Load Balancing은 가장 가까운 GKE 클러스터로 요청 트래픽을 전송합니다. 클러스터에는 각 노드에 대한 포드가 포함됩니다. 각 포드에서 Triton 추론 서버는 추론 서비스(ResNet-50 모델 지원)를 제공하고 NVIDIA T4 GPU는 성능을 향상시켜 줍니다. 클러스터의 모니터링 서버는 GPU 사용률 및 메모리 사용량에 대한 측정항목 데이터를 수집합니다.

자세한 내용은 확장 가능한 TensorFlow 추론 시스템을 참조하세요.

목표

  • 사전 학습된 ResNet-50 모델 다운로드 및 TensorRT(TF-TRT)와 TensorFlow 통합을 사용하여 최적화 적용
  • NVIDIA Triton 추론 서버에서 ResNet-50 모델 지원
  • PrometheusGrafana를 사용하여 Triton의 모니터링 시스템 빌드
  • Locust를 사용하여 부하 테스트 도구 빌드

비용

이 배포에서는 NVIDIA T4 GPU 외에도 다음 청구 가능한 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.

이 배포를 마친 후에 만든 리소스를 삭제하지 마세요. 배포를 측정하고 조정할 때 이러한 리소스가 필요합니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE API.

    Enable the API

TF-TRT를 사용하여 최적화된 모델 빌드

이 섹션에서는 작업 환경을 만들고 사전 학습된 모델을 최적화합니다.

사전 학습된 모델은 gs://cloud-tpu-test-datasets/fake_imagenet/에서 가짜 데이터 세트를 사용합니다. 또한 gs://solutions-public-assets/tftrt-tutorial/resnet/export/1584366419/의 Cloud Storage 위치에 사전 학습된 모델의 복사본이 있습니다.

작업 환경 만들기

작업 환경을 위해서는 Deep Learning VM Image를 사용해서 Compute Engine 인스턴스를 만듭니다. 이 인스턴스에서 TensorRT로 ResNet-50 모델을 최적화하고 양자화합니다.

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. working-vm이라는 인스턴스를 배포합니다.

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone us-west1-b
    gcloud compute instances create working-vm \
        --scopes cloud-platform \
        --image-family common-cu113 \
        --image-project deeplearning-platform-release \
        --machine-type n1-standard-8 \
        --min-cpu-platform="Intel Skylake" \
        --accelerator=type=nvidia-tesla-t4,count=1 \
        --boot-disk-size=200GB \
        --maintenance-policy=TERMINATE \
        --metadata="install-nvidia-driver=True"
    

    PROJECT_ID를 이전에 만든 Google Cloud 프로젝트의 ID로 바꿉니다.

    이 명령어는 NVIDIA T4를 사용해서 Compute Engine 인스턴스를 실행합니다. 처음 부팅할 때 TensorRT 5.1.5와 호환되는 NVIDIA GPU 드라이버가 자동으로 설치됩니다.

다른 최적화로 모델 파일 만들기

이 섹션에서는 TF-TRT를 사용하여 원래의 ResNet-50 모델에 다음 최적화를 적용합니다.

  • 그래프 최적화
  • 그래프 최적화를 사용하여 FP16으로 변환
  • 그래프 최적화와 INT8을 사용하여 양자화

이러한 최적화에 대한 자세한 내용은 성능 최적화를 참조하세요.

  1. Google Cloud 콘솔에서 Compute Engine > VM 인스턴스로 이동합니다.

    VM 인스턴스로 이동

    앞에서 만든 working-vm 인스턴스가 표시됩니다.

  2. 인스턴스의 터미널 콘솔을 열려면 SSH를 클릭합니다.

    이 터미널을 사용해서 이 문서의 나머지 명령어를 실행합니다.

  3. 터미널에서 필요한 저장소를 복제하고 현재 디렉터리를 변경합니다.

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/gke-tensorflow-inference-system-tutorial
    cd gke-tensorflow-inference-system-tutorial/server
    
  4. 사전 학습된 ResNet-50 모델을 로컬 디렉터리로 다운로드합니다.

    mkdir -p models/resnet/original/00001
    gcloud storage cp gs://solutions-public-assets/tftrt-tutorial/resnet/export/1584366419/* models/resnet/original/00001 --recursive
    
  5. TF-TRT용 최적화 도구가 포함된 컨테이너 이미지를 빌드합니다.

    docker build ./ -t trt-optimizer
    docker image list
    

    마지막 명령어는 저장소 테이블을 표시합니다.

  6. 테이블의 tft-optimizer 저장소 행에서 이미지 ID를 복사합니다.

  7. 원본 모델에 최적화(그래프 최적화, FP16으로 변환, INT8을 사용하여 양자화)를 적용합니다.

    export IMAGE_ID=IMAGE_ID
    
    nvidia-docker run --rm \
        -v `pwd`/models/:/workspace/models ${IMAGE_ID} \
        --input-model-dir='models/resnet/original/00001' \
        --output-dir='models/resnet' \
        --precision-mode='FP32' \
        --batch-size=64
    
    nvidia-docker run --rm \
        -v `pwd`/models/:/workspace/models ${IMAGE_ID} \
        --input-model-dir='models/resnet/original/00001' \
        --output-dir='models/resnet' \
        --precision-mode='FP16' \
        --batch-size=64
    
    nvidia-docker run --rm \
        -v `pwd`/models/:/workspace/models ${IMAGE_ID} \
        --input-model-dir='models/resnet/original/00001' \
        --output-dir='models/resnet' \
        --precision-mode='INT8' \
        --batch-size=64 \
        --calib-image-dir='gs://cloud-tpu-test-datasets/fake_imagenet/' \
        --calibration-epochs=10
    

    IMAGE_ID를 이전 단계에서 복사한 tft-optimizer의 이미지 ID로 바꿉니다.

    --calib-image-dir 옵션은 사전 학습된 모델에 사용된 학습 데이터의 위치를 지정합니다. 동일한 학습 데이터가 INT8 양자화를 위한 보정에 사용됩니다. 보정 프로세스는 약 5분 정도 걸릴 수 있습니다.

    명령어 실행이 완료되면 마지막 출력 줄이 다음과 비슷하게 표시되고, 최적화된 모델은 ./models/resnet에 저장됩니다.

    INFO:tensorflow:SavedModel written to: models/resnet/INT8/00001/saved_model.pb
    

    디렉터리 구조는 다음과 비슷합니다.

    models
    └── resnet
        ├── FP16
        │   └── 00001
        │       ├── saved_model.pb
        │       └── variables
        ├── FP32
        │   └── 00001
        │       ├── saved_model.pb
        │       └── variables
        ├── INT8
        │   └── 00001
        │       ├── saved_model.pb
        │       └── variables
        └── original
            └── 00001
                ├── saved_model.pb
                └── variables
                    ├── variables.data-00000-of-00001
                    └── variables.index
    

다음 표에는 디렉터리와 최적화 간의 관계가 요약되어 있습니다.

디렉터리 최적화
FP16 그래프 최적화 외에 FP16으로 변환
FP32 그래프 최적화
INT8 그래프 최적화 외에 INT8을 사용한 양자화
original 원본 모델(TF-TRT를 사용한 최적화 없음)

추론 서버 배포

이 섹션에서는 5개 모델로 Triton 서버를 배포합니다. 먼저 이전 섹션에서 만든 모델 바이너리를 Cloud Storage에 업로드합니다. 그런 다음 GKE 클러스터를 만들고 클러스터에 Triton 서버를 배포합니다.

모델 바이너리 업로드

  • SSH 터미널에서 모델 바이너리와 config.pbtxt 구성 파일을 스토리지 버킷에 업로드합니다.

    export PROJECT_ID=PROJECT_ID
    export BUCKET_NAME=${PROJECT_ID}-models
    
    mkdir -p original/1/model/
    cp -r models/resnet/original/00001/* original/1/model/
    cp original/config.pbtxt original/1/model/
    cp original/imagenet1k_labels.txt original/1/model/
    
    mkdir -p tftrt_fp32/1/model/
    cp -r models/resnet/FP32/00001/* tftrt_fp32/1/model/
    cp tftrt_fp32/config.pbtxt tftrt_fp32/1/model/
    cp tftrt_fp32/imagenet1k_labels.txt tftrt_fp32/1/model/
    
    mkdir -p tftrt_fp16/1/model/
    cp -r models/resnet/FP16/00001/* tftrt_fp16/1/model/
    cp tftrt_fp16/config.pbtxt tftrt_fp16/1/model/
    cp tftrt_fp16/imagenet1k_labels.txt tftrt_fp16/1/model/
    
    mkdir -p tftrt_int8/1/model/
    cp -r models/resnet/INT8/00001/* tftrt_int8/1/model/
    cp tftrt_int8/config.pbtxt tftrt_int8/1/model/
    cp tftrt_int8/imagenet1k_labels.txt tftrt_int8/1/model/
    
    mkdir -p tftrt_int8_bs16_count4/1/model/
    cp -r models/resnet/INT8/00001/* tftrt_int8_bs16_count4/1/model/
    cp tftrt_int8_bs16_count4/config.pbtxt tftrt_int8_bs16_count4/1/model/
    cp tftrt_int8_bs16_count4/imagenet1k_labels.txt tftrt_int8_bs16_count4/1/model/
    
    gcloud storage buckets create gs://${BUCKET_NAME}
    gcloud storage cp original tftrt_fp32 tftrt_fp16 tftrt_int8 tftrt_int8_bs16_count4 \
        gs://${BUCKET_NAME}/resnet/ --recursive
    

    PROJECT_ID를 이전에 만든 Google Cloud 프로젝트의 ID로 바꿉니다.

    다음 조정 매개변수는 config.pbtxt 파일에 지정됩니다.

    • 모델 이름
    • 입력 텐서 이름 및 출력 텐서 이름
    • 각 모델에 GPU 할당
    • 인스턴스 그룹의 일괄 처리 크기 및 개수

    예를 들어 original/1/model/config.pbtxt 파일에는 다음 콘텐츠가 포함됩니다.

    name: "original"
    platform: "tensorflow_savedmodel"
    max_batch_size: 64
    input {
        name: "input"
        data_type: TYPE_FP32
        format: FORMAT_NHWC
        dims: [ 224, 224, 3 ]
    }
    output {
        name: "probabilities"
        data_type: TYPE_FP32
        dims: 1000
        label_filename: "imagenet1k_labels.txt"
    }
    default_model_filename: "model"
    instance_group [
      {
        count: 1
        kind: KIND_GPU
      }
    ]
    dynamic_batching {
      preferred_batch_size: [ 64 ]
      max_queue_delay_microseconds: 20000
    }
    

배치 크기 및 인스턴스 그룹 수에 대한 자세한 내용은 성능 최적화를 참조하세요.

다음 표에는 이 섹션에서 배포한 5가지 모델이 요약되어 있습니다.

모델 이름 최적화
original 원본 모델(TF-TRT를 사용한 최적화 없음)
tftrt_fp32 그래프 최적화
(배치 크기=64, 인스턴스 그룹=1)
tftrt_fp16 그래프 최적화 외에 FP16으로 변환
(배치 크기=64, 인스턴스 그룹=1)
tftrt_int8 그래프 최적화 외에 INT8을 사용한 양자화
(배치 크기=64, 인스턴스 그룹=1)
tftrt_int8_bs16_count4 그래프 최적화 외에 INT8을 사용한 양자화
(배치 크기=16, 인스턴스 그룹=4)

Triton을 사용하여 추론 서버 배포

  1. SSH 터미널에서 GKE 클러스터를 관리하는 인증 패키지를 설치 및 구성합니다.

    export USE_GKE_GCLOUD_AUTH_PLUGIN=True
    sudo apt-get install google-cloud-sdk-gke-gcloud-auth-plugin
    
  2. NVIDIA T4 GPU를 사용하는 컴퓨팅 노드를 사용해서 GKE 클러스터 및 GPU 노드 풀을 만듭니다.

    gcloud auth login
    gcloud config set compute/zone us-west1-b
    gcloud container clusters create tensorrt-cluster \
        --num-nodes=20
    gcloud container node-pools create t4-gpu-pool \
        --num-nodes=1 \
        --machine-type=n1-standard-8 \
        --cluster=tensorrt-cluster \
        --accelerator type=nvidia-tesla-t4,count=1
    

    --num-nodes 플래그는 GKE 클러스터에 대해 20개 인스턴스를 지정하고 GPU 노드 풀 t4-gpu-pool에 대해 하나의 인스턴스를 지정합니다.

    GPU 노드 풀은 NVIDIA T4 GPU가 있는 단일 n1-standard-8 인스턴스로 구성됩니다. NVIDIA T4 GPU는 동일한 인스턴스의 여러 포드에서 공유될 수 없으므로 GPU 인스턴스의 수는 추론 서버 포드의 수보다 크거나 같아야 합니다.

  3. 클러스터 정보를 표시합니다.

    gcloud container clusters list
    

    출력은 다음과 비슷합니다.

    NAME              LOCATION    MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION    NUM_NODES  STATUS
    tensorrt-cluster  us-west1-b  1.14.10-gke.17  XX.XX.XX.XX    n1-standard-1  1.14.10-gke.17  21         RUNNING
    
  4. 노드 풀 정보를 표시합니다.

    gcloud container node-pools list --cluster tensorrt-cluster
    

    출력은 다음과 비슷합니다.

    NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
    default-pool  n1-standard-1  100           1.14.10-gke.17
    t4-pool       n1-standard-8  100           1.14.10-gke.17
    
  5. daemonSet 워크로드를 사용 설정합니다.

    gcloud container clusters get-credentials tensorrt-cluster
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    

    이 명령어는 GPU 노드 풀의 노드에 NVIDIA GPU 드라이버를 로드합니다. 또한 GPU 노드 풀에 새 노드를 추가할 때 드라이버를 자동으로 로드합니다.

  6. 클러스터에 추론 서버를 배포합니다.

    sed -i.bak "s/YOUR-BUCKET-NAME/${PROJECT_ID}-models/" trtis_deploy.yaml
    kubectl create -f trtis_service.yaml
    kubectl create -f trtis_deploy.yaml
    
  7. 서비스가 사용 가능해질 때까지 몇 분 정도 기다립니다.

  8. Triton의 clusterIP 주소를 가져와서 환경 변수에 저장합니다.

    export TRITON_IP=$(kubectl get svc inference-server \
      -o "jsonpath={.spec['clusterIP']}")
    echo ${TRITON_IP}
    

이 때 추론 서버가 다른 최적화를 사용하여 모델 파일 만들기 섹션에서 만든 4개의 ResNet-50 모델을 제공합니다. 클라이언트가 추론 요청을 전송할 때 사용할 모델을 지정할 수 있습니다.

Prometheus 및 Grafana로 모니터링 서버 배포

  1. SSH 터미널에서 클러스터에 Prometheus 서버를 배포합니다.

    sed -i.bak "s/CLUSTER-IP/${TRITON_IP}/" prometheus-configmap.yml
    kubectl create namespace monitoring
    kubectl apply -f prometheus-service.yml -n monitoring
    kubectl create -f clusterRole.yml
    kubectl create -f prometheus-configmap.yml -n monitoring
    kubectl create -f prometheus-deployment.yml -n monitoring
    
  2. Prometheus 서비스의 엔드포인트 URL을 가져옵니다.

    ip_port=$(kubectl get svc prometheus-service \
      -o "jsonpath={.spec['clusterIP']}:{.spec['ports'][0]['port']}" -n monitoring)
    echo "http://${ip_port}"
    

    나중에 Grafana를 구성하는 데 사용할 수 있도록 Prometheus 엔드포인트 URL을 기록해 둡니다.

  3. 클러스터에 Grafana 서버를 배포합니다.

    kubectl create -f grafana-service.yml -n monitoring
    kubectl create -f grafana-deployment.yml -n monitoring
    
  4. 모든 서비스가 사용 가능해질 때까지 몇 분 정도 기다립니다.

  5. Grafana 서비스의 엔드포인트 URL을 가져옵니다.

    ip_port=$(kubectl get svc grafana-service \
      -o "jsonpath={.status['loadBalancer']['ingress'][0]['ip']}:{.spec['ports'][0]['port']}" -n monitoring)
    echo "http://${ip_port}"
    

    다음 단계에서 사용할 수 있도록 Grafana 엔드포인트 URL을 기록해 둡니다.

  6. 웹브라우저에서 이전 단계에서 확인한 Grafana URL로 이동합니다.

  7. 기본 사용자 ID와 비밀번호(adminadmin)를 사용해서 로그인합니다. 메시지가 표시되면 기본 비밀번호를 변경합니다.

  8. 첫 번째 데이터 소스 추가를 클릭하고 시계열 데이터베이스 목록에서 Prometheus를 선택합니다.

  9. 설정 탭의 URL 필드에서 앞에서 확인한 Prometheus 엔드포인트 URL을 입력합니다.

  10. 저장 및 테스트를 클릭한 후 홈 화면으로 돌아갑니다.

  11. nv_gpu_utilization에 대해 모니터링 측정항목을 추가합니다.

    1. 첫 번째 대시보드 만들기를 클릭한 후 시각화 추가를 클릭합니다.
    2. 데이터 소스 목록에서 Prometheus를 선택합니다.
    3. 쿼리 탭의 측정항목 필드에 nv_gpu_utilization을 입력합니다.

    4. 패널 옵션 섹션의 제목 필드에 GPU Utilization을 입력한 후 적용을 클릭합니다.

      페이지에 GPU 사용률 패널이 표시됩니다.

  12. nv_gpu_memory_used_bytes에 대해 모니터링 측정항목을 추가합니다.

    1. 추가를 클릭하고 시각화를 선택합니다.
    2. 쿼리 탭의 측정항목 필드에 nv_gpu_memory_used_bytes를 입력합니다.

    3. 패널 옵션 섹션의 제목 필드에 GPU Memory Used를 입력한 후 저장을 클릭합니다.

  13. 대시보드를 추가하려면 대시보드 저장 패널에서 저장을 클릭합니다.

    GPU 사용률 및 사용된 GPU 메모리에 대한 그래프가 표시됩니다.

부하 테스트 도구 배포

이 섹션에서는 Locust 부하 테스트 도구를 GKE에 배포하고 워크로드를 생성하여 추론 서버의 성능을 측정합니다.

  1. SSH 터미널에서 Triton 클라이언트 라이브러리가 포함된 Docker 이미지를 빌드하고 이를 Container Registry에 업로드합니다.

    cd ../client
    git clone https://github.com/triton-inference-server/server
    cd server
    git checkout r19.05
    sed -i.bak "s/bootstrap.pypa.io\/get-pip.py/bootstrap.pypa.io\/pip\/2.7\/get-pip.py/" Dockerfile.client
    docker build -t tritonserver_client -f Dockerfile.client .
    gcloud auth configure-docker
    docker tag tritonserver_client \
        gcr.io/${PROJECT_ID}/tritonserver_client
    docker push gcr.io/${PROJECT_ID}/tritonserver_client
    

    빌드 프로세스는 약 5분 정도 걸릴 수 있습니다. 프로세스가 완료되면 명령 프롬프트가 SSH 터미널에 표시됩니다.

  2. 빌드 프로세스가 완료되면 테스트 워크로드를 생성하기 위해 Docker 이미지를 빌드하고, 이를 Container Registry에 업로드합니다.

    cd ..
    sed -i.bak "s/YOUR-PROJECT-ID/${PROJECT_ID}/" Dockerfile
    docker build -t locust_tester -f Dockerfile .
    docker tag locust_tester gcr.io/${PROJECT_ID}/locust_tester
    docker push gcr.io/${PROJECT_ID}/locust_tester
    

    명령어에서 YOUR-PROJECT-ID를 변경하거나 대체하지 마세요.

    이 이미지는 이전 단계에서 만든 이미지에서 빌드됩니다.

  3. Locust 파일 service_master.yamldeployment_master.yaml을 배포합니다.

    sed -i.bak "s/YOUR-PROJECT-ID/${PROJECT_ID}/" deployment_master.yaml
    sed -i.bak "s/CLUSTER-IP-TRTIS/${TRITON_IP}/" deployment_master.yaml
    
    kubectl create namespace locust
    kubectl create configmap locust-config --from-literal model=original --from-literal saddr=${TRITON_IP} --from-literal rps=10 -n locust
    
    kubectl apply -f service_master.yaml -n locust
    kubectl apply -f deployment_master.yaml -n locust
    

    configmap 리소스는 클라이언트가 추론 요청을 전송하는 머신러닝 모델을 지정하는 데 사용됩니다.

  4. 서비스가 사용 가능해질 때까지 몇 분 정도 기다립니다.

  5. locust-master 클라이언트의 clusterIP 주소를 가져와서 이 주소를 환경 변수에 저장합니다.

    export LOCUST_MASTER_IP=$(kubectl get svc locust-master -n locust \
        -o "jsonpath={.spec['clusterIP']}")
    echo ${LOCUST_MASTER_IP}
    
  6. Locust 클라이언트를 배포합니다.

    sed -i.bak "s/YOUR-PROJECT-ID/${PROJECT_ID}/" deployment_slave.yaml
    sed -i.bak "s/CLUSTER-IP-LOCUST-MASTER/${LOCUST_MASTER_IP}/" deployment_slave.yaml
    kubectl apply -f deployment_slave.yaml -n locust
    

    이 명령어는 테스트 워크로드를 생성하는 데 사용할 수 있는 Locust 클라이언트 pod 10개를 배포합니다. 현재 클라이언트 수로는 요청을 충분히 생성할 수 없다면 다음 명령어를 사용하여 pod 수를 변경하면 됩니다.

    kubectl scale deployment/locust-slave --replicas=20 -n locust
    

    기본 클러스터에 복제본 수를 늘리기 위한 충분한 용량이 없으면 GKE 클러스터의 노드 수를 늘리는 것이 좋습니다.

  7. Locust 콘솔의 URL을 복사한 후 웹브라우저에서 이 URL을 엽니다.

    export LOCUST_IP=$(kubectl get svc locust-master -n locust \
         -o "jsonpath={.status.loadBalancer.ingress[0].ip}")
    echo "http://${LOCUST_IP}:8089"
    

    Locust 콘솔이 열리고 이로부터 테스트 워크로드를 생성할 수 있습니다.

실행 중인 포드 확인

구성요소가 성공적으로 배포되었는지 확인하려면 포드가 실행 중인지 확인합니다.

  1. SSH 터미널에서 추론 서버 포드를 확인합니다.

    kubectl get pods
    

    출력은 다음과 비슷합니다.

    NAME                                READY   STATUS    RESTARTS   AGE
    inference-server-67786cddb4-qrw6r   1/1     Running   0          83m
    

    예상한 출력이 표시되 않으면 Triton을 사용하여 추론 서버 배포의 단계를 완료했는지 확인합니다.

  2. Locust 포드를 확인합니다.

    kubectl get pods -n locust
    

    출력은 다음과 비슷합니다.

    NAME                                READY   STATUS    RESTARTS   AGE
    locust-master-75f6f6d4bc-ttllr      1/1     Running   0          10m
    locust-slave-76ddb664d9-8275p       1/1     Running   0          2m36s
    locust-slave-76ddb664d9-f45ww       1/1     Running   0          2m36s
    locust-slave-76ddb664d9-q95z9       1/1     Running   0          2m36s
    

    예상한 출력이 표시되지 않으면 부하 테스트 도구 배포의 단계를 완료했는지 확인합니다.

  3. 모니터링 포드를 확인합니다.

    kubectl get pods -n monitoring
    

    출력은 다음과 비슷합니다.

    NAME                                     READY   STATUS    RESTARTS   AGE
    grafana-deployment-644bbcb84-k6t7v       1/1     Running   0          79m
    prometheus-deployment-544b9b9f98-hl7q8   1/1     Running   0          81m
    

    예상한 출력이 표시되지 않으면 Prometheus 및 Grafana를 사용하여 모니터링 서버 배포의 단계를 완료했는지 확인합니다.

이 시리즈의 다음 부분에서는 이 추론 서버 시스템을 사용하여 다양한 최적화가 성능을 어떻게 개선하는지와 이러한 최적화를 해석하는 방법을 알아봅니다. 다음 단계는 TensorFlow 추론 시스템의 성능 측정 및 조정을 참조하세요.

다음 단계