IT/기초 지식

[Azure] Azure으로 MLOps 구현하기 <실전편>

개발자 두더지 2022. 4. 12. 16:12
728x90

일본의 한 블로그 글을 번역한 포스팅입니다. 오역 및 의역, 직역이 있을 수 있으며, 틀린 내용은 지적해주시면 감사하겠습니다.

 

 이번 포스팅에서는 지난 포스팅에 이어 실제로 Azure에서 MLOps를 구현해보고자 한다. 

 

Azure에서 MLOps 라이프 사이클을 실현하기 위한 최적화된 방법


 아래 5개의 그림이 Azure에서 추천하는 MLOps기반의 좋은 방법이다. 

1. 재이용 가능한 파이프라인으로 모델을 만들기

 모델링에 이용하는 데이터 세트의 선택, 각 종 파라미터의 설정등도 하나로 모아서 모델 생성의 포르레스를 파이프라인화한다.

2. 모델 등록의 자동화

 이벤트 구동형으로 실제 사용자 환경에 가동할 모델을 바꿀 수 있도록 메타 정보를 포함하여 모델의 버전 관리를 행한다.

3. 감사증좌의 자동화

 테스트 코드를 포함하여 파이프라인으로 일괄 관리한다.

4. 모니터링을 포함한 deploy

 머신러닝 모델의 재학습의 타이밍을 판별하기 위해 중요하다.

5. 데이터 드리프트(data drift)*의 감지

 드리프트에 주기성이 확인된 경우에는 스케줄 베이스의 리모델링을 고려해야하지만, 기본적으로는 드리프트의 상황을 보고 재학습을 실시한다.

*데이터 드리프트(data drift)란 모델 훈련시에 "입력 데이터(특징량, 설명변수)"의 통계적 분석과 테스트시/실제 사용자 환경에서의 "입력 데이터"의 통계적 분포가 어떠한 변화에 의해 차이가 생기고 있음을 의미한다. 

 

 

이번에 사용할 GitHub 리포지토리


이번 포스팅에서 사용할 GitHub 리포지토리는 다음과 같다.

 

 

GitHub - microsoft/MLOpsPython: MLOps using Azure ML Services and Azure DevOps

MLOps using Azure ML Services and Azure DevOps. Contribute to microsoft/MLOpsPython development by creating an account on GitHub.

github.com

 

 

 

실전편


이번에 구현해 볼 아키텍처 그림

 이번에 구현할 범위는 아래의 아키텍처의 빨간색 테두리 부분이다. 

 

1. Azure Pipeline의 설정

 Azure Machine Learning과 인프로 환경을 구축해보자. 참고로아래의 구조도에서 빨간색으로 테두리 친 부분에 대한 설명이다.

 이번의 메인 작업 공간인 Azure DevOps를 연다.

 Azure DevOps 왼쪽 사이드 메뉴에서 Pipelines를 클릭한다. 이번에는 크게 3개로 나눠진 파이프라인을 구축해나갈 것이다. 

첫 번째 파이프라인 AML-lac

Azure Machine Learning을 포함한 인프라 환경을 구축하기 위한 파이프라인

두 번째 파이프라인 Model Train Register CI

머신러닝모델의 생성 및 등록을 하는 파이프라인

세 번째 파이프라인 Model Deploy CD

Container Instance, AKS에 디플로이하는 것과 같은 CD의 파이프라인

포크한 리포지토리

GitHub에서 리포지토리를 fork한다. 포크한 리포지토리는 Azure DevOps의 Repos에서 확인할 수 있다.

 각 파이프라인은 예를 들어 모델의 작성을 열면, diabetes_regression-ci.yml 모델 실행시에 이용할 python의 스크립트, 아래 단계에서 이용할 YMAL가 정의된다.

변수 정의

다음은 파이프라인상의 변수를 설정한다.

