Zephyrnet Logosu

AWS Lambda'da TensorFlow modellerini çalıştırmak için kapsayıcı görüntülerini kullanma

Tarih:

TensorFlow sinir ağları ve makine öğrenimi modelleri geliştirmek için yaygın olarak kullanılan açık kaynaklı bir makine öğrenimi (ML) kitaplığıdır. Bu modeller, eğitimi hızlandırmak için genellikle birden çok GPU örneği üzerinde eğitilir, bu da pahalı eğitim süresi ve birkaç gigabayta kadar model boyutlarıyla sonuçlanır. Eğitildikten sonra, bu modeller çıkarımlar üretmek için üretimde dağıtılır. Eşzamanlı, eşzamansız veya toplu iş tabanlı iş yükleri olabilirler. Sıfırdan milyonlarca isteği işlemek için bu uç noktaların yüksek düzeyde ölçeklenebilir ve esnek olması gerekir. burası AWS Lambda ölçeklenebilir, uygun maliyetli ve güvenilir eşzamanlı ve eşzamansız makine öğrenimi çıkarımı için cazip bir bilgi işlem hizmeti olabilir. Lambda, otomatik ölçeklendirme, azaltılmış operasyonel ek yük ve çıkarım başına ödeme faturalandırması gibi avantajlar sunar.

Bu gönderi, 10 GB'a kadar bellekle üretimde ölçeklenebilir çıkarımlar için herhangi bir TensorFlow modelini Lambda ile nasıl kullanacağınızı gösterir. Bu, birkaç gigabayta kadar Lambda işlevlerinde ML modellerini kullanmamıza izin verir. Bu gönderi için önceden eğitilmiş TensorFlow-Keras kullanıyoruz ResNet50 görüntü sınıflandırması için

Çözüme genel bakış

Lambda, sunucuları sağlamadan veya yönetmeden kod çalıştırmanıza olanak tanıyan sunucusuz bir bilgi işlem hizmetidir. Lambda, her olaya yanıt olarak kod çalıştırarak uygulamanızı otomatik olarak ölçeklendirerek olay odaklı mimarilere ve çözümlere olanak tanır. Kod paralel olarak çalışır ve her olayı ayrı ayrı işler, günlük birkaç istekten yüz binlerce iş yüküne kadar iş yükünün boyutuna göre ölçeklenir. Aşağıdaki diyagram, çözümümüzün mimarisini göstermektedir.

Aşağıdaki diyagram, çözümümüzün mimarisini göstermektedir.

Kodunuzu ve bağımlılıklarınızı bir kapsayıcı görüntüsü Docker CLI gibi araçları kullanarak. Maksimum kapsayıcı boyutu 10 GB'dir. Çıkarım modeli Dockerized olduktan sonra, görüntüyü şuraya yükleyebilirsiniz: Amazon Elastik Konteyner Kayıt Defteri (Amazon ECR'si). Ardından, Amazon ECR'de saklanan kapsayıcı görüntüsünden Lambda işlevini oluşturabilirsiniz.

Önkoşullar

Bu izlenecek yol için aşağıdaki ön koşullara sahip olmalısınız:

Çözümün uygulanması

Görüntü sınıflandırması için TensorFlow Hub'dan önceden eğitilmiş bir model kullanıyoruz. Bir resme bir resim yüklendiğinde Amazon Basit Depolama Hizmeti (Amazon S3) kovası, görüntüyü algılamak ve onu yazıcıya yazdırmak için bir Lambda işlevi çağrılır. Amazon Bulut İzleme kütükler. Aşağıdaki diyagram bu iş akışını göstermektedir.

Aşağıdaki diyagram bu iş akışını göstermektedir.

Çözümü uygulamak için aşağıdaki adımları tamamlayın:

  1. Yerel makinenizde şu adla bir klasör oluşturun: lambda-tensorflow-example.
  2. Hat için bir requirements.txt bu dizindeki dosya.
  3. Makine öğrenimi modeliniz için gerekli tüm kitaplıkları ekleyin. Bu gönderi için TensorFlow 2.4 kullanıyoruz.
  4. Bir oluşturma app.py Lambda işlevinin kodunu içeren komut dosyası.
  5. Aynı dizinde bir Dockerfile oluşturun.

Aşağıdaki metin, kullanım durumumuz için TensorFlow kodunu çalıştırmak için gereklilikler.txt dosyasına bir örnektir:

# List all python libraries for the lambda
tensorflow==2.4.0
tensorflow_hub==0.11
Pillow==8.0.1

TensorFlow 2.4 sürümünü yalnızca CPU desteğiyle kullanıyoruz çünkü bu yazı itibariyle Lambda yalnızca CPU desteği sunuyor. TensorFlow'un yalnızca CPU sürümleri hakkında daha fazla bilgi için bkz. Paket konumu.

Python kodu app.py içine yerleştirilmiştir. app.py'deki çıkarım işlevinin, uygulama tarafından çağrılacak belirli bir yapıyı izlemesi gerekir. Lambda çalışma zamanı. Lambda işleyicileri hakkında daha fazla bilgi için bkz. Python'da AWS Lambda işlev işleyicisi. Aşağıdaki koda bakın:

