/serving

DKT Project Served by Airflow / BentoML / Docker Swarm

Primary LanguagePython

πŸ“š Deep Knowledge Tracing(DKT)

λ”₯λŸ¬λ‹μ„ μ΄μš©ν•œ 지식 μƒνƒœ 좔적(Deep Learning + Knowledge Tracing)으둜 νŠΉμ • μ‹œν—˜μ„ 톡해 ν•™μƒμ˜ 지식 μƒνƒœλ₯Ό νŒŒμ•…ν•˜κ³  이λ₯Ό 기반으둜 λ‹€μŒ 문제λ₯Ό λ§žμΆœμ§€ μ˜ˆμΈ‘ν•˜λŠ” νƒœμŠ€ν¬μž…λ‹ˆλ‹€. ν•™μŠ΅κ³Ό 망각을 톡해 지식 μƒνƒœλŠ” 계속 λ³€ν™”ν•˜λ©° μΆ”κ°€λ˜λŠ” 문제 풀이 μ •λ³΄λ‘œ 지식 μƒνƒœλ₯Ό μ§€μ†μ μœΌλ‘œ 좔적해야 ν•©λ‹ˆλ‹€.


πŸ“ Repository Summary

이 λ ˆν¬μ§€ν† λ¦¬λŠ” μ•„λž˜μ™€ 같은 아킀텍쳐λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•œ μ½”λ“œλ‘œ μ΄λ£¨μ–΄μ ΈμžˆμŠ΅λ‹ˆλ‹€. λ¨Όμ € 이 μ•„ν‚€ν…μ³λŠ” 두 개의 μ„œλ²„λ₯Ό μ „μ œν•œ μƒνƒœλ‘œ κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

1. Inference용 μ„œλ²„ : Naver Cloud Platform Server

  • μœ μ €μ˜ Requestλ₯Ό λ°›μ•„ Inferenceλ₯Ό μˆ˜ν–‰ν•˜κ³  κ²°κ³Όλ₯Ό λ Œλ”λ§ν•˜κ±°λ‚˜, Model file을 packingν•˜μ—¬ μƒˆλ‘œμš΄ Docker Image둜 λ§Œλ“œλŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

2. Train용 μ„œλ²„ : P40 GPU Server

  • Docker μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬μ„±λœ μ„œλ²„λ‘œ, P40 GPUκ°€ ν• λ‹Ήλ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ 데이터λ₯Ό λ‚΄λ €λ°›μ•„ Train을 μ§„ν–‰ν•˜κ³ , model.pt νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€. Model Train에 GPU λ¦¬μ†ŒμŠ€κ°€ 많이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μ„œλ²„λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

μ™œ μ„œλ²„λ₯Ό λ‚˜λˆ„μ—ˆλŠ”κ°€?

ML/DL Cycleμ—μ„œ 각 Taskλ³„λ‘œ ν•„μš”ν•œ λ¦¬μ†ŒμŠ€μ˜ μ’…λ₯˜μ™€ μˆ˜μ€€μ΄ λ‹€λ¦…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Train Server의 경우 High-GPU ν™˜κ²½μ΄ μ„ΈνŒ…λ˜μ–΄μ•Ό μ›ν™œν•œ ν•™μŠ΅μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Inference의 경우 무거운 λͺ¨λΈμ„ μ˜¬λ¦¬μ§€ μ•ŠλŠ”λ‹€λ©΄ ꡳ이 높은 λΉ„μš©μ„ λ“€μ—¬ GPU μ„œλ²„λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 이처럼 Task에 따라 λΉ„μš©μ„ μ΅œλŒ€ν•œ μ ˆμ•½ν•˜κ³  μŠ€μΌ€μΌλ§ κ°€λŠ₯ν•œ 아킀텍쳐λ₯Ό λ§Œλ“œλŠ” 것이 AI λͺ¨λΈ μ„œλΉ™μ˜ 핡심 point 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

기본적으둜 μ„œλ²„ μ„ΈνŒ…μ€ NCP Cloud Server와 Docker μ»¨ν…Œμ΄λ„ˆμΈ P40 GPU Server에 μ˜¬λΌκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ„λ‘ μ„ΈνŒ…ν•˜μ‹œλ €λ©΄ Config λ˜λŠ” μ½”λ“œ λ‚΄μ˜ 경둜 섀정을 λ³€κ²½ν•΄μ£Όμ…”μ•Όν•©λ‹ˆλ‹€.

