본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] AWS Lambda 서버리스 모델 배포 시 패키지 용량 제한 250MB 해결을 위한 3가지 방법과 차이점

by Papa Martino V 2026. 4. 16.
728x90

AWS Lambda
AWS Lambda

파이썬(Python) 기반의 머신러닝 모델을 AWS Lambda와 같은 서버리스 환경에 배포할 때 가장 먼저 마주치는 거대한 장벽은 바로 '배포 패키지 용량 제한'입니다. 기본적인 Scikit-learn부터 시작해 PyTorch, TensorFlow 같은 라이브러리를 포함하면 금세 제한 수치인 250MB(압축 해제 기준)를 초과하게 됩니다. 본 포스팅에서는 이를 해결하기 위한 전문적인 아키텍처 설계와 실무 노하우를 상세히 다룹니다.


1. 서버리스 배포의 아킬레스건: 패키지 사이즈 이슈

AWS Lambda는 이벤트 중심의 확장성이 뛰어난 서비스지만, 빠른 Cold Start를 위해 배포 패키지 크기를 엄격히 제한합니다. 하지만 일반적인 딥러닝 스택은 다음과 같은 용량을 차지합니다.

  • PyTorch: 약 600MB ~ 800MB
  • TensorFlow: 약 500MB+
  • Pandas & Numpy: 약 100MB+

단순한 압축 방식으로는 절대 이 장벽을 넘을 수 없습니다. 따라서 우리는 패키지를 최적화하거나, 로드 방식을 변경하거나, 혹은 컨테이너 기술을 활용하는 전략적 접근이 필요합니다.

2. 배포 전략별 핵심 차이 및 특징 비교

상황에 따라 적합한 해결책이 다릅니다. 아래 표를 통해 전략별 장단점을 비교해 보세요.

구분 Lambda Layer 활용 EFS(Elastic File System) 마운트 Docker 컨테이너 (Image)
최대 용량 250MB (총합) 무제한에 가까움 (PB급) 10GB
복잡도 낮음 높음 (VPC 설정 필수) 중간 (ECR 활용)
실행 속도 빠름 네트워크 지연 발생 가능 Cold Start 최적화 필요
주요 대상 경량 ML 모델 (sklearn 등) 대용량 가중치 파일 보유 모델 PyTorch/TF 기반 딥러닝 모델

3. 실무 적용을 위한 7가지 패키지 용량 해결 예제 (Python & CLI)

단순 이론을 넘어 실제 개발 환경에서 즉시 적용 가능한 7가지 솔루션 코드를 제공합니다.

Example 1: .jfrog 또는 .whl 파일에서 불필요한 파일 제거 스크립트

패키지 내의 테스트 폴더, 소스 코드 주석, 컴파일된 바이너리 중 불필요한 것을 삭제하여 용량을 줄입니다.

import os
import shutil

def cleanup_package(directory):
    patterns_to_remove = ['tests', '__pycache__', '*.pyc', 'dist-info', '*.so.1']
    for root, dirs, files in os.walk(directory):
        for name in dirs:
            if name in patterns_to_remove:
                shutil.rmtree(os.path.join(root, name))
                print(f"Removed directory: {name}")

# 배포 전 빌드 폴더 정리
cleanup_package("./my_lambda_package")
        

Example 2: AWS Lambda 전용 경량화 라이브러리 사용 (TFLite)

전체 TensorFlow 대신 TFLite 런타임만 사용하여 용량을 1/10로 줄이는 해결 방법입니다.

# requirements.txt에 일반 tensorflow 대신 아래 링크 사용
# tflite-runtime은 1MB 내외의 아주 작은 패키지입니다.
# https://google-styleguide.googlecode.com/svn/trunk/pyguide.html

import tflite_runtime.interpreter as tflite
import numpy as np

def lambda_handler(event, context):
    interpreter = tflite.Interpreter(model_path="model.tflite")
    interpreter.allocate_tensors()
    # 추론 로직 수행
    return {"status": "success"}
        

