Inferensi machine learning menggunakan AWS Inferentia - Amazon EKS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Inferensi machine learning menggunakan AWS Inferentia

Topik ini menjelaskan cara membuat klaster Amazon EKS dengan simpul yang berjalan Inf1 Amazon EC2 instans dan (opsional) men-deploy aplikasi sampel. Instans Amazon EC2 Inf1 didukung oleh chip AWS Inferentia, yang dibuat khusus AWS untuk memberikan kinerja tinggi dan inferensi biaya terendah di cloud. Model pembelajaran mesin digunakan ke wadah menggunakan AWS Neuron, kit pengembangan perangkat lunak khusus (SDK) yang terdiri dari kompiler, runtime, dan alat profil yang mengoptimalkan kinerja inferensi pembelajaran mesin chip Inferentia. AWS Neuron mendukung kerangka kerja pembelajaran mesin populer seperti TensorFlow, PyTorch, dan MXNet.

catatan

Perangkat Neuron ID logis harus berdekatan. Jika beberapa perangkat Neuron yang Pod meminta dijadwalkan pada jenis inf1.6xlarge atau inf1.24xlarge instance (yang memiliki lebih dari satu perangkat Neuron), itu Pod akan gagal dimulai jika Kubernetes penjadwal memilih ID perangkat yang tidak berdekatan. Untuk informasi selengkapnya, lihat ID logis perangkat harus bersebelahan. GitHub

Prasyarat

  • Miliki eksctl yang terinstal pada komputer Anda. Jika Anda belum menginstalnya, lihat Instalasi di eksctl dokumentasi.

  • Miliki kubectl yang ter-install pada komputer Anda. Untuk informasi selengkapnya, lihat Menginstal atau memperbarui kubectl.

  • (Opsional) Miliki python3 yang ter-install pada komputer Anda. Jika Anda belum menginstalnya, lihat Mengunduh Python untuk petunjuk instalasi.

Membuat klaster

Untuk membuat klaster dengan simpul instans Inf1 Amazon EC2
  1. Membuat klaster dengan simpul instans Inf1 Amazon EC2. Anda dapat mengganti inf1.2xlarge dengan jenis instans Inf1 apa pun. eksctlUtilitas mendeteksi bahwa Anda meluncurkan grup node dengan tipe Inf1 instans dan akan memulai node Anda menggunakan salah satu AMI Amazon Linux Amazon yang dioptimalkan Amazon EKS yang dioptimalkan.

    catatan

    Anda tidak dapat menggunakan peran IAM untuk akun layanan dengan TensorFlow Serving.

    eksctl create cluster \ --name inferentia \ --region region-code \ --nodegroup-name ng-inf1 \ --node-type inf1.2xlarge \ --nodes 2 \ --nodes-min 1 \ --nodes-max 4 \ --ssh-access \ --ssh-public-key your-key \ --with-oidc
    catatan

    Perhatikan nilai baris output berikut. Ini digunakan dalam langkah (opsional) selanjutnya.

    [9]  adding identity "arn:aws:iam::111122223333:role/eksctl-inferentia-nodegroup-ng-in-NodeInstanceRole-FI7HIYS3BS09" to auth ConfigMap

    Saat meluncurkan grup node dengan Inf1 instance, eksctl secara otomatis menginstal plugin Kubernetes perangkat AWS Neuron. Plugin ini mengiklankan perangkat Neuron sebagai sumber daya sistem ke Kubernetes penjadwal, yang dapat diminta oleh wadah. Sebagai tambahan untuk kebijakan IAM simpul Amazon EKS default, Amazon S3 hanya membaca kebijakan akses yang ditambahkan sehingga aplikasi sampel, dibahas dalam langkah berikutnya, dapat memuat model terlatih dari Amazon S3.

  2. Pastikan semua Pods sudah dimulai dengan benar.

    kubectl get pods -n kube-system

    Output yang disingkat:

    NAME READY STATUS RESTARTS AGE [...] neuron-device-plugin-daemonset-6djhp 1/1 Running 0 5m neuron-device-plugin-daemonset-hwjsj 1/1 Running 0 5m

(Opsional) Menyebarkan gambar aplikasi TensorFlow Penyajian

Sebuah model terlatih harus dikompilasikan ke target Inferentia sebelum dapat di-deploy pada instans Inferentia. Untuk melanjutkan, Anda memerlukan TensorFlow model yang dioptimalkan Neuron yang disimpan di Amazon S3. Jika Anda belum memilikinya SavedModel, ikuti tutorial untuk membuat model ResNet 50 yang kompatibel dengan Neuron dan unggah hasilnya SavedModel ke S3. ResNet-50 adalah model pembelajaran mesin populer yang digunakan untuk tugas pengenalan gambar. Untuk informasi lebih lanjut tentang kompilasi model Neuron, lihat Chip AWS Inferentia Dengan DLAMI di Panduan Pengembang. AWS Deep Learning AMI

Manifes penerapan sampel mengelola wadah penyajian inferensi bawaan yang TensorFlow disediakan oleh AWS Deep Learning Containers. Di dalam wadah adalah AWS Neuron Runtime dan aplikasi TensorFlow Serving. Daftar lengkap Deep Learning Containers pra-bangun yang dioptimalkan untuk Neuron dipertahankan di GitHub bawah Gambar yang Tersedia. Saat start-up, DLC akan mengambil model Anda dari Amazon S3, meluncurkan Neuron TensorFlow Serving dengan model yang disimpan, dan menunggu permintaan prediksi.

