Kamal 배포 환경에서 Ruby on Rails AI 모델 사전 다운로드 최적화

Predownloading embedding models in Rails with Kamal

3줄 요약

  • Ruby on Rails에서 Informers/Transformers.rb gem을 사용할 때, AI 모델이 첫 사용 시 다운로드되어 프로덕션 배포(Kamal) 시 반복적인 다운로드 문제가 발생합니다.
  • 이 문제를 해결하기 위해 모델을 영구적인 볼륨에 사전 다운로드하고, gem이 해당 위치를 사용하도록 설정해야 합니다.
  • Kamal 볼륨 및 환경 변수 설정, 그리고 docker-entrypoint 스크립트 수정을 통해 모델 사전 로딩 프로세스를 자동화하여 배포 효율성을 높일 수 있습니다.

Ruby on Rails 환경에서 AI 기반 애플리케이션을 개발할 때, Informers 또는 Transformers.rb와 같은 gem은 문서 임베딩 생성에 유용하게 활용됩니다. 그러나 이러한 gem들이 사용하는 대규모 AI 모델은 기본적으로 첫 사용 시 다운로드되는 구조를 가지고 있습니다. 이는 개발 환경에서는 편리하지만, Kamal과 같은 Docker 기반 프로덕션 배포 환경에서는 배포될 때마다 모델이 새로 다운로드되는 비효율성을 야기하며 배포 시간을 증가시키는 주요 원인이 됩니다.

이러한 프로덕션 환경에서의 비효율성을 개선하기 위한 핵심 전략은 AI 모델을 단 한 번만 다운로드하여 영구적인 위치에 저장하고, 해당 gem들이 이 저장된 모델을 사용하도록 설정하는 것입니다. 첫 단계로 서버에 모델을 저장할 디렉토리(/models)를 생성하고 적절한 권한(컨테이너 사용자 권한 포함)을 설정합니다. 다음으로, Kamal의 config/deploy.yml 파일에 해당 디렉토리를 컨테이너 내부 경로(/rails/models)로 마운트하는 볼륨 설정을 추가합니다. 이어서, gem들이 모델 캐시 경로를 인식하도록 XDG_CACHE_HOME 환경 변수를 /rails/models로 설정합니다. 마지막으로, 모델을 실제로 사전 다운로드하는 과정을 자동화합니다. 이는 로컬에서 다운로드 후 scp로 전송하거나, kamal console을 이용하거나, 혹은 배포 과정의 일부로 통합하기 위해 bin/docker-entrypoint 스크립트에 모델 다운로드 명령어를 추가하는 방식을 사용할 수 있습니다. 특히 docker-entrypoint에 추가하는 방식은 애플리케이션 시작 전 모델 가용성을 보장하는 효과적인 방법입니다. 이 스크립트에서는 애플리케이션 진입점(예: Solid Queue 시작)에 따라 모델 다운로드 로직을 실행하도록 조건을 설정할 수 있으며, 사용하려는 모든 모델을 명시적으로 호출하여 다운로드되도록 해야 합니다.

결론적으로, Ruby on Rails AI 애플리케이션을 Kamal로 배포 시 발생하는 모델 반복 다운로드 문제를 해결하기 위해 영구 볼륨을 활용한 모델 사전 다운로드 및 캐시 경로 설정은 필수적입니다. 서버 디렉토리 설정, Kamal 볼륨 및 환경 변수 구성, 그리고 `docker-entrypoint`를 통한 사전 로딩 자동화는 배포 프로세스의 효율성을 크게 향상시키고 안정적인 서비스 운영에 기여합니다. 이러한 최적화는 특히 모델 크기가 크거나 여러 모델을 사용하는 경우 더욱 중요하며, 지속적인 통합/지속적인 배포(CI/CD) 파이프라인의 속도 개선에도 긍정적인 영향을 미칩니다.