import json
import boto3
import numpy as np
import PIL.Image as Image import tensorflow as tf
import tensorflow_hub as hub IMAGE_WIDTH = 224
IMAGE_HEIGHT = 224 IMAGE_SHAPE = (IMAGE_WIDTH, IMAGE_HEIGHT)
model = tf.keras.Sequential([hub.KerasLayer("model/")])
model.build([None, IMAGE_WIDTH, IMAGE_HEIGHT, 3]) imagenet_labels= np.array(open('model/ImageNetLabels.txt').read().splitlines())
s3 = boto3.resource('s3') def lambda_handler(event, context): bucket_name = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] img = readImageFromBucket(key, bucket_name).resize(IMAGE_SHAPE) img = np.array(img)/255.0 prediction = model.predict(img[np.newaxis, ...]) predicted_class = imagenet_labels[np.argmax(prediction[0], axis=-1)] print('ImageName: {0}, Prediction: {1}'.format(key, predicted_class)) def readImageFromBucket(key, bucket_name): bucket = s3.Bucket(bucket_name) object = bucket.Object(key) response = object.get() return Image.open(response['Body'])

Python 3.8 için aşağıdaki Dockerfile, AWS tarafından sağlanan açık kaynağı kullanır temel görüntüler kap görüntüleri oluşturmak için kullanılabilir. Temel görüntüler, Lambda'da bir kapsayıcı görüntüsü çalıştırmak için gereken dil çalışma zamanları ve diğer bileşenlerle önceden yüklenmiştir.

# Pull the base image with python 3.8 as a runtime for your Lambda
FROM public.ecr.aws/lambda/python:3.8 # Install tar and gzip
RUN yum -y install tar gzip zlib # Copy the earlier created requirements.txt file to the container
COPY requirements.txt ./ # Install the python requirements from requirements.txt
RUN python3.8 -m pip install -r requirements.txt # Copy the earlier created app.py file to the container
COPY app.py ./ # Download ResNet50 and store it in a directory
RUN mkdir model
RUN curl -L https://tfhub.dev/google/imagenet/resnet_v1_50/classification/4?tf-hub-format=compressed -o ./model/resnet.tar.gz
RUN tar -xf model/resnet.tar.gz -C model/
RUN rm -r model/resnet.tar.gz # Download ImageNet labels
RUN curl https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt -o ./model/ImageNetLabels.txt # Set the CMD to your handler
CMD ["app.lambda_handler"]

Klasör yapınız aşağıdaki ekran görüntüsü gibi görünmelidir.

Klasör yapınız aşağıdaki ekran görüntüsü gibi görünmelidir.

Aşağıdaki bash komutlarıyla kapsayıcı görüntüsünü oluşturabilir ve Amazon ECR'ye iletebilirsiniz. değiştirin kendi AWS hesap kimliğinizle ve ayrıca bir .

# Build the docker image
docker build -t lambda-tensorflow-example . # Create a ECR repository
aws ecr create-repository --repository-name lambda-tensorflow-example --image-scanning-configuration scanOnPush=true --region <REGION> # Tag the image to match the repository name
docker tag lambda-tensorflow-example:latest <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/lambda-tensorflow-example:latest # Register docker to ECR
aws ecr get-login-password --region <REGION> | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com # Push the image to ECR
docker push <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/lambda-tensorflow-example:latest

Model çıkarımınızı yerel olarak test etmek istiyorsanız, Lambda'nın temel görüntüleri, ayrıca yerel test Lambda işleviniz, geliştirme döngülerini hızlandırmak için bir kapsayıcı görüntüsü olarak paketlenmiştir.

S3 grubu oluşturma

Bir sonraki adım olarak, görüntü sınıfını tahmin etmek için kullanılan görüntüleri depolamak için bir S3 kovası oluşturuyoruz.

  1. Amazon S3 konsolunda şunu seçin: Grup oluştur.
  2. S3 klasörüne şöyle bir ad verin: tensorflow-images-for-inference-<Random_String> ve değiştirin rastgele bir değerle.
  3. Klinik Grup oluştur.

TensorFlow koduyla Lambda işlevini oluşturma

Lambda işlevinizi oluşturmak için aşağıdaki adımları tamamlayın:

  1. Lambda konsolunda şunu seçin: fonksiyonlar.
  2. Klinik İşlev oluştur.
  3. seç Konteyner görüntüsü.
  4. İçin Fonksiyon adı, gibi bir ad girin tensorflow-endpoint.
  5. İçin Kapsayıcı görüntüsü URI'si, daha önce oluşturulanı girin lambda-tensorflow-example deposu.

  1. Klinik Görsellere göz atın en son görüntüyü seçmek için
  2. Tıkla İşlev oluştur oluşturulmasını başlatmak için.
  3. Lambda çalışma zamanını iyileştirmek için, işlev belleğini en az 6 GB'a ve zaman aşımını 5 dakikaya yükseltin. Temel ayarlar.

