일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- bigquery
- gnn
- level 1
- SQL
- 프레임워크
- 통계방법론
- Level 2
- 통계학입문
- 데이터분석준전문가
- MYSQL
- 인공지능
- Kubernetes
- RNN
- SQLD
- MLOps
- SQLP
- 자연어처리
- ML Ops
- CS224W
- LLM
- ADsP
- 머신러닝
- docker
- nlp
- 언어모델
- 포아송분포
- Ai
- 코딩테스트
- 데이터분석전문가
- Today
- Total
코드 깎는 PM
MLOps Series #8 - Github Actions 기반 CI/CD 본문
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
링크: "https://link.coupang.com/a/bqfD0v
MLOps 도입 가이드:기업에서 머신러닝 모델을 가장 효율적으로 운영하는 방법
COUPANG
www.coupang.com
1. CI / CD란?
- CI/CD는 Continuous Integration / Continuous Delivery(or Deployment)의 줄임말이다.
- 번역하면 지속적인 코드 통합 / 지속적인 서비스 제공 / 지속적인 배포를 의미한다.
- 이는 고객에게는 애플리케이션을 고객에게 자동화하여 빠르게 제공하는 방법이며,
- 개발/운영팀에게는 개발시 발생하는 '통합 지옥(Integration hell)'을 해결하기 위한 방법이다.
- 결론적으로, CI/CD는 파이프라인으로 표현되는 실제 프로세스를 의미하며, 어플리케이션 개발에 지속적인 자동화 및 지속적인 모니터링을 추가하는 것을 의미한다.
1) CI (Continuous Integration)
- 'CI'는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미한다.
- CI를 통해 어플리케이션에 변경이 발생하면 정기적으로 Build, Test 과정을 거쳐 Repository에 병합된다.
- 때문에 여러명의 개발자가 동시에 애플리케이션 개발 작업을 하는 경우에 충돌을 피할 수 있다.
2) CD (Continuous Delivery & Deployment)
- 'CD'는 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미하며 이 두 용어는 상호 교환하여 사용된다.
(1) CD #1 - Continuous Delivery (지속적 제공)
- 'CD'(Continuous Delivery - 지속적 제공)를 통해 변경사항이 버그 테스트를 거쳐 Repository에 자동적으로 업로드된다.
- 이때, Repository에서 애플리케이션을 실시간으로 Production 환경에 배포할 수 있다.
(2) CD #2 - Continuous Deployment (지속적 배포)
- 'CD'(Continuous Deployment - 지속적 배포)는 개발자의 변경사항을 Repository에서 고객이 사용 가능한 Production환경까지 자동으로 Release 하는 것을 의미한다.
- 이는 수동 프로세스로 인한 업무 과중을 해결하여 지속적으로 빠르게 서비스를 제공할 수 있게 한다.
2. Github Actions란?
- Github Actions란 개발자들의 workflows를 자동화하기 위한 플랫폼이다.
- 단순 CI/CD 툴을 넘어서 workflow 자체를 자동화하기 위한 툴이다.
1) Git이란?
- Git은 형상 관리 도구 중 하나로, 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 단에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다.
- Git은 프로젝트 폴더 내에서 작업을 기록하고, 버전 관리를 통해서 체계적인 개발이 가능하게 한다.
2) Github이란?
- Github는 분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다.
- Github를 사용하면, 버전 관리, 협업, 배포 등의 작업을 수행할 수 있다.
(1) Github 구성 요소
- Users - 해당 Repository를 사용한 이용자들의 수
- Contributors - 해당 Repository를 구성하는 데 기여한 사람들
- Release - 해당 Repository의 배포 버전 관리
(2) Github Flow
- Master/Main Branch에서 작업을 시작한다.
- Create Branch를 통해서 Master Branch에 영향이 안 가게끔 새로운 Branch에서 작업을 진행한다.
- 개발 변경 사항들을 Commit 하며,
- Pull Request를 통해 Branch에 적용해 간다.
- 이후 Contributor들 간의 feedback을 통해 코드에 대해 논의하고 Issue를 통해 개선한다.
- Issue들을 해결한 후에는 Build 하여 Test를 통해 오류 여부를 확인한다.
- 이상이 없는 경우 Master Branch에 merge 한다.
- 최종적으로 Master Branch에 병합된 코드들을 Deploy 한다.
(3) Detailed Flow
- Issue 생성 (버그 확인)
- Task 중요도 판단
- Task 재발 가능 여부 판단
- Pull Request (코드 병합)
- 버그 해결 여부 확인
- Merge 여부 결정
- 검증 후 Master Branch로 merge
- 테스트 - 빌드 - 배포
- Release notes 준비
- Version number 업데이트
(4) Github Events
- Github Repository안에서 발생하는 모든 작업들을 Github Events라고 한다.
- PR 생성
- Contribution 생성
- Issue 생성
- PR 병합
- 기타 애플리케이션 등
(5) Github Actions
- Github Actions는 Github Events들이 발생하는 경우에 자동적으로 작업을 처리해 주는 기능을 수행한다.
- 즉, Event 발생을 감지하면 설정해 둔 workflow pipeline에 따라서 자동적으로 CI/CD를 포함한 workflow 작업을 수행해 주는 기능이다.
- 장점:
- 1) 별도의 통합과정이 없이 같은 도구로 workflow과정을 관리할 수 있다.
- 2) 파이프라인 설치가 간편하다.
- 3) 개발자 중심의 도구로 개발되었다.
3. Github Actions 실행
1) Build
- Github Actions를 수행하기 위해서는 '당연히' Github의 Repository가 필요하다.
- Repository를 생성한 후 Action에서 실행시킬 Application을 선택한다.
- (임의명칭). yml파일을 생성한 후 build과정을 포함한 workflow file을 생성해 준다.
(1) Github Actions 예시
name: Upload data
on:
pull_request:
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Save PR number
env:
PR_NUMBER: ${{ github.event.number }}
run: |
mkdir -p ./pr
echo $PR_NUMBER > ./pr/pr_number
- uses: actions/upload-artifact@v3
with:
name: pr_number
path: pr/
- 위의 코드는 Github Actions Docs에서 제공하는 예시 코드이다.
- 하나 이상의 jobs를 설정할 수 있으며,
- runs-on을 통해서 실행할 OS를 설정할 수 있다.
- steps를 통해서 실행할 작업들을 설정할 수 있다. 보다 구체적으로는
- 1) 명령어를 run 할 수 있으며,
- 2) tasks를 설정할 수 있으며
- 3) action을 run할 수 있다.
- uses는 action을 선택하는 과정이다.
- uses에서 설정되는 actions들은 다음에 재사용되는 기능(action)들이다.
- run은 실행될 command를 작성하는 곳이다.
(2) OS Strategy 설정
- Github Actions는 OS별로 각기 다른 Build를 자동화할 수도 있다.
- strategy기능을 활용하여 각 버전별로 build 할 Dependency를 할당하면, 작업을 병렬적으로 처리하며 각 OS별로 Build작업을 처리한다.
- 이때, 깃헙 액션에서 수행한 Build는 어디서 실행될까?
- 모든 코드 실행은 깃헙에 의해서 관리되며 깃헙의 서버에서 수행됨
- 또한, workflow의 각 job은 각각 새로운 가상환경을 만들어서 실행된다.
- 이때, 깃헙 액션에서 수행한 Build는 어디서 실행될까?
name: Python application
on:
push:
branches: [ python-ci-workflow ]
pull_request:
branches: [ python-ci-workflow ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ['3.6', '3.8']
exclude:
- os: macos-latest
python-version: '3.8'
- os: windows-latest
python-version: '3.6'
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Display Python version
run: python -c "import sys; print(sys.version)"
2) Push
- Build 한 Job 중에 다른 Repository로 push를 하는 작업이 있는 경우, 이 또한 자동화할 수 있다.
- 아래는 Docker Image를 생성하여 Docker Hub에 push 하는 예시이다.
(1) Dockerfile 작성
# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
(2) Dockerhub에서 Image 빌드
- Dockerhub Repository 생성
- Secrets 설정
- DOCKER_USERNAME 설정
- DOCKER_PASSWORD 설정
(3) Dockerhub에 push하는 yaml 작성
- name에서 작업을 인지할 수 있도록 작성
- name: Build & push Docker image
- Image repo와 함께 Image name을 명시
- secrets를 포함한 추가 정보 작성
name: Python application
on:
push:
branches: [ python-ci-workflow ]
pull_request:
branches: [ python-ci-workflow ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: "3.8"
- name: Display Python version
run: python -c "import sys; print(sys.version)"
- name: Build & push Docker image
uses: mr-smithers-excellent/docker-build-push@v5
with:
image: 'Dockerhub repo'/'Docker Img name'
tags: v3, latest
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
4. 기타 명령어 모음
# git branch 설정
git checkout -b main
# cat은 결과물을 결합시키는 명령어이다.
cat ~~
# echo는 linux환경에서 결과물을 console에 반환하게 한다.
echo ~~
Reference:
https://www.redhat.com/ko/topics/devops/what-is-ci-cd
https://ko.wikipedia.org/wiki/%EA%B9%83_(% EC%86% 8C% ED%94%84% ED% 8A% B8% EC% 9B% A8% EC%96% B4)
https://velog.io/@jini_eun/Github-Github%EB%9E%80-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC
https://ko.wikipedia.org/wiki/%EA%B9%83%ED%97%88%EB%B8%8C
https://build5nines.com/introduction-to-git-version-control-workflow/
https://github.com/iterative/cml
https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows
'ML Ops > ML Ops Basic' 카테고리의 다른 글
MLOps Series #7 - Katib (AutoML Platform) (0) | 2023.01.28 |
---|---|
MLOps Series #6 - Kubeflow (쿠버네티스 ML Ops 플랫폼) (0) | 2023.01.28 |
MLOps Series #5 - Model Monitoring (모델 모니터링) (0) | 2023.01.28 |
MLOps Series #4 - Model Serving (모델 서빙) (0) | 2023.01.28 |
MLOps Series #3 - mlflow (0) | 2023.01.22 |