Pipelines > Library를 클릭해, 변수의 그룹을 생성한다.

 아래의 화면에서 변수명과 각종 변수를 설정한다.

이번에 추가한 변수는 총 9개이다.

- ACI_DEPLOYMENT_NAME / AKS_DEPLOYMENT_NAME

 이것은 각각의 ACI와 AKS의 디플로이 명칭이 된다.

- AKS_COMPUTER_NAME

 추론 클러스터의 명칭으로, 이것은 Azure Machin Learning쪽에 설정한다.

- Azure_RM_SVC_CONNECTION

 이것은 Azure 파이프라인이 Azure Resource Manager을 통해서 Azure Machine Learning 워크스페이스와 관련 리소스를 생성하기위한 연결선이다.

- BASE_NAME

 리소스에 이름을 붙이기 위해 사전에 정의해두는 프리픽스이다.

- LOCATION

 Azure Devops의 리소스 위치를 설정한다.

- RESOURCE_GROUP

 신규 작성한 Azure Machine Learning의 리소스 그룹명을 정의한다.

- WORKSPACE_NAME

 작성할 Azure Machine Learning의 워크 스페이스명을 정의한다.

- WORKSPACE_SVC_CONNECTION

 이것은 Azure 파이프라인과 Azure Machine Learning워크 스페이스 연결하기 위한 커넥션이다.

변수의 추가가 끝났다면, 다음은 연결(커넥션)을 작성한다.

워크 스페이스용 커넥션의 작성

Azure DevOps에서부터 Azure Machine Learning 워크 스페이스의 전개용의 커넥션을 작성한다.

Project Settings > 서비스 커넥션을 클릭한다.

Connection Type에는 Azure Resource Manager를 선택한다.

인증방식에 대해서는 기본 서비스 정책으로 해둔다. 이번 스코프 레벨은 서브스크립션으로 하므로, Resource Group은 블락해둔대로 둔다.

서비스 커넥션 네임에 대해서는 아까 변수에서 설정한 azure-rm-csv-connection 파라미터를 넣는다.

이렇게 설정한 내용을 저장하면 완료이다.

Azure Machine Learning와 인프라 환경을 구축하기 위한 파이프라인 구성

Azure Machine Learning와 그 주변의 서비스 인프로를 전개할 파이프라인을 만든다. Piplines에서 신규작성을 클릭한다. 이번에 이용할 YAML 파일이 저장되어 있는 ReposGit을 선택한다.

정리하자면, Piplines > New Pipelines > Azure Repos Git 순서로 클릭하면 된다.

여러가지의 타입중 파이프라인을 선택할 수 있는데, 이번에는 existing Azure Pipeline YAML 파일을 선택한다. 

 여기서는 인프라의 전개용 YAML 파일을 선택하고, Countine을 클릭한다. 이 YAML 파일이 선택되므로, 이 상태로 특별한 문제가 없다면 Run을 클릭한다.

파이프라인 실행 완료

 파이프라인의 실행이 완료되면 아래의 화면으로 이동된다. Job을 선택하면, 각각의 공정 실행 이력이 이 곳에 출력된다. 에러가 발생한 경우네는 Job에서 에러 코드를 확인할 수 있다. 실제로 이곳의 에러 코드를 보고 대처해나가며 파이프라인의 구현해나가는 방식이 된다.

구현 확인

 실제로 전개된 리소스 그룹을 살펴보면, Application Insight, 스토리지, Azure ML 워크 스페이스 등과 이러한 것들을 연계하기 위한 Key Vault가 생성되어 있는 것을 볼 수 있다. 이것으로 Azure Pipelines의 설정이 완료됐다. 

 

2. 첫 번째 파이프라인 구성 ; Azure Machine Learning(AML) Model Training CI 파이프라인의 구성

아래의 구성도 중 빨간색 박스로 표시한 부분을 구성해나갈 것이다.

