๋จธ์ ๋ฌ๋ ๋ชจ๋ธ APIํ - ์ํ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๊ธฐ
์ด ๊ธ์์๋ ํ์ผํ๋ชจ์์์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ค ํ๋์ธ ์ํ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๊ธฐ๋ฅผ APIํ ํ๋ ๊ณผ์ ์ ์๊ฐํ๋ค.

์ด ๊ธ์์๋ ํ์ผํ๋ชจ์์์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ค ํ๋์ธ ์ํ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๊ธฐ๋ฅผ APIํ ํ๋ ๊ณผ์ ์ ์๊ฐํ๋ค.
๊ฐ์
๊ธฐ์กด์ ํ์ผํ๋ชจ์์ ์ ์ฉ๋ ์ํ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๊ธฐ๋ on-premise๋ก ๊ตฌ์ฑ๋ ์๋ฒ์ ๋ฐฐํฌ๋ผ ์์๋ค. on-premise์ ๊ตฌ์ถ๋ ์๋ฒ์ ๋ฐฐํฌ๋ฅผ ์งํํ๋ค ๋ณด๋ ์๊ธฐ์น ๋ชปํ ์๋ฒ์ ์ฅ์ ๋, ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํด ์๋ฒ์ ๋ฆฌ์์ค๊ฐ ์ ์ ๋ผ ๋ฒ๋ฆฌ๊ฑฐ๋ ํ๋ ์ด์๋ค์ด ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
๋๋ฌธ์ Kubernetes๋ฅผ ํ์ฉํด ์๋ํ๋ ๋ฆฌ์์ค ๊ด๋ฆฌ๊ฐ ํ์ํ๊ณ , Kubernetes๋ฅผ ํ์ฉํ๊ฒ ๋๋ฉด ๊ธฐ์กด ๋ชจ๋ธ API๋ฅผ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ณ๊ฒฝํด์ผ ํ ํ์๊ฐ ์์๋ค.
์ด ๊ธ์์๋ ์ด๋ป๊ฒ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๋ฅผ ์ํํ๋ ๋ชจ๋ธ์ด ์ด๋ค ํํ๋ก APIํ ๋ผ ์์ผ๋ฉฐ, GKE(Google Kubernetes Engine)์ ์ด๋ค ๊ณผ์ ์ ํตํด ๋ฐฐํฌ๋ฅผ ์งํํ๋ ์ง์ ๋ํด ์ค๋ช ํ ๊ฒ์ด๋ค.
ํ์ผํ๋ชจ์์์ ์ฌ์ฉ ์ค์ธ ์ํ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๊ธฐ API๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํฌ๊ฒ ๋ ๊ฐ์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ผ ์๋ค.
์ฌ์ฉ์๊ฐ Client API๋ฅผ ํตํด ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๋ฅผ ์์ฒญํ๋ฉด, Client API๋ ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ๋ฐ์ ์ํ๋ช ๊ณผ ์ด๋ฏธ์ง ์ฃผ์๋ฅผ ๋ฒกํฐํํด, Model API์ ํด๋น ๊ฐ์ ์ ๋ฌํ ํ, ๋ถ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ๋๋ค.
์ ๊ตฌ์กฐ์์ Model API, Client API๊ฐ ๊ฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋ผ ์๊ณ , ์ด๋ป๊ฒ ๊ฐ API๋ฅผ ์คํ์ํค๋์ง, ๊ทธ ๊ณผ์ ์ ๋ํด ์์ธํ ์ค๋ช ํ ๊ฒ์ด๋ค.
Model API
์ค์ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๋ฅผ ์ํํ๋ ๋ชจ๋ธ์ธ Model API๋ tensorflow-serving์ ์ด์ฉํด ๊ตฌ์ฑ๋ผ ์๋ค.
Tensorflow Serving์ Tensorflow ๋ชจ๋ธ์ ํจ๊ณผ์ ์ผ๋ก ๋ฐฐํฌ ๋ฐ ์๋น์คํ ํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ TFX์ ์ผ๋ถ๋ถ์ด๋ฉฐ, ํ์ต๋ ๋ชจ๋ธ์ ์ ์ ์์์ผ๋ก๋ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ๋ Serving API๋ฅผ ๋์ธ ์ ์๊ฒ ํด์ค๋ค.
์ด Model API๋ฅผ GKE(Google Kubernetes Engine) ์์ ๋ฐฐํฌํด ์๋์ผ๋ก Scale-out์ด ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ด๋ค.
์ค๋น ๊ณผ์
์ค๋น ๊ณผ์ ์ ํฌ๊ฒ ์ธ ๊ฐ์ง๊ฐ ํ์ํ๋ค. ํ์ตํ ๋ชจ๋ธ์ Tensorflow Serving์์ ์ฌ์ฉํ ์ ์๋ ํํ๋ก ์ค๋นํ๋ ๊ฒ๊ณผ ์ค๋น๋ ๋ชจ๋ธ์ Kubernete ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ ์๋๋ก GCS๋ก ์ ๋ก๋ ํ๋ ๊ฒ, ๊ทธ๋ฆฌ๊ณ ์ ์ ํ๊ฒ Tensorflow Serving ์ค์ ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด๋ค.
1. SavedModel Format์ผ๋ก ํ์ต๋ ๋ชจ๋ธ ์ค๋น
Tensorflow Serving์ ํ์ฉํ๊ธฐ ์ํด์๋ SavedModel ํฌ๋งท์ผ๋ก ํ์ต๋ ๋ชจ๋ธ์ด ํ์ํ๋ค. ๋ชจ๋ธ์ ํ์ต์ํค๋ ์์ ์์ SavedModel ํฌ๋งท์ผ๋ก ์ ์ฅํ์ง ์์๋๋ผ๋, ๋ค์๊ณผ ๊ฐ์ด SavedModel ํฌ๋งท์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
ํน์, tensorflow 1.x ์์ ์ ์ฅํ Keras ๋ชจ๋ธ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์ฝ๊ฒ SavedModel ํฌ๋งท์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
์ ์์ ์ผ๋ก SavedModel ํฌ๋งท์ผ๋ก ์ ์ฅ์ด ๋๋ค๋ฉด, saved_model.pb ํ์ผ๊ณผ ํจ๊ป ์ธํผ๋ฐ์ค์ ํ์ํ ๋ฆฌ์์ค๋ค์ด ํด๋๋ก ์กด์ฌํ๊ฒ ๋ ๊ฒ์ด๋ค.
2. ํ์ต๋ ๋ชจ๋ธ GCS๋ก ์ ๋ก๋
์ต์ข ์ ์ผ๋ก Model API๋ฅผ GKE์ ์ ๋ก๋ ํด์ผ ํ๊ธฐ ๋๋ฌธ์, GKE์์ ์ ๊ทผํ ์ ์๋๋ก ๋ณํ๋ SavedModel์ GCS๋ก ์ ๋ก๋ ํด์ผ ํ๋ค. ํ์ฌ ๋ชจ๋ธ์ ์ ์ฅ์ GCS์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ ๋ก๋ ๋ผ ์๋ค.
cate_dict ํด๋๋ ๋ชจ๋ธ์์ ์์ธกํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํํ์ ์นดํ
๊ณ ๋ฆฌ๋ช
์ผ๋ก ๋ณํํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ํ์ผ๋ค์ด ๋ค์ด ์๋ ํด๋์ด๋ฉฐ, tokenizer ํด๋๋ ์ํ๋ช
์ ์ ์ฒ๋ฆฌํด ๋์ด์ฐ๊ธฐ๋ฅผ ์ํํ๋ ๋ชจ๋์ด ๋ค์ด์๋ ํด๋์ด๋ค.
hybrid_classifier ํด๋๋ ํ ์คํธ์ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ชจ๋ ํ์ฉํด ์ํ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ด ์ ์ฅ๋ ํด๋์ด๋ฉฐ, text_classifier ํด๋๋ ํ ์คํธ ์ ๋ณด๋ง ํ์ฉํด ์ํ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ด ์ ์ฅ๋ ํด๋์ด๋ค.
๋ ๋ชจ๋ธ์ ์ ๋ถ ์ฌ์ฉํด ์ต์ข ์ ์ผ๋ก ์์๋ธ์ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ชจ๋ธ ๋ชจ๋ SavedModel ํ์์ผ๋ก ์ ์ฅํด GCS์ ์ ๋ก๋ ํ๋ค.
๊ฐ ๋ชจ๋ธ ํด๋์๋ ๋ค์๊ณผ ๊ฐ์ด ์ซ์๋ฅผ ํด๋๋ช ์ผ๋ก ๊ฐ๋ ๊ตฌ์กฐ๋ก ๋ชจ๋ธ์ด ์ ๋ก๋ ๋ผ ์์ด์ผ ํ๋ค. ์ดํ์ Tensorflow Serving์ ์ด์ฉํด ๋ชจ๋ธ์ ์๋นํ ๋, Tensorflow Serving์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ๋ชจ๋ธ ๋ฒํธ๋ฅผ ๋ถ๋ฌ์จ๋ค(์ค์ ์ ํตํด ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ฉฐ, ๋์์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ชจ๋ธ์ ์๋นํ๊ฑฐ๋, ํน์ ๋ฒ์ ์ ๋ชจ๋ธ๋ง ์๋นํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค).
์ด ์ซ์๋ค์ด ๊ฐ ๋ชจ๋ธ์ id๊ฐ ๋๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ซ์๋ก ์ด๋ค์ง ํด๋๋ก ๋ชจ๋ธ์ ์ ์ฅํด์ผ ํ๋ค.
3. models.config ํ์ผ ์ค์
tensorflow serving์ ์ด์ฉํด Model API๋ฅผ ์ํํ๊ณ ์ ํ ๋์๋, ์ค์ ํ์ผ(์ฌ๊ธฐ์๋ models.config ํ์ผ)์ ์์ฑํด์ผ ํ๋ค.
์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ ๋ชจ๋ธ API๋ฅผ ๋์ธ ๋์๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ค์ ํ์ผ์ ์์ฑํ๋ค.
Tensorflow Serving์ ์์ ๊ฐ์ ์ค์ ํ์ผ์ ์ด์ฉํด ์ํํ๋ค๋ฉด, ํ ๋ฒ์ ๋ ์ข ๋ฅ์ ๋ชจ๋ธ(name key๋ก ๋ช ์๋ text_classifier, hybrid_classifier)์ APIํ ํ ์ ์๋ค.
text_classifier, hybrid_classifier ๋ชจ๋ ๊ฐ base_path์ ์กด์ฌํ๋ ๋ชจ๋ธ๋ค์ ๋ก๋ํด APIํ ํ๊ฒ ๋๋ฉฐ, ์ด๋ ๊ฐ base_path (/models/text_classifier, /models/hybrid_classifier)์๋ ์ ๊ณผ์ ์์ GCS์ ์ ์ฅํ๋ ๊ฒ ์ฒ๋ผ ๋ฒํธ๋ฅผ ํด๋๋ช ์ผ๋ก ํ๋ SavedModel ๋ค์ด ์ ์ฅ๋ผ ์์ด์ผ ํ๋ค.
๊ทธ๋์ผ Tensorflow Serving์ด ๋ชจ๋ธ์ ๋ก๋ ํ ๋, ๊ฐ์ฅ ๋ฒํธ๊ฐ ํฐ ๋ชจ๋ธ์ ์๋์ผ๋ก ๋ถ๋ฌ์ค๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ธ์ ์ด๋ฉด base_path์ ๊ฐ์ฅ ํ์ ํด๋ ๋ช ๊ณผ name์ ๋งค์นญ์ํค๋๋กํ๋ค.
์คํ ๊ณผ์
์คํ ๊ณผ์ ์ ํฌ๊ฒ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ธ ์๋ค. ํ๋๋ Dockerfile์ ์ด์ฉํด docker image ๋น๋ & GKE deployment ๋ฐฐํฌ ๊ณผ์ , ๋ค๋ฅธ ํ๋๋ GKE Ingressroute Service ๋ฐฐํฌ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ traefik ์ middleware ์ค์ ์ด๋ค.
1. Docker image ๋น๋ & GKE deployment ๋ฐฐํฌ
Model API์์ ์ฌ์ฉ๋๋ Dockerfile๊ณผ Dockerfile ๋ด๋ถ์์ ์ฌ์ฉ๋๋ serving_api_entrypoint.sh, GKE์ ๋ฐฐํฌํ๊ธฐ ์ํ deployment.yaml์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์๋ค.
์ด Dockefile์ ์ด์ฉํด GKE ์์์ tensorflow serving API๋ฅผ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์, tensorflow serving Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์ผ๋ฉฐ, serving_api_entrypoint.sh ํ์ผ์ ์ํํ๋๋ฐ ํ์ํ ์ค๋น ์์ ์ ์งํํ๊ณ , ์ต์ข ์ ์ผ๋ก serving_api_entrypoint.sh๋ฅผ ์ํํ๋ ๊ตฌ์กฐ๋ค.
serving_api_entirypoint.sh ํ์ผ์์๋ GCS์ ์ ๋ก๋ํ SavedModel ํ์ผ์ container ๋ด๋ถ๋ก ๋ค์ด๋ก๋ํ๊ณ , ๋ฏธ๋ฆฌ ์์ฑํ models.config ํ์ผ์ ์ด์ฉํด tensorflow-serving API๋ฅผ ์คํํ๋ ์ญํ ์ ํ๋ค.
prepare_serving.py ์คํฌ๋ฆฝํธ์์๋ ๋ชจ๋ธ์ ์๋นํ๋๋ฐ ํ์ํ ๋ฆฌ์์ค๋ค์ GCS์์ ์ปจํ ์ด๋ ๋ด๋ถ๋ก ๋ค์ด๋ก๋ํ๋ ๊ณผ์ ์ ์ํํ๋ค.
๋ณดํต Dockerfile์ ๋น๋ํด Docker image repository๋ก ์ ๋ก๋ํ์ง๋ง, Github CI๋ฅผ ํ์ฉํด ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ GCS ๋ด๋ถ ์ด๋ฏธ์ง ๋ ํฌ์งํ ๋ฆฌ์ ์ ๋ก๋ ํ๋๋ก ํ๋ค. ๋ฐ๋ผ์ ์์ฑํ Dockerfile์ ์ง์ ๋น๋ํ๋ ๊ณผ์ ์ ์ด ๋ฌธ์์์ ์ ์ธ๋๋ค.
โ Dockerfile์ ๋ํ ์ค๋ช
expose 8500, 8501์ ์ด์ฉํด ๋ ํฌํธ๋ฅผ ์ด์ด์คฌ๋๋ฐ, ์ด ๋ ํฌํธ๊ฐ tensorflow serving์์ ์ฌ์ฉ๋๋ REST API์, gRPC ํธ์ถ์ ์ฌ์ฉ๋๋ ํฌํธ์ด๋ค. ๋ฐ๋ผ์ ๋ ํฌํธ๋ฅผ ์ด์ด์คฌ๋ค.
deployment.yaml์์๋ asia.gcr.io/storage-273502/buzzni-ai-category-api-serving์ ์ ์ฅ๋ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด GKE์ ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
buzzni-ai-category-api-serving ์ด๋ฏธ์ง๊ฐ ์ ์์ ์ผ๋ก ๋น๋๋๊ณ , ์ด๊ฒ์ด ์ด๋ฏธ์ง ๋ ํฌ์งํ ๋ฆฌ์ ์ ์์ ์ผ๋ก ์ ๋ก๋ ๋๋ค๋ฉด, ๋ก์ปฌ ํฐ๋ฏธ๋์์๋
kubectl apply -f deployment.yaml
๋ช ๋ น์ด๋ง ์ํํด Model API๋ฅผ ๋ฐฐํฌํ ์ ์๋ค.
์ด ๋ช ๋ น์ด๊ฐ ์ํ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด GKE์ ์ ์์ ์ผ๋ก ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ๋ฅผ ์ํ Model API๋ฅผ ์ํ deployment pod์ด ์์ฑ๋๋ค.
2. GKE Ingressroute Service ๋ฐฐํฌ
์ ๊ณผ์ ์ ์งํํ๋ค๊ณ , ๋ฐ๋ก API Endpoint๊ฐ ์์ฑ๋๊ณ , URL์ ํตํด ์ ๊ทผํ ์ ์๋ ๊ฒ์ ์๋๋ค. AI Lab์ GKE๋ Ingressroute๊ณผ Traefik์ ์ด์ฉํด ์ธ๋ถ ์ ์์ GKE ๋ด๋ถ์ Pod๊ณผ ์ฐ๊ฒฐ์์ผ ์ฃผ๊ณ ์๋ค.
์ด๋ฅผ ์ํด์๋ ๋ณ๋์ Service Pod๋ฅผ ๋์์ผ ํ๋ฉฐ, ํด๋น service์ ์ค์ ํ์ผ์ deployment_service.yaml ํ์ผ์ด๋ค.
์ด ์ค์ ํ์ผ์์ ๋ณต์กํ ์ญํ ์ ๋ด๋นํ๋ ๊ฒ์ ์๋๊ณ , ๊ธฐ์กด์ ์ ์๋ vpn-web entrypoint๋ฅผ ํ์ฉํด, ๋ด๋ถ IP ๋ง์ผ๋ก๋ถํฐ ๋ค์ด์ค๋ ์์ฒญ์ ์ค์ ํ ๋ด๋ถ deployment pod์(selector: app: category-api-serving ์ค์ ) ์ ๋ฌํด ์ฃผ๊ฒ ๋ค๋ ์๋ฏธ๋ค.
๊ทธ๋ฆฌ๊ณ , URL์ด /category-serving/๊ณผ ๋งค์นญ๋๋ ์์ฒญ์ ๋ํด์ api-strip์ด๋ผ๋ middle-ware๋ฅผ ํตํ๊ฒ ๋ค๋ ์ค์ ์ ์คฌ๋๋ฐ, ์ด ๋ถ๋ถ์ ๋ํ ์ค๋ช ์ ์ด์ด์ ํ๋๋ก ํ ๊ฒ์ด๋ค.
๋๋ฌธ์ Ingressroute Service ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ ๋ก์ปฌ์์ ๋ค์ ๋ช ๋ น์ด๋ง ์ํํด ์ฃผ๋ฉด ๋๋ค.
kubectl apply -f buzzni-ai-category-api/kubernetes/deployment_service.yaml
3. traefik-middleware ์ค์
์์ ์ค์ ํ middleware๋ฅผ ํตํด API ์์ฒญ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ง ์๋๋ค๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํํ์ ์ ๊ทผ URL์ด ์์ฑ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ง๊ฒ ์ค์ ์ ์ถ๊ฐํด์ผ ํ๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ kubectl ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ๊ธฐ์กด์ ์ ์๋ ์ค์ ๊ฐ์ ์ํ๋ ์ฃผ์๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
kubectl edit middlewares.traefik.containo.us api-strip
์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด traefik ์ค์ ์์ api-strip ์ฃผ์์ deployment_service์์ ์ค์ ๋ category-serving ํค์๋๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค.
๊ฒฐ๊ณผ ํ์ธ
์ฌ๊ธฐ๊น์ง ๋ฌธ์ ์์ด ์ํ์ด ๋๋ค๋ฉด, ๋ค์ URL ์ ํตํด ์ ์์ ์ผ๋ก Model API๊ฐ ์คํ๋๊ณ ์๋์ง ํ์ธํ ์ ์๋ค.
http://IngressRoute์ฃผ์/category-serving/v1/models/hybrid_classifier
์์ฒญ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ผญ ์์ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ์ด ๋๋์ง ํ์ธํ๊ณ , Client API๋ฅผ ๋ฐฐํฌํ๋๋ก ํ์.
Client API
Client API๋ ์ฌ์ฉ์๊ฐ ์ค์ ์์ฒญ์ ๋ณด๋ด๋ API์ด๋ฉฐ, Swagger ๊ธฐ๋ฐ์ Flask App์ผ๋ก ๊ฐ๋ฐ๋ผ ์์ผ๋ฉฐ, Model API์ ๋ง์ฐฌ๊ฐ์ง๋ก GKE์ ๋ฐฐํฌ๋ผ ์๋ค.
์ค๋น ๊ณผ์
Model API์ ๋ง์ฐฌ๊ฐ์ง๋ก, Client API ์ญ์ Client API์์ ์ฌ์ฉ๋๋ ๋ช๋ช ์์(์ฌ๊ธฐ์์๋ Text Tokenizer, idx โ plain text dict)์ ๋ฏธ๋ฆฌ GCS์ ์ ๋ก๋ ํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
1. ํ์ํ ํ์ผ GCS ์ ๋ก๋
Client API์์ ํ์ํ ๋ฆฌ์์ค๋ ๋ ๊ฐ์ง๊ฐ ์๋ค. ํ๋๋ ํ ์คํธ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉ ํ๊ธฐ ์ํ tokenizer ์ด๋ฉฐ, ๋ค๋ฅธ ํ๋๋ ๋ถ๋ฅ ๊ฒฐ๊ณผ์ index ๊ฐ์ plain text๋ก ๋ณํํ๊ธฐ ์ํ python dictionary(ํ ์คํธ, ํ์ด๋ธ๋ฆฌ๋ ๋ ๊ฐ)์ด๋ค.
Model API์์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋น์ทํ ์ฝ๋์์ ํด๋น ์์ ์ ์งํํด ์ฃผ๊ณ ์์ผ๋ฉฐ, ๋ฐฐํฌ ์ ์ ๋ฏธ๋ฆฌ ์คํํด GCS์ ํ์ํ ํ์ผ๋ค์ ์ ๋ก๋ ํด์ผ ํ๋ค.
์คํ ๊ณผ์
์คํ ๊ณผ์ ์ญ์ Model API์ ๋ง์ฐฌ๊ฐ์ง๋ก, Dockerfile์ ์ด์ฉํด docker image ๋น๋ & GKE deployment ๋ฐฐํฌ ๊ณผ์ , ๋ค๋ฅธ ํ๋๋ GKE Ingressroute Service ๋ฐฐํฌ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ traefik์ middleware ์ค์ ์ธ ๊ฐ์ง ๋จ๊ณ๋ก ์ด๋ค์ ธ ์๋ค.
1. docker image ๋น๋ & GKE deployment ๋ฐฐํฌ
Client API์์ ์ฌ์ฉ๋๋ Dockerfile๊ณผ, Dockerfile ๋ด๋ถ์์ ์ฌ์ฉ๋๋ client_api_entrypoint.sh, GKE์ ๋ฐฐํฌํ๊ธฐ ์ํ deployment.yaml์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์๋ค.
Client API ์์ ์ฌ์ฉ๋๋ Dockerfile์ Model API ์์ ์ฌ์ฉ๋๋ Dockerfile๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, client_api_entrypoint.sh ํ์ผ์ ์คํํ๋๋ฐ ํ์ํ ์ค๋น ์์ ์ ์งํํ๊ณ , ์ต์ข ์ ์ผ๋ก client_api_entrypoint.sh ๋ฅผ ์ํํ๋ ๊ตฌ์กฐ์ด๋ค.
client_api_entrypoint.sh ์์๋ GCS์ ์ ๋ก๋ํ ์ฌ๋ฌ ํ์ผ๋ค์ docker container ๋ด๋ถ๋ก ๋ค์ด๋ก๋ ํ๊ณ , client api ํ๋ก์ธ์ค๋ฅผ ์ํ์ํค๋ ์ญํ ์ ํ๋ค.
ํ์ง๋ง Model API ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก, Github CI ์์ ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋๋ก ์ค์ ํ์๊ธฐ ๋๋ฌธ์ ์ง์ Dockerfile์ ๋น๋ํ ํ์๊ฐ ์์ผ๋ฉฐ, ๋ฐฐํฌ ์ญ์ ์ฟ ๋ฒ๋คํฐ์ค yaml ํ์ผ์ธ deployment.yaml ํ์ผ์ ์ด์ฉํด ์์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๋ค.
Github CI ์์ ์ ์์ ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ๋น๋๋์๋ค๋ฉด, ๋ก์ปฌ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด Client API๋ฅผ ๋ฐฐํฌํ ์ ์๋ค.
kubectl apply -f deployment.yaml
์ ๋ช ๋ น์ด๊ฐ ์ํ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ด deployment pod์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
2. GKE Ingressroute Service ๋ฐฐํฌ
Client API ์ญ์ ๋ง์ฐฌ๊ฐ์ง๋ก Ingressroute Service๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
Ingressroute Service๋ฅผ ์ํ ์ค์ ํ์ผ์ deployment_service.yaml ํ์ผ์ด๋ฉฐ, ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์๋น์ค ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋ค.
kubectl apply -f deployment_service.yaml
3. traefik-middleware ์ค์
๊ทธ๋ฆฌ๊ณ traefik์ middleware ์ญ์ ์ค์ ํด์ค์ผ ํ๋ค.
Model API์์ ์ค์ ํ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด api-strip ์ชฝ์ ์์ ํด ์ฃผ๋ฉด ๋๋ค.
kubectl edit middlewares.traefik.containo.us api-strip
๊ฒฐ๊ณผ ํ์ธ
์ฌ๊ธฐ๊น์ง ๋ฌธ์ ๊ฐ ์์ด ์คํ์ด ๋๋ค๋ฉด, URL ์ ํตํด ์ ์์ ์ผ๋ก Client API๊ฐ ์คํ๋๊ณ ์๋์ง ํ์ธํ ์ ์๋ค.
๊ฐ์ ์
์ง๊ธ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ถ๋ถ์ ํ์ํ ๊ฐ์ ์ ์ด ์๋ค๊ณ ์๊ฐํ๋ค(๋ชจ๋ธ ์์ฒด์ ๋ํ ๊ฐ์ ์ ์ ์ ์ธํ).
์ฒซ ๋ฒ์งธ๋ Client API๋ฅผ ๋จ์ Flask๋ง ์ด์ฉํ๋๋ฐ, gunicorn์ผ๋ก ํ๋ฒ ๋ wrappingํด multi-processing์ ์ ์ฉํ๊ฑฐ๋, fast-api, sanic ๋ฑ์ ํ์ฉํด ๋น๋๊ธฐ๋ก ๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ค.
ํ์ฌ ๋ฐฐํฌ๋ผ ์ฌ์ฉ์ค์ธ API์๋ ์ ์ฉ๋ผ ์์ง๋ง, ์ด ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ชฉ์ ์ ๋ค๋ฅธ AI ๋ฆฌ์์น ์์ง๋์ด๊ฐ ๊ฐ๋ฐํ ๋ชจ๋ธ์ ์ง์ ์๋นํ๊ธฐ ์ํ ๊ฐ์ด๋ ์์ฑ์ด์๊ธฐ ๋๋ฌธ์ ์ ์ธํ์๋ค.
๋ ๋ฒ์งธ๋, Tensorflow Serving์ ํ์ฉํ Model API์, Client API์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค. ํ์ฌ ๋ ๊ฐ์ง API๊ฐ ํ ๋ ํฌ์งํ ๋ฆฌ์ ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ถํธํ ๋ถ๋ถ๋ค์ด ์๋๋ฐ, ๊ตฌ๋ถ์ง์ด ๋ณ๋์ ๋ ํฌ์งํ ๋ฆฌ๋ก ํ๋ ๊ฒ์ด ์ด๋จ๊น ํ๋ค.
