플러팅 AI/Flask Server

Docker 이미지 최적화로 12GB-> 3.5GB

Solo.dev 2024. 12. 6. 00:49
 

Docker 이미지 최적화로 Cold Start 줄이기: 실제 경험담


1. 문제점: Docker 이미지 크기가 너무 크다

  • 현재 상태
    Google Cloud Run에 배포할 컨테이너 이미지를 빌드했는데 크기가 12GB에 달함.
    • Cloud Run은 서버가 꺼진 상태에서 요청이 들어오면 Cold Start를 통해 이미지를 다시 다운로드하고 환경을 구축함.
    • Cold Start 문제: 이미지 크기가 클수록 다운로드와 환경 구축 시간이 오래 걸림.
    • 내 앱은 서버에서 health 체크나 sid를 받지 않으면 부트스플래시 화면에서 넘어가지 않도록 설계했는데, 이 과정에서 대기 시간이 길어져 사용자 경험이 저하됨.
  • 앱 구조 변경 아이디어
    • 앱 진입점에서 health 체크만 받은 후, 사용자가 이미지를 업로드하면 로딩 상태로 둠.
    • 서버는 작업을 큐에 넣어 대기하고, 클라이언트의 sid가 연결되자마자 업로드 엔드포인트 실행.
    • 이를 통해 초기 로딩 속도를 개선.

2. Docker 이미지 용량 확인 및 분석

1) 이미지 레이어와 크기 확인

  • Docker Desktop을 사용해 레이어 크기를 확인했더니 총 8GB.
  • 하지만 전체 이미지 크기는 12GB로 나타남.

2) Dive 설치 후 분석 시도

  • Dive 설치 방법
    • Dive 설치 후 환경 변수 PATH에 추가.
    • dive image-name 명령으로 이미지 분석.
  • 문제 발생
    • 이유: Docker 설정에서 containerd 기반 이미지 스토리지를 사용하도록 되어 있었음.
  • shell
    코드 복사
    could not find 'blobs/sha256/... in parsed layers

3. 문제 해결: Docker 설정 변경으로 용량 감소

1) Docker Desktop 설정 변경

  • 설정 → General → Use containerd for pulling and storing images 옵션 체크 해제.
  • 결과: 이미지 크기가 12GB → 8GB로 감소.

2) 이유 분석

  • Containerd 옵션 활성화
    • 멀티 플랫폼 이미지 지원.
    • 보안 검증(이미지 서명 등) 활성화.
    • Google Cloud Run은 containerd를 사용하므로 호환성이 높음.
  • Containerd 옵션 비활성화
    • 단일 플랫폼(예: linux/amd64) 이미지만 사용 시 메타데이터가 줄어 이미지 크기 감소.
    • Cloud Run은 단일 플랫폼 이미지를 기본 지원하므로 비활성화 상태에서도 문제 없음.

3) 결론

  • 조직적 배포 환경이 아니라면 비활성화로 이미지 크기를 줄이는 것이 Cold Start 문제 해결에 유리.

4. Dive로 대용량 라이브러리 확인

1) Dive 분석

  • Dive 명령어로 분석 후 site-packages 디렉토리를 조사.
  • du -sh * 명령어를 사용해 라이브러리별 메모리 크기 확인.

2) 결과

  • 가장 큰 용량을 차지하는 라이브러리:
    • nvidia (2.7GB): GPU 관련 패키지.
    • torch (1.7GB): PyTorch GPU 버전.
    • opencv, scipy 등도 각각 수백 MB 이상.

5. 문제 해결: GPU 패키지 → CPU 패키지로 전환

1) GPU → CPU 변경

  • Docker requirements.txt에서 PyTorch 및 torchvision을 CPU 버전으로 명시.
text
코드 복사
--extra-index-url https://download.pytorch.org/whl/cpu torch==2.5.1+cpu torchvision==0.20.1+cpu

2) 결과

  • 이미지 크기: 12GB → 3.5GB
    • GPU 패키지 제거로 약 8.5GB 감소.
    • torch와 nvidia가 전체 최적화에 크게 기여.

6. 추가 테스트

1) Dive 결과

  • Dive 분석 화면에서 모든 레이어와 라이브러리 크기 재확인.
  • GPU 패키지가 제거된 후 용량이 적절히 줄어든 것을 확인.

2) Cloud Run 테스트

  • 최적화된 이미지를 Cloud Run에 배포.
  • 실제 Cold Start 시간 확인(예상: 대폭 감소).

7. 추후 계획

  1. 구현 변경:
    • 앱 진입점에서 health 체크만 수행.
    • 사용자가 이미지를 업로드하면 큐에 작업을 대기시키고, 서버가 준비되면 업로드 처리.
  2. Cloud Run Cold Start 테스트:
    • Cold Start 시간 비교.
    • 최적화 전/후 속도 차이 기록.

8. 결론

  • Docker 이미지는 크기가 작을수록 배포 속도가 빨라지고 Cold Start 시간이 줄어든다.
  • Dive와 Docker Desktop을 활용해 대용량 요소를 파악하고 최적화 가능.
  • 단일 플랫폼, CPU 기반으로 전환하면 대부분의 애플리케이션에서 충분히 효율적으로 동작.
  • 추가로 Docker 이미지 설계 및 최적화 방법론을 학습하고 적용할 계획.