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 ๊ด๋ฆฌ ํ์ผ
- Python 3.10
- MLflow๋ฅผ ํตํ ์คํ ๊ด๋ฆฌ
Python 3.10 ๋ฒ์ ์ Conda ๊ฐ์ ํ๊ฒฝ์ ์์ฑํ๊ณ ํ์ฑํ.
conda create -n ml4 python=3.10
conda activate ml4ํ๋ก์ ํธ์ ํ์ํ ์์กด์ฑ ๋ชจ๋์ ์ค์น
pip install -r requirements.txtconfig/config.yaml ํ์ผ์ ์ด์ด ํ์ํ ์ค์ ์ ํ์ธํ๊ณ ์คํ์ ๋ง๊ฒ ์์
- ๋ฐ์ดํฐ์
์ค์ :
dataset์น์ ์์ ๋ฐ์ดํฐ์ ์ข ๋ฅ์ ์ํ๋ง ๋น์จ ๋ฑ์ ์ค์ - ๋ชจ๋ธ ์ค์ :
model์น์ ์์ ์ฌ์ฉํ ๋ชจ๋ธ ์ด๋ฆ๊ณผ ํ์ต ํ๋ผ๋ฏธํฐ ๋ฑ์ ์ค์ - ํ์ต ์ค์ :
train์น์ ์์ ์ํฌํฌ ์, ๋ฐฐ์น ํฌ๊ธฐ ๋ฑ์ ์ค์
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ MLflow UI๋ฅผ ์์
mlflow ui --host 127.0.0.1 --port 5050๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:5050 ์ ์ ์ํ์ฌ MLflow UI์ ์ ๊ทผ
- ๊ตฌ์กฐ
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)
ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ๋ชจ๋ธ ํ์ต์ ์์ํ๊ฑฐ๋, IDE์์ train.py๋ฅผ ์คํ:
python train.pyํ์ต ์๋ฃ ํ ํฐ๋ฏธ๋์ ๋ํ๋๋ ๋ชจ๋ธ ๊ด๋ฆฌ ๊ด๋ จ ๋ฉ์์ง์ ๋ฐ๋ผ 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์ด ๊ฐ์ด๋๋ฅผ ๋ฐ๋ผ ํ๋ก์ ํธ๋ฅผ ์คํํ๊ณ ๋ชจ๋ธ์ ํ์ต ๋ฐ ๊ด๋ฆฌ. ํ์์ ๋ฐ๋ผ config.yaml ํ์ผ์ ์ค์ ์ ์กฐ์ ํ์ฌ ์คํ์ ์งํ
- ๋ฐ์ดํฐ์
์ข
๋ฅ (
dataset.name): ์ฌ์ฉํ ๋ฐ์ดํฐ์ ์ ์ด๋ฆ์ ์ง์ . ๊ธฐ๋ณธ๊ฐ์nsmc - ๋ชจ๋ธ ์ด๋ฆ (
model.name): ์ฌ์ฉํ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ด๋ฆ์ ์ง์ . ๊ธฐ๋ณธ๊ฐ์KcBER - ๋ฐ์ดํฐ์
์ํ๋ง ๋น์จ (
dataset.sampling_rate): ๋ฐ์ดํฐ์ ์ ์ผ๋ถ๋ง ์ฌ์ฉํ์ฌ ๋น ๋ฅธ ์คํ์ ์งํ - ์ต๋ ์
๋ ฅ ๊ธธ์ด (
dataset.max_length): ๋ชจ๋ธ ์ ๋ ฅ ์ํ์ค์ ์ต๋ ๊ธธ์ด๋ฅผ ์ง์ - ๋ชจ๋ธ ๋ฑ๋ก ์ต์ ๊ธฐ์ค (
model.register_threshold): ๋ชจ๋ธ์ ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋กํ๊ธฐ ์ํ ์ต์ ์ฑ๋ฅ ๊ธฐ์ค์ ์ค์ - ์ธํ๋ฆฌ์ฆํ ๋ ์ด์ด ์ (
model.unfrozen_layers): ๋ชจ๋ธ ํ์ต ์ ์ ๋ฐ์ดํธํ ๋ ์ด์ด์ ์๋ฅผ ์ง์
- ํ๊ฒฝ ์ค์ : ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ์ฌ ์์กด์ฑ ์ถฉ๋์ ๋ฐฉ์ง
- ์ค์ ์กฐ์ :
config.yamlํ์ผ์ ์์ ํ์ฌ ๋ค์ํ ์คํ์ ์งํ - ๋ชจ๋ธ ๊ด๋ฆฌ ์๋ํ: ํ์ต ์คํฌ๋ฆฝํธ ์คํ ํ ์๋์ผ๋ก ๋ชจ๋ธ ๋ฑ๋ก ๋ฐ ๊ด๋ฆฌ ๋ฉ์์ง
- MLflow ์ฌ์ฉ: ์คํ ์ถ์ , ๋ชจ๋ธ ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ
Airflow๋ฅผ Docker๋ก ์ค์ ํ๋ ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์คํ:
docker-compose up --build -d
Airflow์์ Slack Webhook์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ์ ๋ณด๋ฅผ .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 ์ค์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฑ๋ก๋์๋์ง ํ์ธ.
- ๋ฐ์ดํฐ ์ถ์ฒ: ๋ค์ด๋ฒ ์ํ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ
- ๋ฐ์ดํฐ ๊ตฌ์ฑ:
- ์ด ๋ฐ์ดํฐ ์: 200,000๊ฐ
- ํ๋ จ์ฉ ๋ฐ์ดํฐ: 150,000๊ฐ
- ํ ์คํธ์ฉ ๋ฐ์ดํฐ: 50,000๊ฐ
- ๋ ์ด๋ธ: ๊ธ์ (1), ๋ถ์ (0) ์ด์ง ๋ถ๋ฅ
- ๋ด์ฉ: ์ฌ์ฉ์ ์์ฑ ์ํ ๋ฆฌ๋ทฐ์ ํด๋น ๊ฐ์ฑ ๋ ์ด๋ธ
- ์ด ๋ฐ์ดํฐ ์: 200,000๊ฐ
- ํน์ง:
- ํ๊ตญ์ด ๊ฐ์ฑ ๋ถ์์ ์ํ ๋ํ์ ์ธ ๊ณต๊ฐ ๋ฐ์ดํฐ์
- ๋ฆฌ๋ทฐ๋ ํ๊ธ๊ณผ ๊ณต๋ฐฑ์ผ๋ก๋ง ๊ตฌ์ฑ๋์ด ์ ์ฒ๋ฆฌ ํ์์ฑ์ด ์ ์
- ๋ผ์ด์ ์ค: ๊ณต๊ฐ ๋ผ์ด์ ์ค (์ถ์ฒ ํ๊ธฐ ํ์)
- ๋ชจ๋ธ๋ช : KC-BERT (Korean Comments BERT)
- ์ํคํ ์ฒ: BERT-base
- ์ธ์ด: ํ๊ตญ์ด
- ๋ชจ๋ธ ํฌ๊ธฐ:
- ํ๋ผ๋ฏธํฐ ์: ์ฝ 110M (1์ต 1์ฒ๋ง ๊ฐ)
- ํ์ต ๋ฐ์ดํฐ:
- ํ๊ตญ์ด ์ํค๋ฐฑ๊ณผ
- ๋ด์ค ๊ธฐ์ฌ
- ์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ ๋๊ธ ๋ฐ SNS ๋ฐ์ดํฐ
- ํน์ง:
- ๊ตฌ์ด์ฒด, ๋น์์ด ๋ฑ ์ผ์ ์ธ์ด์ ๋ํ ์ดํด๋ ํฅ์
- ํ๊ตญ์ด ํ ์คํธ์ ๋ฌธ๋งฅ์ ์๋ฏธ ํ์ ์์ ์ฐ์ํ ์ฑ๋ฅ ๋ฐํ
- ๋ผ์ด์ ์ค: MIT ๋ผ์ด์ ์ค