MLOps

GitHub Actions를 활용한 머신러닝 모델 테스트 및 성능 모니터링 자동화

백악기작은펭귄 2024. 5. 4.
반응형

GitHub Actions를 활용한 머신 러닝 모델 테스트 및 성능 모니터링 자동화

머신러닝 모델의 개발 및 배포 과정에서 지속적인 통합과 배포(CI/CD)는 매우 중요하다. 이 과정은 서비스에 배포되어 있는 모델의 버전을 업데이트하는 것뿐만 아니라 모델을 테스트하고 성능을 모니터링하는 것 또한 포함할 수 있다.

 

GitHub Actions는 이 과정을 자동화하여 모델 개발자들이 좀 더 편하게 모델을 개발하고 배포하며 관리할 수 있도록 해준다. 이 글에서는 GitHub Actions를 이용하여 머신러닝 모델을 자동으로 테스트하고 성능을 모니터링하는 방법에 대해 다뤄보려 한다.

 

GitHub Actions 기본

GitHub ActionsGitHub 저장소를 기반으로 작동하는 CI/CD 시스템이다. 여기서 CI/CD란 지속적 통합(Continuous Integration)지속적 전달(Continuous Deploy 혹은 Continuous Delivery)의 줄임말이다. 지속적 통합(CI)이란 테스트, 빌드, 도커라이징과 같이 개발 과정에서의 코드 변경 사항을 주기적으로 통합하는 프로세스를 의미하며, 지속적 전달(CD)이란 통합된 코드를 자동으로 테스트하고 실제 사용자들에게 배포하는 프로세스를 의미한다.

 

자세한 사용법에 대한 설명은 다음 글을 참고하길 바란다.

 

 

Github Action 사용법 정리

Github Action 사용법 및 cron 사용 방법에 대해 정리한 글입니다 Github Action으로 YES24 IT 신간을 파이썬으로 크롤링 후 Issue에 업로드하는 예제가 있습니다 Github Action with Python Github action with cron, Github a

zzsza.github.io

 

머신러닝 모델 테스트 자동화

GitHub Actions를 사용하기 위해서는 깃허브 저장소에 워크플로우 파일(.github/workflows)을 추가함으로써, 소스 코드의 특정 이벤트(예: 푸시, 풀 리퀘스트, 태그 생성 등)에 따라 자동으로 작업을 실행할 수 있다.

 

1. 워크플로우 설정

모델 코드가 저장되어 있는 깃허브 저장소에 특정한 액션이 발생할 때마다 자동으로 특정 작업이 실행되도록 워크플로우를 설정할 수 있다.

name: ML Model Testing

on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: python -m unittest discover -s tests

 

이와 같은 yaml 파일을 작성하게 되면, 깃허브 저장소에 push 혹은 pull request가 실행될 때마다 자동으로 테스트를 수행하게 된다.

 

2. 테스트 스크립트 작성

모델의 성능을 검증하기 위한 테스트 케이스를 작성하여 워크플로우 상에서 실행될 수 있도록 하였다. 여기서는 파이썬 표준 라이브러리 중 하나인 unittest 라이브러리를 사용하여 모델의 예측 정확도, 처리 시간 등을 평가할 수 있도록 하였다. 이 라이브러리는 내장된 테스트 기능을 제공하여 코드의 다양한 부분을 독립적으로 검증할 수 있게 해 준다.

import unittest
from your_model_module import YourModel

class TestYourModel(unittest.TestCase):
@classmethod
def setUpClass(cls):
# 모델 초기화 및 필요 리소스 로드
cls.model = YourModel()

def test_prediction(self):
    # 예측 함수 테스트
    input_data = [0, 1, 2, 3]  # 예제 입력 데이터
    result = self.model.predict(input_data)
    expected_output = [0, 1, 1, 0]  # 기대하는 출력 결과
    self.assertEqual(result, expected_output)

def test_performance(self):
    # 성능 검증 테스트
    test_data, test_labels = load_test_data()  # 테스트 데이터 로드
    accuracy = self.model.evaluate(test_data, test_labels)
    self.assertGreater(accuracy, 0.8)  # 모델 정확도가 80% 이상인지 확인

def load_test_data():
    # 테스트 데이터 로딩 로직
    return data, labels

if name == 'main':
    unittest.main()

 