Example 3: 모델 가중치를 S3에서 /tmp로 스트리밍 로드

패키지에 모델 파일을 포함하지 않고, Lambda 실행 시 S3에서 읽어오는 방식입니다.

import boto3
import os

s3 = boto3.client('s3')

def load_model():
    if not os.path.exists('/tmp/model.pth'):
        s3.download_file('my-bucket', 'models/weights.pth', '/tmp/model.pth')
    
    # 이후 torch.load('/tmp/model.pth') 실행
    return "/tmp/model.pth"
        

Example 4: Dockerfile을 활용한 10GB 용량 제한 해결 (Container Image)

Lambda의 컨테이너 이미지 지원 기능을 활용하면 250MB 제한이 10GB로 늘어납니다.

FROM public.ecr.aws/lambda/python:3.9

# 필요한 대용량 라이브러리 설치
RUN pip install torch --no-cache-dir

# 소스 코드 복사
COPY app.py ${LAMBDA_TASK_ROOT}
COPY model.pth ${LAMBDA_TASK_ROOT}

# 실행 명령
CMD [ "app.lambda_handler" ]
        

Example 5: 공유 라이브러리(.so) 압축 및 런타임 압축 해제

용량이 큰 라이브러리 바이너리를 gzip으로 압축해 배포한 후 런타임에 메모리상에서 압축을 푸는 고도의 기술입니다.

import zipfile
import sys

def decompress_large_lib():
    with zipfile.ZipFile('heavy_lib.zip', 'r') as zip_ref:
        zip_ref.extractall('/tmp/libs')
    sys.path.append('/tmp/libs')

# Lambda 핸들러 밖에서 최초 1회 실행
decompress_large_lib()
        

Example 6: AWS CDK를 이용한 Layer 자동 분할 배포

인프라 코드(IaC)를 통해 종속성을 자동으로 분석하고 여러 레이어로 나누어 배포하는 해결책입니다.

# Python CDK 예시
from aws_cdk import aws_lambda as _lambda

layer = _lambda.LayerVersion(self, "MyLayer",
    code=_lambda.Code.from_asset("layer_output/"),
    compatible_runtimes=[_lambda.Runtime.PYTHON_3_9],
    description="ML Dependencies"
)

# 함수에 레이어 연결
handler = _lambda.Function(self, "MyFunc",
    layers=[layer],
    # ... 기타 설정
)
        

Example 7: 정적 분석 도구를 통한 종속성 다이어트 (pip-compile)

실제로 사용하지 않는 서브 종속성을 제거하여 패키지 크기를 최소화합니다.

# 터미널 명령어
# pip-chill은 꼭 필요한 최상위 패키지만 보여줍니다.
pip install pip-chill
pip-chill > requirements.txt

# 특정 플랫폼(Lambda 환경: manylinux)에 맞는 최소 사이즈 wheel 설치
pip install --platform manylinux2014_x86_64 --only-binary=:all: -r requirements.txt -t ./package
        

4. 결론 및 전문가의 조언

서버리스 환경에서 파이썬 모델의 용량 문제는 더 이상 '불가능'의 영역이 아닙니다. 2024년 현재 가장 추천되는 방식은 'Docker 컨테이너 이미지'를 통한 배포입니다. 이는 10GB라는 넉넉한 용량을 제공할 뿐만 아니라, 개발 환경과 배포 환경의 일관성을 보장하기 때문입니다. 만약 Cold Start 시간이 매우 중요하다면, 모델 양자화(Quantization)를 통해 모델 자체의 크기를 줄이고 Lambda Layer를 활용하는 복합적인 전략을 구사해야 합니다.

내용 출처 및 참고 문헌

  • AWS Documentation: "Deploying Lambda functions as container images"
  • PyTorch Official Guide for Mobile and Edge deployment.
  • Serverless Framework ML Deployment Blog.
  • NVIDIA TensorRT Optimization guide for Cloud Inference.
728x90