ModelPack: AI/ML 모델의 패키징/배포/실행을 위한 오픈소스 표준 (= AI 모델을 위한 Docker, feat. OCI)

ModelPack 소개

ModelPack은 인공지능(AI) 및 머신러닝(ML) 모델을 패키징, 배포, 그리고 실행하기 위해 설계된 벤더 중립적(Vendor-neutral)인 오픈소스 표준 사양입니다. 클라우드 네이티브 환경에서 AI 모델을 마치 소프트웨어 컨테이너처럼 다룰 수 있게 하여, 특정 플랫폼이나 기업에 종속되지 않는 자유로운 모델 생태계를 구축하는 것을 목표로 합니다.

ModelPack 프로젝트의 등장은 인프라스트럭처의 진화 과정과 밀접하게 연관되어 있습니다. 우리는 과거 하드웨어 중심의 시대에서 가상 머신(VM)의 시대를 거쳐, Docker와 Kubernetes로 대표되는 컨테이너 중심의 인프라 시대로 넘어왔습니다. ModelPack 프로젝트는 이제 네 번째 단계인 AI 모델 중심 인프라(AI Model Centric Infrastructure) 시대가 도래했음을 알립니다. 컨테이너 기술이 소프트웨어 배포의 표준을 정립했던 것처럼, ModelPack은 파편화된 AI 모델의 배포 방식을 표준화하려는 시도입니다.

현재 AI 개발 환경에서 개발자들은 모델을 배포할 때마다 각기 다른 프레임워크와 비표준화된 저장 방식을 마주해야 합니다. 모델 가중치 파일, 추론 코드, 설정 파일들이 제각기 흩어져 있어 관리가 어렵고, 로컬 개발 환경과 실제 운영 환경의 차이로 인해 배포가 실패하는 경우도 빈번합니다. ModelPack은 이러한 문제를 해결하기 위해 CNCF(Cloud Native Computing Foundation) 생태계의 기술을 활용하여, 어떤 환경에서든 모델이 동일하게 동작하도록 보장하는 표준 규격을 제공합니다.

기존 컨테이너 기술과의 비교 및 OCI의 역할

ModelPack을 이해하기 위해서는 먼저 OCI(Open Container Initiative)에 대한 이해가 필요합니다. OCI는 컨테이너 포맷과 런타임에 대한 업계 개방형 표준입니다. 우리가 흔히 사용하는 Docker 이미지가 바로 이 OCI 표준을 따르고 있습니다. 덕분에 Docker로 만든 이미지를 Kubernetes가 실행할 수 있고, Amazon ECR이나 Google GCR 같은 다양한 저장소에 보관할 수 있는 것입니다.

ModelPack은 바로 이 OCI 아티팩트(Artifact) 표준을 AI 모델에 적용했습니다. 기존의 Docker 컨테이너가 '애플리케이션과 그 실행 환경(OS 라이브러리 등)'을 패키징했다면, ModelPack은 AI 모델 데이터(가중치), 메타데이터, 그리고 추론 코드OCI 포맷으로 패키징합니다.

이러한 접근 방식은 기존 AI 생태계의 독점적 포맷(Proprietary formats)과 큰 차별점을 가집니다. 특정 클라우드 벤더의 전용 모델 저장소나 Hugging Face와 같은 특정 플랫폼에 의존하는 대신, 개발자들은 이미 회사에서 사용 중인 Docker Hub, Harbor, GitHub Packages와 같은 표준 OCI 레지스트리를 그대로 사용하여 AI 모델을 저장하고 버전 관리할 수 있습니다. 즉, 별도의 AI 전용 인프라를 새로 구축할 필요 없이 기존의 검증된 컨테이너 인프라를 재사용할 수 있다는 것이 가장 큰 기술적 장점입니다.

ModelPack의 구성 요소