이전 단계에서의 워크플로우 설정에 따라, unittest 라이브러리는 tests 디렉터리 아래에 위치한 모든 테스트 모듈을 자동으로 찾아내어 실행한다. python -m unittest discover -s tests 명령은 tests 폴더에서 시작하여 모든 test_.py 파일들을 검색하고, 이 파일들 내의 unittest.TestCase를 상속받은 클래스들에서 시작하는 모든 test_ 메소드들을 실행한다.

 

테스트 결과는 GitHub Actions 로그를 통해 확인할 수 있으며, 실패한 테스트가 있을 경우, 해당 로그를 분석하여 문제를 진단하고 수정할 수 있다.

 

성능 모니터링

위에서 진행한 머신러닝 모델 테스트의 결과를 자동으로 기록하고 간편하게 모니터링할 수 있도록 하면 모델의 성능 하락이나 잘못된 예측을 수행하는 상황에 대해서 빠른 대응이 가능해진다.

 

1. 성능 로깅 구현

모델의 성능 지표(정확도, f1 score, 응답 시간 등)를 로깅할 수 있도록 코드를 작성한다. 이와 같은 데이터는 테스트 실행 시 수집된다. 아래 예시는 logging 모듈을 이용하여 모델의 정확도를 로깅하는 간단한 예시이다. 실제 사용 환경에서는 모델의 운용 목적 및 KPI 등에 따라 더욱 고차원적으로 설계할 필요가 있다.

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()

def evaluate_model(model, test_data):
predictions = model.predict(test_data)
accuracy = calculate_accuracy(predictions, test_data.labels)
logger.info(f"Model accuracy: {accuracy}")

 

2. 성능 지표 추적

GitHub Actions 워크플로우에서 성능 지표를 추적하여 로그 파일이나 외부 모니터링 도구로 이를 전송할 수 있다. 여기서는 대표적인 머신러닝 실험 관리 툴인 Weights & Biases(W&B)를 활용하여 성능 지표를 추적해 보도록 하겠다. W&B는 모델의 학습 과정, 하이퍼 파라미터, 출력 결과 등을 시각적으로 나타내고 이를 확인할 수 있기 때문에 자주 사용된다.

- name: Log in to Weights & Biases
  run: wandb login ${{ secrets.WANDB_API_KEY }}
- name: Run performance tests and log with wandb
  run: python evaluate_model.py

 

여기서 W&B 로그인에 사용되는 API 키는 GitHub의 Secrets 기능을 사용하여 관리할 수 있으며, 워크플로우 상에서는 ${{ secrets.WANDB_API_KEY }}와 같이 사용할 수 있다.

 

이후 W&B 로깅을 위한 코드가 작성되어 있는 evaluate_model.py를 실행시킴으로써 모델의 성능 지표를 W&B 대시보드에 기록할 수 있다.

import wandb
import model_library

def evaluate():
    # wandb 설정
    wandb.init(project="my_model_performance", entity="my_entity")

    # 모델 불러오기 및 평가
    model = model_library.load_model()
    test_data, test_labels = model_library.load_test_data()
    results = model.evaluate(test_data, test_labels)

    # 결과 로깅
    wandb.log({"accuracy": results.accuracy, "loss": results.loss})

    wandb.finish()

if __name__ == "__main__":
    evaluate()

 

이와 같은 외부 모니터링 도구를 사용하면 더욱 전문적으로 성능 지표를 관리하고 시각화하여 분석할 수 있으며, 버전 별로 성능 밒 실험 설정에 대한 추적이 가능하며, 팀 내 다른 인원이 접근하기 간편하기 때문에 실험 관리가 매우 용이하다.

 

이처럼, GitHub Actions를 통해 머신 러닝 모델의 테스트 및 성능 모니터링을 자동화함으로써 모델 개발자는 모델의 품질을 지속적으로 유지하고 개선할 수 있다. 이는 모델의 신뢰성을 높이고, 최종 사용자에게 일관된 성능을 제공하는 데 핵심적인 역할을 하기 때문에 매우 중요하다.

반응형

'MLOps' 카테고리의 다른 글

웹 싱글 패턴  (0) 2024.08.01
모델 분석 방법  (0) 2022.01.26
모델 튜닝  (0) 2022.01.19
TFX Trainer 컴포넌트  (0) 2022.01.11
TFX 모델 학습 - 모델 정의하기  (0) 2022.01.10

댓글