모델 가중치 저장 (Storing model weights)
모델 가중치 저장 (Storing model weights)
큰 모델의 가중치를 어떻게 다루느냐는 대부분의 ML·AI 애플리케이션에서 빌드 시간과 시작 지연을 좌우하는 핵심이에요. LLM 추론을 Modal에 올릴 때도 모델 파일을 어디에 두고 어떻게 불러오느냐가 콜드 스타트와 성능을 크게 바꾸죠. Modal에서 권장하는 방법은 모델 가중치를 Volume에 저장하는 건데, 이건 모든 Modal Function이 접근 가능한 분산 파일시스템, 쉽게 말해 '공유 디스크'처럼 동작해요.
Volume에 가중치 저장하기
가중치를 Volume에 저장하려면 두 가지 경로가 있어요. 하나는 가중치를 저장하는 Modal Function에 Volume을 붙여 읽고 쓸 수 있게 하는 방법이고, 다른 하나는 클라이언트에서 가중치를 Volume로 업로드하는 방법이에요.
이미 Modal에서 가중치를 생성하고 있다면, Volume을 dictionary에 담아 원격 머신의 경로와 modal.Volume 객체를 매핑해서 Function에 붙이면 돼요. Volume은 일반 파일시스템처럼 보이기 때문에, 모델 가중치를 저장하는 데 특별한 코드가 필요 없어요.
가중치가 Modal 밖에서 생성되고 인터넷으로 제공된다면(예: 오픈 가중치 모델 제공사나 전용 클러스터에서의 학습 잡) Modal Function 안에서 내려받아 Volume에 넣을 수도 있어요. 인증이 필요한 가중치는 Modal Secrets를 추가해서 접근하면 돼요.
클라이언트에서 Volume로 밀어 넣기
Modal Function 안에서 Volume으로 당겨 오는 대신, 노트북이나 전용 학습 클러스터 같은 클라이언트에서 Modal로 밀어 넣고 싶을 수 있어요. 그럴 때는 modal.Volume의 batch_upload 메서드를 Modal Python 클라이언트 라이브러리로 쓰거나, modal volume CLI 명령으로 업로드할 수 있어요.
가중치가 이미 S3 버킷 같은 클라우드 스토리지에 있다면 CloudBucketMount로 Modal Functions에 연결할 수 있어요. 사용법은 cloud-bucket-mounts 가이드를 참고하면 돼요. Volume에 담긴 가중치는 Function에 Volume을 붙이는 한, 디스크에서 읽듯 평범하게 읽을 수 있어요.
Volume 대신 Image에 저장하기
가중치를 Function의 Modal Image에 저장할 수도 있어요. Image는 Function이 시작할 때 보는 비공개 파일시스템 상태죠. Image.run_commands로 셸 명령으로 내려받거나, Image.run_function으로 Python 함수로 내려받을 수 있어요.
다만 Modal은 가중치를 Volume에 저장하는 걸 권장해요. 두 방법의 성능은 비슷하지만 Volume이 더 유연하거든요. Image는 정의가 바뀌면 변경된 레이어부터 다시 빌드되는데, 이게 어떤 빌드에서는 재현성을 높이지만 대부분의 경우 불필요한 추가 다운로드를 유발해요.
가중치를 한 번만 로드하기 (컨테이너 수명 주기)
위 코드 예제에서는 inference 함수가 실행될 때마다 가중치를 디스크에서 메모리로 로드해요. 추론이 모델 로딩보다 훨씬 느릴 때(아주 큰 데이터셋으로 돌릴 때)나 로딩 로직이 재로드를 똑똑하게 건너뛸 때는 괜찮지만, 특정 모델의 가중치가 딱 한 번만 로드되도록 보장하려면 @modal.enter 컨테이너 수명 주기 훅을 쓰면 돼요. 이 훅은 새 컨테이너가 시작할 때만 가중치를 로드하죠.
주의할 점은 @modal.enter로 장식한 메서드는 동적 인자를 넘길 수 없다는 거예요. 컨테이너 시작마다 단일하지만 서로 다를 수 있는 모델을 로드해야 한다면, modal.parameter 문법으로 modal.Cls를 파라미터화하면 돼요.