ModelPack은 단순한 파일 형식이 아니라, 모델의 생애 주기를 관리하는 포괄적인 시스템으로, 다음과 같은 3가지의 구성 요소를 갖습니다:

  • Model Spec (사양): 모델 패키지가 어떻게 구성되어야 하는지 정의한 기술적 규칙입니다. OCI 이미지 명세를 기반으로 하며, 레이어 구조와 메타데이터 형식을 규정합니다.

  • Modelfile: Docker의 Dockerfile과 유사한 개념입니다. 모델 패키지를 어떻게 빌드할지 정의하는 설정 파일로, 모델의 이름, 아키텍처, 포함할 파일 경로 등을 KEY VALUE 형식으로 기술합니다.

  • modctl (CLI 도구): ModelPack 사양에 맞춰 모델을 빌드(Build), 레지스트리에 푸시(Push), 다운로드(Pull) 할 수 있는 명령줄 도구입니다.

이제 각 구성요소를 하나씩 살펴보겠습니다:

Model Spec: 모델 패키지의 구성 요소

ModelPack 사양서(spec.md)에 따르면, ModelPack 패키지는 OCI 이미지 레이아웃을 따르며 크게 세 가지 핵심 요소로 구성됩니다:

첫 번째는 매니페스트(Manifest) 입니다. 이는 패키지의 '목차'와 같은 역할을 하며, 해당 모델 패키지를 구성하는 모든 레이어들의 해시값(Digest)과 크기 정보를 담고 있습니다. 런타임은 이 매니페스트를 통해 패키지의 무결성을 검증하고 필요한 파일들을 다운로드합니다.

두 번째는 설정(Configuration) 레이어입니다. 이곳에는 모델의 기술적 메타데이터가 JSON 형식으로 저장됩니다. 모델이 어떤 아키텍처(예: Transformer)를 기반으로 하는지, 파라미터의 크기는 얼마인지, 입력과 출력 텐서(Tensor)의 형태는 어떠한지 등이 명시됩니다. 이러한 메타데이터의 표준화는 런타임이 모델 파일을 열어보지 않고도 필요한 리소스를 미리 할당하거나 호환성을 체크할 수 있게 해줍니다.

세 번째는 실제 데이터가 담긴 레이어(Layers) 들입니다. ModelPack은 효율성을 위해 데이터를 여러 층으로 분리합니다. 예를 들어, 수 기가바이트(GB)에 달하는 모델 가중치(Weights) 파일은 별도의 레이어로, 변경이 잦은 추론 코드(Inference Code)나 설정 파일은 또 다른 가벼운 레이어로 구성합니다. 이렇게 하면 모델 코드를 수정해서 다시 배포할 때, 거대한 가중치 파일을 다시 업로드하거나 다운로드할 필요 없이 변경된 코드 레이어만 전송하면 되므로 배포 속도가 획기적으로 빨라집니다.

Modelfile: 모델 정의의 표준

Docker에 Dockerfile이 있다면, ModelPack에는 **Modelfile**이 있습니다. 이는 모델 패키지를 빌드하기 위한 설계도 역할을 하는 텍스트 파일입니다. 개발자는 이 파일에 모델의 정체성과 구성 요소를 정의합니다. Modelfile은 키-값(Key-Value) 쌍의 명령어로 구성되며, 주요 명령어는 다음과 같습니다.

먼저 모델의 식별 정보를 정의합니다. NAME은 모델의 이름을, ARCH는 모델의 아키텍처(예: transformer, cnn)를 지정합니다. FAMILY는 모델의 계열(예: llama, bert)을 나타내며, PARAMSIZEPRECISION은 각각 파라미터 수(예: 7B, 70B)와 데이터 정밀도(예: fp16, bf16)를 명시하여 사용자가 리소스 계획을 세울 수 있도록 돕습니다. FORMAT은 원본 모델 파일의 형식(예: safetensors, onnx)을 지정합니다.

다음으로 패키지에 포함될 실제 파일들을 매핑합니다. CONFIG 명령어는 모델의 하이퍼파라미터 등이 담긴 설정 파일을, MODEL 명령어는 실제 가중치 파일을 지정합니다. CODE 명령어는 모델을 로드하고 실행하는 Python 등의 소스 코드를 포함시키며, DOC은 README와 같은 문서 파일을 지정합니다. 와일드카드(*) 패턴을 지원하여 여러 파일을 한 번에 지정할 수도 있습니다.

modctl: 모델 패키징 및 배포 워크플로우

