Setelah melatih model, Anda biasanya menerapkannya sebagai layanan inferensi. Jumlah panggilan ke layanan tersebut berfluktuasi sesuai permintaan bisnis, sehingga memerlukan server yang dapat diskalakan secara elastis untuk menghemat biaya. Solusi penerapan konvensional tidak mampu memenuhi tuntutan sistem berskala besar dengan konkurensi tinggi. Alibaba Cloud memungkinkan Anda menjalankan beban kerja pada Elastic Container Instance (ECI) guna memenuhi kebutuhan skalabilitas elastis layanan inferensi. Topik ini menjelaskan cara menjalankan layanan inferensi elastis pada ECI.
Prasyarat
Sebuah model siap untuk diterapkan. Topik ini menggunakan model Bidirectional Encoder Representations from Transformers (BERT) yang dilatih dengan TensorFlow 1.15.
Komponen ack-virtual-node, ack-alibaba-cloud-metrics-adapter, dan arena telah diinstal. Untuk informasi selengkapnya tentang cara mengelola komponen, lihat Manage components. Untuk informasi selengkapnya tentang ack-virtual-node, lihat Connect to ECI.
Prosedur
Unggah model yang telah dilatih ke bucket Object Storage Service (OSS). Untuk informasi selengkapnya, lihat Upload objects.
Buat persistent volume (PV) dan persistent volume claim (PVC).
Buat file bernama
pvc.yamlmenggunakan templat berikut.apiVersion: v1 kind: PersistentVolume metadata: name: model-csi-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: model-csi-pv # Must be the same as the PV name. volumeAttributes: bucket: "Your Bucket" url: "Your oss url" akId: "Your Access Key Id" akSecret: "Your Access Key Secret" otherOpts: "-o max_stat_cache_size=0 -o allow_other" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: model-pvc spec: accessModes: - ReadWriteMany volumeName: model-csi-pv storageClassName: "" resources: requests: storage: 5GiParameter
Deskripsi
bucket
Nama bucket OSS, yang bersifat unik secara global dalam OSS. Untuk informasi selengkapnya, lihat Bucket naming conventions.
url
URL yang digunakan untuk mengakses objek di dalam bucket. Untuk informasi selengkapnya, lihat Mendapatkan URL objek tunggal atau URL beberapa objek.
akId
ID AccessKey dan Rahasia AccessKey yang digunakan untuk mengakses bucket OSS. Kami menyarankan agar Anda mengakses bucket OSS sebagai pengguna Resource Access Management (RAM). Untuk informasi selengkapnya, lihat Create an AccessKey pair.
akSecret
otherOpts
Parameter kustom untuk memasang bucket OSS.
Tetapkan
-o max_stat_cache_size=0untuk menonaktifkan cache metadata. Jika fitur ini dinonaktifkan, sistem akan mengambil metadata terbaru dari OSS setiap kali mencoba mengakses objek di OSS.Tetapkan
-o allow_otheruntuk mengizinkan pengguna lain mengakses bucket OSS yang telah Anda pasang.
Untuk informasi selengkapnya tentang parameter lainnya, lihat Custom parameters supported by ossfs.
Jalankan perintah berikut untuk membuat PV dan PVC.
kubectl apply -f pvc.yaml
Terapkan layanan inferensi.
Jalankan perintah berikut untuk menerapkan layanan inferensi.
Saat menerapkan layanan inferensi, Anda dapat menggunakan anotasi untuk menentukan jenis resource. Parameter utama dijelaskan di bawah ini.
Parameter
Deskripsi
alibabacloud.com/burst-resourceNilai yang valid:
Default (tidak dikonfigurasi): Hanya menggunakan resource Elastic Compute Service (ECS) yang tersedia di kluster.
eci: Menggunakan resource ECI ketika resource ECS di kluster tidak mencukupi.eci_only: Hanya menggunakan resource ECI. Resource ECS di kluster tidak digunakan.
k8s.aliyun.com/eci-use-specsUntuk menggunakan resource GPU ECI, gunakan anotasi ini untuk menentukan tipe instans GPU-accelerated.
arena serve tensorflow \ --namespace=default \ --name=bert-tfserving \ --model-name=chnsenticorp \ --gpus=1 \ --image=tensorflow/serving:1.15.0-gpu \ --data=model-pvc:/data \ --model-path=/data/models/tensorflow/chnsenticorp \ --version-policy=specific:1623831335 \ --annotation=alibabacloud.com/burst-resource=eci_only \ --annotation=k8s.aliyun.com/eci-use-specs=ecs.gn6i-c4g1.xlargeJalankan perintah berikut untuk melihat status layanan.
arena serve listOutput yang diharapkan:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU bert-tfserving Tensorflow 202207181536 1 1 172.16.52.170 GRPC:8500,RESTFUL:8501 1Jalankan perintah berikut untuk melihat status pod.
kubectl get pods -o wideOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bert-tfserving-202207181536-tensorflow-serving-547797c546-djh58 1/1 Running 0 114s 192.168.0.246 virtual-kubelet-cn-beijing-h <none> <none>Output tersebut menunjukkan bahwa tipe
Nodeadalahvirtual-kubelet-cn-beijing-h, yang mengindikasikan bahwa pod diterapkan pada instans ECI.
Buat Horizontal Pod Autoscaler (HPA). HPA secara otomatis menskalakan jumlah replika pod di Kubernetes berdasarkan beban kerja.
Jalankan perintah berikut untuk melihat deployment layanan inferensi.
kubectl get deploymentOutput yang diharapkan:
NAME READY UP-TO-DATE AVAILABLE AGE bert-tfserving-202207181536-tensorflow-serving 1/1 1 1 2m18sJalankan perintah berikut untuk melihat layanan inferensi.
kubectl get serviceOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bert-tfserving-202207181536-tensorflow-serving ClusterIP 172.16.52.170 <none> 8500/TCP,8501/TCP 2m45sBuat file bernama
bert-tfserving-eci-hpa.yamlmenggunakan templat berikut.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: bert-tfserving-eci-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-tfserving-202207181536-tensorflow-serving minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "k8s-log-{cluster id}" sls.logstore: "nginx-ingress" sls.ingress.route: "default-bert-tfserving-202207181536-tensorflow-serving-8501" target: type: AverageValue averageValue: "10"Parameter utama dijelaskan di bawah ini.
Parameter
Deskripsi
scaleTargetRefObjek yang diikat oleh HPA. Dalam topik ini, diatur ke nama deployment layanan inferensi dari Langkah a.
minReplicasJumlah minimum replika.
maxReplicasJumlah maksimum replika.
sls.projectNama proyek log kluster. Formatnya adalah
k8s-log-{cluster id}. Ganti{cluster id}dengan ID kluster aktual Anda.sls.logstoreNama penyimpanan log. Nilai default-nya adalah
nginx-ingress.sls.ingress.routeEntri rute Ingress. Formatnya adalah
{namespace}-{service name}-{service port}.metricnameNama metrik. Dalam topik ini, diatur ke
sls_ingress_qps.targetaverageValueNilai permintaan per detik (QPS) yang memicu skala keluar. Dalam topik ini, diatur ke
10. Skala keluar dipicu ketika QPS melebihi 10.Jalankan perintah berikut untuk melihat status HPA.
kubectl get hpaOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE bert-tfserving-eci-hpa Deployment/bert-tfserving-202207181536-tensorflow-serving 0/10 (avg) 1 10 1 116s
Konfigurasikan Ingress publik.
Secara default, layanan inferensi yang diterapkan oleh perintah
arena serve tensorflowdiekspos melalui layanan ClusterIP dan tidak dapat diakses dari jaringan publik. Oleh karena itu, Anda harus membuat Ingress publik untuk layanan inferensi tersebut.Pada halaman Ingresses, pilih Namespace tempat layanan inferensi berada, lalu klik Create Ingress. Konfigurasikan parameter berikut. Untuk informasi selengkapnya tentang parameter tersebut, lihat Create and use an NGINX Ingress to expose a service.
Name: Atur ke
bert-tfserving.Rules:
Domain Name: Nama domain kustom, seperti
test.example.com.Path Mapping:
Path: Pertahankan path root
/.Matching Rule: Default (ImplementationSpecific).
Service Name: Atur ke nama layanan yang Anda peroleh di langkah 3.b. Dalam contoh ini, nama layanannya adalah
bert-tfserving-202207181536-tensorflow-serving.Port: Atur ke 8501.
Pada halaman Ingresses, lihat alamat Ingress target di kolom Rules.
Gunakan alamat yang diperoleh di langkah 5.d untuk melakukan uji stres pada layanan inferensi. Skala keluar dipicu jika permintaan per detik (QPS) melebihi nilai
averageValueyang dikonfigurasi di HPA. Jumlah pod tidak melebihimaxReplicas. Skala masuk dipicu jika QPS turun di bawah nilaiaverageValue.