머신러닝 모델의 생성 및 등록을 위한 파이프라인 구성을 해보자. Azure DevOps 콘솔에서 작업을 하기 전에 Azure ML의 파이프라인을 Azure Pipeline부터 실행할 수 있는 확장 기능을 넣을 필요가 있다.

Azure Machine Learning 확장 기능을 Azure DevOps에 설치하기

아래의 URL을 통해서 설치가능하다.

 

Machine Learning - Visual Studio Marketplace

Extension for Azure DevOps - Submit experiments from a DevOps Pipeline, track code from Azure Repos or GitHub, trigger release pipelines when an ML model is registered, and automate ML deployments using Azure Pipelines.

marketplace.visualstudio.com

 확장기능을 설치할 DevOps Organizations를 선택하고 설치하자.

Azure Machine Learning 워크 스페스와의 연결

 다음은 Azure Machine Learning 워크 스페이스와 접속을 구성해보자. Project Setting > 서비스 커넥션 > 아까와 동일하게 Azure Resource 매니저 서비스 정책을 선택하여 설정한다.

 이번에는 스코프 레벨을 Machine Learning 워크 스페이스로한다. 그리고 맨 처음의 파이프 라인으로 작성한 Resource Group 및 워크 스페이스를 선택하고, Services Connection Name에는 라이브러리를 정의한 변수 ws-csv-connection의 파라미터를 입력하여 저장한다. 이것으로 커넥션 설정은 끝이다.

머신러닝 학습 모델의 CI 파이프라인의 구현

 위의 구성으로 Azuer Resource의 셋업이나 서비스 접속 구성을 완료했으므로, 머신러닝학습모델의 CI 파이프라인을 구현해보자.

 파이프라인으로부터 신규 작성을 클릭, 여기서도 아까와 동일하게 Azure Machine Learning와 그 주변의 서비스의 인프라를 전개하는 파이프라인을 구축과 동일하게 Azure Repos의 대상 리포지토리를 선택하여, Azure Pipeline YAML 파일을 선택한다. 그리고 CI 파이프라인이 정의된 YAML을 선택하여 파이프라인을 실행한다.

파이프라인의 실행

 이전에 설명했던 Azure Machine Learning과 그 주변 서비스의 인프라를 전개한 파이프라인 구축과 동일하게 Job에서 로그를 확인할 수 있다.

 artifact를 선택하면,

실제 파이프라인의 결과물을 여기서 확인할 수 있다.

 그리고 그 뒤에 구축할 CD 파이프라인의 경우, 이번에 실행했던 파이프라인 명칭을 참고하므로, 여기서 Model-Train-Register-CI에 이름을 변경해두자.

 Azure Machine Learning 워크 스페이스에 이동해서 방금 작성한 파이프라인의 결과를 확인할 수 있다.

 

3. 두 번째 파이프 라인 구성 ;  Azure Container Instance(ACI) CD 파이프라인 구성

Azure Container Instance로의 CD 파이프라인을 구현하자.

구성도의 빨간 박스로 처리된 부분을 구현할 것이다. CI 파이프라인으로 작성한 아키텍처를 이용하여 Azure Container Instance에 deploy할 파이프라인을 실행한다.

 파이프라인 > 방금의 파이프 라인 구축과 동일한 순서로 Azure Container Instance로 이어지는 CD 파이프라인을 구축한다.

 Azure Repos의 대상 리포지토리를 선택하여, Azure Pipeline YAML 파일을 선택한다. 이번에는 Regression-cd이라는 YAML 파일을 선택한다. 이것으로 Continue를 누르면 파이프라인이 실행된다.

파이프라인 실행 완료