ModelPack 프로젝트는 이 사양을 구현한 **modctl**이라는 공식 CLI(Command Line Interface) 도구를 제공합니다. 일반적인 개발 워크플로우는 다음과 같이 진행됩니다.

가장 먼저 modctl을 설치하고, 작업 디렉토리에 모델 파일과 Modelfile을 준비합니다. 모든 준비가 끝나면 개발자는 modctl build 명령어를 실행합니다. 이 과정에서 도구는 Modelfile을 읽어 들여, 로컬에 있는 모델 파일과 코드들을 OCI 레이어로 변환하고, 이를 하나로 묶어 로컬 저장소에 '태그'가 달린 아티팩트로 생성합니다.

빌드가 완료되면 modctl push 명령어를 통해 이를 원격 레지스트리로 전송합니다. 이때 목적지는 Docker Hub가 될 수도 있고, 사내에 구축된 Harbor 레지스트리가 될 수도 있습니다. OCI 표준을 따르기 때문에 docker push와 거의 동일한 사용자 경험을 제공하며, 레지스트리 인증 또한 modctl login을 통해 처리됩니다.

마지막으로 배포 단계에서는 modctl pull 명령어를 사용하여 원격 저장소에 있는 모델을 내려받습니다. 단순히 다운로드하는 것에 그치지 않고, modctl extract 명령어를 사용하면 패키지 내부의 파일들을 특정 디렉토리에 압축 해제하여 즉시 사용할 수 있는 상태로 만들 수 있습니다. Kubernetes 환경에서는 이러한 과정을 자동화하여, 파드(Pod)가 시작될 때 모델 패키지를 볼륨으로 마운트하여 애플리케이션에 제공하는 것도 가능합니다.

ModelPack 사용 예시

modctl 도구를 사용하여 모델을 패키징하고 배포하는 과정은 Docker 워크플로우와 매우 유사합니다. 다음의 5단계를 통해 모델을 패키징하는 과정을 살펴보겠습니다.

1단계: 모델 파일 및 추론 코드 준비

먼저 GitHub 릴리스 등을 통해 modctl을 설치하고, 패키징할 모델 파일(예: .safetensors, .pt)과 추론 코드를 준비합니다.

2단계: Modelfile 작성

이제 모델 패키징을 위해 프로젝트 루트 경로에 Modelfile을 생성하고 모델 정보를 정의합니다. 다음은 Modelfile의 예시입니다:

# 1. 모델의 기본 메타데이터 정의
NAME my-llama3-model
ARCH transformer
FAMILY llama
FORMAT safetensors
PARAMSIZE 8B
PRECISION bf16

# 2. 패키지에 포함할 실제 파일 지정 (Glob 패턴 지원)
# 모델 설정 파일
CONFIG config.json
# 모델 가중치 파일
MODEL *.safetensors
# 추론 코드
CODE inference.py
# 문서
DOC README.md

3단계: 모델 패키지 빌드 (Build)

작성된 Modelfile을 기반으로 OCI 아티팩트를 빌드합니다.

# 현재 디렉토리(.)의 Modelfile을 사용하여 빌드 및 태깅
modctl build -t registry.example.com/my-models/llama3:v1.0.0 .

4단계: 빌드한 이미지를 원격 저장소로 배포 (Push)

빌드한 모델 패키지를 OCI 호환 레지스트리(Harbor, GHCR 등)에 업로드합니다.

# 레지스트리 로그인
modctl login registry.example.com

# 모델 푸시
modctl push registry.example.com/my-models/llama3:v1.0.0

5단계: ModelPack 사용 (Pull & Extract)

다른 서버나 개발 환경에서 모델을 받아 사용합니다. Kubernetes 환경에서는 CSI 드라이버를 통해 볼륨으로 마운트할 수도 있습니다.

# 모델 다운로드
modctl pull registry.example.com/my-models/llama3:v1.0.0

# (선택 사항) 특정 디렉토리에 파일 압축 해제
modctl extract registry.example.com/my-models/llama3:v1.0.0 --output ./model_dir

:house: ModelPack 공식 홈페이지

:github: ModelPack 프로젝트 GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요

기업에 종속되지 않는 형태가 나오는건 정말 반갑네요.

1개의 좋아요