CLOps 블로그 시리즈 이전 글에서는 CLOps 내부 주요 컴포넌트의 구조와 구현 기술을 자세히 살펴봤습니다. 이번 글에서는 CLOps를 통해 CLOVA의 모델 상용화 프로세스가 어떻게 개선됐는지 살펴보겠습니다. 또한 CLOVA 내 어떤 AI 모델이 CLOps에서 서비스로 제공되고 있는지 알아보겠습니다.
CLOps가 바꿔 놓은 CLOVA 모델 상용화 프로세스
CLOps 개발 전 상황
CLOps가 개발되기 전에는 모델러가 생성한 학습 모델과 Python 코드 조각 또는 Jupyter Notebook 코드를 엔지니어에게 직접 전달했습니다. 엔지니어는 전달받은 코드를 서비스 가능한 형태로 재작성해야 했고 여기에만 2주 이상 걸렸습니다. 단지 시간이 오래 걸릴 뿐 아니라 재작성 과정에서 기능이 누락되거나 버그가 발생하기도 했습니다. 한편 모델러는 지속적으로 모델과 코드를 전달하고 유지할 방법이 없었습니다. 개선한 코드를 지속적으로 전달하며 기능을 수정해 빠르게 배포할 수 있는 여지가 별로 없었기 때문에 실제 서비스와 전달한 코드의 차이가 컸고, 자연스레 서비스에 대한 관심과 책임이 줄어들었습니다.
또한 엔지니어는 모델을 서빙하기 위한 장비를 스스로 발주하고 관리해야 했습니다. 팀마다 각각 확보한 장비는 이용 효율이 떨어졌고, 모니터링 방법도 통일되지 않아 관리가 부실해질 수밖에 없었습니다. 또한 모델 서빙 후 서비스를 운영하기 위한 SRE(Site Reliability Engineering) 관련 인력과 툴이 부족했고, ML 서빙 구조와 관련해 통일된 기준과 방법이 없었으며, 여러 리전에 신규를 배포하는 작업은 한 달 이상 인프라를 구축해야 하는 큰 작업이 수반되기도 했습니다.
왜 오픈소스를 사용하지 않고 직접 CLOps를 만들었을까요?
위와 같은 여러 ML 엔지니어링 문제를 개선하기 위해 CLOps를 개발했습니다. 그런데 왜 오픈소스 ML 플랫폼을 도입하지 않고 직접 만들었을까요?
처음에는 여러 오픈소스 ML 플랫폼을 검토하고 비교해 가며 살펴봤습니다. 그런데 우리에게 필요한 몇 가지 핵심 기능을 모두 잘 지원하는 솔루션을 찾기 힘들었습니다. 프로젝트 멀티테넌시 기능(프로젝트 내 협업 및 외부로 카탈로그 노출 등)이나 퍼블릭 API의 보안을 세밀하게 제어할 수 있는 기능(Private, Public, Permissive 제어) 등을 핵심 기능으로 꼽을 수 있는데요. 우리는 꼭 필요한 몇 가지 핵심 기능을 확보하고 이미 잘 구축돼 있는 사내 여러 기반 시스템과 유기적으로 연동하기 위해서 기존 ML 플랫폼을 도입하는 대신 우리에게 잘 맞는 플랫폼을 핵심 기능부터 차근차근 만들어 가기로 결정했습니다.
CLOps가 만들어 낸 변화 1 - 통합된 모델 배포 워크 플로
CLOps 시리즈 이전 글에서 모델 레지스트리라는 컴포넌트를 설명했습니다. 이 모델 레지스트리가 모델 배포 워크플로 개선의 핵심입니다. 모델 레지스트리를 통해 대용량 모델 파일을 빠르게 업로드하거나 다운로드할 수 있고, 추가로 모델 파일 버전을 관리하고 관련 태그나 메타 정보도 함께 전달할 수 있습니다. 사내 스토리지 저장소의 성능을 최대한 사용할 수 있도록 별도로 API와 도구를 개발해 모델을 전달하고 배포하는 시간을 많이 줄일 수 있었으며, 이런 도구를 이용해 자동화해서 좀 더 빠르고 정확한 워크플로를 만들 수 있었습니다.
또한 모델 레지스트리를 기반으로 다양한 참여자가 모델 파일을 공유하고 참고할 수 있고, 실제로 서빙하기 위해 전달할 때도 특별히 제작한 모델을 위한 캐시 등을 이용해 배포 시간을 획기적으로 줄였습니다. 모델 파일과 서빙 코드가 하나로 뭉쳐진 거대한 Docker 이미지를 푸시하거나 풀(pull)하는 고통은 이제 더 이상 겪지 않아도 됩니다.
CLOps에서는 여러 개의 프로젝트를 생성할 수 있고, 프로젝트 간 격리된 환경을 제공합니다. 모델러, 엔지니어, 기획자 등 여러 직군의 사람들이 하나의 프로젝트 안에서 다양한 ML 업무를 함께 수행하며 공유할 수 있습니다.
CLOps가 만들어 낸 변화 2 - 쉽고 빠른 모델 배포
머신 타입, 컨테이너 이미지, 모델 파일, 이 세 가지를 모델 배포에 필요한 최소한의 요소로 정의하고 이들 중심으로 서빙 리소스를 설계하였습니다. 옵션 스펙을 사용하면 기능 확장이 가능하지만 가장 기본이 되는 세 가지 요소만 만족된다면 서비스에서 바로 사용할 수 있는 엔드 포인트를 얻을 수 있습니다.
머신 타입
머신 타입은 모델이 실행되는 리소스 환경입니다. AWS Instance Type처럼 CLOps에서 미리 정의해 놓은 머신 타입을 이용해 모델 서빙에 필요한 CPU 또는 GPU 리소스를 선택해서 배포할 수 있습니다.
이전에는 각 팀에서 서빙하기 위한 장비를 직접 수급해야 했기 때문에 장비를 구하는 데 짧게는 수일에서 수주가 걸렸지만, CLOps를 이용하면 이미 머신 타입별로 잘 관리되고 있는 CLOps 머신 공용 풀에서 필요한 만큼 바로 머신을 할당받아 서빙 작업을 이어갈 수 있습니다.
컨테이너 이미지
사용자는 이미 빌드된 컨테이너 이미지를 사용할 수도 있고 커스텀 이미지를 CLOps를 통해 빌드해 배포하는 방식을 선택할 수도 있습니다. 또한 Transformer와 같이 많이 사용하는 모델은 별도 설정이나 수정 작업 없이 바로 서비스할 수 있도록 추론(inference)에 최적화된 전용 이미지를 제공하고 있습니다.
모델 파일
CLOps 모델 레지스트리에 업로드한 모델은 모델 URL을 통해서 서빙에서 바로 사용 가능하며, 모델 크기에 따라 모델을 캐시 형태로 사용할 수 있도록 제공하기 때문에 크기가 큰 모델을 배포할 때 여러 번 다운로드하지 않도록 설정할 수 있습니다. 또한 모델 파일 주소를 컨테이너 이미지와 별개의 스펙으로 제공하기 때문에 두 개를 분리해 각각 버전을 관리하고 배포할 수 있습니다.
배포 작업은 세 가지 인자와 함께 CLOpsDeployment 리소스 YAML 파일을 하나 작성해서 제출하는 것으로 완료됩니다. 사용자는 배포 후 수 분 내에 추론 API에 접근할 수 있는 모델의 유일한 엔드 포인트를 확보할 수 있습니다.
CLOps가 만들어 낸 변화 3 - 안정적인 운영
모델 서비스를 배포한 후에는 서비스가 잘 작동하는지, 자원은 부족하지 않은지, 사용자가 서비스를 쾌적하게 사용하고 있는지 등 지속적으로 모니터링할 필요가 있습니다. CLOps 이전에는 배포 후 별도로 모니터링 방법을 찾아야 했고, 이에 따라 각 프로젝트마다 모니터링 방법이 다른 경우도 많았습니다.
CLOps에서는 각 프로젝트를 모니터링하기 위한 시스템을 원클릭으로 배포하고 수 분 내에 모니터링을 시작할 수 있습니다. 이때 미리 작성해 배포하는 모니터링 대시보드를 통해 서비스 상태를 빠르게 확인하고 관리할 수 있으며, 서비스에 직접 트래픽을 전달해 정상 작동 여부를 모니터링하는 서비스를 이용할 수도 있습니다. (이전 포스팅 참고)
또한 CLOps에서는 서비스 규모가 커지면 GPU 머신을 추가로 할당받아 스케일을 늘리는 작업도 손쉽게 진행할 수 있습니다. CLOps 시리즈 이전 글에서 설명드렸던 오토 스케일 기능을 이용하면, 각 서비스 특성에 맞게 여러 가지 옵션으로 자동 스케일을 적용해 인스턴스 규모를 좀 더 유연하고 능동적으로 관리할 수 있습니다.
CLOps가 만들어 낸 변화 4 - 배포 환경 표준화
CLOps는 상이한 인프라 환경에서도 사용자에게 표준화된 배포 환경을 제공합니다. 사용자는 단일한 배포 리소스 디스크립터 파일(YAML)을 사용해 여러 리전에 배포할 수 있습니다. 인프라 환경에 따라 추가 개발할 필요가 없습니다. 이를 통해 신규 리전에 출시할 때 배포 시간을 크게 줄일 수 있고, 모델링과 모델에 필요한 비즈니스 로직 개발에만 신경 쓸 수 있습니다.
지금까지 CLOps가 CLOVA 내 모델 상용화 프로세스를 어떻게 바꿔 왔는지 살펴봤습니다. CLOps는 모델러와 개발자, 운영자가 AI 모델 서비스를 개발하고 서비스할 때 좀 더 편리하고 빠른 워크플로를 경험할 수 있도록 만들고, GPU 비롯한 컴퓨팅 리소스를 좀 더 효율적으로 관리하고 운영하는 것에 초점을 맞춰 꾸준히 개선해 나가고 있습니다.
CLOps는 얼마나 쓰고 있을까
CLOps에서 배포된 모델은 수백 개가 넘어가며 하루에도 수십 번씩 배포가 진행되고 매일 수천 만에 달하는 요청을 실시간으로 처리하고 있습니다. 배포된 모델은 AI 프로토타입을 위한 데모 환경 제공에서부터 전사적으로 다양한 AI 서비스의 백엔드 엔진으로 제공되고 있습니다. 이와 같이 CLOps를 사용하는 대표적인 AI 서비스로는 HyperCLOVA와 쇼핑, 케어콜, CLOVA 스피커, 스마트 램프, CLOVA Note 요약, OCR, 음성 합성 등이 있습니다.
CLOps 향후 계획
CLOps는 CLOVA 내 모델 상용화를 가속화하기 위해서 개발하고 있습니다. 이를 위해 많은 컴포넌트를 개발했고, 여러 리전에 CLOps가 확장되면서 리전 관리를 통합할 필요가 생겼습니다. 이에 각 리전의 배포 환경을 하나의 컨트롤 타워에서 제어하고 리전 간 서비스가 단절되지 않도록 인증과 콘솔을 통합하는 작업을 진행하고 있습니다. 인증뿐 아니라 리소스 인가(Authorization) 부분에도 집중해서 CLOps 내 여러 컴포넌트가 통합된 정책으로 리소스를 관리할 수 있게 개선할 예정입니다.
GPU는 현재 모든 컴퓨팅 리소스 중에서 가장 비싼 리소스입니다. 리소스 자원을 모니터링하고 효율적으로 스케줄링하는 일은 대규모 클러스터를 관리하는 플랫폼 운영자에게는 숙명이라고 할 수 있습니다. 선점형 리소스, TTL 기반 스케줄링, 디바이스 동적 추가(attach) 등 리소스를 효율적으로 활용하기 위해서 지속적으로 연구하고 개발할 예정입니다.
모델 서빙 추론 최적화는 인프라 비용 측면에서 중요합니다. 최적화하지 않은 모델은 많은 리소스가 필요하기 때문에 서비스 출시나 가격 정책에 좋지 않은 영향을 끼칩니다. 따라서 모델별로 최적화한 추론 이미지와 서빙 토폴로지를 제공해야 하는데요. 앞으로도 꾸준히 이 분야에 집중해 더욱 효율적인 추론 환경을 제공할 예정입니다.
마지막으로 CLOps 주요 기능 중 일부를 오픈소스화할 계획입니다. CLOVA에서 고민했던 많은 문제들은 다른 회사 개발자분들도 고민하고 있는 문제일 수 있는데요. 그런 분들에게 CLOps 오픈소스가 도움이 될 것이라고 생각합니다.
마치며
이번 글을 끝으로 올해 CLOps 기술 블로그는 연재를 마칩니다. 그동안 CLOps 기술 블로그에 관심을 가져주셔서 감사합니다. 내년에 더 좋은 기술 이야기로 찾아뵐 수 있도록 노력하겠습니다. 마지막으로 CLOps 업무에 관심 있으시다면 아래 링크를 통해 많은 지원 부탁드립니다. 🙂