Jumlah perangkat Neuron yang dialokasikan untuk aplikasi penyajian Anda agar dapat disesuaikan dengan mengubah sumber daya aws.amazon.com/neuron dalam deployment yaml. Harap dicatat bahwa komunikasi antara TensorFlow Serving dan runtime Neuron terjadi melalui GRPC, yang membutuhkan penerusan IPC_LOCK kemampuan ke wadah.

  1. Menambahkan Kebijakan IAM AmazonS3ReadOnlyAccess untuk peran instans simpul yang dibuat di langkah 1 dari Membuat klaster. Hal ini diperlukan agar aplikasi sampel dapat memuat model terlatih dari Amazon S3.

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \ --role-name eksctl-inferentia-nodegroup-ng-in-NodeInstanceRole-FI7HIYS3BS09
  2. Buat file bernama rn50_deployment.yaml dengan isi berikut ini. Memperbarui kode wilayah dan jalur model agar sesuai dengan pengaturan yang Anda inginkan. Nama model adalah untuk tujuan identifikasi ketika klien membuat permintaan ke TensorFlow server. Contoh ini menggunakan nama model untuk mencocokkan contoh skrip klien ResNet 50 yang akan digunakan pada langkah selanjutnya untuk mengirim permintaan prediksi.

    aws ecr list-images --repository-name neuron-rtd --registry-id 790709498068 --region us-west-2
    kind: Deployment apiVersion: apps/v1 metadata: name: eks-neuron-test labels: app: eks-neuron-test role: master spec: replicas: 2 selector: matchLabels: app: eks-neuron-test role: master template: metadata: labels: app: eks-neuron-test role: master spec: containers: - name: eks-neuron-test image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.4-neuron-py37-ubuntu18.04 command: - /usr/local/bin/entrypoint.sh args: - --port=8500 - --rest_api_port=9000 - --model_name=resnet50_neuron - --model_base_path=s3://your-bucket-of-models/resnet50_neuron/ ports: - containerPort: 8500 - containerPort: 9000 imagePullPolicy: IfNotPresent env: - name: AWS_REGION value: "us-east-1" - name: S3_USE_HTTPS value: "1" - name: S3_VERIFY_SSL value: "0" - name: S3_ENDPOINT value: s3.us-east-1.amazonaws.com - name: AWS_LOG_LEVEL value: "3" resources: limits: cpu: 4 memory: 4Gi aws.amazon.com/neuron: 1 requests: cpu: "1" memory: 1Gi securityContext: capabilities: add: - IPC_LOCK
  3. Men-deploy model.

    kubectl apply -f rn50_deployment.yaml
  4. Membuat file bernama rn50_service.yaml dengan konten berikut. Port HTTP dan gRPC dibuka untuk menerima permintaan prediksi.

    kind: Service apiVersion: v1 metadata: name: eks-neuron-test labels: app: eks-neuron-test spec: type: ClusterIP ports: - name: http-tf-serving port: 8500 targetPort: 8500 - name: grpc-tf-serving port: 9000 targetPort: 9000 selector: app: eks-neuron-test role: master
  5. Buat Kubernetes layanan untuk aplikasi Melayani TensorFlow model Anda.

    kubectl apply -f rn50_service.yaml

(Opsional) Buat prediksi terhadap layanan TensorFlow Serving Anda

  1. Untuk menguji secara lokal, meneruskan port gRPC ke layanan eks-neuron-test.

    kubectl port-forward service/eks-neuron-test 8500:8500 &
  2. Membuat skrip Python yang disebut tensorflow-model-server-infer.py dengan konten berikut. Skrip ini menjalankan inferensi melalui gRPC, yang merupakan kerangka kerja layanan.

    import numpy as np import grpc import tensorflow as tf from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.resnet50 import preprocess_input from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow.keras.applications.resnet50 import decode_predictions if __name__ == '__main__': channel = grpc.insecure_channel('localhost:8500') stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) img_file = tf.keras.utils.get_file( "./kitten_small.jpg", "https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg") img = image.load_img(img_file, target_size=(224, 224)) img_array = preprocess_input(image.img_to_array(img)[None, ...]) request = predict_pb2.PredictRequest() request.model_spec.name = 'resnet50_inf1' request.inputs['input'].CopyFrom( tf.make_tensor_proto(img_array, shape=img_array.shape)) result = stub.Predict(request) prediction = tf.make_ndarray(result.outputs['output']) print(decode_predictions(prediction))
  3. Menjalankan penulisan untuk mengirimkan prediksi ke layanan Anda.

    python3 tensorflow-model-server-infer.py

    Contoh output adalah sebagai berikut.

    [[(u'n02123045', u'tabby', 0.68817204), (u'n02127052', u'lynx', 0.12701613), (u'n02123159', u'tiger_cat', 0.08736559), (u'n02124075', u'Egyptian_cat', 0.063844085), (u'n02128757', u'snow_leopard', 0.009240591)]]