- 프로젝트 기간: 2024년 11월 25일 ~ 12월 6일
- 목표:
- 웹 데이터 수집부터 모델 서빙까지의 End-to-End MLOps 파이프라인 구현
- 실시간 긍정/부정을 예측하는 한국어 감성 분석 시스템 개발
- 박정준:
- AI Engineer
- : NLP 모델 개발, 모델 관리 파이프라인 (MLflow)
- AI Engineer
- 김동완:
- Data Engineer
- : Data management & scraping 데이터 수집 및 관리
- Data Engineer
- 김묘정
- Front-end Engineer, QA
- : 프론트엔드 개발 (Streamlit), 모델 테스트
- Front-end Engineer, QA
- 이다언:
- Back-end Engineer
- : Fast API
- Back-end Engineer
- 웹 데이터 크롤링: Selenium 및 Scrapy 사용
- 정제된 텍스트 처리: 한글 텍스트만 추출
- 모델 개발:
- Kc-BERT 및 Kc-ELECTRA 기반 Fine-tuning
- NSMC 데이터셋 사용
- MLflow를 활용한 관리:
- 실험 추적 및 모델 버전 관리
- FastAPI: 실시간 감성 예측 API 제공
- Airflow: 배치 작업 관리
- Streamlit: 사용자가 모델을 직접 테스트할 수 있는 인터페이스 제공
project_root/
├── src/
│ ├── config/
│ │ ├── __init__.py
│ │ └── config.py # Configuration management
│ ├── models/
│ │ ├── __init__.py
│ │ └── base_model.py # Model architecture definitions
│ │ └── kcbert_model.py # KcBERT Model architecture definitions
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── visualization.py
│ │ └── mlflow_utils.py # MLflow integration utilities
│ └── data/
│ ├── __init__.py
│ └── base_dataset.py
│ └── nsmc_dataset.py # nsmc dataset script
├── ── train.py # train module script
│ └── inference.py # inference module script
├── configs/
│ ├── config.yaml # Configuration files
│ └── model_registry.json # Model registry files
├── mlruns/ # mlflow artifacts files folder
├── init-scripts/
│ ├── init.sh # Docker init file
├── dags/
│ └── dags.py # dags script for airflow
├── app.py # streamlit web gui for model test & management
├── requirements.txt
├── README.md
├── docker-compose.yml
├── Dockerfile
└── .env # Environment variables for slack webhook - docker
- 주요 모듈 코드 보관
- config.py: 프로젝트 설정 관리
- data/: 데이터 관련 코드
- models/: 모델 아키텍처 정의
- utils/: 유틸리티 함수 모음
- raw/: raw data
data, models 폴더 및 파일이 없는 경우에도 [train.py](http://train.py) 실행시 저절로 데이터,모델 다운받아 실행
- processed/: processed data
- Pretrained models
- YAML 기반 설정 파일
-
데이터셋 종류: 사용할 데이터셋 종류 설정 (기본값: NSMC - 네이버 영화 리뷰)
-
모델 설정: 사용할 모델 및 학습 파라미터 설정 (기본값: KcBERT)
-
기타 파라미터:
dataset_sampling_rate
: 빠른 실험을 위한 데이터셋 샘플링 비율max_length
: 모델 입력의 최대 길이register_threshold
: 모델 등록을 위한 최소 기준unfrozen_layers
: 학습 시 언프리즈할 레이어 수
-
requirements.txt
: 프로젝트 의존성 -
.env
: 환경 변수 -
README.md
: 프로젝트 문서
-
- JSON 기반 Model 관리 파일
- MLflow 실행 결과 metadata 저장 폴더
- MLflow 실행 결과 Model 등 아티팩트 저장 폴더
- 라이브러리: Selenium, Scrapy
- 정제 작업:
- HTML 태그 및 특수 문자 제거
- 연속 공백 및 이모지 제거
- 모델: Kc-BERT, Kc-ELECTRA
- 데이터셋: NSMC (Naver Sentiment Movie Corpus)
- 모델 성능 평가 기준: F1 Score ≥ 0.7
- MLflow: 모델 버전 관리
- 실험 및 모델 파라미터 추적
- MLflow Model Registry, 별도의 model_registry.json 파일 정보를 싱크, 모델 버전 관리
- 모델 단계:
- Candidate: 새로 훈련된 모델
- Champion: 프로덕션 준비 완료된 모델
- Archived: 사용 중단된 모델
- Docker & Airflow: 자동화 파이프라인 구축
- Airflow 컨테이너 자동 생성
- Slack webhook 연결 및 계정 자동 생성
- 모델 등록 알림 및 모델 테스트 결과 알림
-
FastAPI: 실시간 추론 API
-
API 응답 예시:
{ "prediction": "positive", "confidence": 0.95 }
- 출처: GitHub - e9t/nsmc
- 내용: 네이버 영화 리뷰 텍스트와 감성 레이블 (긍정: 1, 부정: 0)
- 특징:
- 총 20만 개의 데이터 (훈련: 15만 개, 테스트: 5만 개)
- 구어체, 비속어, 오탈자 등이 포함된 정제되지 않은 데이터
- 사용 목적: 한국어 감성 분석 모델 학습
- 출처: GitHub - Beomi/KcBERT
- 아키텍처: BERT-base
- 학습 데이터:
- 한국어 위키백과
- 뉴스 기사
- 온라인 커뮤니티 댓글 및 SNS 데이터
- 특징:
- 구어체 및 비정형 표현 이해에 강점
- 감성 분석, 문서 분류 등 한국어 NLP 태스크에 적합
- 출처: GitHub - Beomi/KcBERT
- 아키텍처: ELECTRA-base (Generator-Discriminator)
- 학습 데이터:
- 한국어 위키백과
- 뉴스 기사
- 온라인 커뮤니티 댓글 및 SNS 데이터
- 특징:
- BERT 대비 경량화
- 빠른 학습과 추론이 필요한 환경에서 적합
- 실험 및 테스트 환경
- Linux, Windows 10, Mac OS
- Python 버전
- Python 3.10
- Conda 환경 생성:
conda create -n ml4 python=3.10
conda activate ml4
pip install -r requirements.txt
config/config.yaml
파일을 열어 필요한 설정을 확인하고 실험에 맞게 수정
- 데이터셋 설정:
dataset
섹션에서 데이터셋 종류와 샘플링 비율 등을 설정 - 모델 설정:
model
섹션에서 사용할 모델 이름과 학습 파라미터 등을 설정 - 학습 설정:
train
섹션에서 에포크 수, 배치 크기 등을 설정
mlflow ui --host 127.0.0.1 --port 5050
- 브라우저에서
http://127.0.0.1:5050
에 접속
python train.py
- 구조
Args:
interactive: 대화형 추론 및 모델 관리 기능 활성화 여부 (옵션: default = False)
Returns:
dict: 학습 결과 정보
{
'run_id': str,
'metrics': dict,
'run_name': str,
'model': PreTrainedModel,
'tokenizer': PreTrainedTokenizer,
'data_module': NSMCDataModule
}
- 사용 예시
from src.train import SentimentTrainer
# 기본 학습. 설정은 config.yaml 에서 project 항목
trainer = SentimentTrainer()
result = trainer.train()
추론 코드:
- 구조
Args:
text: 입력 텍스트 또는 텍스트 리스트
return_probs: 확률값 반환 여부
Returns:
Dict 또는 Dict 리스트: 예측 결과
{
'text': str, # 원본 텍스트
'label': str, # '긍정' 또는 '부정'
'confidence': float, # 예측 확신도
'probs': { # 각 레이블별 확률 (return_probs=True인 경우)
'긍정': float,
'부정': float
}
}
- 사용 예시
from src.inference import SentimentPredictor
predictor = SentimentPredictor() # default: Production (최신 모델)
texts = ["다시 보고 싶은 영화", "별로에요"]
results = predictor.predict(texts)
결과:
{'text': '다시 보고 싶은 영화', 'label': 'positive', 'confidence': 0.93}
{'text': '별로에요', 'label': 'negative', 'confidence': 0.85}
학습 완료 후 터미널에 나타나는 모델 관리 관련 메시지에 따라 CLI에서 숫자 또는 y/n
을 입력하여 모델을 관리.
- 모델 등록: 모델을 레지스트리에 등록할지 여부 선택
- 모델 단계 설정: 모델의 단계(stage)를 설정 (예: None, Staging, Production)
- MLflow UI: 브라우저에서 실험 결과, 메트릭, 파라미터 및 아티팩트를 확인.
- 폴더 구조:
mlruns/
폴더에 실행(run) 관련 로그와 메트릭이 저장.exp id / exp id / artifacts /
폴더에 모델 파일 등 아티팩트가 저장.config/model_info.json
파일에서 등록된 모델의 단계(stage)를 확인.
streamlit run app.py
- 웹 브라우저에서 인터페이스를 통해 모델 테스트
- init-scripts/init.sh 파일 실행 시 자동으로 실행되는 초기 설정 파일
- Airflow, Slack webhook 연결 계정 자동 생성
- init.sh: 초기 설정 파일
- Dockerfile: Docker 컨테이너 설정 파일
- docker-compose.yml: Docker 컨테이너 관리 파일
Airflow를 Docker로 설정하려면 아래 명령어를 실행:
docker-compose up --build -d
Airflow에서 Slack Webhook을 사용하려면 다음 정보를 .env
파일에 저장:
.env
파일 예시
env
코드 복사
# Slack Webhook Token 설정
SLACK_WEBHOOK_TOKEN=PUT YOUR SLACK TOKEN
# Airflow 설정
AIRFLOW__CORE__LOAD_EXAMPLES=False
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=sqlite:////usr/local/ml4/airflow.db
AIRFLOW__PROVIDERS__SLACK__WEBHOOK_CONN_ID=slack_webhook
만약 자동 설정이 안되는 경우, Slack Webhook 연결을 위해 Airflow의 Connection ID를 아래와 같이 설정
- Connection ID:
slack_webhook
- Token:
.env
파일에 설정된SLACK_WEBHOOK_TOKEN
값 사용
Airflow 초기 설정 시 다음 기본 계정이 자동으로 생성:
- ID:
admin
- Password:
admin
docker-compose.yml
파일이 제대로 구성되어 있는지 확인.- Airflow를 실행한 후 웹 UI에서 Slack Webhook Connection 설정이 올바르게 등록되었는지 확인.
Python 기반 네이버 블로그 크롤러 서비스입니다. 검색어(Query)를 입력받아 크롤링을 수행하고, 결과를 JSON 또는 CSV 형식으로 저장합니다.
- Scrapy 기반 크롤링: Scrapy와 Selenium을 사용하여 데이터를 효율적으로 크롤링합니다.
- 결과 저장: 크롤링 결과를 JSON 및 CSV 형식으로 저장.
- 사용 편의성: Python 함수 호출 또는 명령줄 인터페이스로 실행 가능.
-
저장소 클론 git clone <repository_url> cd CrawlerService
-
가상환경 설정 python3.12 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate
-
의존성 설치 pip install -r requirements.txt
-
Scrapy 명령어로 실행 검색어(Query)를 입력하여 크롤링을 실행하고 결과를 저장합니다. [예시]
scrapy crawl naver_blog_spider scrapy crawl naver_blog_spider -a verbose=True scrapy crawl naver_blog_spider -a verbose=True -o output/naver_blog_crawling.csv scrapy crawl naver_blog_spider -a verbose=True -a query=스위스,독일 scrapy crawl naver_blog_spider -a verbose=True -a query=스위스,독일 -a max_results=4 scrapy crawl naver_blog_spider -a verbose=True -a query=이탈리아 -a max_results=2 scrapy crawl naver_blog_spider -a verbose=True -a query=일본,중국,베트남 -a max_results=5 scrapy crawl naver_blog_spider -a verbose=True -a query=일본,중국,베트남 -a max_results=5 -o output/test001.csv
[ERROR] 아래와 같은 경우 error가 발생합니다.
# ###################################################################### crawl: error: running 'scrapy crawl' with more than one spider is not supported # ###################################################################### scrapy crawl naver_blog_spider -a verbose=True -t csv [crawl: error] scrapy crawl naver_blog_spider -a verbose=True -a query= 스위스,독일 [crawl: error] # ######################################################################
-
Python 코드로 실행 crawler_service.py의 run_crawler 함수를 호출하여 실행합니다:
[test_crawler.py]
from CrawlerService.crawler_service import run_crawler
output_filename = "naver_blog_crawling" result = run_crawler(query="일본 도쿄,한국 서울", verbose=True, max_results=4, output_filename=output_filename) print(f"크롤링 결과 저장 (CSV file): output/{output_filename}.csv") print(f"크롤링 결과 저장 (JSON file): output/{output_filename}.json")
-
의존성 분석 pipdeptree를 사용하여 프로젝트 의존성을 분석할 수 있습니다: pip install pipdeptree pipdeptree
-
로깅 크롤링 과정에서 발생하는 모든 로그는 logs/ 폴더에 저장됩니다.
프로젝트 디렉토리 구조는 다음과 같습니다:
CrawlerService
├── CrawlerService
│ ├── __init__.py
│ ├── crawler_service.py
│ ├── items.py
│ ├── pipelines.py
│ ├── settings.py
│ ├── setup.py
│ └── spiders
│ ├── __init__.py
│ └── naver_blog_spider.py
├── README.md
├── app
│ └── main.py
├── logs
├── output
├── requirements.txt
├── scrapy.cfg
├── test_crawler.py
├── .gitignore
└── venv
- 실시간 감성 분석 서비스 구축:
- 한국어 텍스트의 긍정/부정 분류 모델 개발
- 정제되지 않은 한국어 텍스트에 대한 감성 분류에서 높은 정확도와 안정성 달성
- MLOps 파이프라인 구축:
- 모델, 데이터 관리 및 MLOps 인프라 전반 이해 및 구현
- 데이터셋:
- 문제: 실시간 데이터 수집 및 모델 학습의 어려움
- 해결: 목표 데이터 타입과 유사한 특성을 가진 대규모 레이블 데이터셋을 이용, 기본 모델을 학습
- MLOps 통합:
- 문제: 모델 버전 관리 및 배포의 원활한 연계
- 해결: MLflow를 활용한 실험 추적 및 모델 레지스트리 구현
- 모델 배포:
- 문제: 실시간 추론을 위한 낮은 지연 시간 확보
- 해결: FastAPI와 비동기 처리로 모델 서빙 최적화
- Airflow 자동화 통합: 데이터 수집 및 전처리, 모델 학습, 배포 자동화
- 다중 감정 분류 확장: 중립 및 복합 감정을 추가로 예측
- 모델 일반화 향상: 다양한 데이터셋 사용
- 프론트엔드 개선: 사용자 경험 최적화
- 다중 유저 정보 관리: 다양한 유저 정보 관리 및 모델 테스트
- Report
- Presentation
- Meeting Log
- NSMC 데이터셋: GitHub - e9t/nsmc
- Hugging Face: Hugging Face
- Kc-BERT 모델: GitHub - Beomi/KcBERT
- KC-ELECTRA 모델: Hugging Face - beomi/KcELECTRA-base
- MLflow 문서: MLflow
- Streamlit 문서: Streamlit
- FastAPI 문서: FastAPI
- Airflow 문서: Airflow