CI/CD 란? 

소프트웨어 개발 과정을 자동화하여 개발의 효율성과 신속성을 극대화하는 방법론

 

지속적통합(CI): 개발자들이 코드를 주기적으로 메인 레포지토리에 병합하여(코드 충돌 최소화) 자동으로 빌드 및 테스트하는 과정

지속적배포(CD): CI 과정을 넘어 빌드 및 테스트를 거친 코드 변경사항이 운영환경에 배포하는 과정

 

CI/CD의 중요성

개발주기를 단축하고, 소프트웨어 품질을 향상시키며, 사용자 만족도 증가

코드의 변경사항을 자동으로, 즉각적으로 현재 운영중인 서비스에 반영할 수 있게 함

잠재적인 문제를 조기에 발견하게 함

 

CI/CD를 위한 툴 - Github Actions

Github actions는 Github 리포지토리의 이벤트에 반응하여 워크플로우를 자동으로 실행

코드 푸시 or 풀 리퀘스트 -> 빌드, 테스트, 배포 등 자동 실행

 

코드 버전 관리 툴 github과 긴밀하게 연결되어 있으므로, 간편하게 사용할 수 있음

 

 

도커(docker)란?

도커는 애플리케이션을 컨테이너(container)라는 격리된 환경에서 실행할 수 있도록 해주는 오픈 소스 가상화 기술

가상화 기술은 이전부터 사용했지만(Virtual Machine 등), docker의 장점이 있다.

 

격리 시켜야 하는 이유?

하나의 물리적 시스템 안에서 여러 애플리케이션을 구동하면, 충돌이 일어나거나 관리 어려움(하나의 애플리케이션의 에러로 다른 시스템까지 영향)

 

배포 환경을 옮길 때에도 서버에 이전 서버와 같이 모든 환경 세팅을 새로 해야하는 번거러움 존재(도커로 이식성 증가)

 

도커 vs Virtual Machine(VM, 가상머신)

 

오른쪽 VM의 경우, 격리시키고자 하는 App을 위해 게스트 OS를 각각 올려 리소스를 할당한다.

그러나, 얼마만큼의 리소스를 할당할 것인지 미리 정의해야하고, 그로 인해 낭비되는 리소스 존재 가능성이 있다.

 

왼쪽 docker container를 적용하면, 하나의 OS를 docker를 통해 App 들이 공유하게 되어 리소스를 효율적으로 활용 가능

게스트 OS를 사용하지 않아 가볍고 쉬움.

 

도커 주요 개념 및 특징

  • 컨테이너: 애플리케이션과 그 종속성을 포함하는 실행 가능한 소프트웨어 패키지. 애플리케이션이 동작하는 환경을 코드로 정의
  • 이미지: 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하는 불변의 템플릿. 코드, 런타임, 라이브러리, 환경변수 등
  • 도커 허브: 도커 이미지를 공유할 수 있는 중앙 저장소
  • 도커 파일: 컨테이너 이미지를 빌드하기 위한 명세서

 

도커가 쓰이는 분야

  • 지속적인 통합 및 배포(CI/CD), 데브옵스(DevOps)
  • 애플리케이션 실행 환경 통일
  • 딥러닝 환경 설정과 고정, 통일
  • 마이크로서비스 아키텍처의 독립 개발, 배포

'AI 인공지능 > MLOps' 카테고리의 다른 글

[CI/CD] CI/CD 기초 개념  (0) 2024.04.09
[Wandb] YOLOv8 & Wandb sweep 함께 사용하기  (0) 2024.03.26

Wandb란?

  • wandb는 ML/AI 모델 학습 시, 학습 상황을 tracking(추적) 하여 진행이 잘 되고 있는지 확인할 수 있는 툴
  • 또한, 여러 하이퍼파라미터 조합으로 학습을 시도하여 최적의 하이퍼파라미터를 찾아내도록 돕는 툴
  • 학습 결과를 기록하고 관리하여 성능 개선을 돕는 툴

 

wandb와 yolov8 (ultralytics) 모델 함께 사용하기

import wandb
wandb.login()

from ultralytics import YOLO
import ultralytics
from wandb.integration.ultralytics import add_wandb_callback
  • wandb.login() -> wandb 사이트에서 API 확인 -> 입력

 

wandb.init(project='sample_project', job_type='training')
  • wandb.init() 으로 어떤 프로젝트인지, 어떤 작업으로 wandb를 동작하게 할건지 설정

 

sweep_config = {
    'method': 'random',
    'metric': {'goal': 'maximize', 'name': 'metrics/mAP50(B)'},
    'parameters': {
        'batch_size': {
            'values': [16, 32, 64]
        },
        'learning_rate': {
            'distribution': 'uniform',
            'min':0.0001,
            'max':0.001
        } 
    }
}
  • 내가 하고 싶은 건 'sweep' 이므로 sweep_config를 설정
  • sweep은 한 모델만의 학습을 wandb로 모니터링하는 게아니라, 여러 하이퍼파라미터들을 바꿔가며 알아서 여러번 학습하고, 그 결과를 저장/비교할 수 있도록 한 것

  • learning rate decay, category, learning rate 라는 초매개 변수들의 여러 조합을 변화시키면서 학습할 때,
  • 각 학습의 결과 Accuracy가 가장 높은 조합은 무엇인지 찾아낼 수 있음

 

  • 내 config 에서는 batch_size와 learning_rate만 조절

 

sweep_id = wandb.sweep(sweep=sweep_config, project='sds')
def yolo_train():
    with wandb.init() as run:
        config = wandb.config

        # 모델 정의 및 하이퍼파라미터 사용
        model = YOLO('yolov8n.pt')
        add_wandb_callback(model, enable_model_checkpointing=True)
        results = model.train(data='/data/sds/datasets/version_1/data.yaml', name='version_1_',
                              plots=True, batch=config.batch_size, epochs=10, imgsz=640,
                              cos_lr=True, lrf=0.01, lr0=config.learning_rate)
        wandb.log({
            'epoch': epoch, 
            'val_loss': val/dfl_loss
        })
  • 자동으로 매번 학습을 시도할 함수를 정의해줌
  • batch=config.batch_size 처럼 변화를 주면서 학습시킬 변수를 설정해놓음
  • 나중에 학습 과정에서 로그를 남기고 싶은 값은 wandb.log로 설정해놓음 

 

wandb.agent(sweep_id, function=yolo_train)
  • 이제 wandb.agent로 알아서 yolo_train이라는 함수를 사용해서 학습을 시켜라 라고 지정해놓으면 끝

 

 

 

왼쪽 탭에 sweep들 (파라미터 조합을 여러가지로 시도해서 학습하고 있는 각 모델 경우의 수)로

알아서 agent가 잘 학습하고 있는 것을 보여준다. 이제 학습이 끝나고 가장 mAP가 높았던 파라미터를 최적으로 선정하면 끝!

'AI 인공지능 > MLOps' 카테고리의 다른 글

[CI/CD] CI/CD 기초 개념  (0) 2024.04.09
[Docker] Docker란 무엇이고 왜 쓸까?  (0) 2024.04.02

+ Recent posts