İşlev belleği ve zaman aşımı ayarları hakkında daha fazla bilgi için, bkz. AWS Lambda için Yeni – 10 GB'a Kadar Bellek ve 6 vCPU ile İşlevler.

S3 kovasını Lambda işlevinize bağlama

Lambda işlevinin başarılı bir şekilde oluşturulmasından sonra, S3 klasörüne bir dosya yüklendiğinde işlevin çağrılması için ona bir tetikleyici eklememiz gerekir.

  1. Lambda konsolunda işlevinizi seçin.
  2. Klinik Tetikleyici ekle.

Tetikleyici ekle'yi seçin.

  1. Klinik S3.
  2. İçin Kova, daha önce oluşturduğunuz grubu seçin.

Paket için daha önce oluşturduğunuz grubu seçin.

Tetikleyici eklendikten sonra, uygun ayarı ayarlayarak Lambda işlevinin S3 klasörüne bağlanmasına izin vermeniz gerekir. AWS Kimlik ve Erişim Yönetimi yürütme rolü için (IAM) hakları.

  1. Üzerinde İzinler sekmesinde, IAM rolünü seçin.
  2. Klinik Politikaları ekleyin.
  3. Aramak AmazonS3ReadOnlyAccess ve bunu IAM rolüne ekleyin.

Artık işlevinizi test etmek için gerekli tüm hizmetleri yapılandırdınız. AWS yönetim konsolunda klasörü açıp simgesine tıklayarak oluşturulan S3 klasörüne bir JPG görüntüsü yükleyin. Foto Yükle. Birkaç saniye sonra, tahminin sonucunu CloudWatch günlüklerinde görebilirsiniz. Bir takip adımı olarak, tahminleri bir Amazon DinamoDB tablo.

S3 grubuna bir JPG resmi yükledikten sonra, sonuç olarak CloudWatch'a yazdırılan tahmini görüntü sınıfını alacağız. Lambda işlevi, EventBridge tarafından tetiklenecek ve görüntüyü kovadan çekecektir. Örnek olarak, bunun resmini kullanacağız. papağan çıkarım uç noktamız tarafından tahmin edilmek için.

CloudWatch günlüklerinde, tahmin edilen sınıf yazdırılır. Gerçekten de model, resim (Amerika papağanı) için doğru sınıfı tahmin eder:

Performans

Optimum performans elde etmek için, çeşitli bellek ayarı düzeylerini deneyebilirsiniz (bu, atanan vCPU'yu doğrusal olarak değiştirir, daha fazla bilgi edinmek için bunu okuyun) AWS Haber Günlüğü). Dağıtılan modelimiz söz konusu olduğunda, çoğu performans kazancını yaklaşık 3 GB – 4 GB (~2vCPU'lar) ayarında gerçekleştiriyoruz ve bunun ötesindeki kazançlar nispeten düşük. Farklı modeller, artan CPU miktarıyla farklı performans iyileştirme seviyeleri görür, bu nedenle bunu kendi modeliniz için deneysel olarak belirlemek en iyisidir. Ek olarak, yararlanmak için kaynak kodunuzu derlemeniz önemle tavsiye edilir. Gelişmiş Vektör Uzantıları 2 (AVX2), vCPU'ların saat döngüsü başına daha yüksek sayıda tamsayı ve kayan nokta işlemleri yürütmesine izin vererek performansı daha da artırır.

Sonuç

Lambda için kapsayıcı görüntüsü desteği, işlevinizi daha fazla özelleştirmenize olanak tanıyarak sunucusuz makine öğrenimi için pek çok yeni kullanım durumu açar. Kapsayıcı görüntü boyutu için 10 GB'a kadar kullanarak özel modellerinizi getirebilir ve Lambda'da dağıtabilirsiniz. Çok fazla bilgi işlem gücüne ihtiyaç duymayan daha küçük modeller için, yalnızca Lambda'da çevrimiçi eğitim ve çıkarım gerçekleştirebilirsiniz. Model boyutu büyüdüğünde, soğuk çalıştırma sorunları giderek daha önemli hale gelir ve çözülmesi gerekir. azaltılmış olması. Ayrıca, kapsayıcı görüntülerle ilgili çerçeve veya dil üzerinde herhangi bir kısıtlama yoktur; gibi diğer ML çerçeveleri PyTorch, Apache MX Ağı, XGBoostya da Scikit-öğrenme de kullanılabilir!

Çıkarımınız için GPU'ya ihtiyacınız varsa, aşağıdaki gibi kapsayıcı hizmetlerini kullanmayı düşünebilirsiniz: Amazon Elastik Konteyner Hizmeti (Amazon ECS), Kubernetes veya modeli bir Amazon Adaçayı Yapıcı Son nokta.


Yazar Hakkında

Jan Bauer AWS Professional Services'de Bulut Uygulama Geliştiricisidir. İlgi alanları sunucusuz bilgi işlem, makine öğrenimi ve bulut bilgi işlem içeren her şeydir.

Kaynak: https://aws.amazon.com/blogs/machine-learning/using-container-images-to-run-tensorflow-models-in-aws-lambda/

spot_img

En Son İstihbarat

spot_img