[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.12.09
📕 프로젝트 작업 내역
- AWS 아키텍처 설계
- 워크플로우
- 인프라
📗 수행 결과
1. 프로젝트 요구사항
1) 모델 학습
- EC2에서 머신러닝 모델 학습 실행
- 학습 데이터와 결과물(S3 저장)
2) API 배포
- 학습된 모델을 기반으로 API를 배포하여 서비스 제공
3) 자동화(CI/CD)
- GitLab CI/CD를 통해 학습 및 배포 자동화
4) 모니터링
- API 상태와 모델 성능 모니터링
2. AWS 아키텍처 설계
1) 전체 아키텍처 개요
- GitLab: 코드 저장 및 CI/CD 파이프라인 관리
- EC2: 머신러닝 모델 학습 및 데이터 처리
- S3: 학습 데이터와 결과물(모델, 로그) 저장
- Lambda: 경량화된 API 실행
- API Gateway: 사용자 요청을 Lambda로 전달하여 모델 예측 결과 반환
- CloudWatch: API 및 Lambda의 로그와 성능 모니터링
2) 아키텍처 구성도
(i) 학습 데이터(텍스트) 입력 시
사용자 입력 (텍스트) → API Gateway → Lambda #1 (텍스트 입력 처리)
↓
Lambda #2 (GraphRAG 호출: 교육과정 표 기반 검색)
↓
Lambda #3 (LLM 및 AI Agent)
↓
Lambda #4 (MongoDB 저장 및 결과 생성)
↓
API Gateway → 사용자
(ii) 학습 데이터(이미지) 입력 시
사용자 입력 (이미지) → API Gateway → Lambda #1 (이미지 입력 처리)
↓
Lambda #2 (텍스트 추출: YOLOv8, OCR, 멀티모달)
↓
Lambda #3 (GraphRAG 호출: 교육과정 표 기반 검색)
↓
Lambda #4 (LLM 및 AI Agent)
↓
Lambda #5 (MongoDB 저장 및 결과 생성)
↓
API Gateway → 사용자
3. 단계별 구현
1) EC2: 모델 학습
- 작업 내용
- EC2 인스턴스에서 머신러닝 학습 실행(OCR, YOLOv8 등)
- GitLab CI/CD에서 EC2에 학습 스크립트를 자동 실행
- 학습된 모델 및 로그를 S3에 저장
- AWS 설정
- EC2 인스턴스
- GPU가 필요한 경우 EC2 GPU 인스턴스 사용(예: p3 또는 g4dn)
- CPU 기반 학습은 m5.large 인스턴스
- IAM 역할
- EC2 인스턴스에 S3 액세스 권한 부여
- 데이터 전송
- S3에서 학습 데이터 다운로드 → 학습 실행 → 결과물(S3 업로드)
- EC2 인스턴스
2) S3: 데이터 저장소
- 작업 내용
- 학습 데이터, 모델 파일, 학습 로그 등을 저장
- API 배포 시 Lambda가 S3에서 학습된 모델을 로드
- S3 버킷 구조
s3://project-data/
├── input-data/ # 학습 데이터
├── models/ # 학습된 모델 파일
└── logs/ # 학습 로그
- 버전 관리
- S3 버킷에 객체 버전 관리 활성화(모델 파일 변경 이력 추적)
3) Lambda: 모델 배포
- 작업 내용
- S3에 저장된 모델을 로드하여 예측 서비스 제공
- 경량화된 환경에서 API 요청 처리
- AWS 설정
- Lambda 함수
- Python 또는 Node.js로 작성
- S3에서 모델 파일 로드 후 메모리에 캐싱
- Lambda 메모리 및 실행 시간
- 모델 크기와 처리량에 따라 메모리 설정(예: 512MB~3GB)
- Lambda 함수
4) API Gateway: 사용자 요청 처리
- 작업 내용
- 사용자 요청을 받아 Lambda로 전달하고 결과 반환
- AWS 설정
- RESTful API 생성
- POST 요청: 사용자 입력(이미지/텍스트) 전달
- 응답: Lambda에서 예측 결과 반환.
- CORS 설정
- 클라이언트 애플리케이션이 요청할 수 있도록 CORS 정책 설정
- RESTful API 생성
5) CloudWatch: 모니터링
- 작업 내용
- Lambda 및 API Gateway의 로그와 성능 추적
- 모델 예측 호출 수, 지연 시간, 오류 비율 모니터링
- AWS 설정
- CloudWatch 로그 그룹
- Lambda 및 API Gateway의 로그 수집
- 경고 설정
- API 응답 시간이 임계값 초과 시 알림(SNS 또는 이메일)
- CloudWatch 로그 그룹
4. CI/CD 구성 (GitLab 기반)
1) CI (Continuous Integration)
CI의 핵심 목표는 코드 변경 사항을 빠르고 안전하게 테스트하고 통합하는 것
1-1) 동작 과정
- 개발자가 새로운 코드 변경 사항을 푸시하면, CI 파이프라인이 자동으로 실행됨
- CI는 코드 빌드(Build), 테스트(Test), 정적 분석(Code Quality Check) 등의 단계를 수행
- 모든 테스트와 검증이 성공적으로 통과되면, 변경된 코드를 저장소에 병합
1-2) 주요 역할
- 자동화된 테스트: 개발 중 코드에 버그가 생기지 않도록 코드의 품질을 자동으로 검증
- 코드 병합: 개발자들이 개별적으로 작업한 코드를 중앙 저장소에 통합
- 빠른 피드백: 변경 사항이 전체 코드베이스에 영향을 미치는지 즉시 확인 가능
1-3) 결론
- CI는 코드 변경 사항을 안정적으로 병합하기 위한 과정
- 주로 테스트 및 검증 자동화에 중점을 둠
2) CD (Continuous Delivery 또는 Continuous Deployment )
CD의 핵심 목표는 코드 변경 사항을 실제 운영 환경에 자동으로 배포하는 것
CD는 Continuous Delivery와 Continuous Deployment 두 가지로 나뉨
1-1) Continuous Delivery
- 코드가 운영 환경에 배포될 준비가 된 상태로 유지됨을 보장
- 배포는 자동화된 프로세스로 준비되지만, 최종 배포는 수동으로 승인하는 방식
1-2) Continuous Deployment
- 코드가 운영 환경까지 자동으로 배포됨
- 모든 단계를 자동화하여, 배포 과정에서 수동 작업이 필요 없음
1-3) 주요 역할
- 서비스 배포: 병합된 코드를 실제 사용자에게 제공할 환경에 배포
- 사용자에게 새로운 기능 제공: 최신 코드를 운영 환경에 반영하여 사용자에게 서비스를 업데이트
- 운영 상태 모니터링: 배포된 서비스가 정상적으로 작동하는지 실시간으로 확인
1-4) 결론
- CD는 최신 코드를 운영 환경에 배포하는 과정
- Continuous Delivery는 수동 배포 승인 가능, Continuous Deployment는 완전 자동화
Continuous Integration (CI) | Continuous Delivery / Deployment (CD) | |
목적 | 코드 변경 사항을 테스트하고 병합 | 병합된 코드를 운영 환경에 배포 |
주요 단계 | 빌드, 테스트, 정적 분석 | 배포 자동화, 운영 환경 업데이트 |
자동화 수준 | 주로 테스트와 병합 자동화 | Delivery는 수동 배포 승인, Deployment는 완전 자동화 |
결과물 | 통합된 코드가 저장소에 병합 | 사용자에게 새로운 코드와 기능 제공 |
초점 | 코드 품질 보장 | 운영 환경 배포 및 사용자 제공 |
3) 이번 프로젝트에서 CI/CD 역할
- CI "코드 변경 사항을 테스트하고 병합하는 단계 (코드 품질 보장)"
- GitLab CI 파이프라인을 사용해 서비스 소스코드를 자동으로 빌드, 테스트, 정적 분석
- 테스트 통과 시, 코드가 GitLab 저장소에 자동 병합 및 푸시
1. 개발자가 코드 변경 사항을 로컬에서 작업
↓
2. GitLab 브랜치에 코드 푸시 (feature, dev 등)
↓
3. GitLab이 `.gitlab-ci.yml` 파일을 확인하여 파이프라인 트리거
↓
4. 빌드 단계 실행
- 소스 코드 컴파일 또는 설치
- 의존성 확인 (예: npm install, pip install 등)
↓
5. 테스트 단계 실행
- 유닛 테스트, 통합 테스트 수행
- 코드 품질 검사 (정적 분석: pylint, ESLint 등)
↓
6. 테스트 결과 확인
- 테스트 성공: 다음 단계 진행
- 테스트 실패: 파이프라인 중단, 개발자에게 알림
↓
7. 코드 병합
- 테스트를 통과한 코드가 GitLab 메인 브랜치(main 또는 master)로 병합
↓
8. CI 완료
- 병합된 코드는 CD 단계로 전달
- CD "병합된 코드를 실제 서비스로 배포하는 단계"
- 병합된 코드를 기반으로 AWS Lambda 및 API Gateway를 업데이트
- 서비스 코드가 운영 환경에 배포되어, 사용자가 새로운 기능을 이용 가능
# Continuous Delivery
1. CI에서 테스트를 통과한 코드가 GitLab 메인 브랜치(main)로 병합
↓
2. 배포 준비 단계 실행
- 배포 스크립트 실행 (예: Lambda 업데이트, Docker 이미지 빌드 등)
↓
3. 배포 준비 완료
- 운영 환경 배포를 위해 수동 승인 대기
↓
4. 운영 환경 배포
- 승인된 코드가 AWS Lambda, EC2, S3 등으로 배포
↓
5. 배포 결과 확인
- 배포 성공: 운영 환경 업데이트 완료
- 배포 실패: 롤백 또는 디버깅
↓
6. CD 완료
# Continuous Deployment
1. CI에서 테스트를 통과한 코드가 GitLab 메인 브랜치(main)로 병합
↓
2. 배포 준비 단계 실행
- 배포 스크립트 실행 (예: Lambda 업데이트, Docker 이미지 빌드 등)
↓
3. 운영 환경에 자동 배포
- 승인 없이 자동으로 AWS Lambda, EC2, S3 등으로 배포
↓
4. 배포 결과 확인
- 배포 성공: 운영 환경 업데이트 완료
- 배포 실패: 자동 롤백 수행
↓
5. CD 완료
- CI/CD 통합 워크플로우
1. 개발자가 로컬에서 코드 작업 후 GitLab 브랜치에 코드 푸시
↓
2. GitLab이 CI 파이프라인 트리거
- 빌드 → 테스트 → 병합
- 병합된 코드가 메인 브랜치(main)로 통합
↓
3. GitLab이 CD 파이프라인 트리거
- 배포 준비 → (Continuous Delivery: 수동 승인 대기) → 운영 환경 배포
- Continuous Deployment의 경우 자동 배포
↓
4. 운영 환경 업데이트 완료
- AWS Lambda, API Gateway, EC2, S3 등이 업데이트
↓
5. 결과 확인 및 모니터링
- 배포 로그와 시스템 상태 모니터링
5. 최종 설계
AWS 서비스 | 역할 |
EC2 | 모델 학습 및 데이터 전처리 |
S3 | 학습 데이터 및 결과물(모델, 로그) 저장 |
Lambda | 학습된 모델을 로드하여 API 요청 처리 |
API Gateway | 사용자 요청과 Lambda 간의 인터페이스 |
CloudWatch | API 및 Lambda 성능 모니터링 |
1) 모델 학습 및 서비스 구성 워크플로우
- 모델 학습, 저장, API 로 저장되는 과정
1. 데이터 준비
- 수학 문제 데이터셋 준비 (이미지 및 라벨링 데이터)
- 데이터 S3에 저장 (학습용 데이터 저장소)
- 교육과정 로드맵 데이터 준비
↓
2. Neo4j에 데이터 입력
- 교육과정 로드맵 데이터를 Neo4j 그래프 데이터베이스에 저장
- 교육과정 성취수준(노드)와 관계(엣지)를 정의
↓
3. 모델 학습 (EC2)
- YOLOv8: 텍스트 영역, 그래프, 표 탐지 모델 학습
- OCR 모델: 텍스트 추출 모델 학습
- 멀티모달 모델: 그래프, 표의 의미 분석 모델 학습
- 학습 중간 체크포인트 저장:
- Epoch마다 검증 데이터의 성능(예: 정확도, 손실 값)을 기준으로 가장 성능이 좋은 모델을 S3에 저장
- 학습 종료 후 최종 모델 저장:
- 학습 완료 후 최종 모델과 관련된 모든 데이터를 S3에 저장
- MLflow를 통해 학습 로그 기록:
- 하이퍼파라미터, 학습 상태, 중간 및 최종 모델 정보를 기록
↓
4. 학습 결과 저장 (S3)
- 학습된 모델 파일 저장 (YOLOv8, OCR, 멀티모달)
- 가장 성능이 좋은 체크포인트 모델 저장
- 최종 학습된 모델 저장
- MLflow 로그 및 메트릭 저장
↓
5. 서비스 구성 (AWS Lambda + API Gateway)
- API Gateway:
- 사용자 요청(텍스트 또는 이미지)을 수신하고 Lambda로 전달
- Lambda의 처리 결과를 사용자에게 반환
- AWS Lambda:
- 텍스트 입력:
- 입력된 텍스트를 Neo4j에 전달하여 학습 목표 검색
- GraphRAG를 통해 관련 학습 목표를 Neo4j에서 검색
- 검색 결과를 LLM과 AI Agent에 전달하여 라벨링 수행
- 이미지 입력:
- S3에서 학습된 YOLOv8, OCR, 멀티모달 모델 로드
- 이미지에서 텍스트를 추출하고 Neo4j에 전달
- GraphRAG를 통해 학습 목표 검색 및 라벨링 수행
↓
6. 라벨링 결과 저장 (MongoDB)
- 최종 라벨링 결과를 JSON 형태로 MongoDB에 저장
↓
7. 서비스 배포 (GitLab CI/CD)
- GitLab CI/CD로 코드 변경 시 자동 배포
- Lambda 및 API Gateway 업데이트
2) 수학 문제 입력에서 라벨링 결과까지의 워크플로우
- 사용자가 입력한 데이터를 기반으로 결과를 생성하는 전체 흐름
1. 사용자가 문제 데이터 입력
- 문제 이미지 업로드 또는 텍스트 입력
- 데이터 유형 선택 (이미지, 텍스트 등)
↓
2. API Gateway를 통한 요청 전달
- 사용자의 입력 데이터를 Lambda로 전달
↓
3. AWS Lambda 처리 (GraphRAG 역할 포함)
- 텍스트 입력:
- GraphRAG를 사용하여 입력된 텍스트를 Neo4j에 전달
- Neo4j에서 교육과정 로드맵 기반의 하위 분류(학습 목표) 검색
- GraphRAG가 검색 결과를 정리하여 LLM에 전달
- 이미지 입력:
- YOLOv8 모델: 텍스트 영역, 그래프, 표 탐지
- OCR 모델: 텍스트 영역에서 문자 및 수식 추출
- 멀티모달 모델: 그래프와 표의 의미 분석
- 추출된 텍스트를 GraphRAG를 사용하여 Neo4j에 전달
- Neo4j에서 교육과정 로드맵 기반의 하위 분류 검색
- GraphRAG가 검색 결과를 정리하여 LLM에 전달
↓
4. LLM + AI Agent 라벨링
- LLM:
- GraphRAG에서 전달된 데이터를 기반으로 라벨링 수행
- AI Agent:
- LLM의 라벨링 결과를 검토 및 최적화
↓
5. 라벨링 결과 MongoDB 저장
- 최종 라벨링 결과를 JSON 형식으로 MongoDB에 저장
↓
6. 라벨링 결과 출력 및 제공
- JSON 형식으로 결과 제공:
- 사용자 요청에 따라 API Gateway를 통해 반환
- UI에서 결과 확인:
- 사용자 인터페이스에서 라벨링 결과를 확인 및 수정 가능
[tip] 워크플로우 vs 인프라
1) 워크플로우(Workflow)란?
- 목적: 작업의 순서와 흐름을 정의
- 어떤 단계들이 있는지, 그리고 각 단계가 어떻게 연결되어 진행되는지를 설명
- 초점: 프로세스 중심
- 작업을 수행하는 단계와 데이터가 어떻게 처리되는지
- 질문: "무엇을 할 것인가?"
- "사용자가 문제를 입력하면 어떤 단계를 거쳐 결과를 얻는가?" 같은 흐름을 정의
- 설명: 프로세스의 각 단계와 그 순서를 보여줌
1. 문제 이미지 입력 →
2. 텍스트 영역 탐지(YOLOv8) →
3. 텍스트 추출(OCR 모델) →
4. 데이터 결합 및 해석 →
5. GraphRAG 및 AI Agent 라벨링 →
6. 결과 출력 (JSON)
2) 인프라(Infrastructure)란?
- 목적: 프로세스를 지원하는 물리적 또는 가상 환경을 정의
- 워크플로우를 실행하기 위한 시스템과 도구를 제공
- 초점: 시스템 중심
- 하드웨어, 소프트웨어, 네트워크 자원 등을 설명
- 질문: "어떻게 실행할 것인가?"
- "어떤 서버에서 모델을 학습시키고, 데이터는 어디에 저장하며, 배포는 어떻게 할 것인가?" 같은 기술적 구성
- 설명: 작업을 실행하는 시스템 및 구성 요소를 보여줌
- AWS EC2: YOLOv8 및 OCR 모델 학습 수행
- AWS S3: 학습 데이터와 결과 저장
- AWS Lambda: 학습된 모델로 예측 수행
- API Gateway: 사용자 요청 처리
- GitLab CI/CD: 코드 변경 시 학습 및 배포 자동화
📙 내일 일정
- 최종 프로젝트
'TIL _Today I Learned > 2024.12' 카테고리의 다른 글
[DAY 101] 최종 프로젝트_ 네트워크 (0) | 2024.12.11 |
---|---|
[DAY 100] 최종 프로젝트_ GitLab (1) | 2024.12.10 |
[DAY 98] 최종 프로젝트_ 모델 Fine Tuning, 플로우 차트 (2) | 2024.12.06 |
[DAY 97] 최종 프로젝트_ GraphRAG, MLOps, CI/CD (0) | 2024.12.05 |
[DAY 96] 최종 프로젝트_ 프로젝트 개요] 최종 프로젝트_ 워크플로우 (3) | 2024.12.03 |