--- Service Flow

  1. κ°€μž₯ λ¨Όμ € Inference, Train 각 μ„œλ²„μ— git clone을 λ°›κ³  μ‰˜ 슀크립트λ₯Ό μ΄μš©ν•΄ μ„œλ²„ μ„ΈνŒ… / 졜초의 Client-Inference μ»¨ν…Œμ΄λ„ˆ 생성을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  2. μœ μ €κ°€ Inference μ„œλ²„μ— μš”μ²­μ„ 보내면, Flask μ»¨ν…Œμ΄λ„ˆ(Client μ»¨ν…Œμ΄λ„ˆ)κ°€ ν•΄λ‹Ή 데이터λ₯Ό Inference μ»¨ν…Œμ΄λ„ˆ(μ„œλ²„ μ»¨ν…Œμ΄λ„ˆ)둜 μ „λ‹¬ν•˜μ—¬ Score μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  3. update_data_dag

    • Inference κ³Όμ •μ—μ„œ AWS S3에 μ—…λ°μ΄νŠΈν•  데이터λ₯Ό μŒ“μ•„λ‘μ—ˆλ‹€κ°€, 주기적으둜 S3둜 μ—…λ‘œλ“œν•˜μ—¬ Versioning ν•©λ‹ˆλ‹€. 이 λ•Œ S3 버킷 λ„€μž„μ€ λ°˜λ“œμ‹œ 본인의 S3 Bucket Name으둜 λ°”κΏ”μ£Όμ„Έμš”.
  4. retrain_and_push_dag

    • Train serverμ—μ„œ S3의 μ—…λ°μ΄νŠΈλœ 데이터λ₯Ό λ‚΄λ €λ°›κ³ , ν•™μŠ΅μ„ μˆ˜ν–‰ν•˜μ—¬ λͺ¨λΈ νŒŒμΌμ„ μƒμ„±ν•œ λ’€ 이λ₯Ό λ‹€μ‹œ S3에 μ—…λ‘œλ“œν•˜μ—¬ Versioningν•©λ‹ˆλ‹€.
  5. update_inference_dag

    • Inference Serverμ—μ„œ λͺ¨λΈνŒŒμΌμ„ λ‚΄λ €λ°›κ³ , 이λ₯Ό 기쑴의 μ½”λ“œμ™€ ν•¨κ»˜ BentoML둜 Packing & Containerizingν•˜μ—¬ μ΄λ―Έμ§€λ‘œ λΉŒλ“œν•œ ν›„ Docker Hub에 pushν•©λ‹ˆλ‹€. 이 λ•Œ ν˜„μž¬ Docker Hub λ‚΄μ˜ Image Repository μ„ΈνŒ…μ„ 본인의 λ ˆν¬μ§€ν† λ¦¬λ‘œ λ°”κΏ”μ£Όμ„Έμš”.
    • 각 Inference μ»¨ν…Œμ΄λ„ˆλŠ” Service λ‹¨μœ„λ‘œ λ¬Άμ—¬ Docker Swarm으둜 λ°°ν¬λ©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, Docker Imageλ₯Ό Pullλ°›μ•„ 변경점이 생긴 Imageλ₯Ό κΈ°μ€€μœΌλ‘œ Inference Serviceλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

μ΄ν›„μ—λŠ” 2-5의 과정을 주기적으둜 λ°˜λ³΅ν•˜μ—¬ λͺ¨λΈμ„ μž¬ν•™μŠ΅ν•˜κ³  μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λͺ¨λ“  과정은 Apache Airflow Dags에 μ˜ν•΄ μˆ˜ν–‰/κ΄€λ¦¬λ©λ‹ˆλ‹€.


πŸ“Œ How to run

ν•΄λ‹Ή λ ˆν¬μ§€ν† λ¦¬μ˜ μ΅œμƒλ‹¨μ—λŠ” λ‘κ°œμ˜ Initialization μ‰˜ μŠ€ν¬λ¦½νŠΈκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 두 μ‰˜ 슀크립트λ₯Ό μ΄μš©ν•˜μ—¬ 각각 Inference Server와 Train Serverλ₯Ό 졜초 μ„ΈνŒ…ν•©λ‹ˆλ‹€. 이후, Airflow Webserverλ₯Ό μ΄μš©ν•˜μ—¬ Dagsλ₯Ό μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ μ„œλΉ™ νŒŒμ΄ν”„λΌμΈμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

