Vertex AI AutoML 및 파이프라인을 사용한 확장 가능한 MLOps 시스템 빌드하기
Chansung Park
ML Google Developer Expert
Vertex AI AutoML 및 파이프라인을 사용한 확장 가능한 MLOps 시스템 빌드하기
머신러닝(ML) 제품을 빌드할 때는 적어도 2가지 MLOps 시나리오를 고려해야 합니다. 첫째, 혁신적인 알고리즘이 학계나 업계에 도입되면 모델을 바꿀 수 있어야 합니다. 둘째, 변화하는 세상의 데이터에 맞게 모델 자체가 진화해야 합니다.
Vertex AI에서 제공하는 서비스를 활용하면 두 시나리오를 모두 해결할 수 있습니다. 예를 들면 다음과 같습니다.
- AutoML 기능이 사용자의 예산, 데이터, 설정에 따라 최적의 모델을 자동으로 식별합니다.
- Vertex 관리형 데이터 세트로 새 데이터 세트를 만들거나 데이터를 기존 데이터 세트에 추가하여 쉽게 데이터 세트를 관리할 수 있습니다.
- Vertex Pipelines를 사용해 데이터 세트를 가져오는 것부터 모델 배포까지 일련의 단계를 자동화하는 ML 파이프라인을 빌드할 수 있습니다.
이 블로그 게시물에서는 이러한 시스템을 빌드하는 방법에 대해 다룹니다. 재현에 사용할 수 있는 전체 노트북은 여기에서 확인할 수 있습니다. MLOps를 구현할 때 많은 사람들이 ML 파이프라인에 집중하지만 MLOps를 '시스템'으로 빌드하는 데에는 그 밖에도 많은 것이 필요합니다. 이 게시물에서는 Google Cloud Storage(GCS)와 Google Cloud Functions가 MLOps 시스템에서 어떻게 데이터를 관리하고 이벤트를 처리하는지 살펴보겠습니다.
아키텍처
그림 1은 이 블로그에서 소개하는 전체적인 아키텍처를 보여줍니다. MLOps 시스템의 2가지 일반적인 워크플로라는 맥락에서 구성요소와 연결을 다뤄보겠습니다.
구성요소
Vertex AI는 이 시스템의 핵심으로서 Vertex 관리형 데이터 세트, AutoML, Prediction, Pipelines를 활용합니다. Vertex 관리형 데이터 세트를 사용해 데이터 세트를 만들고 데이터 세트가 확장됨에 따라 이를 관리할 수 있습니다. 사용자가 모델링에 대해 잘 몰라도 Vertex AutoML에서 최적의 모델을 선택해 줍니다. Vertex Prediction은 클라이언트가 통신하는 엔드포인트(RestAPI)를 만듭니다.
데이터 세트에서 시작해 모델을 학습시키고 배포하기까지 진행되는 단순한 완전 관리형이면서도 어느 정도는 완전한 엔드 투 엔드 MLOps 워크플로입니다. 이 워크플로는 Vertex Pipelines에서 프로그래매틱 방식으로 작성할 수 있습니다. Vertex Pipelines는 언제 어디서나 파이프라인을 다시 실행할 수 있도록 ML 파이프라인의 사양을 출력해 줍니다. Cloud Functions와 Cloud Storage를 사용해 파이프라인을 트리거할 시기와 방법을 지정하세요.
Cloud Functions를 사용하면 Google Cloud에서 서버리스 방식으로 코드를 배포할 수 있습니다. 이 프로젝트에서는 지정된 Cloud Storage 위치의 변경사항을 리슨하여 파이프라인을 트리거합니다. 구체적으로 예를 들어 새 데이터 세트가 추가되면 새 스팬 번호가 생성됩니다. 그러면 파이프라인이 트리거되어 데이터 세트를 학습시키고 새 모델이 배포됩니다.
워크플로
이 MLOps 시스템은 Vertex 데이터 세트의 기본 제공 사용자 인터페이스(UI) 또는 사용자가 원하는 외부 도구를 사용해 데이터 세트를 준비합니다. 준비된 데이터 세트를 SPAN-NUMBER라는 이름의 새 폴더가 있는 지정된 GCS 버킷에 업로드하면 Cloud Functions가 GCS 버킷에서 변경사항을 감지하고 Vertex 파이프라인을 트리거해 AutoML 학습에서부터 엔드포인트 배포까지 작업을 실행합니다.
Vertex 파이프라인 내에서 전에 만든 기존의 데이터 세트가 있는지 확인합니다. 새 데이터 세트인 경우 Vertex 파이프라인이 GCS 위치에서 데이터 세트를 가져와 새로운 Vertex 데이터 세트를 만들고 해당하는 아티팩트를 내보냅니다. 기존 데이터 세트가 있다면 추가 데이터 세트를 기존 Vertex 데이터 세트에 추가하고 아티팩트를 내보냅니다.
Vertex 파이프라인이 데이터 세트를 새 항목으로 인식하면 새로운 AutoML 모델을 학습시키고 새 엔드포인트를 만들어 이를 배포합니다. 새 데이터 세트가 아니면 Vertex 모델에서 모델 ID를 가져와 새 AutoML 모델 또는 업데이트된 AutoML 모델이 필요한지 여부를 결정합니다. 두 번째 브랜치에서 AutoML 모델이 생성되었는지 여부를 판단합니다. 생성되지 않았다면 두 번째 브랜치가 새 모델을 만듭니다. 또한 모델이 학습되면 해당하는 구성요소에서도 아티팩트를 내보냅니다.
다양한 배포를 반영한 디렉터리 구조
이 프로젝트에서는 CIFAR-10 데이터 세트의 2가지 하위 집합인 SPAN-1과 SPAN-2를 만들었습니다. 이 프로젝트의 보다 일반적인 버전은 여기에서 확인할 수 있습니다. 이 버전은 학습 및 일괄 평가 파이프라인을 빌드하는 방법을 보여줍니다. 이 파이프라인을 함께 작동하도록 설정하여 현재 배포된 모델을 평가하고 재학습 프로세스를 트리거할 수 있습니다.
Kubeflow Pipelines(KFP)를 사용한 ML 파이프라인
이 프로젝트에서는 파이프라인 조정에 Kubeflow Pipelines를 사용했습니다. 몇 가지 강조하고 싶은 것이 있습니다. 첫째, KFP에서 조건문으로 브랜치를 만드는 방법을 알아두면 좋습니다. 둘째, 이전에 학습된 모델을 기반으로 모델을 학습시키는 등 AutoML 기능을 충분히 활용하려면 AutoML API 사양을 살펴봐야 합니다. 마지막으로 Vertex 데이터 세트 및 Vertex 모델에서 사용할 아티팩트를 Vertex AI가 인식할 수 있도록 내보낼 방법도 찾아야 합니다. 이제부터 하나씩 살펴보겠습니다.
브랜칭 전략
이 프로젝트에는 기본 조건 2개와 두 번째 기본 브랜치 내의 하위 브랜치 2개가 있습니다. 기존 Vertex 데이터 세트가 있는지 여부에 따라 기본 브랜치가 파이프라인을 분할합니다. 하위 브랜치는 기존 Vertex 데이터 세트가 있을 때 선택되는 두 번째 기본 브랜치에 적용됩니다. 모델 목록을 조회하고 AutoML 모델을 처음부터 학습시킬지 아니면 전에 학습된 모델에 기초하여 학습시킬지 결정합니다.
KFP로 작성된 ML 파이프라인에는 kfp.dsl.Condition이라는 특수 문법을 사용하는 조건이 있을 수 있습니다. 예를 들어 브랜치를 다음과 같이 정의할 수 있습니다.
get_dataset_id와 get_model_id는 각각 기존 Vertex 데이터 세트와 Vertex 모델이 있는지 확인하는 데 사용되는 커스텀 KFP 구성요소입니다. 둘 다 모델이 발견되면 'None'을 반환하고 모델을 찾지 못하면 다른 값을 반환합니다. 이 둘은 또한 Vertex AI가 인식하는 아티팩트를 내보냅니다. 이것이 의미하는 바는 다음 섹션에서 다루겠습니다.
Vertex AI가 인식할 수 있는 아티팩트 내보내기
아티팩트는 ML 파이프라인에서 각 실험의 경로를 추적하고 Vertex 파이프라인 UI에 메타데이터를 표시합니다. Vertex AI가 인식할 수 있는 아티팩트가 파이프라인에 출시되면 사용자가 웹페이지를 방문하여 자세한 내용을 알아볼 수 있도록 Vertex 파이프라인 UI가 Vertex 데이터 세트와 같은 내부 서비스의 링크를 표시합니다.
Vertex AI가 인식할 수 있는 아티팩트를 생성하는 커스텀 구성요소를 작성하려면 커스텀 구성요소의 매개변수에 Output[Artifact]가 포함되어야 합니다. 그런 다음 metadata 속성의 resourceName을 특수한 문자열 형식으로 바꿔야 합니다.
다음 예시 코드는 이전 코드 스니펫에 사용된 get_dataset_id의 실제 정의입니다.
보시다시피 dataset가 매개변수에서 Output[Artifact]로 정의됩니다. 매개변수에 표시되지만 실제로는 자동으로 내보내집니다. 함수 변수처럼 필요한 데이터만 제공하면 됩니다.
데이터 세트 구성요소가 aiplatform.ImageDataset.list API를 호출하여 Vertex 데이터 세트의 목록을 가져옵니다. 길이가 0이면 'None'을 반환합니다. 그 외에는 Vertex 데이터 세트의 발견된 리소스 이름을 반환하는 동시에 리소스 이름이 포함된 dataset.metadata['resourceName']을 제공합니다. Vertex AI 인식가 인식할 수 있는 리소스 이름은 'projects/<project-id>/locations/<location>/<vertex-resource-type>/<resource-name>'이라는 특수한 문자열 형식을 따릅니다.
<vertex-resource-type>은 내부 Vertex AI 서비스를 가리키는 것이면 무엇이든 가능합니다. 예를 들어 아티팩트를 Vertex 모델로 지정하려면 <vertex-resource-type>을 모델로 바꿔야 합니다. <resource-name>은 리소스의 고유한 ID이며 aiplatform API를 통해 검색한 리소스의 이름 속성에서 액세스할 수 있습니다. 다른 커스텀 구성요소인 get_model_id도 이와 매우 유사한 방법으로 작성됩니다.
이전 모델 기반의 AutoML
전에 가장 우수한 성능을 보인 모델을 기반으로 새 모델을 학습시키고 싶을 때가 있습니다. 이렇게 할 수 있다면 새로운 모델은 이전에 학습한 지식을 활용하기 때문에 처음부터 학습시킨 모델보다 훨씬 우수할 가능성이 높습니다.
다행히 Vertex AutoML에서는 이전 모델을 사용하여 모델을 학습시킬 수 있는 기능을 제공합니다. AutoMLImageTrainingJobRunOp 구성요소를 사용하면 다음과 같이 base_model 인수를 제공하여 모델을 학습시킬 수 있습니다.
처음부터 새 AutoML 모델을 학습시키는 경우 base_model 인수에 'None'을 전달하면 이것이 기본값이 됩니다. 하지만 이 인수를 VertexModel 아티팩트로 설정할 수도 있습니다. 그러면 구성요소가 다른 모델을 기반으로 AutoML 학습 작업을 트리거합니다.
한 가지 주의해야 할 점은 VertexModel 아티팩트를 일반적인 Python 프로그래밍 방식으로는 구성할 수 없다는 것입니다. 즉, Vertex 모델 대시보드에서 찾은 ID를 설정해도 VertexModel 아티팩트의 인스턴스를 만들 수 없습니다. 이 인스턴스는 metadata['resourceName'] 매개변수를 적절하게 설정하는 방식으로만 만들 수 있습니다. 동일한 규칙이 VertexDataset와 같은 다른 Vertex AI 관련 아티팩트에도 적용됩니다. 기존 Vertex 데이터 세트로 추가 데이터를 가져오도록 VertexDataset 아티팩트를 적절하게 구성하는 방법을 확인할 수 있습니다. 이 프로젝트의 전체 노트북은 여기를 참조하세요.
비용
새 GCP 계정을 만들 때 제공되는 $300의 무료 크레딧으로 이 프로젝트와 동일한 결과를 재현할 수 있습니다.
이 블로그 게시물을 작성할 당시 Vertex Pipelines의 가격은 실행당 약 $0.03였으며 각 파이프라인 구성요소의 기본 VM 유형인 e2-standard-4는 시간당 약 $0.134였습니다. Vertex AutoML 이미지 분류 학습 비용은 시간당 약 $3.465였습니다. 실제 데이터를 보관하는 GCS 비용은 100GiB 용량당 월 $2.40였습니다. Vertex 데이터 세트는 무료입니다.
서로 다른 2개의 브랜치를 시뮬레이션하는 전체 실험에 약 1~2시간이 걸렸으며 프로젝트의 총 비용은 약 $16.59가 들었습니다. Vertex AI 가격 책정에 대한 자세한 내용은 여기에서 확인하세요.
결론
많은 사람들이 AutoML의 기능을 과소평가합니다. 하지만 AutoML은 ML 배경 지식이 거의 없는 앱 및 서비스 개발자에게 훌륭한 대안이 됩니다. Vertex AI는 ML 워크플로를 자동화하는 파이프라인 기능뿐 아니라 AutoML을 제공하는 유용한 플랫폼입니다. 이 게시글에서는 데이터 삽입, 기존에 가장 뛰어난 성능을 보인 모델을 기반으로 한 모델 학습, Vertex AI 플랫폼에 모델 배포 등 기본적인 MLOps 워크플로를 설정하고 실행하는 방법을 시연했습니다. 이런 식으로 ML 모델이 새로운 데이터 세트의 변경사항에 자동으로 적응하도록 할 수 있습니다. 이제 모델 모니터링 시스템을 통합하여 데이터/모델 드리프트를 감지하도록 구현하는 작업이 남아 있습니다. 예시는 여기에서 확인하세요.