제퍼넷 로고

컨테이너 이미지를 사용하여 AWS Lambda에서 TensorFlow 모델 실행

시간

TensorFlow 신경망 및 ML 모델을 개발하는 데 널리 사용되는 오픈 소스 머신 러닝 (ML) 라이브러리입니다. 이러한 모델은 일반적으로 학습 속도를 높이기 위해 여러 GPU 인스턴스에서 학습되므로 학습 시간과 모델 크기가 최대 몇 기가 바이트에 이릅니다. 교육을받은 후 이러한 모델은 추론을 생성하기 위해 프로덕션에 배포됩니다. 동기식, 비동기식 또는 배치 기반 워크로드 일 수 있습니다. 이러한 엔드 포인트는 XNUMX 개에서 수백만 개의 요청을 처리하기 위해 고도로 확장 가능하고 탄력적이어야합니다. 여기가 AWS 람다 확장 가능하고 비용 효율적이며 안정적인 동기 및 비동기 ML 추론을위한 강력한 컴퓨팅 서비스가 될 수 있습니다. Lambda는 자동 조정, 운영 오버 헤드 감소, 추론 당 지불 청구와 같은 이점을 제공합니다.

이 게시물에서는 최대 10GB의 메모리로 프로덕션에서 확장 가능한 추론을 위해 Lambda와 함께 TensorFlow 모델을 사용하는 방법을 보여줍니다. 이를 통해 Lambda 함수에서 최대 몇 기가 바이트까지 ML 모델을 사용할 수 있습니다. 이 게시물에서는 사전 학습 된 TensorFlow-Keras를 사용합니다. 레스넷50 이미지 분류를 위해.

솔루션 개요

Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수있는 서버리스 컴퓨팅 서비스입니다. Lambda는 모든 이벤트에 대한 응답으로 코드를 실행하여 애플리케이션을 자동으로 확장하여 이벤트 기반 아키텍처 및 솔루션을 허용합니다. 코드는 병렬로 실행되고 각 이벤트를 개별적으로 처리하여 하루에 몇 개의 요청에서 수십만 개의 워크로드로 워크로드의 크기에 따라 확장됩니다. 다음 다이어그램은 솔루션의 아키텍처를 보여줍니다.

다음 다이어그램은 솔루션의 아키텍처를 보여줍니다.

코드와 종속성을 컨테이너 이미지 Docker CLI와 같은 도구를 사용합니다. 최대 컨테이너 크기는 10GB입니다. 추론을위한 모델이 Dockerized되면 ​​이미지를 다음 위치에 업로드 할 수 있습니다. Amazon Elastic Container Registry (Amazon ECR). 그런 다음 Amazon ECR에 저장된 컨테이너 이미지에서 Lambda 함수를 생성 할 수 있습니다.

사전 조건

이 연습에서는 다음과 같은 전제 조건이 있어야합니다.

솔루션 구현

이미지 분류를 위해 TensorFlow Hub의 사전 학습 된 모델을 사용합니다. 이미지가 아마존 단순 스토리지 서비스 (Amazon S3) 버킷, Lambda 함수가 호출되어 이미지를 감지하고 아마존 클라우드 워치 로그. 다음 다이어그램은이 워크 플로를 보여줍니다.

다음 다이어그램은이 워크 플로를 보여줍니다.

솔루션을 구현하려면 다음 단계를 완료하십시오.

  1. 로컬 컴퓨터에서 이름으로 폴더를 만듭니다. lambda-tensorflow-example.
  2. 만들기 requirements.txt 해당 디렉토리의 파일.
  3. ML 모델에 필요한 모든 라이브러리를 추가합니다. 이 게시물에서는 TensorFlow 2.4를 사용합니다.
  4. 를 생성 app.py Lambda 함수에 대한 코드가 포함 된 스크립트.
  5. 동일한 디렉터리에 Dockerfile을 만듭니다.

다음 텍스트는 사용 사례에서 TensorFlow 코드를 실행하기위한 requirements.txt 파일의 예입니다.

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

이 글을 쓰는 시점에서 Lambda는 CPU 지원 만 제공하기 때문에 CPU 만 지원하는 TensorFlow 2.4 버전을 사용하고 있습니다. CPU 전용 버전의 TensorFlow에 대한 자세한 내용은 패키지 위치.

Python 코드는 app.py에 있습니다. app.py의 추론 함수는 특정 구조를 따라야합니다. Lambda 런타임. Lambda 용 핸들러에 대한 자세한 내용은 Python의 AWS Lambda 함수 핸들러. 다음 코드를 참조하십시오.

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 용 다음 Dockerfile은 AWS에서 제공하는 오픈 소스를 사용합니다. 기본 이미지 컨테이너 이미지를 만드는 데 사용할 수 있습니다. 기본 이미지에는 Lambda에서 컨테이너 이미지를 실행하는 데 필요한 언어 런타임 및 기타 구성 요소가 미리로드되어 있습니다.

# 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"]

폴더 구조는 다음 스크린 샷과 같아야합니다.

폴더 구조는 다음 스크린 샷과 같아야합니다.

다음 bash 명령을 사용하여 컨테이너 이미지를 빌드하고 Amazon ECR에 푸시 할 수 있습니다. 교체 자신의 AWS 계정 ID를 사용하고 .

# 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

모델 추론을 로컬에서 테스트하려는 경우 Lambda의 기본 이미지에 RIE (Runtime Interface Emulator)가 포함되어 있습니다. 로컬 테스트 Lambda 함수를 컨테이너 이미지로 패키징하여 개발주기를 가속화하십시오.

S3 버킷 생성

