Lambda 및 CDK V2를 사용하여 추론을 위한 여러 기계 학습 모델 배포

This article was base on this post, however in this case I'm using CDK V2



대규모 라이브러리 또는 사전 훈련된 모델을 사용하여 기계 학습 모델 추론에 Lambda 이점을 활용할 수 있습니다.

솔루션 개요



추론 Lambda 함수의 경우 필요한 라이브러리를 가져오고 ML 모델을 로드하기 위해 Docker 구현을 사용합니다. 배포 패키지 크기의 Lambda limits(컨테이너 이미지의 경우 10GB 및 .zip 파일의 경우 50MB) 때문에 이러한 방식으로 수행합니다.

추론을 위한 Lambda 함수의 파일 시스템으로 Amazon EFS를 구현하므로 이제 ML 추론 워크로드를 위해 대용량 모델과 파일을 메모리에 로드하는 것이 훨씬 더 쉽고 빠릅니다.

ML 모델을 파일 시스템에 업로드하기 위해 모델을 S3 버킷에 업로드할 때 트리거되는 Lambda 함수를 사용합니다. (다음 그림에서 아키텍처를 보게 될 것입니다)

아키텍처 개요



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



AWS 서비스


  • Amazon VPC(Amazon EFS에 필요)
  • 아마존 S3
  • 아마존 EFS
  • AWS 람다
  • Amazon API 게이트웨이

  • 이 아키텍처를 처음부터 만드는 단계



    TypeScript와 함께 AWS CDK V2를 사용하고 있습니다.

    추론을 위한 Docker는 scikit-learn 요구 사항을 위해 만들어졌습니다. TensorFlow, PyTorch, xgboost 등과 같은 원하는 기계 학습 프레임워크를 사용하도록 요구 사항 파일을 사용자 지정할 수 있습니다.

    1) VPC, EFS 및 액세스 포인트 생성




    const vpc = new Vpc(this, "MLVpc");
    


    EFS는 VPC 내부에 있어야 하므로 VPC를 생성합니다.

    const fs = new FileSystem(this, "MLFileSystem", {
       vpc,
       removalPolicy: RemovalPolicy.DESTROY,
       throughputMode: ThroughputMode.BURSTING,
       fileSystemName: "ml-models-efs",
    });
    


    여기서는 VPC 내에 EFS를 생성합니다. 명심해야 할 것은 처리량 모드입니다.

    In bursting mode, the throughput of your file system depends on how much data you’re storing in it. The number of burst credits scales with the amount of storage in your file system. Therefore, if you have an ML model that you expect to grow over time and you drive throughput in proportion to the size, you should use burst throughput mode.



    const accessPoint = fs.addAccessPoint("LambdaAccessPoint", {
      createAcl: {
        ownerGid: "1001",
        ownerUid: "1001",
        permissions: "750"
      },
      path: "/export/lambda",
      posixUser: {
        gid: "1001",
        uid: "1001"
      }
    });
    


    여기에서 EFS에 연결하기 위해 람다의 함수에서 사용할 액세스 포인트를 추가합니다.

    2) S3 버킷 및 Lambda 함수 생성(S3에서 EFS로 콘텐츠 업로드)




    const bucket = new Bucket(this, "MLModelsBucket", {
      encryption: BucketEncryption.S3_MANAGED,
      bucketName: "machine-learning.models",
    });
    


    S3 버킷의 기본 구성입니다.

    const MODEL_DIR = "/mnt/ml";
    
    const loadFunction = new NodejsFunction(this, "HandleModelUploaded", {
      functionName: "handle-model-uploaded",
      entry: `${__dirname}/functions/model-uploaded/handler.ts`,
      handler: "handler",
      environment: {
        MACHINE_LEARNING_MODELS_BUCKET_NAME: bucket.bucketName,
        MODEL_DIR,
      },
      vpc,
      filesystem: LambdaFileSystem.fromEfsAccessPoint(accessPoint, MODEL_DIR),
    });
    
    //Permission settings
    
    bucket.grantRead(loadFunction);
    
    loadFunction.addEventSource(
      new S3EventSource(bucket, {
        events: [EventType.OBJECT_CREATED],
      })
    );
    


    고려해야 할 몇 가지 사항이 있습니다.

    1) VPC: Lambda에서 EFS의 동일한 VPC를 설정해야 합니다.
    2) MODEL_DIR: 머신러닝 모델을 저장하고 불러올 경로입니다.
    3) 이벤트 소스: 버킷의 모든 새 개체가 해당 람다 함수를 실행할 것이라고 말합니다.

    3) Lambda 함수(추론용) 및 API Gateway



    const inferenceFunction = new DockerImageFunction(this, "InferenceModel", {
      functionName: "inference-model",
      code: DockerImageCode.fromImageAsset(
        `${__dirname}/functions/model-inference`
      ),
      environment: {
        MODEL_DIR,
      },
      memorySize: 10240,
      timeout: Duration.seconds(30),
      vpc,
      filesystem: LambdaFileSystem.fromEfsAccessPoint(accessPoint, MODEL_DIR),
    });
    
    

    패키지 크기 때문에 DockerImage를 람다 함수로 사용하고 있습니다. 배포 패키지 크기에서 Lambda limits(컨테이너 이미지의 경우 10GB, .zip 파일의 경우 50MB)을 기억하십시오.

    요청이 있을 때마다 내부 캐시를 로드하지 않도록 내부 캐시를 사용하기 때문에 허용되는 최대 메모리를 설정합니다.

    const api = new RestApi(this, "ApiGateway", {
       restApiName: "inference-api",
       defaultCorsPreflightOptions: {
         allowHeaders: ["*"],
         allowMethods: ["*"],
         allowOrigins: ["*"],
       }
    });
    
    const todos = api.root.addResource("inference");
    
    todos.addMethod("POST", new LambdaIntegration(inferenceFunction, { proxy: true }));
    
    


    마지막으로 Rest Api 게이트웨이를 생성합니다. CDK V2가 Api Gateway V2를 생성자로 아직 출시하지 않았기 때문에 ApiGateway V1을 사용합니다.

    Github



    우리Github를 살펴보겠습니다.

    좋은 웹페이지 즐겨찾기