init_for_inference_server.sh

🏠 ν™ˆ 디렉토리 : /root/ βœ”οΈ μ„€μΉ˜ νŒ¨ν‚€μ§€

  • Docker
  • Airflow
  • SQLite3

Description

  • νŒ¨ν‚€μ§€ μ„ΈνŒ… 및 Airflow Scheduler 데λͺ¬ μ‹€ν–‰
  • GUI Web server 데λͺ¬ μ‹€ν–‰(default port 8080)
  • 졜초의 Client-Inference μ»¨ν…Œμ΄λ„ˆ μ„œλΉ„μŠ€λ“€μ„ Docker Swarm으둜 Deploy
  • μ‹€ν–‰ κ³Όμ •μ—μ„œ aws configureλ₯Ό μ„€μ •ν•΄μ•Ό S3 μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯을 μ •μƒμ μœΌλ‘œ μˆ˜ν–‰ κ°€λŠ₯

init_for_train_server.sh

🏠 ν™ˆ 디렉토리 : /opt/ml/ βœ”οΈ μ„€μΉ˜ νŒ¨ν‚€μ§€

  • Docker
  • Airflow
  • SQLite3

Description

  • νŒ¨ν‚€μ§€ μ„ΈνŒ… 및 Airflow Scheduler 데λͺ¬ μ‹€ν–‰
  • GUI Web server 데λͺ¬ μ‹€ν–‰(default port 6006)
  • μ‹€ν–‰ κ³Όμ •μ—μ„œ aws configureλ₯Ό μ„€μ •ν•΄μ•Ό S3 μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯을 μ •μƒμ μœΌλ‘œ μˆ˜ν–‰ κ°€λŠ₯

Airflow Dags

μ•„λž˜ Dag듀을 μ°¨λ‘€λŒ€λ‘œ μˆ˜ν–‰ν•˜μ…¨μ„ λ•Œ ν•œ Cycle이 μ™„μ„±λ©λ‹ˆλ‹€.

update_data_dag - Inference Server

Inference κ³Όμ •μ—μ„œ μŒ“μΈ μœ μ € Interaction λ‘œκ·Έλ“€μ„ κΈ°μ‘΄ 데이터와 ν•©μ³μ„œ S3에 μ—…λ‘œλ“œν•©λ‹ˆλ‹€.

retrain_and_push_dag - Train Server

S3에 μ—…λ°μ΄νŠΈλœ μœ μ € Interaction λ‘œκ·Έλ“€μ„ λΆˆλŸ¬μ™€ μž¬ν•™μŠ΅λœ λͺ¨λΈμ„ S3에 μ—…λ‘œλ“œ ν•©λ‹ˆλ‹€.

update_inference_server_dag - Inference Server

S3에 μ €μž₯된 Retrain 된 λͺ¨λΈμ„ Inference server둜 읽어와 rolling updateλ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.


πŸ› οΈ Installation

Server Dependencies (pip3)

  • easydict==1.9
  • numpy==1.19.5
  • pandas==1.1.5
  • sklearn==0.0
  • torch==1.6.0
  • transformers==4.6.1
  • bentoml==0.12.1
  • boto3==1.17.78
  • apache-airflow
  • sqlalchemy < 1.4.0
  • attrdict

πŸ›οΈ File Structure

