반응형
나는조이
쑥쑥 크는 조이
나는조이
  • 분류 전체보기 (66)
    • 나누며 성장하기 (14)
      • Raktivist's Diary (4)
      • 성장 코칭 Growth Coaching (2)
      • 일상 · 생각 (8)
    • 읽고 성장하기 (1)
    • 공부하며 성장하기 (51)
      • 인공지능 AI (34)
      • AWS (1)
      • 파이썬 Python (6)
      • C# · WPF (1)
      • Fixing Errors (6)
      • 인사이트 리뷰 Insight Review (2)
      • AI-struction (1)

인기 글

최근 댓글

공지사항

  • def introduce(self):
전체 방문자
오늘
어제
ⓒ2022 @nanunzoey.All rights reserved.
hELLO · Designed By 정상우.
나는조이

쑥쑥 크는 조이

AWS ECR 이미지와 lambda로 딥러닝 Serverless 서비스 만들기 - UnicodeDecodeError 해결
공부하며 성장하기/Fixing Errors

AWS ECR 이미지와 lambda로 딥러닝 Serverless 서비스 만들기 - UnicodeDecodeError 해결

2023. 6. 13. 13:50

 

Error message:

Traceback (most recent call last):
    File "/var/runtime/bootstrap.py", line 60, in <module>
    main()
    File "/var/runtime/bootstrap.py", line 55, in main
    add_default_site_directories()
    ...
    중략
    ...
    File "/var/lang/lib/python3.9/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 64: invalid start byte


Cause:

딥러닝 모델 파일(.pth)을 AWS lambda working directory에 COPY한 후, decode하는 과정에서 에러 발생

 


Solution:

① Dockerfile에 COPY 경로를 정확하게 적었는지 확인하기

아래 예시처럼 ${LAMBDA_TASK_ROOT}에 해당 파일이나 디렉토리가 잘 복사되도록 작성한다.
사실 어차피 base image에서 ${LAMBDA_TASK_ROOT}를 WORKDIR로 미리 설정하기 때문에 아래와 같이 명시하는 것이 의무는 아닌 것 같지만... 혹시 모르니까 잘 적어주었다.

FROM public.ecr.aws/lambda/python:3.9
COPY requirements.txt .
RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host download.pytorch.org --trusted-host=files.pythonhosted.org --no-cache-dir -r requirements.txt --no-deps --target "${LAMBDA_TASK_ROOT}"
RUN yum -y update && yum -y install mesa-libGL
COPY app.py ${LAMBDA_TASK_ROOT}
COPY model ${LAMBDA_TASK_ROOT}/model
CMD [ "app.handler" ]

 

② 모델 파일(.pth)을 직접 COPY하지 않고 S3에서 가져와서 사용하기

사실 이게 크리티컬했다.
원래는 모델 파일도 함께 ${LAMBDA_TASK_ROOT}에 COPY하여 컨테이너 이미지를 빌드했다.
그런데 그렇게 했더니 어떤 방식으로도 decodeerror가 해결되지 않았다.

결국 S3에 모델 파일을 올려두었다가 람다 함수가 실행될 때 다운로드해서 로드하는 것으로 변경했다.
그랬더니 바로 해결!

이때 주의할 것은 다운로드 경로를 /tmp 디렉토리 안에 담아야 한다는 것이다.

import boto3

s3_client = boto3.client("s3")
net = DeeplearningModel(
    encoder_name='resnet50',
    in_channels=3,
    classes=1
)

s3_client.download_file("BUCKET_NAME", "MODEL_FILE.pth", "/tmp/MODEL_FILE.pth")

def handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(DATA)
    }

 

반응형

'공부하며 성장하기 > Fixing Errors' 카테고리의 다른 글

Docker Desktop shutting down 해결  (0) 2024.02.22
Loss function returned Nan values 해결  (0) 2023.12.08
torch.load 시 _pickle.UnpicklingError: invalid load key 해결  (0) 2022.10.29
requirements.txt에서 URL로 PyTorch 설치하기  (1) 2022.09.21
torch.cuda.is_available() False 해결  (2) 2022.06.11
    '공부하며 성장하기/Fixing Errors' 카테고리의 다른 글
    • Docker Desktop shutting down 해결
    • Loss function returned Nan values 해결
    • torch.load 시 _pickle.UnpicklingError: invalid load key 해결
    • requirements.txt에서 URL로 PyTorch 설치하기
    나는조이
    나는조이
    매일 쑥쑥 크는 성장기를 담습니다.

    티스토리툴바