모델 로드와 관리 (Load and manage models)
모델 로드와 관리 (Load and manage models)
모델을 서빙하려면 그 전에 "어디에 모델을 저장하고, 어떻게 불러올지"를 정해야 해요. BentoML은 이 과정을 다루는 간단한 API를 제공하는데, 로컬의 Model Store에 모델을 저장하고, Service 안에서 BentoModel·HuggingFaceModel로 불러오는 흐름을 이해하면 배포가 훨씬 수월해져요. 이 페이지에서 그 전 과정을 정리해 볼게요.
출처: https://docs.bentoml.com/en/latest/build-with-bentoml/model-loading-and-management.html
Model Store 이해하기
BentoML은 모델을 저장하고 관리하는 로컬 Model Store를 제공해요. 사실상 BentoML이 관리하는 로컬 파일 디렉터리인데, 두 가지 경우에 특히 유용해요.
- 프라이빗 모델 관리: 특정 작업을 위해 미세조정(fine-tune)하거나 학습시킨 프라이빗 모델을 안전하고 효율적으로 저장하고 버전 관리하며 접근할 수 있어요.
- 모델 카탈로그링: 모델을 쉽게 카탈로그화하고 버전 관리해서, 모델 반복과 전환 기록을 깔끔하게 유지할 수 있어요.
모델 저장하기
bentoml.models.create()를 컨텍스트 매니저로 사용하면 모델이 제대로 정리·저장되도록 보장하면서 Model Store에 등록할 수 있어요. 예를 들어 Hugging Face Transformers 파이프라인을 아래처럼 저장할 수 있어요.
import transformers
import bentoml
model = "sshleifer/distilbart-cnn-12-6"
task = "summarization"
pipeline = transformers.pipeline(task, model=model)
with bentoml.models.create(
name='summarization-model',
) as model_ref:
pipeline.save_pretrained(model_ref.path)
print(f"Model saved: {model_ref}")
기본적으로 Model Store에 저장된 모델은 /home/user/bentoml/models/ 아래에, 모델마다 고유한 하위 디렉터리로 저장돼요. 위 코드는 summarization-model을 /home/user/bentoml/models/summarization-model/에 저장하죠. 저장된 모델의 경로는 path 속성으로 가져올 수 있어요. 디스크에 이미 모델이 있다면 shutil.copytree로 Model Store로 가져올 수도 있어요.
모델 로드하기
BentoML은 모델 로딩을 효율적으로 만들어 BentoCloud에서의 배포를 가속하고, 이미지 빌드 시간과 콜드 스타트 시간을 줄여줘요.
Model Store 또는 BentoCloud에서 로드
로컬 Model Store나 BentoCloud에서 모델을 불러오려면 bentoml.models에서 BentoModel을 만들고 모델 태그를 지정하면 돼요. 모델이 로컬에 저장되어 있거나 BentoCloud에 있어야 해요.
import bentoml
from bentoml.models import BentoModel
import joblib
@bentoml.service(resources={"cpu": "200m", "memory": "512Mi"})
class MyService:
iris_ref = BentoModel("iris_sklearn:latest")
def __init__(self):
self.iris_model = joblib.load(self.iris_ref.path_of("model.pkl"))
기본적으로 BentoModel의 __get__은 bentoml.Model 객체를 반환해서, joblib.load 같은 도구로 실제 모델 데이터를 불러와야 해요.
Hugging Face에서 로드
Hugging Face(HF)에서 모델을 불러오려면 bentoml.models의 HuggingFaceModel을 만들고 HF에 표시된 모델 ID를 지정해요. 게이트(gated) 모델이라면 로드 전에 Hugging Face API 토큰을 환경 변수로 export 해 두어야 해요.
import bentoml
from bentoml.models import HuggingFaceModel
from transformers import AutoModelForSequenceClassification, AutoTokenizer
@bentoml.service(resources={"cpu": "200m", "memory": "512Mi"})
class MyService:
model_path = HuggingFaceModel("google-bert/bert-base-uncased")
def __init__(self):
self.model = AutoModelForSequenceClassification.from_pretrained(self.model_path)
self.tokenizer = AutoTokenizer.from_pretrained(self.model_path)
HuggingFaceModel은 기본적으로 내려받은 모델 경로를 문자열로 반환하기 때문에, 그 경로를 transformers 같은 라이브러리에 바로 넘겨서 모델을 로드할 수 있어요. 모델이 프라이빗 리포지토리에 있다면 endpoint 파라미터로 엔드포인트 URL을 지정할 수 있고, 기본값은 https://huggingface.co/예요.
model_path = HuggingFaceModel("your_model_id", endpoint="https://my.huggingface.co/")
한 가지 꼭 기억할 점이 있어요. BentoModel이나 HuggingFaceModel은 Service 클래스의 클래스 스코프에서 로드해야 해요. 클래스 변수로 정의해야 그 모델이 Service의 의존성으로 선언되어, Bento가 전송·배포될 때 모델도 함께 참조되거든요. 만약 이 API를 Service 클래스 생성자 안에서 호출하면 모델이 Bento에 참조되지 않아 push나 배포가 되지 않고, 결국 모델 NotFound 오류가 나요.
BentoML은 모델 로딩을 두 가지로 가속해요. 첫째, BentoModel·HuggingFaceModel을 쓰면 모델을 Service 시작 시점이 아니라 이미지 빌드 시점에 내려받아서 컨테이너에 캐시·마운트해요. 그래서 특히 큰 모델에서 콜드 스타트가 크게 줄어들죠. 둘째, safetensors를 이용한 병렬 로딩으로 모델 가중치를 순차가 아닌 동시에 여러 부분으로 나눠 로드해요.
모델 관리하기
Model Store에 모델을 저장하고 꺼내는 게 가장 흔한 관리 작업이에요. 그 외에도 BentoML CLI나 관리 API로 다양한 작업을 할 수 있어요.
CLI 명령
- 목록:
bentoml models list— 저장된 모델 전체를 태그·크기·생성 시간과 함께 보여줘요. - 조회:
bentoml models get summarization-model:latest— 특정 모델의 상세 정보를 보여줘요. - 내보내기/가져오기:
bentoml models export summarization-model:latest .로 모델을 단일 아카이브 파일(.bentomodel)로 내보내고,bentoml models import로 다시 가져올 수 있어요. AWS S3, GCS, FTP, Dropbox 같은 외부 스토리지로도 내보내고 가져올 수 있어요. - 푸시/풀: BentoCloud 계정으로 로그인하면
bentoml models push와bentoml models pull로 모델을 BentoCloud에 올리고 내려받을 수 있어요. - 삭제:
bentoml models delete summarization-model:latest -y로 모델을 삭제해요.
CLI에 대한 더 자세한 사용법은 bentoml models --help를 실행해 보세요.
Python API
CLI 명령과 동일한 동작을 하는 Python API도 제공해요. bentoml.models.list(), bentoml.models.export_model(), bentoml.models.import_model(), bentoml.models.push(), bentoml.models.pull(), bentoml.models.delete()가 그거예요. 외부 스토리지 사용 예로 bentoml.models.import_model('s3://my_bucket/folder/my_model.bentomodel')처럼 S3 경로를 넘길 수도 있답니다.
더 알아보기
- Bento와 모델 API 레퍼런스: Bento and model APIs
- Service 안에서 모델 의존성으로 활용하기: Create online API Services