파이프 라인의 실행이 완료되면 아래의 화면으로 이동한다.

 AKS의 설정되어 있지 않은 경우에는 파이프라인의 Deploy to AKS > 이 공정이 스킵된다. 따라서 현재 ACI만 deploy되는 상태이다. 

 또한 기본적으로는 최신의 모델을 deploy하지만, 특정 버전의 모델을 deploy하고 싶은 경우가 있을 것으로 생각된다.

 그러한 경우에는 Deploy to ACI에서 Parse json을 선택한 후 모델의 ID를 명시하는 것으로 ACI에 디플로이될 모델을 변경하는 것이 가능하다.

 다음으로는 Azure Machine Learning 워크 스페이스에서 AKS상의 추론 컨테이너를 준비하자.

 

4. AKS상의 추론 컨테이너를 준비

 Azure Kubernetes Services(AKS) 클러스터를 구성한다.

Azure Kubernetes Serviecs(AKS) 클러스터의 구성

Azure Machine Learning Studio에 이동한다.

컴퓨팅 > 추론 클러스터 > 신규생성을 클릭한다. 컨테이너의 리전을 원하는 지역으로 설정한다. 클러스터를 사용할 VM 사이즈를 설정한다. 여기서는 ds2로 설정했다.

 컴퓨팅명은 Azure DevOps에서 설정한 변수명의 mlops4-inferenc 파리미터와 동일하다. 컴퓨팅명을 입력하면, 생성을 클릭한다.

 

5. 세 번째 파이프라인 구성 ; Azure Kubernetes Services(AKS) CD 파이프라인 구성

 생성한 실제 배포용 환경용 추론 클러스터에 CI 파이프라인에 만든 머신러닝모델을 deploy하는 Pipeline을 실행한다.

  Azure 컨테이너 인스턴스에 모델을 deploy했을 때의 파이프라인을 재이용한다. 여기서 Run New를 클릭해보자.

파이프라인 실행 완료

 처리가 완료되면 위와같이 AKS의 deploy가 완료된다.

 

5. Azure Machine Learning의 Data Drift Monitor 기능

  마지막으로 Azure Machine Learning의 Data Drift Monitor 기능으로 드리프트를 감지하도록 구조를 만들어보자.

 타겟 데이터 세트를 감시하여 데이터 오차의 비율로 설정한 값이 초과했을 때 메일로 통지를 보내는 설정을 할 수 있다.

드리프트 감지

 추론시점에서의 데이터가 학습시점에서의 것과 허용 범위를 넘어선 변화가 있다는 것을 데이터 드리프트라고 부르며, 모델의 추론 정밀도가 떨어지는 등의 영향 및 머신러닝모델의 품질이 나빠지는 문제가 발생한다. 

 드리프트 감지 기능을 생성하는 경우, 두 종류의 데이터 세트가 필요하다.

  • 모델의 학습에 이용했던 데이터 세트
  • 실제 값을 포함한 데이터 세트

 실제의 값을 포함한 데이터 세트에는 시계열 컬럼이 필요하다.

 데이터 세트 모니터(프리뷰)를 클릭하여, 모니터를 생성한다. 먼저, 머신러닝의 결과를 포함한 데이터 세트를 선택한다.

 다음은 Baseline Data Set, 비교대상의 데이터 세트는 모델 생성시에 사용했던 데이터 세트를 선택한다.

  • 모니터의 이름을 입력
  • 기능에서 모니터링하고 싶은 지표를 선택
  • 컴퓨팅할 곳을 설정
  • 데이터 세트에 대해서 모니터링의 빈도, 데이터 오차 비율 값을 설정, 통지를 보낼 메일 주소를 설정

위의 설정이 끝나면 생성을 클릭한다.

 드리프트의 트래킹은 위와 같이 대시보드로 감지할 수 있다. 데이터 사이언티스트 이외의 엔지니어도 트래킹하고 싶은 경우는 Azure Application Insight와 연계하는 것이 좋다.

 

이상으로 Azure에서 MLOps 구현해보았다. 


참고자료

https://atmarkit.itmedia.co.jp/ait/articles/2202/21/news033.html

https://qiita.com/banana-877/items/170123087a9ec4621d69

728x90