Dokumen ini menjelaskan cara men-deploy arsitektur referensi yang dijelaskan dalam Sistem inferensi TensorFlow yang skalabel.
Seri ini ditujukan bagi developer yang sudah memahami Google Kubernetes Engine dan framework machine learning (ML), termasuk TensorFlow dan NVIDIA TensorRT.
Setelah menyelesaikan deployment ini, lihat Mengukur dan menyesuaikan performa sistem inferensi TensorFlow.
Arsitektur
Diagram berikut menunjukkan arsitektur sistem inferensi.
Cloud Load Balancing mengirimkan traffic permintaan ke cluster GKE terdekat. Cluster berisi Pod untuk setiap node. Di setiap Pod, Server Inferensi Triton menyediakan layanan inferensi (untuk menayangkan model ResNet-50), dan GPU NVIDIA T4 meningkatkan performa. Server pemantauan di cluster mengumpulkan data metrik tentang penggunaan GPU dan penggunaan memori.
Untuk mengetahui detailnya, lihat Sistem inferensi TensorFlow yang skalabel.
Tujuan
- Download model ResNet-50 yang telah dilatih sebelumnya, dan gunakan integrasi TensorFlow dengan TensorRT (TF-TRT) untuk menerapkan pengoptimalan
- Menayangkan model ResNet-50 dari Server Inferensi NVIDIA Triton
- Membangun sistem pemantauan untuk Triton dengan menggunakan Prometheus dan Grafana
- Membuat alat pengujian beban menggunakan Locust
Biaya
Selain GPU NVIDIA T4, dalam deployment ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.
Setelah menyelesaikan deployment ini, jangan hapus resource yang Anda buat. Anda memerlukan resource ini saat mengukur dan menyesuaikan deployment.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API GKE.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API GKE.
Membangun model yang dioptimalkan dengan TF-TRT
Di bagian ini, Anda akan membuat lingkungan kerja dan mengoptimalkan model yang telah dilatih sebelumnya.
Model terlatih menggunakan set data palsu di gs://cloud-tpu-test-datasets/fake_imagenet/
.
Ada juga salinan model terlatih di lokasi Cloud Storage di gs://solutions-public-assets/tftrt-tutorial/resnet/export/1584366419/
.
Menciptakan lingkungan kerja
Untuk lingkungan kerja, Anda membuat instance Compute Engine menggunakan Deep Learning VM Image. Anda akan mengoptimalkan dan mengukur model ResNet-50 dengan TensorRT pada instance ini.
Di konsol Google Cloud, aktifkan Cloud Shell.
Deploy instance bernama
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"
Ganti
PROJECT_ID
dengan ID project Google Cloud yang Anda buat sebelumnya.Perintah ini meluncurkan instance Compute Engine menggunakan NVIDIA T4. Saat booting pertama, driver akan otomatis menginstal driver GPU NVIDIA yang kompatibel dengan TensorRT 5.1.5.
Membuat file model dengan pengoptimalan yang berbeda
Di bagian ini, Anda akan menerapkan pengoptimalan berikut ke model ResNet-50 asli menggunakan TF-TRT:
- Pengoptimalan grafik
- Konversi ke FP16 dengan pengoptimalan grafik
- Kuantisasi dengan INT8 dengan pengoptimalan grafik
Untuk mengetahui detail tentang pengoptimalan ini, lihat Pengoptimalan performa.
Di konsol Google Cloud, buka Compute Engine > VM instances.
Anda akan melihat instance
working-vm
yang dibuat sebelumnya.Untuk membuka konsol terminal instance, klik SSH.
Gunakan terminal ini untuk menjalankan perintah lainnya dalam dokumen ini.
Di terminal, clone repositori yang diperlukan dan ubah direktori saat ini:
cd $HOME git clone https://github.com/GoogleCloudPlatform/gke-tensorflow-inference-system-tutorial cd gke-tensorflow-inference-system-tutorial/server
Download model ResNet-50 yang telah dilatih sebelumnya ke direktori lokal:
mkdir -p models/resnet/original/00001 gcloud storage cp gs://solutions-public-assets/tftrt-tutorial/resnet/export/1584366419/* models/resnet/original/00001 --recursive
Buat image container yang berisi alat pengoptimalan untuk TF-TRT:
docker build ./ -t trt-optimizer docker image list
Perintah terakhir menampilkan tabel repositori.
Di tabel, pada baris untuk repositori
tft-optimizer
, salin ID gambar.Terapkan pengoptimalan (pengoptimalan grafik, konversi ke FP16, dan kuantisasi dengan INT8) ke model asli:
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
Ganti
IMAGE_ID
dengan ID gambar untuktft-optimizer
yang Anda salin di langkah sebelumnya.Opsi
--calib-image-dir
menentukan lokasi data pelatihan yang digunakan untuk model terlatih. Data pelatihan yang sama digunakan untuk kalibrasi untuk kuantisasi INT8. Proses kalibrasi dapat memerlukan waktu sekitar 5 menit.Saat perintah selesai berjalan, baris output terakhir akan mirip dengan berikut, dengan model yang dioptimalkan disimpan di
./models/resnet
:INFO:tensorflow:SavedModel written to: models/resnet/INT8/00001/saved_model.pb
Struktur direktorinya mirip dengan yang berikut:
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
Tabel berikut meringkas hubungan antara direktori dan pengoptimalan.
Direktori | Pengoptimalan |
---|---|
FP16 |
Konversi ke FP16 selain pengoptimalan grafik |
FP32 |
Pengoptimalan grafik |
INT8 |
Kuantisasi dengan INT8 selain pengoptimalan grafik |
original |
Model asli (tanpa pengoptimalan dengan TF-TRT) |
Men-deploy server inferensi
Di bagian ini, Anda akan men-deploy server Triton dengan lima model. Pertama, upload biner model yang Anda buat sebelumnya ke Cloud Storage. Kemudian, buat cluster GKE dan deploy server Triton di cluster tersebut.
Upload biner model
Di terminal SSH, upload biner model dan file konfigurasi
config.pbtxt
ke bucket penyimpanan: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
Ganti
PROJECT_ID
dengan ID project Google Cloud yang Anda buat sebelumnya.Parameter penyesuaian berikut ditentukan dalam file
config.pbtxt
:- Nama model
- Nama tensor input dan nama tensor output
- Alokasi GPU untuk setiap model
- Ukuran batch dan jumlah grup instance
Sebagai contoh, file
original/1/model/config.pbtxt
berisi konten berikut: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 }
Untuk mengetahui detail tentang ukuran batch dan jumlah grup instance, lihat Pengoptimalan performa.
Tabel berikut merangkum lima model yang Anda deploy di bagian ini.
Nama model | Pengoptimalan |
---|---|
original |
Model asli (tanpa pengoptimalan dengan TF-TRT) |
tftrt_fp32 |
Pengoptimalan grafik (batch size=64, instance groups=1) |
tftrt_fp16 |
Konversi ke FP16 selain pengoptimalan grafik (ukuran batch=64, grup instance=1) |
tftrt_int8 |
Kuantisasi dengan INT8 selain pengoptimalan grafik (ukuran tumpukan=64, grup instance=1) |
tftrt_int8_bs16_count4 |
Kuantisasi dengan INT8 selain pengoptimalan grafik (ukuran tumpukan=16, grup instance=4) |
Men-deploy server inferensi menggunakan Triton
Di terminal SSH, instal dan konfigurasikan paket autentikasi, yang mengelola cluster GKE:
export USE_GKE_GCLOUD_AUTH_PLUGIN=True sudo apt-get install google-cloud-sdk-gke-gcloud-auth-plugin
Buat cluster GKE dan node pool GPU dengan node komputasi yang menggunakan GPU NVIDIA T4:
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
Flag
--num-nodes
menentukan 20 instance untuk cluster GKE dan satu instance untuk kumpulan node GPUt4-gpu-pool
.Kumpulan node GPU terdiri dari satu instance
n1-standard-8
dengan GPU NVIDIA T4. Jumlah instance GPU harus sama dengan atau lebih besar dari pod server inferensi, karena GPU NVIDIA T4 tidak dapat digunakan bersama oleh beberapa pod pada instance yang sama.Tampilkan informasi cluster:
gcloud container clusters list
Outputnya mirip dengan yang berikut ini:
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
Tampilkan informasi kumpulan node:
gcloud container node-pools list --cluster tensorrt-cluster
Outputnya mirip dengan yang berikut ini:
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
Aktifkan beban kerja
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
Perintah ini memuat driver GPU NVIDIA pada node di kumpulan node GPU. Kode ini juga otomatis akan memuat driver saat Anda menambahkan node baru ke kumpulan node GPU.
Deploy server inferensi di cluster:
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
Tunggu beberapa menit sampai layanan tersedia.
Dapatkan alamat
clusterIP
Triton dan simpan alamat tersebut pada variabel lingkungan:export TRITON_IP=$(kubectl get svc inference-server \ -o "jsonpath={.spec['clusterIP']}") echo ${TRITON_IP}
Pada tahap ini, server inferensi menayangkan empat model ResNet-50 yang telah Anda buat di bagian Membuat file model dengan pengoptimalan yang berbeda. Klien dapat menentukan model yang akan digunakan saat mengirim permintaan inferensi.
Men-deploy server pemantauan dengan Prometheus dan Grafana
Di terminal SSH, deploy server Prometheus pada cluster:
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
Dapatkan URL endpoint dari layanan Prometheus.
ip_port=$(kubectl get svc prometheus-service \ -o "jsonpath={.spec['clusterIP']}:{.spec['ports'][0]['port']}" -n monitoring) echo "http://${ip_port}"
Catat URL endpoint Prometheus, karena Anda akan menggunakannya untuk mengonfigurasi Grafana nanti.
Deploy server Grafana pada cluster:
kubectl create -f grafana-service.yml -n monitoring kubectl create -f grafana-deployment.yml -n monitoring
Tunggu beberapa menit hingga semua layanan tersedia.
Mendapatkan URL endpoint dari layanan Grafana.
ip_port=$(kubectl get svc grafana-service \ -o "jsonpath={.status['loadBalancer']['ingress'][0]['ip']}:{.spec['ports'][0]['port']}" -n monitoring) echo "http://${ip_port}"
Catat URL endpoint Grafana yang akan digunakan di langkah berikutnya.
Di browser web, buka URL Grafana yang Anda catat di langkah sebelumnya.
Login dengan ID pengguna dan sandi default (
admin
danadmin
). Saat diminta, ubah sandi default.Klik Add your first data source, lalu di daftar Time series database, pilih Prometheus.
Di tab Settings, di kolom URL, masukkan URL endpoint Prometheus yang Anda catat sebelumnya.
Klik Save and Test, lalu kembali ke layar utama.
Tambahkan metrik pemantauan untuk
nv_gpu_utilization
:- Klik Create your first dashboard, lalu klik Add visualization.
- Di daftar Sumber data, pilih Prometheus.
Di tab Query, di kolom Metric, masukkan
nv_gpu_utilization
.Di bagian Opsi panel, di kolom Judul, masukkan
GPU Utilization
, lalu klik Terapkan.Halaman ini menampilkan panel untuk penggunaan GPU.
Tambahkan metrik pemantauan untuk
nv_gpu_memory_used_bytes
:- Klik Tambahkan, lalu pilih Visualisasi.
Di tab Query, di kolom Metric, masukkan
nv_gpu_memory_used_bytes
.Di bagian Opsi panel, di kolom Judul, masukkan
GPU Memory Used
, lalu klik Simpan.
Untuk menambahkan dasbor, di panel Simpan dasbor, klik Simpan.
Anda akan melihat grafik untuk Pemakaian GPU dan Memori GPU yang Digunakan.
Men-deploy alat pengujian beban
Di bagian ini, Anda akan men-deploy alat pengujian beban Locust di GKE, dan menghasilkan beban kerja untuk mengukur performa server inferensi.
Di terminal SSH, build image Docker yang berisi library klien Triton, lalu upload ke 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
Proses build dapat memerlukan waktu sekitar 5 menit. Setelah proses selesai, perintah prompt akan muncul di terminal SSH.
Setelah proses build selesai, build image Docker untuk menghasilkan beban kerja pengujian, lalu upload ke 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
Jangan mengubah atau mengganti
YOUR-PROJECT-ID
dalam perintah.Image ini dibuat dari image yang telah Anda buat di langkah sebelumnya.
Deploy file Locust
service_master.yaml
dandeployment_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
Resource
configmap
digunakan untuk menentukan model machine learning yang menjadi tujuan pengiriman permintaan klien untuk inferensi.Tunggu beberapa menit sampai layanan tersedia.
Dapatkan alamat
clusterIP
dari klienlocust-master
, dan simpan alamat tersebut dalam variabel lingkungan:export LOCUST_MASTER_IP=$(kubectl get svc locust-master -n locust \ -o "jsonpath={.spec['clusterIP']}") echo ${LOCUST_MASTER_IP}
Men-deploy klien 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
Perintah ini men-deploy 10 Pod klien Locust yang dapat digunakan untuk membuat workload pengujian. Jika tidak dapat membuat cukup permintaan dengan jumlah klien saat ini, Anda dapat mengubah jumlah Pod menggunakan perintah berikut:
kubectl scale deployment/locust-slave --replicas=20 -n locust
Jika kapasitas cluster default tidak cukup untuk meningkatkan jumlah replika, maka sebaiknya jumlah node di cluster GKE dinaikkan
Salin URL konsol Locust, lalu buka URL ini di browser web:
export LOCUST_IP=$(kubectl get svc locust-master -n locust \ -o "jsonpath={.status.loadBalancer.ingress[0].ip}") echo "http://${LOCUST_IP}:8089"
Konsol Locust akan terbuka, dan Anda dapat membuat beban kerja pengujian dari konsol tersebut.
Memeriksa Pod yang berjalan
Untuk memastikan bahwa komponen berhasil di-deploy, pastikan Pod sedang berjalan.
Di terminal SSH, periksa Pod server inferensi:
kubectl get pods
Outputnya mirip dengan hal berikut ini:
NAME READY STATUS RESTARTS AGE inference-server-67786cddb4-qrw6r 1/1 Running 0 83m
Jika Anda tidak mendapatkan output yang diharapkan, pastikan Anda telah menyelesaikan langkah-langkah di Men-deploy server inferensi menggunakan Triton.
Periksa Pod Locust
kubectl get pods -n locust
Outputnya mirip dengan hal berikut ini:
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
Jika Anda tidak mendapatkan output yang diharapkan, pastikan Anda telah menyelesaikan langkah-langkah di Men-deploy alat pengujian beban.
Periksa Pod pemantauan:
kubectl get pods -n monitoring
Outputnya mirip dengan hal berikut ini:
NAME READY STATUS RESTARTS AGE grafana-deployment-644bbcb84-k6t7v 1/1 Running 0 79m prometheus-deployment-544b9b9f98-hl7q8 1/1 Running 0 81m
Jika Anda tidak mendapatkan output yang diharapkan, pastikan Anda telah menyelesaikan langkah-langkah di Men-deploy server pemantauan dengan Prometheus dan Grafana.
Pada bagian selanjutnya dari seri ini, Anda akan menggunakan sistem server inferensi ini untuk mempelajari bagaimana berbagai pengoptimalan meningkatkan performa dan cara untuk menafsirkan pengoptimalan tersebut. Untuk langkah berikutnya, lihat Mengukur dan menyesuaikan performa sistem inferensi TensorFlow.
Langkah selanjutnya
- Pelajari Google Kubernetes Engine (GKE) lebih lanjut.
- Pelajari Cloud Load Balancing lebih lanjut.
- Untuk mengetahui lebih banyak tentang arsitektur referensi, diagram, dan praktik terbaik lainnya, jelajahi Pusat Arsitektur Cloud.