본문 바로가기
TIL _Today I Learned/2024.12

[DAY 99] 최종 프로젝트_ AWS 아키텍처 설계

by gamdong2 2024. 12. 9.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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 업로드)

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)

4) API Gateway: 사용자 요청 처리

  • 작업 내용
    • 사용자 요청을 받아 Lambda로 전달하고 결과 반환
  • AWS 설정
    • RESTful API 생성
      • POST 요청: 사용자 입력(이미지/텍스트) 전달
      • 응답: Lambda에서 예측 결과 반환.
    • CORS 설정
      • 클라이언트 애플리케이션이 요청할 수 있도록 CORS 정책 설정

5) CloudWatch: 모니터링

  • 작업 내용
    • Lambda 및 API Gateway의 로그와 성능 추적
    • 모델 예측 호출 수, 지연 시간, 오류 비율 모니터링
  • AWS 설정
    • CloudWatch 로그 그룹
      • Lambda 및 API Gateway의 로그 수집
    • 경고 설정
      • API 응답 시간이 임계값 초과 시 알림(SNS 또는 이메일)

 

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: 코드 변경 시 학습 및 배포 자동화

 
 
 
 

📙 내일 일정

  • 최종 프로젝트