β”œβ”€β”€ client                                 # Components of Flask
β”‚   β”œβ”€β”€ Dockerfile
β”‚   β”œβ”€β”€ app
β”‚   β”‚   β”œβ”€β”€ main.py
β”‚   β”‚   β”œβ”€β”€ requirements.txt
β”‚   β”‚   β”œβ”€β”€ static
β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”œβ”€β”€ templates
β”‚   β”‚   β”‚   └── index.html
β”‚   β”‚   └── uwsgi.ini
β”‚   └── start.sh                           # Build and Run client server container
β”‚
β”œβ”€β”€ dags                                   # Airflow DAGs
β”‚   β”œβ”€β”€ retrain_and_push_dag.py
β”‚   β”œβ”€β”€ update_data_dag.py
β”‚   └── update_inference_server_dag.py
β”‚
β”œβ”€β”€ data                                   # Data WH upload/download & save data
β”‚   └── ...
β”œβ”€β”€ models                                 # Data WH upload/download & save model
β”‚   └── ...
β”‚
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ docker_manual
β”‚   β”œβ”€β”€ docker_commands.sh                 # Summary of docker commands
β”‚   └── service-init.sh                    # Start inference with docker swarm
β”‚
β”œβ”€β”€ config                                 # Model Config JSON Files 
β”‚   └── ...
β”œβ”€β”€ asset                                  # Encoder class npy files 
β”‚   └── ..
β”œβ”€β”€ dkt                                    # Baseline codes
β”‚   └── ...                                
β”œβ”€β”€ args.py                                # Get user arguments
β”œβ”€β”€ train.py                               # Training model
β”œβ”€β”€ requirements.txt
β”‚
β”œβ”€β”€ questions.csv
β”œβ”€β”€ inference.py                           # Inferenece using question.csv
β”œβ”€β”€ packer.py                              # Packing model, encoders to bentoml service class
β”œβ”€β”€ service.py                             # Compose inference api 
β”‚
β”œβ”€β”€ init_for_inference_server.sh           # Initialize for Inference server
β”œβ”€β”€ init_for_train_server.sh               # Initialize for Train server
└── README.md

client

Flaskλ₯Ό μ΄μš©ν•˜μ—¬ μ›ΉνŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν•˜λŠ” μš”μ†Œλ“€μž…λ‹ˆλ‹€. Interactionν•˜λŠ” 화면을 λ°”κΎΈκ³ μ‹Άλ‹€λ©΄ 이 파트λ₯Ό μˆ˜μ •ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

dags

Airflow에 Dag둜 등둝될 νŒŒμΌλ“€μ΄ μ‘΄μž¬ν•˜λŠ” λ””λ ‰ν† λ¦¬μž…λ‹ˆλ‹€. cp μ»€λ§¨λ“œλ₯Ό μ΄μš©ν•˜μ—¬ initialization κ³Όμ •μ—μ„œ airflow/dags/ λ””λ ‰ν† λ¦¬λ‘œ λ³΅μ‚¬λ©λ‹ˆλ‹€.

data

데이터가 μœ μ € Interaction을 톡해 μƒˆλ‘­κ²Œ μΆ”κ°€λ˜μ—ˆμ„ λ•Œ, S3에 Upload/Downloadλ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 또, Uploadν•  csv 데이터 / Downloadν•œ csv 데이터λ₯Ό saveν•©λ‹ˆλ‹€.

models

λͺ¨λΈμ΄ μƒˆλ‘­κ²Œ μΆ”κ°€λ˜μ—ˆμ„ λ•Œ, S3에 Upload/Downloadλ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 또, Uploadν•  λͺ¨λΈ / Downloadν•œ λͺ¨λΈμ„ saveν•©λ‹ˆλ‹€.

docker_manual

Docker λͺ…λ Ήμ–΄λ₯Ό 정리해둔 docker_commands.shκ³Ό 초기 Inference μ»¨ν…Œμ΄λ„ˆ μ„œλΉ„μŠ€ μ„ΈνŒ…μ„ μœ„ν•œ service_init.sh둜 μ΄λ£¨μ–΄μ ΈμžˆμŠ΅λ‹ˆλ‹€.

config

Train 및 Inferenceλ₯Ό μœ„ν•œ argument configuration νŒŒμΌλ“€λ‘œ μ΄λ£¨μ–΄μ ΈμžˆμŠ΅λ‹ˆλ‹€.

asset

Training κ³Όμ •μ—μ„œ Categorical dataλ₯Ό λ³€ν˜•ν•˜λŠ” Encoder 정보가 npy νŒŒμΌλ“€λ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

dkt

DKT Task μˆ˜ν–‰μ„ μœ„ν•œ Trainer, Model, Metric, Loss λ“±μ˜ μ½”λ“œκ°€ μžˆλŠ” baseline code λ””λ ‰ν† λ¦¬μž…λ‹ˆλ‹€.


πŸ‘ͺ Contributor

김성읡 Git Badge Gmail Badge

κΉ€λ™μš° Git Badge

ν™©μ •ν›ˆ Git Badge Gmail Badge