다음 단계로 이미지 클래스를 예측하는 데 사용되는 이미지를 저장할 S3 버킷을 생성합니다.

  1. Amazon S3 콘솔에서 버킷 만들기.
  2. S3 버킷에 다음과 같은 이름을 지정합니다. tensorflow-images-for-inference-<Random_String> 교체 임의의 값으로.
  3. 왼쪽 메뉴에서 버킷 만들기.

TensorFlow 코드로 Lambda 함수 생성

Lambda 함수를 생성하려면 다음 단계를 완료하십시오.

  1. Lambda 콘솔에서 기능.
  2. 왼쪽 메뉴에서 기능 만들기.
  3. 선택 컨테이너 이미지.
  4. 럭셔리 기능 명, 같은 이름을 입력하십시오 tensorflow-endpoint.
  5. 럭셔리 컨테이너 이미지 URI, 이전에 만든 입력 lambda-tensorflow-example 저장소.

  1. 왼쪽 메뉴에서 이미지 찾아보기 최신 이미지를 선택합니다.
  2. 기능 만들기 생성을 초기화합니다.
  3. Lambda 런타임을 개선하려면 함수 메모리를 6GB 이상으로 늘리고 시간 제한을 5 분으로 늘리십시오. 기본 설정.

함수 메모리 및 시간 초과 설정에 대한 자세한 내용은 AWS Lambda의 새로운 기능 – 최대 10GB의 메모리와 6 개의 vCPU를 사용하는 함수.

Lambda 함수에 S3 버킷 연결

Lambda 함수를 성공적으로 생성 한 후에는 파일이 S3 버킷에 업로드 될 때마다 함수가 호출되도록 트리거를 추가해야합니다.

  1. Lambda 콘솔에서 기능을 선택하십시오.
  2. 왼쪽 메뉴에서 트리거 추가.

트리거 추가를 선택합니다.

  1. 왼쪽 메뉴에서 S3.
  2. 럭셔리 버킷에서 이전에 생성 한 버킷을 선택합니다.

버킷에서 이전에 생성 한 버킷을 선택합니다.

트리거가 추가 된 후 적절한 설정을 통해 Lambda 함수가 S3 버킷에 연결하도록 허용해야합니다. AWS 자격 증명 및 액세스 관리 (IAM) 실행 역할에 대한 권한.

  1. 권한 탭에서 IAM 역할을 선택합니다.
  2. 왼쪽 메뉴에서 정책 첨부.
  3. 에 대한 검색 AmazonS3ReadOnlyAccess IAM 역할에 연결합니다.

이제 기능을 테스트하는 데 필요한 모든 서비스를 구성했습니다. AWS 관리 콘솔에서 버킷을 열고 클릭하여 생성 된 S3 버킷에 JPG 이미지를 업로드합니다. 가이드라가. 몇 초 후 CloudWatch 로그에서 예측 결과를 볼 수 있습니다. 후속 단계로 예측을 아마존 DynamoDB 테이블.

JPG 사진을 S3 버킷에 업로드 한 후 예측 이미지 클래스를 결과적으로 CloudWatch에 인쇄합니다. Lambda 함수는 EventBridge에 의해 트리거되고 버킷에서 이미지를 가져옵니다. 예를 들어,이 사진을 사용하겠습니다. 앵무새 추론 엔드 포인트에서 예측할 수 있습니다.

CloudWatch 로그에서 예측 클래스가 인쇄됩니다. 실제로이 모델은 그림 (마코)에 대한 올바른 클래스를 예측합니다.

퍼포먼스

최적의 성능을 얻으려면 다양한 수준의 메모리 설정 (할당 된 vCPU를 선형으로 변경)을 시도해 볼 수 있습니다. AWS 뉴스 블로그). 배포 된 모델의 경우 약 3GB – 4GB (~ 2vCPU) 설정에서 대부분의 성능 향상을 실현하고 그 이상의 향상은 상대적으로 낮습니다. 모델마다 CPU 양이 증가하여 성능 향상 수준이 다르기 때문에 자신의 모델에 대해 실험적으로 결정하는 것이 가장 좋습니다. 또한 소스 코드를 컴파일하여 활용하는 것이 좋습니다. 고급 벡터 확장 2 (AVX2) Lambda에서 vCPU가 클록주기 당 더 많은 수의 정수 및 부동 소수점 작업을 실행할 수 있도록하여 성능을 더욱 향상시킵니다.

결론

Lambda에 대한 컨테이너 이미지 지원을 통해 함수를 훨씬 더 사용자 지정하여 서버리스 ML에 대한 많은 새로운 사용 사례를 열 수 있습니다. 사용자 지정 모델을 가져 와서 컨테이너 이미지 크기로 최대 10GB를 사용하여 Lambda에 배포 할 수 있습니다. 컴퓨팅 성능이 많이 필요하지 않은 소규모 모델의 경우 순수하게 Lambda에서 온라인 교육 및 추론을 수행 할 수 있습니다. 모델 크기가 증가하면 콜드 스타트 ​​문제가 점점 더 중요 해지고 완화. 컨테이너 이미지가있는 프레임 워크 나 언어에도 제한이 없습니다. 다음과 같은 다른 ML 프레임 워크 파이 토치, 아파치 MXNet, XGBoost사이 킷 러닝 또한 사용할 수 있습니다!

추론을 위해 GPU가 필요한 경우 다음과 같은 컨테이너 서비스 사용을 고려할 수 있습니다. Amazon 탄력적 컨테이너 서비스 (Amazon ECS), Kubernetes 또는 모델을 아마존 세이지 메이커 엔드 포인트.


저자에 관하여

얀 바우어 AWS Professional Services의 클라우드 애플리케이션 개발자입니다. 그의 관심 분야는 서버리스 컴퓨팅, 머신 러닝 및 클라우드 컴퓨팅과 관련된 모든 것입니다.

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

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?