From 80866f53f876691f96f720253777f6551cabab95 Mon Sep 17 00:00:00 2001 From: hlchoi <69101205+chl8469@users.noreply.github.com> Date: Thu, 9 Dec 2021 18:30:22 +0900 Subject: [PATCH] Develop (#64) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add atmos ETL process ETL DAG 추가 DB engine관련 오류 발생 수정 중 * Add new train process MLflow & Prefect & Ray tune을 적용한 새로운 training process 입니다. * Add save best model logic 실험이 끝난 뒤에 가장 좋은 모델을 찾아 db에 그 정보를 기록합니다. 이후 predict에서는 db조회로 가장 좋은 모델을 찾아 predict를 수행합니다. * modify atmos ETL pipeline 1. 데이터 요청 후 반환받은 데이터가 없을 시 flow를 종료하도록 설정하였습니다. 2. 데이터 검증 후 조건에 맞지 않는 데이터가 있을 시 저장하지 않고 flow를 종료하도록 하였습니다. 3. cron schedule을 설정하는 코드를 추가하셨습니다. * Fix save model logic best모델을 db에 기록할때 artifact_uri 를 저장하는데 artifact_path도 포함하여 저장합니다. * Add redis redis를 이용해서 비효율적인 읽어옴을 개선했습니다. * Add mnist training mnist classification training process를 추가하였습니다. * add training model process after data ETL 데이터 수집이 성공적으로 종료되면 수집된 데이터를 포함하여 학습을 진행하고 성능이 좋으면 모델을 교체하는 과정을 추가하였습니다. * Fix save logic 저장때 run_id를 저장 하는것으로 수정하였습니다. * Fix save logic return true false를 위해서 로직 수정중에 있습니다. * Add knn model train & save knn 모델을 학습하고 저장합니다. train_df 는 고정되어 있습니다. knn 모델을 cnn 모델이 업데이트 된 경우만 학습을하고 저장하게됩니다. db에 저장하는 것은 가장 최근에 logging된 knn 모델을 저장하게 됩니다. * add redis caching& modify load model process 1. predict API에 redis를 이용하여 모델을 캐시하는 방법을 추가하였습니다. 모델이 redis에 존재하지 않으면 database에서 받아와서 redis에 저장한 후 일정시간 동안 해당 모델에 대한 예측요청이 없으면 삭제합니다. 2. artifact path 대신 run id를 사용하여 모델을 불러오게 변경하였습니다. * Modify predict redis 오작동하는부분 수정 * Add redis update time logic 1. redis로 모델을 캐싱하는 알고리즘을 개선하였습니다. 기존방식: 모델을 캐싱한 후 일정시간이 지나면 삭제되게 하였습니다. 개선방식: 캐싱된 모델이 예측요청을 받으면 만료되는 시간이 초기화되게 하였습니다. * Add mnist prediction route mnist 모델을 불러와서 예측하는 route를 추가하였습니다. 임시적으로 가지고 있던 파일에서 predict를 진행하지만 추후 input값을 받아서 예측하도록 수정 예정입니다. ++ model training process 에서 jit script를 사용하여서 불러와 사용하는데에 문제 없게 하였습니다. ++ training process에서 task파일 안에 model class가 존재하게되면 model 사용에 에러가 발생해 분리하였습니다. * Add redis at mnist prediction redis 사용에 있어서 pickle로 밀어넣을 수 없어서 save_to_buffer 로 넣고 bytes로 읽어옵니다. * Add redis connection pool redis의 connection pool을 도입하였습니다. * Fix data load & cleanup 하드코딩되어있던 부분을 조금 수정했습니다. & 불러오는 로직을 재사용성을 높이기위해 수정했습니다. * Fix data path data 를 storage에서 읽어오는것으로 변경하였습니다. * Modify atmos predict api 1. redis에서 ML모델을 불러오는 코드가 중첩되어 있던 부분을 삭제하였습니다. * Test performance according to method 1. postgres DB에서 모델 로드, redis에서 모델 로드, serialize, deserialize 각각에서 시간이 얼마나 걸리는지 테스트 하기 위하여 시간 측정 코드를 추가해 두었습니다. * Modify caching algorithm 1. 모델을 redis나 기타 DB에 caching하지 않는 방법으로 변경하였습니다. model_timer class를 만들어 instance variable로 저장하고 일정 시간이 지나면 삭제되게 하였습니다. 모델을 직렬화할 필요성이 없어져 inference 속도가 크게 개선되었습니다. 2. caching되지 않은 모델을 mlflow에서 처음 불러오는 부분은 여전히 느립니다. * Modify cache class 1. cache class를 좀 더 범용적인 이름으로 변경하였습니다. 2. 기능상의 변경은 없습니다. 3. predict method를 삭제하였습니다. * Fix mnist model caching redis 사용해서 읽어오던 상황에서 코드를 개선했습니다. redis를 사용해 모델을 캐싱하려면 serialize, deserialize 하는 과정이 필요합니다. 그 과정에서 시간이 너무 오래 걸리기 때문에 개선의 필요성을 느껴 직접 관리하는 코드를 사용합니다. 모델을 읽어오고 캐싱하는 부분을 class로 묶어서 모아놓았습니다. * Fix load model load logic model load하고 캐싱하는 부분에서 lock을 걸고 진행합니다. data도 임시로 캐싱해서 사용하도록 하였습니다. * Remove unnecessary code test를 위한 코드를 삭제하였습니다. * Delete redis 레디스 삭제하였습니다. 비동기함수 잘못 작성된 부분 수정하였습니다. * Update README * Add prefect working directory 1. prefect agent의 실행 위치에 따라 경로를 찾을 수 없는 문제를 해결하였습니다. 2. flow에 working directory를 명시해주면 됩니다. * Add more metrics to Mnist Mnist train과정에서 class별 accuracy를 측정할 수 있도록 추가하였습니다. * Add pipeline option 여러 파이프라인이 동시에 적용될수있도록 insurance pipeline도 업데이트하였습니다. * Update insurance save logic insurance 부분도 다른것들과 마찬가지로 run_id를 저장하는 형식으로 업데이트 하였습니다. * Add insuracne predict insurance predict하는것도 다른것과 동일한 방법으로 진행합니다. * Fix task decorator test와중에 주석처리되었던 @task를 주석해제하였습니다. * Remove resource_per_trial resource_per_trial을 명시했을때 계속 pending상태에 머무르는 현상이 있어 삭제하였습니다. * Fix mlflow-url mlflow default url을 수정하였습니다. * Add git action to build docker containers 1. 도커파일을 빌드하기 위한 깃 액션을 추가하였습니다. 2. 일부 잘못 설정되어있던 호스트 이름을 수정하였습니다. 3. requirements.txt를 최신화 하였습니다. * Remove PR condition Build API server container 하는 부분에서 PR일때 상황은 제거하였습니다. * Modify mnist prediction Mnist prediction 부분을 input을 받아서 예측하도록 바꾸었습니다. run_in_threadpool로 predict부분을 묶어두었습니다. return을 세분화 하였습니다. * Add kubernetes yaml files 1. 쿠버네티스 설정파일들을 추가하였습니다. 2. prefect_Dockerfile을 수정하였습니다. * Remove testing branch test용으로 on push 트리거 브랜치에 feature/kubernetes 도 포함시켜두어서 제외하였습니다. * Add deprecated folder deprecated 된 것들은 폴더에 모아서 기록하였습니다. * Delete experiments and import train code 1. 현재 사용하지 않는 experiments 폴더를 삭제하였습니다. 2. main.py에서 train api를 import하여 에러가 나던 부분을 수정하였습니다. * Modify Dockerfile name 1. 기존 xxx_Dockerfile 형식으로 되어있던 파일 이름을 Dockerfile.xxx 형식으로 바꾸었습니다. 이러한 형식으로 저장하면 파일의 목록을 출력했을 때 도커파일이 모여있게 되므로 가독성이 올라갈 것으로 생각됩니다. * Add load type Model load 방식을 최고성능 모델을 가져오는것 외에 production으로 등록된 모델을 가져오는 방식을 추가하였습니다. mlflow로 모델 production 및 staging을 관리할 경우에 이 방법이 사용될 수 있습니다. * Fix data load logic data로드를 환경변수에서 경로를 읽어서 하지않고 db에서 버전별 그리고 실험별로 읽을 수 있도록 하였습니다. * Modify Mnist Train 출력층 이전 레이어에서 64개의 특징을 추출합니다. model의 xai 특징을 만들때 출력층을 제거하지 않은 모델 예측도 함께 특징으로 사용해서 74개의 특징을 knn으로 학습합니다. * Modify Mnist Predict train부분의 변화에 대응해 수정되었습니다. * Add mnist avg metadata pixel 평균값에 대한 정보를 추가하였습니다. prediction 때에도 input으로 들어온 데이터에대한 pixel 평균값을 로깅합니다. * Add is_cloud parameter is_cloud parameter가 누락되어있어 추가하였습니다. * Add Continuous deploy process - rollout 해주는 부분을 추가함으로써 무중단 배포할 수 있게 되었습니다. * Modify Git Action workflows - continuous deployments를 위해 필요한 deployments만 재시작 되도록 분리하였습니다. * Modify Git Action workflows - continuous deployments를 위해 필요한 kubernetes deployments만 재시작 되도록 분리하였습니다. * Feature/readme (#57) Update README * Feature/data load (#58) update data load * Update phase2.md * Feature/readme (#59) Update README * Feature/readme (#61) * Update README README에내용을 추가하였습니다. * Add phase1 info Phase1 에 대한 내용을 조금 추가하였습니다. * Add phase1 info * Modify phase1 info * Add phase2-local * Add logos 로고추가 * Resize images * Add requirements.sh * Modify main readme page 그림도 넣구 구조도 조금 바꾸었습니당 * Delete phase2.PNG * Add figure phase2 그림 추가하였습니다. * Modify readme file 내용의 순서를 변경하였습니다. * Remove local.md * Add info phase2 * Add frontend link * Modify readme 프로젝트 소개부분 수정하였습니다. * Modify readme 도커 컨테이너를 실행하는 부분에 대한 설명을 추가하였습니다. * Add readme * Update phase2.md * Update README.md * Delete kubernetes nodeselector 1. deployments에 nodeSelector가 설정되어있던 부분을 삭제했습니다. * Modify readme.md 1. readme file의 전체적인 구조를 변경하였습니다. 2. Phase2의 세부내용을 변경된 구조에 맞추어 다시 작성하였습니다. 3. 아직 작성중입니다ㅜㅜ * Modify README.md 1. readme 에서 phase2 프로젝트를 설명한 부분을 수정하였습니다. Co-authored-by: ehddnr301 Co-authored-by: ehddnr301 --- .github/workflows/build_apiserver.yaml | 52 ++++ .gitignore | 5 + .pre-commit-config.yaml | 3 +- Dockerfile.baseimage | 8 + Dockerfile.fastapi | 7 + Dockerfile.prefect | 8 + README.md | 142 ++++++++- app/api/{schemas.py => data_class.py} | 4 + app/api/router/predict.py | 162 +++++++--- app/query.py | 104 +------ app/schema.py | 27 ++ app/utils/__init__.py | 2 + app/utils/utils.py | 196 ++++++++++++ deprecated/app/__init__.py | 0 deprecated/app/api/__init__.py | 0 deprecated/app/api/router/__init__.py | 0 deprecated/app/api/router/predict.py | 60 ++++ {app => deprecated/app}/api/router/train.py | 0 deprecated/app/query.py | 102 +++++++ app/models.py => deprecated/app/schema.py | 0 deprecated/app/utils/__init__.py | 2 + {app => deprecated/app/utils}/utils.py | 11 +- .../experiments}/atmos_tmp_01/config.yml | 0 .../atmos_tmp_01/preprocessing.py | 0 .../atmos_tmp_01/search_space.json | 0 .../experiments}/atmos_tmp_01/train.py | 0 .../experiments}/expr_db.py | 0 .../experiments}/insurance/config.yml | 0 .../experiments}/insurance/query.py | 0 .../experiments}/insurance/search_space.json | 0 .../experiments}/insurance/trial.py | 0 docs/img/api-test.png | Bin 0 -> 25592 bytes docs/img/nni.png | Bin 0 -> 242325 bytes docs/img/phase1.png | Bin 0 -> 57218 bytes docs/img/phase2.png | Bin 0 -> 69360 bytes docs/img/redis_pytorch_time.png | Bin 0 -> 11561 bytes docs/phase1.md | 35 +++ docs/phase2.md | 124 ++++++++ docs/phase2_trouble.md | 42 +++ k8s/configmap.yaml | 14 + k8s/deployments.yaml | 156 ++++++++++ k8s/kustomization.yaml | 7 + k8s/prepi_deployments.yaml | 82 +++++ k8s/pv-pvc.yaml | 24 ++ k8s/service.yaml | 54 ++++ main.py | 5 +- prefect/atmos_tmp_pipeline/main.py | 8 + prefect/atmos_tmp_pipeline/pipeline.py | 83 +++++ prefect/atmos_tmp_pipeline/query.py | 32 ++ prefect/atmos_tmp_pipeline/task.py | 193 ++++++++++++ prefect/atmos_tmp_pipeline/utils.py | 273 +++++++++++++++++ prefect/insurance/Pipeline.py | 91 ++++++ prefect/insurance/db.py | 23 ++ prefect/insurance/main.py | 9 + prefect/insurance/query.py | 32 ++ prefect/insurance/task.py | 236 +++++++++++++++ prefect/mnist/Pipeline.py | 100 ++++++ prefect/mnist/main.py | 9 + prefect/mnist/model.py | 29 ++ prefect/mnist/query.py | 32 ++ prefect/mnist/task.py | 236 +++++++++++++++ prefect/mnist/utils.py | 286 ++++++++++++++++++ requirements.sh | 1 + requirements.txt | Bin 3928 -> 3040 bytes set_prefect.sh | 5 + 65 files changed, 2963 insertions(+), 153 deletions(-) create mode 100644 .github/workflows/build_apiserver.yaml create mode 100644 Dockerfile.baseimage create mode 100644 Dockerfile.fastapi create mode 100644 Dockerfile.prefect rename app/api/{schemas.py => data_class.py} (91%) create mode 100644 app/schema.py create mode 100644 app/utils/__init__.py create mode 100644 app/utils/utils.py create mode 100644 deprecated/app/__init__.py create mode 100644 deprecated/app/api/__init__.py create mode 100644 deprecated/app/api/router/__init__.py create mode 100644 deprecated/app/api/router/predict.py rename {app => deprecated/app}/api/router/train.py (100%) create mode 100644 deprecated/app/query.py rename app/models.py => deprecated/app/schema.py (100%) create mode 100644 deprecated/app/utils/__init__.py rename {app => deprecated/app/utils}/utils.py (99%) rename {experiments => deprecated/experiments}/atmos_tmp_01/config.yml (100%) rename {experiments => deprecated/experiments}/atmos_tmp_01/preprocessing.py (100%) rename {experiments => deprecated/experiments}/atmos_tmp_01/search_space.json (100%) rename {experiments => deprecated/experiments}/atmos_tmp_01/train.py (100%) rename {experiments => deprecated/experiments}/expr_db.py (100%) rename {experiments => deprecated/experiments}/insurance/config.yml (100%) rename {experiments => deprecated/experiments}/insurance/query.py (100%) rename {experiments => deprecated/experiments}/insurance/search_space.json (100%) rename {experiments => deprecated/experiments}/insurance/trial.py (100%) create mode 100644 docs/img/api-test.png create mode 100644 docs/img/nni.png create mode 100644 docs/img/phase1.png create mode 100644 docs/img/phase2.png create mode 100644 docs/img/redis_pytorch_time.png create mode 100644 docs/phase1.md create mode 100644 docs/phase2.md create mode 100644 docs/phase2_trouble.md create mode 100644 k8s/configmap.yaml create mode 100644 k8s/deployments.yaml create mode 100644 k8s/kustomization.yaml create mode 100644 k8s/prepi_deployments.yaml create mode 100644 k8s/pv-pvc.yaml create mode 100644 k8s/service.yaml create mode 100644 prefect/atmos_tmp_pipeline/main.py create mode 100644 prefect/atmos_tmp_pipeline/pipeline.py create mode 100644 prefect/atmos_tmp_pipeline/query.py create mode 100644 prefect/atmos_tmp_pipeline/task.py create mode 100644 prefect/atmos_tmp_pipeline/utils.py create mode 100644 prefect/insurance/Pipeline.py create mode 100644 prefect/insurance/db.py create mode 100644 prefect/insurance/main.py create mode 100644 prefect/insurance/query.py create mode 100644 prefect/insurance/task.py create mode 100644 prefect/mnist/Pipeline.py create mode 100644 prefect/mnist/main.py create mode 100644 prefect/mnist/model.py create mode 100644 prefect/mnist/query.py create mode 100644 prefect/mnist/task.py create mode 100644 prefect/mnist/utils.py create mode 100644 requirements.sh create mode 100755 set_prefect.sh diff --git a/.github/workflows/build_apiserver.yaml b/.github/workflows/build_apiserver.yaml new file mode 100644 index 0000000..3c709d9 --- /dev/null +++ b/.github/workflows/build_apiserver.yaml @@ -0,0 +1,52 @@ +name: Build API server container +on: + push: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check Out Repo + uses: actions/checkout@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + + - name: Build and push api-server + id: api-server + uses: docker/build-push-action@v2 + with: + context: ./ + file: ./Dockerfile.fastapi + push: true + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/mlops-project:api-server-1.0 + + - name: Build and push prefect-worker + id: prefect-worker + uses: docker/build-push-action@v2 + with: + context: ./ + file: ./Dockerfile.prefect + push: true + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/mlops-project:prefect-worker-1.0 + + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} + + - name: Deploy + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.REMOTE_IP }} + username: ${{ secrets.REMOTE_SSH_ID }} + port: ${{ secrets.REMOTE_SSH_PORT }} + key: ${{ secrets.REMOTE_SSH_KEY }} + script: | + kubectl rollout restart -f ./MLOps/k8s/prepi_deployments.yaml diff --git a/.gitignore b/.gitignore index 867b6d8..d9c1c5a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,8 @@ __pycache__ tf_model/**/* log.txt experiments/**/temp/ +.ssl/ +prefect/atmos_tmp_pipeline/ray_mlflow +prefect/atmos_tmp_pipeline/*.sh +mlruns +exp_models diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c2da5d..a86c82a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,4 +8,5 @@ repos: rev: 5.6.4 hooks: - id: isort - language_version: python3 \ No newline at end of file + language_version: python3 + args: ["--profile", "black"] \ No newline at end of file diff --git a/Dockerfile.baseimage b/Dockerfile.baseimage new file mode 100644 index 0000000..146c0a4 --- /dev/null +++ b/Dockerfile.baseimage @@ -0,0 +1,8 @@ +FROM python:3.8 + +COPY requirements.txt /requirements.txt + +RUN pip install --upgrade pip &&\ + pip install --no-cache-dir -r requirements.txt &&\ + pip uninstall -y tensorflow==2.6 &&\ + pip install --no-cache-dir tensorflow-cpu==2.4 \ No newline at end of file diff --git a/Dockerfile.fastapi b/Dockerfile.fastapi new file mode 100644 index 0000000..0c5ec49 --- /dev/null +++ b/Dockerfile.fastapi @@ -0,0 +1,7 @@ +FROM hl8469/mlops-project:base-image-1.0 + +COPY . / + +EXPOSE 8000 + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "3"] \ No newline at end of file diff --git a/Dockerfile.prefect b/Dockerfile.prefect new file mode 100644 index 0000000..510768b --- /dev/null +++ b/Dockerfile.prefect @@ -0,0 +1,8 @@ +FROM hl8469/mlops-project:base-image-1.0 + +COPY ./prefect /prefect +COPY ./set_prefect.sh / + +RUN prefect backend cloud + +CMD /set_prefect.sh diff --git a/README.md b/README.md index f70e538..9d2a3e2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,140 @@ -# MLOps -👊 Build MLOps system step by step 👊 +

MLOps project

+

🚀 프로젝트 목표 🚀

+

지속가능한 AI 서비스를 위한 MLOps System 구성

-## 문서 +[![](https://img.shields.io/static/v1?label=Python&message=3.8&color=0277bd&labelColor=gray&style=flat&logo=data:image/png;base64,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)](https://www.python.org/) +[![](https://img.shields.io/static/v1?label=FastAPI&message=0.7&color=009485&labelColor=gray&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAxCAYAAACYq/ofAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABX9ATtpm7EAAAVESURBVGhD7ZltaBxFGMefZ++Spk1bTbBNW1FRkFiVWCGQWkQoxJeKCCUQVFRQG2OatPGlkqSHvRyaNrFGTOvFhpoPtaKYUkSpouIHIykiVCsUFdQWraA2BtuaNsmZux3/c/ekJt7t7ezegR+8H8zt/J8dduc/bzu7RwUKFChQ4L+A5ZgfBrovorhdQ2zVEKmVpOhyRMuQAkiTSL/hlsdxPErMI3TJlT9QfX0COmdyNxIOB2nZ/LVkqw2k1K2o4CIclZx1hlmX+Q6G3yA7sI82tf2SOuEP/0aUYnql5zYYeJZYrULr+4f5PC44SJOxbtoSGZOoJ/wZ6etaQkGrD7m6pCETmGz82jAcTAUywaMo8ji1hA5CeGoaPXa9sfu5agoEPoCBm6DMG8KyPkRpC9Url0gmStE76+mu2jKqvvkTGh42nj+WHM2I9qxNVkgpPYnNYZ6mRLxTVHYU6mSrTbS0ZD/19c2TqCvmRvq7VxMlDuJGiyTiATWE4XJUhBlKrafgxGByMTHAzMjunhWk7LdgYqFEzNET2eKIKG8oVU8V8zpEZcXdyNBQgAJqD0wsl4hHeC81dfwowjuK2ynavUaUI+5GRk/UkW3fIcorpyme2Cl5fyhVhEViFw0MFEkkI9mN6MnG9jZR3mGrl1pDv4vyj21XUeLMPaIykt1I8cSdqE2lKG8wn6Rg2cuickfZm5PD3IHsRhQ/hK7198xWtJ0aGydE5YMqGju+SvJpOBvpDZejS28R5Q2Lv6ai8v2i8kNyB8F3i0rD2ciCkioMj1JR5ujNoKJt6I1picyCz+H82QwpJgWyo8ixYZ2N2HSDv2GlRmh06j0R/6ANnppcjXMVc9KSqUuxKh2TUi6oq52e9s57pej2F9ECLaLMYE6QZddSU+iwRNzp34HlXb0pKjt6q1NsX0UNoVMSuYBzjzBfLDlzmA55MqFbV/EzotxhLqZYcYmoOTgbUexti6/HuWJvz5ziiXtxo2tFmRGIZ6yXsxFSf0rGDObXqbn9W1HuvLazFEM3hHkoAQOUihMnMi4MzkYs/lly7jCP43WpS5QZ4/GHMTeuEGUG0xni6bOi5uA8fPq716EF3jVcuc4hfZ9+NQQCajM9tvVzCaTQHykS6hiMLJOIGcxfUHOHfqFLw7lHihJfoh5TotzQ2/sbMVQyJGtxqsgs4naLZxMaphHJpeFspCE0isl7RFT+eKmrAjVqFeUNZR2SXBpZJjvaE1Mylc0jQetJDFcfSzufoNGJz0Slkc0IrEweQHf+Kip3oi9chus9KsobzHsoEvlLVBrZjbRE9N7oeVG5w9Nb0Rt+9m8naWFgr6iMZDeimV7wanK1yJVdXdfg9/6U8EDye5i1hR58+rxEMuJupLU1hv3TIzAzLhF/BAMhrFTGn3dmsY+a296RvCPuRjRNoW9QcgNaJy4Rb/TvwDJs14kyh63DFIw9gZzrs8zMiKap421cuAk9k+E9Iwu2zahGJ5LR96kLMJb+qck6aowYvWWaG9FsbN+HCt2Hm5jvwyxegwa9XZQZbL1PQV5HT0X+kIgr3na4M0S7V6Jyg1iBqiXijDatVPrTPTNTqFEXjcZ6sdR6Gsb+jGjC4WKqKGlAD7Wjonha54BemRR9hH1Ze3I++sC/kRn6woupqOQBXEp/cbkeyXy4poYoth0qShs7jkD7eLVOkbuRGcJhi5bOr0SlanHVGkQq0crLoTGs2ILBGCo6hnM/YQ/3FfKf0jgNU1tbbsu6kD8j/0Z/vuns1B/ULLoOv6dXKCr72Kb6A3n5z7BAgQL/S4j+BrgJoam4QNPgAAAAAElFTkSuQmCC)](https://fastapi.tiangolo.com/) +[![](https://img.shields.io/static/v1?label=PostgreSQL&message=13.4&color=32668f&labelColor=gray&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUOSURBVEhL7ZZrTBRXFMfPzO7sY5Z9sbC7CCwryGJBidCGqkTjo5poimlIH35okyYmfmn7pQ3f2kaTfmrih5aUSJo0jTGWlFRs0kpbIXYtEEVtaOySghJ5CMLCsi/2vTPTe2cvuLOzSCPpl6a/7GTuOWfm/mfOPefOwv9sEgoddGb4dPCFMjo7O1nBVn1wci7cyAFvUlJUUK9TTeyvcXgW5+5PTsXYg7PBaBPFU4U88Evby4oi3nB898OFQLXAg0aphGWjVjVUX2b5fvx2369nz55Nk6nXkAl/0+Mu/30hdGnAM/0iLwDDCwLQFAXox5kKNMm9tRXR3uFxI8fzShRHMQClQgGlRQZglAqYmPNBmuPFezQqRfJog7PLWSy899bx4yEiIaIg51WohmOvd1wbmTqe4ngFFkU/IOK0q6yYGfRMsak0R2M/Bp/RQ4B/JSYK1lVYYc4XBhzGczxcCO0sLyqy7N1R+ZPb7eYzd+WsR3//oGP4gfcEmkCWCfS2ML3gByRKPHKCkTj8NbMIzzmsOEMiiVSa7huZfnnvoWPlGU8GifBsPF3lDURUxJTgtJlhGb3VRqzEkhCJJ4FVP5kmmeY0jwMRlpgiEmFvKMYKgpC3KmmaBh4v6j9gzheCmvIiYomFlLIbtAliikhEWIZOoRTJZseFUqjXipPt3GqHenToNPLEWE0FsG+nE/bUOtBYT7wA9kJdOOqf9xNTRCJcYzPMowqVlb4ClW5wJQ4PZn1gRg9QXVYEWyxPJl7FaTeLxeYLRWE5HCVeAFeJcbS1tTVATBGJ8I2+3hlXqUWSEgyqTrFiOZTq3+5NQs+AR3yAXHBBDfw5CaNT3ky5I7QqBhwGRQ8aSqpSIowaPWAzqEeJuQYl5j8zkYDExbUWkAp2ZR2zi0Ew6jQZm2A3s4vDN2/1EnON3ELizWrqqgptBNmwagb1aZxYBFnDAQTQNZacTDiLdX22Algm5hq5wrDkC1zXaxmJCqOkIZF8svT4waKoZXLBrVRo0IGaUYq23VQg7LAovsy3ZcqEm3dtmTBomBliigQjCSgrNhILoECrgnn/CrGk3B1/BHVbbaj9KGgo1195++QrN0hIgkz4Ymfn0gsuqzs7k6i3Ydrrh6oScxrvx84SM/jD+TcTXFOJZArisfh8CSucQa68W51MuLu7myuIPvqivNggSQ+X5lZ2WekPDlSy55q2lYSqSy0kIicST8HuWoevqb7KNjo6fqS77+Y73/5w3U7CIjJhzLunT/9RYVJ/hzcOjJFVJY9ut3yceDz2tWub4/aVm2OMRqUEVsOI8VyMOjWc//Fu3fsXhn9puzh41T0ycSS84F2/nbIQKs3cGdcW04RRq4zud1k69EaW9lka7n/VN3YBFRbT6DTfy63+VZoqTT+37LJfaqm3fr7PnjxhCY+fPHXqjUUSFsnTFGtQn352vjLCK0shMHOHM9irk6A9qdFq7GG/f+Dw81tnz12b7g2hwsvlzKuNr7W81HwZDVe7XMbThJ/K0NBQ00eXPbdw72ZjQGn+pLWuqbm5+TZx5WW9VG9IIBCIqxh5qh02E9/V1TVJzHV5ZmGPxxMUv1A4Z1mHQUV729vbJR+EfDyzcFtb25Jeo4wQUwTv6Xq14g4apjKe9XlmYUTUrKV6V1sOi5aYdUFFKtghOjZgM8ICG/N9eKjW6t5TbZ0/UFPYv90Qe5P2Pewn8X8d/EXA/6c28xL/eQD+Br9J50bag67GAAAAAElFTkSuQmCC)](https://www.postgresql.org/) +[![](https://img.shields.io/static/v1?label=Docker&message=20.10.11&color=2496ed&labelColor=gray&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAATjSURBVFhH7ZZ/TJVVGMfPOe+ve7m8/LwaAy4YYW7NFYVK4CaIWrZYKLZYSM3KH1trrBmt9ZewFmtzNoyaC6M1VlksNk3NAqcoaUlZzVGMVc7BiDDEgJf7vvf9cd7OuZ57Ey9c4ofQH/eznb3P93nec9/nvu9znnNAhAgRItxeILvOmE0HWp5ULbuMSZAW69h58Kn8fiZnDWLXGTOi46WjmlEUGKqGXSw0J8w6wdvNrBOEwFZs2+4PDIMHJgvNCVPW4EN1Xz5DLoXUFnlkcRCeUA2riGoEIY52cCdGVPNRqimeRL6yoWz9AJNh2dbYtiH3nqXndq1I8TJXCFO+QUUzchSfWU7HmM/Yquj4/oAe9Rnlw14jO6Dp8I1xMpsaluebLiRdHhw7evhC5+dNnZ0ic4ewYDXYOzjymIltaVg11n14tv815g5hygRtAHRSW5p/AKgCjM2AJkENImgE42RgxGM2NSyaaaYxE1zX9Iqa1l8SmRxHSA2W1J/chm3wALUdAq+punERQriaahFBjCB3SrPM9VQjG9iSxJ1WdctfoxTZwbeNamYBk8AWhL1Hns3vZTLIw3VfVZES2cMkyHTLOxQfvhIlwQxSKr0pi+SOd0pyroUkuHrvsU9sCEqp7eS5EdUwDwEId1Et8dBEiN9Hkn6FaggBjhK4N8d0q5JqSpxTqP1bNV5kkn6iFV9XFl1kMkjZ+20lV4aUZibJggOAvJggHAC+THf05gWrwZyk5ONOHv7O5LjkKJLE/5qd7m4PSRASD0f+Dh2II4M4gpq8Mv6muN+H/o1PpCeiqcnmzg/05ZKnKcwVhEwxYyS+6d4E99oX1i5XYHnj2Y2qpuezOHCJYhxJwkltm9SYibEqcCjKHyQYGCsCQtFMAt2yxkSOC25vOrbHSK0GNfn8gya2DGp7LQxMA6dg2y4gvdTjv4EgS8JHZNGccbscw57EmPbaLSuDezksrP1iv2biCqbnHR5BdWV6ypJ9W7KuMtc4EM8hntkLQpQgHJwsOQqtwWs3zPlH5ODI3WlyDZMTgmRe6GL2vEKXT6LLUflWcW7YfRstWxzTRlanxXRYSMOmvW9OTisxDvHoZzsK32NyUlANWTEukWthOiyLXMKPd7mjj5BWENIepgN5XteqzORt5A/f0v1C8ffB1Pio18krn/Jm0way4rMyiCnd8Ewfh4C6M+6I3VC9cfkQc4Ul2EmLD5zcP+jVKsiGr5NUbdL7SNOFo6RR9wg8uoQty6Po1jp2+4xwCVxHXvrizdWbsv9grikJJrjz3e+FPmvomMSh7hRP2ssJzj6rqqDACnyG3Yc6PD/0/3WJNOI4/4RpgAC0EqP4t9dkya++lJenMvd/Ytxe9On5HmfjT931GOPU+5Lin3vj8VWXWcjP0x+0P9JzffSwbuFJD5i3QnaJjtR45+6G8jXnmGtajEuQQj4xLG1oK1U0vQpD0OqJleuTt+b+XE2O9zT+RP3pBwe96sdk97nTP2ECyBZuOEW+NcEh1S3bXtASmDsTQhIM0NRpi83fnike1XylZNPPVE2ri4ewlyyUAUngRK/P2O4zMV0w9FBgihzqlXj0jYC4U1ke+Xh1Uc6f/h+aJZMmeDN7bBsNN3+3pF9RMxWvL9YiXdMpcvS0M5Qmy1dTPcZv062tCBEiRPhfAMA/LFP+N0P8j3gAAAAASUVORK5CYII=)](https://www.docker.com/) +[![](https://img.shields.io/static/v1?label=Kubernetes&message=1.22.3&color=2e6ce6&labelColor=gray&style=flat&logo=data:image/png;base64,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)](https://kubernetes.io/) +[![동욱이 바보](https://img.shields.io/static/v1?label=MLflow&message=1.20.2&color=2496ed&labelColor=gray&style=flat&logo=data:image/png;base64,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)](https://mlflow.org/) +[![](https://img.shields.io/static/v1?label=Prefect&message=0.15.6&color=27b1ff&labelColor=gray&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHsIAAB7CAW7QdT4AAASLSURBVFhH7Zd/aBxFFMff7P1IpdiEqA0osdaDCi2hYEXbXG1yMesl/mdj0iJoSsXoH/5jECGJWA9MqCj0H/8QCkJJ8A8RLFVjTpBSqEWxsUWlDWqr1ibRYCHRSHO3O/N8szdzt3f2rnOXC6nQLzzezpvd2c99Z3Z2D27qRtK20xhqQQyqZlXEVF6WJJizDp8SDgyhCwIdNnzH3zB2IsZcdUrFWhbg5u8xHKjBp5HDADjsXkE46AAQKKCLP4kUjNTWs7HJBxhVKlNFgAqsFwQMosvu8aDy4FT22ngR0zB8+zwbnXyufNCyADcjhkMXYJ/gOAiCbchCFIPz1YVLoA6MzE6zUUiwtBryujICbDmOwflG2I8CB5HAJMT1wPSxruf68GfKI3/WsSNg4Kilckkt3g13CoH7aTo30LoCsQTAdaaQNS/76l746t51Xh/bKFLscN1lHFPDl5QR4GSEXfpuk7XddfAxnsKvsnDqpllIXddtmfV5BXWKWjV8SRkBap3fan069aC1HTl2EuiXRWF0W2bZvkZdhonKAtT6YZc1cSFu7aAntIOn8VQenMwKolRdhokqAtT65XEr+dseK8o5xgn0C1M42V5RBws1u8/67PfnrZ13zSRfX+/8kYPRcDJrOF/dRFV51e1+9sUYcv6q4Ly16f6H4NdUA3z911a4vNiQv834tiXabpJ41OpQQxTVsgD3vjDUxt30AcHdXcJ1gXMO9qNxcFwOS2kHfpyvh5MzTXBpviG3D2pQjkkYXyHA3v7EI44Ec/nDnBOYB0dfCRTtdgeEQ0GwLAsYjb6UdmFqrg6S5++Di3PrCYwGQBkrAPjMy8O2w7l0LJpxLAcn3ZO1NjsOa29ZQ4DMg7SIUmZEhHPT6+DY2QhMzd5WXcC+obd2cu68IbhozsCQW4WAlKWDre1xqLt1bQaQEaCEVLABBTs1WwvHvmn88PTb9bvVLYrK6Ckmd16haWlGFPTDKURhRs8hGZyLDFQROEpzWxr/6X+za+FJNXxJGW4zEkRBKBh6N+dqGpyOOUHrafXDMcu6YgUDA1jDI11286FYbKPRRmMESPfNAGjH/KFBZaZ+IQE9MAXJ2AKzWIIFU5En7OjBnlhsUQ1rJDMH89xSMNm2H5h+CbnFqZ8AFwMBdjAddiJ7Olte67HtBTVaWTJ0UEJpx3xAfvcULDl21XX5oTWhmsjeztaBXtu+ooapSEaANHEKwBcEJQqAaXoxwEKb+no6+7vi0Tl1+bJk6CDtcX4YL/8XmOp4dfrbGXVZVVTZGvTCB5wN+YqorsymWAJl3SsElX36WKgrqiezKdZT6oFo0GvlVXJQu+OtQ79jhW4SZLVltgY9hzSIckxF/pO8WmswO7XSJQVa6J4Xq7UGNUDhuss/Pkfn9CYSiapSGjooAfxOaWDvJX2GvnS6T2zb0nRy4qjRn/FyZPQ92N330oQQPJ7/HchPoeAjyQ+OjNMp1V98SuVNsQzAz4mmbeL9d6ME94nszpy1MjIEFCmC+9hCtuOj0Xfax987fFx13Rjq7j4QVoc39T8TwL/JfZXfhOXXJQAAAABJRU5ErkJggg==)](https://docs.prefect.io/) +[![](https://img.shields.io/static/v1?label=RAY&message=1.7.0&color=00a2e9&labelColor=gray&style=flat&logo=data:image/png;base64,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)](https://docs.ray.io/en/latest/) -- [API DOCS](./docs/api-list.md) \ No newline at end of file +
+ +- [1. 프로젝트 소개](#1-프로젝트-소개) +- [2. 프로젝트 실행해보기](#2-프로젝트-실행해보기) +- [3. Phase2(2021.10.06 ~ 2021.11.13)](#3-phase220211006--20211113) + - [3.1. Phase2 주요기능](#31-phase2-주요기능) + - [3.1.1. 전체 흐름도](#311-전체-흐름도) + - [3.1.2. 실험관리 및 모델학습](#312-실험관리-및-모델학습) + - [3.1.3. Inference API](#313-inference-api) + - [3.2. Phase2 트러블슈팅](#32-phase2-트러블슈팅) +- [4. Phase1(2021.08.28 ~ 2021.10.06)](#4-phase120210828--20211006) + - [4.1. Phase1 주요기능](#41-phase1-주요기능) + - [4.2. Phase1 트러블슈팅](#42-phase1-트러블슈팅) + + +
+ +# 1. 프로젝트 소개 +> 저희 프로젝트는 여러 Phase로 이루어져 있습니다. 현재 단락에서 각 Phase에 대하여 간략히 설명하였고, 각 단계에서 구현한 구체적인 내용에 대한 자세한 설명은 아래에 따로 기술하였습니다. + +
+ +**Phase 2** +* Phase2에서는 [MLOps level 1](https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning#mlops_level_1_ml_pipeline_automation)을 구현하기 위해 노력하였습니다. +* Git Action과 Kubernetes를 이용하여 CD/CT를 도입하였습니다. +* hyperparameter tuning process를 NNI에서 ray를 이용해 관리하는 것으로 변경하였습니다. 이로인하여 필요하지 않게된 코드들이 생겨났고 모두 deprecated로 이동하였습니다. +* Workflow관리도구로 prefect를 도입하였습니다. +* predict API를 처음 호출하였을 때 모델을 로딩하는 시간이 길어져 한번 호출된 모델은 일정시간 캐싱해두도록 변경하였습니다. +* 클러스터 모니터링을 위해 prometheus와 grafana를 도입하였습니다. +* `2021.10.06 ~ 2021.11.13` 기간동안 진행되었으며 현재 개발종료되었습니다. + +
+ +**Phase 1** +* Phase 1에서는 [MLOps level 0](https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning#mlops_level_0_manual_process)를 구현하기 위해 노력하였습니다. +* NNI를 이용하여 hyperparameter tuning을 진행하며 학습된 모델에 대한 predict API와 모델학습 파이프라인을 실행시킬 수 있는 train API를 제공합니다. +* `2021.08.28 ~ 2021.10.06` 기간동안 진행되었으며 현재 개발종료되었습니다. + +
+
+ +# 2. 프로젝트 실행해보기 + +[Phase2 프로젝트 실행해보기](./docs/phase2.md) +[Phase1 프로젝트 실행해보기](./docs/phase1.md) + +
+
+ +# 3. Phase2(2021.10.06 ~ 2021.11.13) + +## 3.1. Phase2 주요기능 + +Phase2 단계에서는 [MLOps level 1](https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning#mlops_level_1_ml_pipeline_automation)을 구현하기 위하여 노력하였습니다. + +
+ +### 3.1.1. 전체 흐름도 +![](./docs/img/phase2.png) + +
+ +### 3.1.2. 실험관리 및 모델학습 +**Model artifacts** +- MLflow를 이용하여 Google Cloud Storage에 저장합니다. + +**성능평가지표, 점수, 각 실험에서 사용된 하이퍼파라미터** +- MLflow를 이용하여 PostgreSQL에 저장합니다. + +**AutoML** +- Ray tune을 이용하여 하이퍼파라미터 서칭을 합니다. + +**workflow management** +- 처음엔 크론탭을 고려하였지만 최종적으로 [Prefect](https://github.com/PrefectHQ/prefect)를 사용하였습니다. +- web UI를 제공하여 수동으로 workflow를 실행할 수 있으며 실행 결과를 쉽게 확인할 수 있습니다. +- 주기적인 실행이 필요한 workflow들을 리눅스의 크론탭과 동일한 문법으로 정의할 수 있습니다. +ex) 10 6 * * 1 → 매주 월요일 6시 10분에 workflow 실행 + +**cluster monitoring** +- GCP에서 서비스를 제공할 당시 클러스터의 가용자원 모니터링을 위하여 Prometheus와 Grafana를 도입하였습니다. +- 그라파나에서 제공중인 13077, 315 대시보드를 이용하였습니다. + + +
+ +### 3.1.3. Inference API +- ML파이프라인에 의해 생성된 모델을 이용한 inference 결과를 제공합니다. +- API server는 inference 요청이 들어오면 해당 모델이 캐싱되어있는지 확인한 후 없으면 MLflow server와 통신하여 모델을 로드한 후 요청사항을 처리하여 결과를 반환합니다. +- [Fast API](https://github.com/tiangolo/fastapi)를 이용하였습니다. + +
+ +## 3.2. Phase2 트러블슈팅 +- Phase1에서는 NNI를 사용하였지만 다음과 같은 이유로 Ray Tune으로 변경하였습니다. [해결한 방법](./docs/phase2_trouble.md#NNI) +- GCP로 서버를 이전한 후 MLflow에서 모델을 로드하는 시간이 약 10초로 매우 늦어졌습니다. [해결한 방법](./docs/phase2_trouble.md#우리는왜Redis를버렸나) + + + +
+
+ +# 4. Phase1(2021.08.28 ~ 2021.10.06) +![](./docs/img/phase1.png) + +## 4.1. Phase1 주요기능 +- Phase1에서는 [MLOps level 0](https://cloud.google.com/architecture/)를 구현하기 위하여 노력하였습니다. +- train은 experiments 폴더에 구성되어 있습니다. + - 본 프로젝트에서는 어느정도의 자동화된 모습을 구현하기 위해 train을 api형태로 요청할 수 있게 구성하였습니다. + - train 요청에따라 subprocess로 NNi를 이용한 hyper parameter tuning을 진행합니다. + - 각 실험결과 best모델을 현재 저장된 모델 성능과 비교하여 db에 직렬화시켜 저장합니다. +- predict는 `app/api/router/predict.py` 에 구성되어 있습니다. + - prediction요청에 따라 결과를 반환합니다. + - temp예측의 경우 서버 시작시 모델을 로드하여 모델을 매번 읽어오지 않도록 합니다. + - insurance예측의 경우 db에서 매번 모델을 읽어와 예측을 진행합니다. +- logger + - 요청, 실험진행 등을 log로 남깁니다. + +## 4.2. Phase1 트러블슈팅 \ No newline at end of file diff --git a/app/api/schemas.py b/app/api/data_class.py similarity index 91% rename from app/api/schemas.py rename to app/api/data_class.py index 73118ea..8c4429a 100644 --- a/app/api/schemas.py +++ b/app/api/data_class.py @@ -29,3 +29,7 @@ class ModelCorePrediction(BaseModel): class ModelCore(ModelCoreBase): class Config: orm_mode = True + + +class MnistData(BaseModel): + mnist_num: str diff --git a/app/api/router/predict.py b/app/api/router/predict.py index d2d5319..bf8b300 100644 --- a/app/api/router/predict.py +++ b/app/api/router/predict.py @@ -1,18 +1,34 @@ # -*- coding: utf-8 -*- +import ast +import asyncio +import os from typing import List +import mlflow import numpy as np +import pandas as pd +import torchvision.transforms as transforms +import xgboost as xgb +from dotenv import load_dotenv from fastapi import APIRouter from starlette.concurrency import run_in_threadpool -from app import models -from app.api.schemas import ModelCorePrediction +from app import schema +from app.api.data_class import MnistData, ModelCorePrediction from app.database import engine -from app.utils import ScikitLearnModel, my_model +from app.query import SELECT_BEST_MODEL +from app.utils import CachingModel, VarTimer, load_data, softmax from logger import L -models.Base.metadata.create_all(bind=engine) +load_dotenv() +schema.Base.metadata.create_all(bind=engine) + +host_url = os.getenv("MLFLOW_HOST") +mlflow.set_tracking_uri(host_url) +reset_sec = 5 +CLOUD_STORAGE_NAME = os.getenv("CLOUD_STORAGE_NAME") +CLOUD_VALID_MNIST = os.getenv("CLOUD_VALID_MNIST") router = APIRouter( prefix="/predict", @@ -21,66 +37,136 @@ ) -@router.put("/insurance") -async def predict_insurance(info: ModelCorePrediction, model_name: str): - """ - 정보를 입력받아 보험료를 예측하여 반환합니다. - - Args: - info(dict): 다음의 값들을 입력받습니다. age(int), sex(int), bmi(float), children(int), smoker(int), region(int) - - Returns: - insurance_fee(float): 보험료 예측값입니다. - """ - - def sync_call(info, model_name): - """ - none sync 함수를 sync로 만들어 주기 위한 함수이며 입출력은 부모 함수와 같습니다. - """ - model = ScikitLearnModel(model_name) - model.load_model() - - info = info.dict() - test_set = np.array([*info.values()]).reshape(1, -1) - - pred = model.predict_target(test_set) - return {"result": pred.tolist()[0]} +mnist_model = CachingModel("pytorch", 600) +knn_model = CachingModel("sklearn", 600) +data_lock = asyncio.Lock() +train_df = VarTimer(600) + + +@router.put("/mnist") +async def predict_mnist(item: MnistData): + global train_df + global mnist_model, knn_model + + item2 = np.array(ast.literal_eval(item.mnist_num)).astype(np.uint8) + model_name = "mnist" + model_name2 = "mnist_knn" + is_cloud = False + data_version = 1 + exp_name = 'mnist' + + if not isinstance(train_df._var, pd.DataFrame): + async with data_lock: + if not isinstance(train_df._var, pd.DataFrame): + df, _ = load_data(is_cloud, data_version, exp_name) + train_df.cache_var(df) + + transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))] + ) + reshaped_input = item2.reshape(28, 28) + transformed_input = transform(reshaped_input) + transformed_input = transformed_input.view(1, 1, 28, 28) + + await mnist_model.get_model(model_name, load_type="production") + await knn_model.get_model(model_name2, load_type="production") + + def sync_call(mnist_model, knn_model, train_df): + # Net1 + result = mnist_model.predict(transformed_input) + p_res = softmax(result.detach().numpy()) * 100 + percentage = np.around(p_res[0], 2).tolist() + # Net2 + result = mnist_model.predict(transformed_input, True) + result = np.concatenate((result.detach().numpy(), np.array(percentage).reshape(1,-1) / 10), axis=1) + # KNN + knn_result = knn_model.predict(result) + xai_result = train_df.get_var().iloc[knn_result, 1:].values[0].tolist() + return { + "result": { + "percentage": percentage, + "answer": percentage.index(max(percentage)), + "xai_result": xai_result, + }, + "error": None, + } try: - result = await run_in_threadpool(sync_call, info, model_name) + result = await run_in_threadpool( + sync_call, mnist_model, knn_model, train_df + ) L.info( - f"Predict Args info: {info}\n\tmodel_name: {model_name}\n\tPrediction Result: {result}" + f"Predict Args info: {item.mnist_num}\n\tmodel_name: {model_name}\n\tPrediction Result: {result}\n\tcolor_avg_{result['result']['answer']}: {np.round(np.mean(item2), 2)}" ) return result - except Exception as e: L.error(e) return {"result": "Can't predict", "error": str(e)} -@router.put("/atmos") -async def predict_temperature(time_series: List[float]): +insurance_model = CachingModel("xgboost", 30) + + +@router.put("/insurance") +async def predict_insurance(info: ModelCorePrediction): + info = info.dict() + test_set = xgb.DMatrix(np.array([*info.values()]).reshape(1, -1)) + + model_name = "insurance" + await insurance_model.get_model(model_name, load_type="production") + result = insurance_model.predict(test_set) + + result = float(result[0]) + return { + "result": result, + "error": None, + } + + +lock = asyncio.Lock() +atmos_model_cache = VarTimer() + + +@router.put("/atmos_temperature") +async def predict_temperature_(time_series: List[float]): """ 온도 1시간 간격 시계열을 입력받아 이후 24시간 동안의 온도를 1시간 간격의 시계열로 예측합니다. - Args: time_series(List): 72시간 동안의 1시간 간격 온도 시계열 입니다. 72개의 원소를 가져야 합니다. - Returns: List[float]: 입력받은 시간 이후 24시간 동안의 1시간 간격 온도 예측 시계열 입니다. """ + + global lock + if len(time_series) != 72: L.error(f"input time_series: {time_series} is not valid") return {"result": "time series must have 72 values", "error": None} + model_name = "atmos_tmp" + + if not atmos_model_cache.is_var: + async with lock: + if not atmos_model_cache.is_var: + run_id = engine.execute( + SELECT_BEST_MODEL.format(model_name) + ).fetchone()[0] + print("start load model from mlflow") + atmos_model_cache.cache_var( + mlflow.keras.load_model(f"runs:/{run_id}/model") + ) + print("end load model from mlflow") + def sync_pred_ts(time_series): """ none sync 함수를 sync로 만들어 주기 위한 함수이며 입출력은 부모 함수와 같습니다. """ - time_series = np.array(time_series).reshape(1, -1, 1) - result = my_model.predict_target(time_series) + + time_series = np.array(time_series).reshape(1, 72, 1) + result = atmos_model_cache.get_var().predict(time_series) + atmos_model_cache.reset_timer() L.info( - f"Predict Args info: {time_series.flatten().tolist()}\n\tmodel_name: {my_model.model_name}\n\tPrediction Result: {result.tolist()[0]}" + f"Predict Args info: {time_series.flatten().tolist()}\n\tmodel_name: {model_name}\n\tPrediction Result: {result.tolist()[0]}" ) return {"result": result.tolist(), "error": None} diff --git a/app/query.py b/app/query.py index 744dd0a..ad50b45 100644 --- a/app/query.py +++ b/app/query.py @@ -1,102 +1,6 @@ -UPDATE_TEMP_MODEL_DATA = """ - DELETE FROM temp_model_data - WHERE id NOT IN ( - SELECT id - FROM temp_model_data - WHERE experiment_name = '{}' - ORDER BY {} - LIMIT {} - ) - """ - - -SELECT_TEMP_MODEL_BY_EXPR_NAME = """ - SELECT * - FROM temp_model_data - WHERE experiment_name = '{}' - ORDER BY {}; - """ - - -SELECT_MODEL_METADATA_BY_EXPR_NAME = """ - SELECT * - FROM model_metadata - WHERE experiment_name = '{}' - """ - -INSERT_MODEL_CORE = """ - INSERT INTO model_core ( - model_name, - model_file - ) VALUES( - '{}', - '{}' - ) - """ - -INSERT_MODEL_METADATA = """ - INSERT INTO model_metadata ( - experiment_name, - model_core_name, - experimenter, - version, - train_mae, - val_mae, - train_mse, - val_mse - ) VALUES ( - '{}', - '{}', - '{}', - '{}', - '{}', - '{}', - '{}', - '{}' - ) +SELECT_BEST_MODEL = """ + SELECT run_id + FROM best_model_data + WHERE model_name = '{}' """ -UPDATE_MODEL_CORE = """ - UPDATE model_core - SET - model_file = '{}' - WHERE - model_name = '{}' - """ - -UPDATE_MODEL_METADATA = """ - UPDATE model_metadata - SET - train_mae = {}, - val_mae = {}, - train_mse = {}, - val_mse = {} - WHERE experiment_name = '{}' - """ - -DELETE_ALL_EXPERIMENTS_BY_EXPR_NAME = """ - DELETE FROM temp_model_data - WHERE experiment_name = '{}' -""" - -INSERT_OR_UPDATE_MODEL = """ -UPDATE model_core -SET model_name='{mn}', model_file='{mf}' -WHERE model_core.model_name='{mn}'; -INSERT INTO model_core (model_name, model_file) -SELECT '{mn}', '{mf}' -WHERE NOT EXISTS (SELECT 1 - FROM model_core as mc - WHERE mc.model_name = '{mn}'); -""" - -INSERT_OR_UPDATE_SCORE = """ -UPDATE atmos_model_metadata -SET mae='{score1}', mse='{score2}' -WHERE atmos_model_metadata.model_name='{mn}'; -INSERT INTO atmos_model_metadata (model_name, experiment_id, mae, mse) -SELECT '{mn}', '{expr_id}', '{score1}', '{score2}' -WHERE NOT EXISTS (SELECT 1 - FROM atmos_model_metadata as amm - WHERE amm.model_name = '{mn}'); -""" diff --git a/app/schema.py b/app/schema.py new file mode 100644 index 0000000..369e352 --- /dev/null +++ b/app/schema.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +import datetime + +from sqlalchemy import FLOAT, Column, Integer, String + +from app.database import Base + +KST = datetime.timezone(datetime.timedelta(hours=9)) + + +class BestModelData(Base): + __tablename__ = "best_model_data" + + model_name = Column(String, primary_key=True) + run_id = Column(String, nullable=False) + model_type = Column(String, nullable=False) + metric = Column(String, nullable=False) + metric_score = Column(FLOAT, nullable=False) + + +class DataInfo(Base): + __tablename__ = "data_info" + + path = Column(String, primary_key=True) + exp_name = Column(String) + version = Column(Integer) + data_from = Column(String) diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100644 index 0000000..4b52211 --- /dev/null +++ b/app/utils/__init__.py @@ -0,0 +1,2 @@ +# from .utils import ScikitLearnModel, load_data_cloud, VarTimer, softmax +from .utils import * \ No newline at end of file diff --git a/app/utils/utils.py b/app/utils/utils.py new file mode 100644 index 0000000..6fdabd4 --- /dev/null +++ b/app/utils/utils.py @@ -0,0 +1,196 @@ +import asyncio +import os +import threading +import time +from io import StringIO + +import mlflow +import numpy as np +import pandas as pd +import tensorflow as tf +import torch +from dotenv import load_dotenv +from google.cloud import storage + +from app.database import engine +from app.query import * +from logger import L + +load_dotenv() + +os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" + +base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +physical_devices = tf.config.list_physical_devices("GPU") +if physical_devices: + tf.config.experimental.set_memory_growth(physical_devices[0], enable=True) + + +def softmax(x): + + f_x = np.exp(x) / np.sum(np.exp(x)) + return f_x + +def get_data_path_from_db(data_version, exp_name): + select_query = """ + SELECT * + FROM data_info + where version = {} and exp_name = '{}' + """ + (train_path, _, _, _), (valid_path, _, _, _) = engine.execute( + select_query.format(data_version, exp_name) + ).fetchall() + + return train_path, valid_path + + +def load_data_cloud(bucket_name, version): + data_path, _ = get_data_path_from_db(version, 'mnist') + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(data_path) + + bytes_data = blob.download_as_bytes() + + s = str(bytes_data, "utf-8") + + data = StringIO(s) + df = pd.read_csv(data) + + return df + +def get_data_path_from_db(data_version, exp_name): + select_query = """ + SELECT * + FROM data_info + where version = {} and exp_name = '{}' + """ + (train_path, _, _, _), (valid_path, _, _, _) = engine.execute( + select_query.format(data_version, exp_name) + ).fetchall() + + return train_path, valid_path + +def load_data(is_cloud, data_version, exp_name): + + if is_cloud: + CLOUD_STORAGE_NAME = os.getenv("CLOUD_STORAGE_NAME") + train_path, valid_path = get_data_path_from_db(data_version, exp_name) + train_df = load_data_cloud(CLOUD_STORAGE_NAME, train_path) + valid_df = load_data_cloud(CLOUD_STORAGE_NAME, valid_path) + else: + TRAIN_MNIST = os.getenv("TRAIN_MNIST") + VALID_MNIST = os.getenv("VALID_MNIST") + train_df = pd.read_csv(TRAIN_MNIST) + valid_df = pd.read_csv(VALID_MNIST) + + return train_df, valid_df + + +class VarTimer: + def __init__(self, caching_time=5): + self._var = None + self._caching_time = caching_time + self._reset_flag = False + + def cache_var(self, var, caching_time=False): + if caching_time: + self._change_timedelta(caching_time) + self._var = var + self._reset_flag = True + cleaner = threading.Thread(target=self._value_cleaner) + cleaner.start() + + def _value_cleaner(self): + while self._reset_flag: + self._reset_flag = False + time.sleep(self._caching_time) + self._var = None + + def get_var(self): + self._reset_flag = True + return self._var + + def reset_timer(self, caching_time=False): + if caching_time: + self._change_timedelta(caching_time) + self._reset_flag = True + + def _change_timedelta(self, caching_time): + if not ( + isinstance(caching_time, int) | isinstance(caching_time, float) + ): + + print( + ( + f"timedelta must be int or float! " + f'"{caching_time}"(type {type(caching_time)}) isn\'t applied' + ) + ) + else: + self._caching_time = caching_time + + @property + def is_var(self): + return True if self._var else False + + +class CachingModel(VarTimer): + def __init__(self, model_type, caching_time=5): + super().__init__(caching_time) + self._run_id = None + self._model_type = model_type + self._lock = asyncio.Lock() + self._model_name = None + self._model_type_dict = { + "keras": mlflow.keras.load_model, + "pytorch": mlflow.pytorch.load_model, + "sklearn": mlflow.sklearn.load_model, + "xgboost": mlflow.xgboost.load_model, + } + self._model_load_way = { + "production": "models:/{}/Production", + "score": "runs:/{}/model", + } + + def _load_run_id(self, model_name): + self._run_id = engine.execute( + SELECT_BEST_MODEL.format(model_name) + ).fetchone()[0] + + def _load_model_mlflow(self, load_type): + _model_load_arg = { + "production": self._model_name, + "score": self._run_id, + } + model_uri = self._model_load_way[load_type].format( + _model_load_arg[load_type] + ) + model = self._model_type_dict[self._model_type](model_uri) + + return model + + async def get_model(self, model_name, load_type="production"): + if not super().is_var: + async with self._lock: + if not super().is_var: + if load_type == "production": + self._model_name = model_name + else: + self._load_run_id(model_name) + super().cache_var(self._load_model_mlflow(load_type)) + else: + super().reset_timer() + + def predict(self, data, cut=False): + if self._model_type == "pytorch": + if cut: + return torch.nn.Sequential( + *list(self._var.children())[:-1] + ).forward(data) + else: + return self._var.forward(data) + else: + return self._var.predict(data) + diff --git a/deprecated/app/__init__.py b/deprecated/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deprecated/app/api/__init__.py b/deprecated/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deprecated/app/api/router/__init__.py b/deprecated/app/api/router/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deprecated/app/api/router/predict.py b/deprecated/app/api/router/predict.py new file mode 100644 index 0000000..8769c3c --- /dev/null +++ b/deprecated/app/api/router/predict.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +import numpy as np +import torchvision.transforms as transforms +from dotenv import load_dotenv +from fastapi import APIRouter +from starlette.concurrency import run_in_threadpool + +from app import schema +from app.api.data_class import ModelCorePrediction +from app.database import engine +from app.utils import ( + ScikitLearnModel, +) +from logger import L + +load_dotenv() + +schema.Base.metadata.create_all(bind=engine) + +router = APIRouter( + prefix="/predict", + tags=["predict"], + responses={404: {"description": "Not Found"}}, +) + +@router.put("/insurance") +async def predict_insurance(info: ModelCorePrediction, model_name: str): + """ + 정보를 입력받아 보험료를 예측하여 반환합니다. + + Args: + info(dict): 다음의 값들을 입력받습니다. age(int), sex(int), bmi(float), children(int), smoker(int), region(int) + + Returns: + insurance_fee(float): 보험료 예측값입니다. + """ + + def sync_call(info, model_name): + """ + none sync 함수를 sync로 만들어 주기 위한 함수이며 입출력은 부모 함수와 같습니다. + """ + model = ScikitLearnModel(model_name) + model.load_model() + + info = info.dict() + test_set = np.array([*info.values()]).reshape(1, -1) + + pred = model.predict_target(test_set) + return {"result": pred.tolist()[0]} + + try: + result = await run_in_threadpool(sync_call, info, model_name) + L.info( + f"Predict Args info: {info}\n\tmodel_name: {model_name}\n\tPrediction Result: {result}" + ) + return result + + except Exception as e: + L.error(e) + return {"result": "Can't predict", "error": str(e)} diff --git a/app/api/router/train.py b/deprecated/app/api/router/train.py similarity index 100% rename from app/api/router/train.py rename to deprecated/app/api/router/train.py diff --git a/deprecated/app/query.py b/deprecated/app/query.py new file mode 100644 index 0000000..744dd0a --- /dev/null +++ b/deprecated/app/query.py @@ -0,0 +1,102 @@ +UPDATE_TEMP_MODEL_DATA = """ + DELETE FROM temp_model_data + WHERE id NOT IN ( + SELECT id + FROM temp_model_data + WHERE experiment_name = '{}' + ORDER BY {} + LIMIT {} + ) + """ + + +SELECT_TEMP_MODEL_BY_EXPR_NAME = """ + SELECT * + FROM temp_model_data + WHERE experiment_name = '{}' + ORDER BY {}; + """ + + +SELECT_MODEL_METADATA_BY_EXPR_NAME = """ + SELECT * + FROM model_metadata + WHERE experiment_name = '{}' + """ + +INSERT_MODEL_CORE = """ + INSERT INTO model_core ( + model_name, + model_file + ) VALUES( + '{}', + '{}' + ) + """ + +INSERT_MODEL_METADATA = """ + INSERT INTO model_metadata ( + experiment_name, + model_core_name, + experimenter, + version, + train_mae, + val_mae, + train_mse, + val_mse + ) VALUES ( + '{}', + '{}', + '{}', + '{}', + '{}', + '{}', + '{}', + '{}' + ) +""" + +UPDATE_MODEL_CORE = """ + UPDATE model_core + SET + model_file = '{}' + WHERE + model_name = '{}' + """ + +UPDATE_MODEL_METADATA = """ + UPDATE model_metadata + SET + train_mae = {}, + val_mae = {}, + train_mse = {}, + val_mse = {} + WHERE experiment_name = '{}' + """ + +DELETE_ALL_EXPERIMENTS_BY_EXPR_NAME = """ + DELETE FROM temp_model_data + WHERE experiment_name = '{}' +""" + +INSERT_OR_UPDATE_MODEL = """ +UPDATE model_core +SET model_name='{mn}', model_file='{mf}' +WHERE model_core.model_name='{mn}'; +INSERT INTO model_core (model_name, model_file) +SELECT '{mn}', '{mf}' +WHERE NOT EXISTS (SELECT 1 + FROM model_core as mc + WHERE mc.model_name = '{mn}'); +""" + +INSERT_OR_UPDATE_SCORE = """ +UPDATE atmos_model_metadata +SET mae='{score1}', mse='{score2}' +WHERE atmos_model_metadata.model_name='{mn}'; +INSERT INTO atmos_model_metadata (model_name, experiment_id, mae, mse) +SELECT '{mn}', '{expr_id}', '{score1}', '{score2}' +WHERE NOT EXISTS (SELECT 1 + FROM atmos_model_metadata as amm + WHERE amm.model_name = '{mn}'); +""" diff --git a/app/models.py b/deprecated/app/schema.py similarity index 100% rename from app/models.py rename to deprecated/app/schema.py diff --git a/deprecated/app/utils/__init__.py b/deprecated/app/utils/__init__.py new file mode 100644 index 0000000..4b52211 --- /dev/null +++ b/deprecated/app/utils/__init__.py @@ -0,0 +1,2 @@ +# from .utils import ScikitLearnModel, load_data_cloud, VarTimer, softmax +from .utils import * \ No newline at end of file diff --git a/app/utils.py b/deprecated/app/utils/utils.py similarity index 99% rename from app/utils.py rename to deprecated/app/utils/utils.py index 340571e..a4f5da0 100644 --- a/app/utils.py +++ b/deprecated/app/utils/utils.py @@ -1,10 +1,8 @@ import codecs import glob import io -import multiprocessing import os import pickle -import re import shutil import socketserver import subprocess @@ -13,11 +11,14 @@ import tensorflow as tf import yaml +from dotenv import load_dotenv from app.database import engine from app.query import * from logger import L +load_dotenv() + os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -119,10 +120,6 @@ def load_model(self): self.model = tf.keras.models.load_model(model_path) -my_model = TensorFlowModel("test_model") -my_model.load_model() - - def write_yml(path, experiment_name, experimenter, model_name, version): """ NNI 실험을 시작하기 위한 config.yml파일을 작성하는 함수 입니다. @@ -538,4 +535,4 @@ def modelfile_cleaner(self): """ model_path = os.path.join(self.experiment_path, "temp", "*") exprs = glob.glob(model_path) - [shutil.rmtree(_) for _ in exprs] + [shutil.rmtree(_) for _ in exprs] \ No newline at end of file diff --git a/experiments/atmos_tmp_01/config.yml b/deprecated/experiments/atmos_tmp_01/config.yml similarity index 100% rename from experiments/atmos_tmp_01/config.yml rename to deprecated/experiments/atmos_tmp_01/config.yml diff --git a/experiments/atmos_tmp_01/preprocessing.py b/deprecated/experiments/atmos_tmp_01/preprocessing.py similarity index 100% rename from experiments/atmos_tmp_01/preprocessing.py rename to deprecated/experiments/atmos_tmp_01/preprocessing.py diff --git a/experiments/atmos_tmp_01/search_space.json b/deprecated/experiments/atmos_tmp_01/search_space.json similarity index 100% rename from experiments/atmos_tmp_01/search_space.json rename to deprecated/experiments/atmos_tmp_01/search_space.json diff --git a/experiments/atmos_tmp_01/train.py b/deprecated/experiments/atmos_tmp_01/train.py similarity index 100% rename from experiments/atmos_tmp_01/train.py rename to deprecated/experiments/atmos_tmp_01/train.py diff --git a/experiments/expr_db.py b/deprecated/experiments/expr_db.py similarity index 100% rename from experiments/expr_db.py rename to deprecated/experiments/expr_db.py diff --git a/experiments/insurance/config.yml b/deprecated/experiments/insurance/config.yml similarity index 100% rename from experiments/insurance/config.yml rename to deprecated/experiments/insurance/config.yml diff --git a/experiments/insurance/query.py b/deprecated/experiments/insurance/query.py similarity index 100% rename from experiments/insurance/query.py rename to deprecated/experiments/insurance/query.py diff --git a/experiments/insurance/search_space.json b/deprecated/experiments/insurance/search_space.json similarity index 100% rename from experiments/insurance/search_space.json rename to deprecated/experiments/insurance/search_space.json diff --git a/experiments/insurance/trial.py b/deprecated/experiments/insurance/trial.py similarity index 100% rename from experiments/insurance/trial.py rename to deprecated/experiments/insurance/trial.py diff --git a/docs/img/api-test.png b/docs/img/api-test.png new file mode 100644 index 0000000000000000000000000000000000000000..e648f241c7b9147453ba7103f866497bb10549d9 GIT binary patch literal 25592 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%0AK%tlv~B%FOuI6r6xABN}UAkFPS@{^#pP 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 KLEgVkU;i&dOyc|i literal 0 HcmV?d00001 diff --git a/docs/img/nni.png b/docs/img/nni.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b8c1199699722237b381e3dbe77b7335f3ca82 GIT binary patch literal 242325 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

Bn%1Zu5u1ai`}9M2or@8G5J8Rt+#M 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̸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 H)1ZF<-PGhT literal 0 HcmV?d00001 diff --git a/docs/img/phase1.png b/docs/img/phase1.png new file mode 100644 index 0000000000000000000000000000000000000000..846e2131c514fa34594195cd677cd7d9a5c2e361 GIT binary patch literal 57218 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 z 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 U#z}>d$)_hO%d5#%%9sWJKc0;~ivR!s literal 0 HcmV?d00001 diff --git a/docs/img/phase2.png b/docs/img/phase2.png new file mode 100644 index 0000000000000000000000000000000000000000..e47a5113bc5fb5e407b9f0895833e8f898e6d4cb GIT binary patch literal 69360 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 YV~lOb;xBgFYy++<7tJnI89K%MFVrimYybcN literal 0 HcmV?d00001 diff --git a/docs/img/redis_pytorch_time.png b/docs/img/redis_pytorch_time.png new file mode 100644 index 0000000000000000000000000000000000000000..7526154aaad26d99c4472e02a600e1767745b0e4 GIT binary patch literal 11561 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 literal 0 HcmV?d00001 diff --git a/docs/phase1.md b/docs/phase1.md new file mode 100644 index 0000000..2712c12 --- /dev/null +++ b/docs/phase1.md @@ -0,0 +1,35 @@ +# Phase1 상세 + +- [발표자료](https://docs.google.com/presentation/d/16cQSK4t3O86uMFg6iEr02MrtNUQf95RTcTleAAR44fY) + +## How to enter this project + +### data & env + +- postgres db 를 준비합니다. + - `docker run -d --name postgre -p 5432:5432 -e POSTGRES_PASSWORD= postgres:13.4` +- [Data](https://drive.google.com/file/d/1YPOPA1jnXFyJvl6ikThejvVnxOJl9ya5/view?usp=sharing)를 다운로드 받아 postgresql db에 넣어줍니다. + - `docker cp :/postgres_20211026.sql` + - `docker exec -it bash` + - `psql postgres < /postgres_20211026.sql` + - 만약 컨테이너에서 role "root" does not exist 에러가 난다면 `su -l postgres` 로 유저를 변경한 후에 작업해 주세요 +- enviornment variable 를 .env파일에 포함시켜 줍니다. + ```plain + POSTGRES_USER=postgres + POSTGRES_PASSWORD=0000 + POSTGRES_SERVER=localhost + POSTGRES_PORT=5432 + POSTGRES_DB=postgres + ``` + +### Project + +0. data&env 단계를 수행합니다. +1. [Phase1](https://github.com/State-of-The-MLOps/MLOps/releases/tag/v1.0.0) 에서 Source코드를 다운받습니다. +2. `conda create --name mlops-phase1 python=3.8` +3. `conda activate mlops-phase1` +4. `pip install -r requirements.txt` 로 필요한 라이브러리를 설치합니다. +5. `python main.py` 로 서버를 실행시킵니다. +6. http://localhost:8000/docs 에서 fastapi swagger를 통해 api를 테스트합니다. + +## Review diff --git a/docs/phase2.md b/docs/phase2.md new file mode 100644 index 0000000..e98d00a --- /dev/null +++ b/docs/phase2.md @@ -0,0 +1,124 @@ +# Phase2 상세 + +- [발표자료](https://docs.google.com/presentation/d/1TC_wMWykpN7QATgJnGuMVkwP_cm4PjEe3M3L57RuAfY/edit#slide=id.gf0d4a04c0e_2_75) + +# On premise + +## data & env + +- [링크](https://drive.google.com/drive/folders/16BYXTck28c4Lvz8ps31atB8zfaBtHlW0?usp=sharing)에서 mnist data를 다운받아 준비합니다. +- postgres는 [phase1상태](phase1.md)와 같이 준비되어야 합니다. +- enviorment variable를 .env파일에 포함시켜 줍니다. +```plain +POSTGRES_USER=postgres +POSTGRES_PASSWORD=0000 +POSTGRES_SERVER=localhost +POSTGRES_PORT=5431 +POSTGRES_DB=postgres +MLFLOW_HOST=http://localhost:5000 +TRAIN_MNIST=/절대/경로/mnist_train.csv +VALID_MNIST=/절대/경로/mnist_valid.csv +``` + +## project + +0. data&env 단계를 수행합니다. +1. 소스코드를 다운받습니다. +2. `conda create --name mlops-phase1 python=3.8` +3. `conda activate mlops-phase1` +4. `bash requirements.sh`로 필요한 라이브러리를 설치합니다. + * requirements.txt로 설치해본 결과 tfdv문제때문에 설치가 원활하지 않습니다. + * 설치가 원활하지 않다면 sh파일의 명령어를 복사해서 커맨드 창에서 설치해줍니다. (ex 윈도우환경) +5. fast api server를 실행시킵니다. + * `python main.py` +6. mlflow server를 실행시킵니다 + * `mlflow server --backend-store-uri postgresql://:@localhost:5432/postgres --default-artifact-root <저장 경로>` +7. prefect를 실행해 줍니다. + 1. `python prefect/mnist/main.py` : mnist pipeline 추가 + 2. `prefect agent local start` + - prefect 실행시 mnist의 is_cloud 파라미터를 False로 변경해줍니다. + +# k8s + +## data & env + +### data + +- data 준비 +

+ google cloud storage를 쓰지 않을 경우 +
+ + ```python + import gdown + + google_path = 'https://drive.google.com/uc?id=' + file_id = '115LZXgZA6gPQvf5FPI1b0nsnhNz5mzH0' + output_name = 'data_mnist_train.csv' + gdown.download(google_path+file_id,output_name,quiet=False) + google_path = 'https://drive.google.com/uc?id=' + file_id = '1ExfRt-4YfbP8gOAXfudlR6Lt7PbPhJzs' + output_name = 'data_mnist_valid.csv' + gdown.download(google_path+file_id,output_name,quiet=False) + ``` + +
+
+ + +
+ google cloud storage를 사용할 경우 +
+ + ```python + def insert_info(): + insert_q = """ + INSERT INTO data_info ( + path, + exp_name, + version, + data_from + ) VALUES ( + '{}', + '{}', + {}, + '{}' + ) + """ + + engine.execute(insert_q.format( + 'data/mnist_train.csv', + 'mnist', + 1, + 'mnist_company' + )) + engine.execute(insert_q.format( + 'data/mnist_valid.csv', + 'mnist', + 1, + 'mnist_company' + )) + + insert_info() + ``` + + - google cloud storage에 choonsik-storage 이름으로 bucket생성 (다른이름일 경우 configmap.yaml 수정필요) + - data폴더 아래에 데이터 저장 (`configmap` : CLOUD_TRAIN_MNIST: data/mnist_train.csv) + - db에 cloud storage에 있는 data에 대한 정보 기록 +
+
+ +### kubernetes secret + +- atmos-api-key : 온도정보를 받아오는 api key +- prefect-config : [링크](https://cloud.prefect.io/user/keys) 에서 key 발급후 ~/.prefect/config.toml 에 기록 ([참고](https://docs.prefect.io/orchestration/concepts/api_keys.html#using-api-keys)) +- psql-passwd : postgresql password +- [링크](https://cloud.google.com/docs/authentication/getting-started)를 참고하여 service-account-file을 발급받고 k8s secret으로 관리 + +## Project + +0. data&env 단계를 수행합니다. +1. `cd k8s && kubectl apply -k kustomization.yaml` + +참고: [frontend](https://github.com/ehddnr301/mnist_test_FE) +# Review diff --git a/docs/phase2_trouble.md b/docs/phase2_trouble.md new file mode 100644 index 0000000..7228514 --- /dev/null +++ b/docs/phase2_trouble.md @@ -0,0 +1,42 @@ +# 삽질록 + +## NNI vs Ray 주관비교 + +### NNI + + + +- 하이퍼 파라미터 서칭을 위해 제일 처음 사용한 NNi 입니다. +- 장점 + - 파일형태로 서칭에 필요한 config.yaml과 search_space.json 파일을 작성하기때문에 쉽습니다. + - 별다른 작업없이도 자동적으로 dashboard를 제공합니다. +- 단점 (장점이었던 부분들이 단점이 되었습니다.) + - python code로만 관리되었으면 하는데 불필요한 파일작성이 필요했습니다. + - webui를 실험 실행때 자동으로 띄우는데 이를 배제하는 옵션이 존재하지 않았습니다. + +
+
+ +### NNI + + + +- 하이퍼 파라미터 서칭을 위해 제일 처음 사용한 NNi 입니다. +- 장점 + - 파일형태로 서칭에 필요한 config.yaml과 search_space.json 파일을 작성하기때문에 쉽습니다. + - 별다른 작업없이도 자동적으로 dashboard를 제공합니다. +- 단점 (장점이었던 부분들이 단점이 되었습니다.) + - python code로만 관리되었으면 하는데 불필요한 파일작성이 필요했습니다. + - webui를 실험 실행때 자동으로 띄우는데 이를 배제하는 옵션이 존재하지 않았습니다. + +
+
+ + +## 우리는 왜 Redis를 버렸나 +![](./img/api-test.png) + + +- 상당히 작은 모델임에도 불구하고 redis에 넣기전 serialize하는 작업과 +- redis에서 꺼내서 deserialize하는 작업이 오래 걸립니다. +- 이를 해결하기 위해 메모리에 모델을 그대로 올리고 일정시간이 지나면 지워주는 코드를 사용하게 되었습니다. diff --git a/k8s/configmap.yaml b/k8s/configmap.yaml new file mode 100644 index 0000000..e75a688 --- /dev/null +++ b/k8s/configmap.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-map +data: + POSTGRES_USER: postgres + POSTGRES_SERVER: pgdb + POSTGRES_PORT: "5432" + POSTGRES_DB: postgres + MLFLOW_HOST: http://mlflow-service:5000 + GOOGLE_APPLICATION_CREDENTIALS: /secret/service-account-file.json + CLOUD_STORAGE_NAME: choonsik-storage + CLOUD_TRAIN_MNIST: data/mnist_train.csv + CLOUD_VALID_MNIST: data/mnist_valid.csv diff --git a/k8s/deployments.yaml b/k8s/deployments.yaml new file mode 100644 index 0000000..a9c7f95 --- /dev/null +++ b/k8s/deployments.yaml @@ -0,0 +1,156 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgresql-app +spec: + replicas: 1 + selector: + matchLabels: + app: postgres-server + template: + metadata: + name: postgresql + labels: + app: postgres-server + spec: + containers: + - name: postgresql + image: hl8469/mlops-project:postgre + imagePullPolicy: "Always" + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: task-pv-storage + ports: + - containerPort: 5432 + protocol: TCP + volumes: + - name: task-pv-storage + persistentVolumeClaim: + claimName: task-pv-claim +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mlflow-app +spec: + replicas: 1 + selector: + matchLabels: + app: mlflow-server + template: + metadata: + name: mlflow + labels: + app: mlflow-server + spec: + containers: + - name: mlflow + image: hl8469/mlops-project:mlflow-server-1.0 + imagePullPolicy: "Always" + ports: + - containerPort: 5000 + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fastapi-app +spec: + replicas: 1 + selector: + matchLabels: + app: api-server + template: + metadata: + name: fastapi + labels: + app: api-server + spec: + containers: + - name: fastapi-backend + image: hl8469/mlops-project:api-server-1.0 + imagePullPolicy: "Always" + envFrom: + - secretRef: + name: psql-passwd + - configMapRef: + name: config-map + volumeMounts: + - name: gcs + mountPath: /secret/service-account-file.json + subPath: service-account-file.json + readOnly: true + ports: + - containerPort: 8000 + protocol: TCP + + volumes: + - name: gcs + secret: + secretName: service-account-file +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: prefect-app +spec: + replicas: 1 + selector: + matchLabels: + app: prefect-service + template: + metadata: + name: prefect + labels: + app: prefect-service + spec: + containers: + - name: prefect-worker + image: hl8469/mlops-project:prefect-worker-1.0 + imagePullPolicy: "Always" + envFrom: + - secretRef: + name: psql-passwd + - secretRef: + name: atmos-api-key + - configMapRef: + name: config-map + volumeMounts: + - name: gcs + mountPath: /secret/service-account-file.json + subPath: service-account-file.json + readOnly: true + - name: prefect-cfg + mountPath: /root/.prefect/config.toml + subPath: config.toml + + volumes: + - name: gcs + secret: + secretName: service-account-file + - name: prefect-cfg + secret: + secretName: prefect-config +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: front +spec: + replicas: 1 + selector: + matchLabels: + app: front-app + template: + metadata: + name: front + labels: + app: front-app + spec: + containers: + - name: front-worker + image: ehddnr/mnist_front:1.0.0 + imagePullPolicy: "Always" + ports: + - containerPort: 3000 + protocol: TCP diff --git a/k8s/kustomization.yaml b/k8s/kustomization.yaml new file mode 100644 index 0000000..11277e7 --- /dev/null +++ b/k8s/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - service.yaml + - deployments.yaml + - configmap.yaml + - pv-pvc.yaml diff --git a/k8s/prepi_deployments.yaml b/k8s/prepi_deployments.yaml new file mode 100644 index 0000000..c0fa5b5 --- /dev/null +++ b/k8s/prepi_deployments.yaml @@ -0,0 +1,82 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fastapi-app +spec: + replicas: 1 + selector: + matchLabels: + app: api-server + template: + metadata: + name: fastapi + labels: + app: api-server + spec: + containers: + - name: fastapi-backend + image: hl8469/mlops-project:api-server-1.0 + imagePullPolicy: "Always" + envFrom: + - secretRef: + name: psql-passwd + - configMapRef: + name: config-map + volumeMounts: + - name: gcs + mountPath: /secret/service-account-file.json + subPath: service-account-file.json + readOnly: true + ports: + - containerPort: 8000 + protocol: TCP + + volumes: + - name: gcs + secret: + secretName: service-account-file +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: prefect-app +spec: + replicas: 1 + selector: + matchLabels: + app: prefect-service + template: + metadata: + name: prefect + labels: + app: prefect-service + spec: + containers: + - name: prefect-worker + image: hl8469/mlops-project:prefect-worker-1.0 + imagePullPolicy: "Always" + envFrom: + - secretRef: + name: psql-passwd + - secretRef: + name: atmos-api-key + - configMapRef: + name: config-map + volumeMounts: + - name: gcs + mountPath: /secret/service-account-file.json + subPath: service-account-file.json + readOnly: true + - name: prefect-cfg + mountPath: /root/.prefect/config.toml + subPath: config.toml + + volumes: + - name: gcs + secret: + secretName: service-account-file + - name: prefect-cfg + secret: + secretName: prefect-config + nodeSelector: + kubernetes.io/hostname: cd-test-3 \ No newline at end of file diff --git a/k8s/pv-pvc.yaml b/k8s/pv-pvc.yaml new file mode 100644 index 0000000..8296d2a --- /dev/null +++ b/k8s/pv-pvc.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: task-pv-volume +spec: + storageClassName: postgres-data + capacity: + storage: 3Gi + accessModes: + - ReadWriteMany + hostPath: + path: /home/choonsik/pg_data +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: task-pv-claim +spec: + storageClassName: postgres-data + accessModes: + - ReadWriteMany + resources: + requests: + storage: 3Gi \ No newline at end of file diff --git a/k8s/service.yaml b/k8s/service.yaml new file mode 100644 index 0000000..6368107 --- /dev/null +++ b/k8s/service.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: Service +metadata: + name: mlops-service +spec: + ports: + - name: web-port + port: 8000 + targetPort: 8000 + nodePort: 32105 + selector: + app: api-server + type: NodePort +--- +apiVersion: v1 +kind: Service +metadata: + name: mlflow-service +spec: + ports: + - name: mlflow-port + port: 5000 + targetPort: 5000 + nodePort: 32205 + selector: + app: mlflow-server + type: NodePort +--- +apiVersion: v1 +kind: Service +metadata: + name: pgdb +spec: + ports: + - name: db-port + port: 5432 + targetPort: 5432 + selector: + app: postgres-server + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: front-service +spec: + ports: + - name: front-port + port: 3000 + targetPort: 3000 + nodePort: 32222 + selector: + app: front-app + type: NodePort \ No newline at end of file diff --git a/main.py b/main.py index d0f3693..3d479f1 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from app.api.router import predict, train +from app.api.router import predict app = FastAPI() @@ -17,12 +17,11 @@ ) app.include_router(predict.router) -app.include_router(train.router) @app.get("/") def hello_world(): - return {"message": "Hello World"} + return {"message": "Hi I'm choonsik!"} if __name__ == "__main__": diff --git a/prefect/atmos_tmp_pipeline/main.py b/prefect/atmos_tmp_pipeline/main.py new file mode 100644 index 0000000..51769b3 --- /dev/null +++ b/prefect/atmos_tmp_pipeline/main.py @@ -0,0 +1,8 @@ +from pipeline import atmos_ETL +from prefect import Client + + +if __name__ == '__main__': + Client().create_project(project_name='atmos_test') + Pipeline = atmos_ETL("atmos_test", "atmos_mlrt", "0 */6 * * *") + Pipeline.create_flow() \ No newline at end of file diff --git a/prefect/atmos_tmp_pipeline/pipeline.py b/prefect/atmos_tmp_pipeline/pipeline.py new file mode 100644 index 0000000..fa2a728 --- /dev/null +++ b/prefect/atmos_tmp_pipeline/pipeline.py @@ -0,0 +1,83 @@ +import prefect +from prefect import Flow +from task import * +from prefect.schedules import Schedule +from prefect.schedules.clocks import CronClock +from prefect.run_configs import LocalRun + + +class atmos_ETL: + _project_name = None + _flow_name = None + _logger = None + _flow = None + + + def __init__(self, project_name, flow_name, schedule=None): + self._logger = prefect.context.get("logger") + self._project_name = project_name + self._flow_name = flow_name + self._schedule = schedule + + def create_flow(self): + self._logger.info(f"Create {self._flow_name} flow") + + with Flow(self._flow_name) as flow: + self._logger.info('start data extract') + + host_url = os.getenv('MLFLOW_HOST') + exp_name = "atmos_tmp" + metric = "mae" + model_type = "tensorflow" + num_trials = 10 + + extr_result = data_extract(os.getenv('ATMOS_API_KEY')) + valid_result = data_validation(extr_result[1]) + load_data = data_load_to_db(valid_result[1], + os.getenv("POSTGRES_USER"), + os.getenv("POSTGRES_SERVER"), + os.getenv("POSTGRES_PASSWORD")) + is_end = train_mlflow_ray(load_data, + host_url, + exp_name, + metric, + num_trials) + log_best_model(is_end, host_url, exp_name, metric, model_type) + + flow.run_config = LocalRun(working_dir="prefect/atmos_tmp_pipeline") + self._flow = flow + self._register() + + + def _register(self): + self._logger.info( + f"Regist {self._flow_name} flow to {self._project_name} project" + ) + self._logger.info(f"Set Cron {self._schedule}") + + if self._schedule: + self._set_cron() + + self._flow.register( + project_name=self._project_name, + idempotency_key=self.flow.serialized_hash() + ) + + + def _set_cron(self): + schedule = Schedule(clocks=[CronClock(self._schedule)]) + self._flow.schedule = schedule + + + @property + def flow(self): + return self._flow + + @property + def project_name(self): + return self._project_name + + @property + def flow_name(self): + return self._flow_name + diff --git a/prefect/atmos_tmp_pipeline/query.py b/prefect/atmos_tmp_pipeline/query.py new file mode 100644 index 0000000..8322b5e --- /dev/null +++ b/prefect/atmos_tmp_pipeline/query.py @@ -0,0 +1,32 @@ +INSERT_BEST_MODEL = """ + INSERT INTO best_model_data ( + model_name, + run_id, + model_type, + metric, + metric_score + ) VALUES ( + '{}', + '{}', + '{}', + '{}', + {} + ) + """ + +SELECT_EXIST_MODEL = """ + SELECT * + FROM best_model_data + WHERE model_name = '{}' +""" + +UPDATE_BEST_MODEL = """ + UPDATE best_model_data + SET + run_id = '{}', + model_type = '{}', + metric = '{}', + metric_score = {} + WHERE + model_name = '{}' +""" diff --git a/prefect/atmos_tmp_pipeline/task.py b/prefect/atmos_tmp_pipeline/task.py new file mode 100644 index 0000000..b94f8f5 --- /dev/null +++ b/prefect/atmos_tmp_pipeline/task.py @@ -0,0 +1,193 @@ +import requests +import os +from utils import * +import sqlalchemy +import pandas as pd +from datetime import timedelta +import tensorflow_data_validation as tfdv +import prefect +from prefect import task +from prefect.tasks.prefect.flow_run_cancel import CancelFlowRun +import mlflow + + +@task +def data_extract(api_key): + logger = prefect.context.get("logger") + + timenow = pd.Timestamp.utcnow()\ + .tz_convert("Asia/Seoul")\ + .strftime("%Y-%m-%d %H:%M") + logger.info(f"{timenow}(KST): start data ETL process") + + start_date = get_st_date() + start_date = pd.to_datetime(start_date) + timedelta(hours=1) + end_date = pd.Timestamp.utcnow() - timedelta(hours=15) + endpoint = "http://apis.data.go.kr/1360000/AsosHourlyInfoService/getWthrDataList" + + stt_date_str = start_date.strftime('%Y-%m-%d') + end_date_str = end_date.strftime('%Y-%m-%d') + + if start_date > pd.to_datetime(end_date_str + " 23:00"): + up_to_date = 'data is already up to date' + logger.info(up_to_date) + CFR = CancelFlowRun() + CFR.run() + return False + + date_range = [start_date, + *pd.date_range(stt_date_str, + end_date_str)[1:]] + logger.info(date_range) + + atmos_data = [] + for dr in date_range: + req_url = (f"{endpoint}?serviceKey={api_key}" + f"&numOfRows=24&dataType=JSON&dataCd=ASOS&dateCd=HR" + f"&startDt={dr.strftime('%Y%m%d')}&startHh={dr.hour:>02}" + f"&endDt={dr.strftime('%Y%m%d')}&endHh=23&stnIds=108") + + resp = requests.get(req_url) + logger.info(f"{resp}: {dr}") + + if not resp.ok: + logger.error(f"status code: {resp.status_code}") + logger.error(f"request error: {resp.text}") + break + + try: + json_file = resp.json() + json_data = json_file['response']['body']['items']['item'] + except Exception as e: + logger.info(f"response text: {resp.text}") + logger.error(e) + break + + raw_data = list(map(lambda x: x.values(), json_data)) + atmos_data.extend(raw_data) + + if not atmos_data: + logger.error("failed to request data") + CFR = CancelFlowRun() + CFR.run() + return False + + atmos_df = pd.DataFrame(atmos_data, + columns = json_data[0].keys()) + atmos_df = atmos_df[['tm', 'ta', 'rn', 'wd', 'ws', 'pa', 'ps', 'hm']] + atmos_df.columns = ['time', 'tmp', 'precip', 'wd', 'ws', 'p', 'mslp', 'rh'] + + atmos_df['precip'] = atmos_df['precip'].apply(lambda x: 0 if not x else x) + atmos_df['time'] = pd.to_datetime(atmos_df['time']) + atmos_df.iloc[:, 1:] = atmos_df.iloc[:, 1:].astype(float) + + return True, atmos_df + + +@task +def data_validation(new_data): + + logger = prefect.context.get("logger") + logger.info((f"data type: {type(new_data)}\n\r" + f"data shape: {new_data.shape}")) + + start_date = get_st_date() + org_data = get_org_data(start_date) + org_stats = tfdv.generate_statistics_from_dataframe(org_data) + new_stats = tfdv.generate_statistics_from_dataframe(new_data) + + org_schema = tfdv.infer_schema(org_stats) + + for i in org_data.keys()[1:]: + temp=tfdv.get_feature(org_schema, i) + temp.drift_comparator.infinity_norm.threshold = 0.01 + + drift_anomaly = tfdv.validate_statistics(statistics=new_stats, + schema=org_schema, + previous_statistics=org_stats) + + drift_stats = [] + for anm in drift_anomaly.drift_skew_info: + if anm.drift_measurements[0].value > anm.drift_measurements[0].threshold: + drift_stats.append(anm) + logger.info(f"data drift vars: {drift_stats}") + + if not drift_stats: + logger.info(True) + return True, new_data + else: + logger.info(False) + logger.info(drift_stats) + CFR = CancelFlowRun() + CFR.run() + return False + + +@task +def data_load_to_db(new_data, ps_user, ps_host, ps_pw): + logger = prefect.context.get("logger") + logger.info((f"data type: {type(new_data)}\n\r" + f"data shape: {new_data.shape}")) + try: + load_to_db(new_data) + logger.info("data has been saved successfully!") + return True + except Exception as e: + logger.error(e) + CFR = CancelFlowRun() + CFR.run() + return False + + +@task +def train_mlflow_ray(load_data_suc, host_url, exp_name, metric, num_trials): + mlflow.set_tracking_uri(host_url) + mlflow.set_experiment(exp_name) + + it = AtmosTuner( + host_url=host_url, exp_name=exp_name, metric=metric + ) + it.exec(num_trials=num_trials) + + return True + + +@task +def log_best_model(is_end, host_url, exp_name, metric, model_type): + mlflow.set_tracking_uri(host_url) + + client = MlflowClient() + exp_id = client.get_experiment_by_name(exp_name).experiment_id + runs = mlflow.search_runs([exp_id]) + + best_score = runs["metrics.mae"].min() + best_run = runs[runs["metrics.mae"] == best_score] + run_id = best_run.run_id.item() + + save_best_model( + run_id, + model_type, + metric, + metric_score=best_score, + model_name=exp_name, + ) + + +# if __name__ == '__main__': +# host_url = os.getenv('MLFLOW_HOST') +# exp_name = "atmos_tmp" +# metric = "mae" +# model_type = "tensorflow" +# num_trials = 10 +# extr_result = data_extract(os.getenv('ATMOS_API_KEY')) +# valid_result = data_validation(extr_result[1]) +# load_data = data_load_to_db(valid_result[1], +# os.getenv("POSTGRES_USER"), +# os.getenv("POSTGRES_SERVER"), +# os.getenv("POSTGRES_PASSWORD")) +# is_end = train_mlflow_ray(load_data, +# host_url, +# exp_name, +# metric, +# num_trials) +# log_best_model(is_end, host_url, exp_name, metric, model_type) \ No newline at end of file diff --git a/prefect/atmos_tmp_pipeline/utils.py b/prefect/atmos_tmp_pipeline/utils.py new file mode 100644 index 0000000..938d4f5 --- /dev/null +++ b/prefect/atmos_tmp_pipeline/utils.py @@ -0,0 +1,273 @@ +from abc import ABC, abstractmethod +from dotenv import load_dotenv +import os +import sqlalchemy +import pandas as pd + +import numpy as np +import pandas as pd +from tensorflow import keras +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Dense +from tensorflow.keras.callbacks import EarlyStopping +from tensorflow.keras.layers import GRU +from sklearn.metrics import mean_absolute_error, mean_squared_error +from sklearn.model_selection import train_test_split +from ray import tune +import mlflow +from mlflow.tracking import MlflowClient +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, TensorSpec +from query import INSERT_BEST_MODEL, SELECT_EXIST_MODEL, UPDATE_BEST_MODEL + + +def connect(db): + """Returns a connection and a metadata object""" + + load_dotenv(verbose=True) + + POSTGRES_USER = os.getenv("POSTGRES_USER") + POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD") + POSTGRES_SERVER = os.getenv("POSTGRES_SERVER") + POSTGRES_PORT = os.getenv("POSTGRES_PORT") + POSTGRES_DB = db + + url = f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_SERVER}:{POSTGRES_PORT}/{POSTGRES_DB}" + + connection = sqlalchemy.create_engine(url) + + return connection + +conn = connect('postgres') +load_dotenv(verbose=True) + +def load_to_db(data): + data.to_sql("atmos_stn108", conn, index=False, if_exists='append') + + +def get_st_date(): + start_date = conn.execute( + "SELECT time FROM atmos_stn108 ORDER BY time DESC;" + ).fetchone()[0] + return start_date + + +def get_org_data(start_date): + org_data_query = f""" + SELECT * + FROM atmos_stn108 + WHERE time < '{start_date}'; + """ + org_data = pd.read_sql(org_data_query, conn) + return org_data + + +def preprocess(data): + # missing data + data = data.fillna(method="ffill") + + # etc. + + return data + + +class Tuner(ABC): + def __init__(self): + self.model = None + self.data_X = None + self.data_y = None + self.config = None + + + def _split(self, test_size): + """ + self.data_X, self.data_y 를 split + data_X와 data_y는 상속받은 class에서 값을 받게 되어있음. + """ + train_X, valid_X, train_y, valid_y = train_test_split( + self.data_X, + self.data_y, + test_size=test_size, + ) + + return train_X, valid_X, train_y, valid_y + + + def _split_ts(self, data, label, window_size=365, predsize=None): + feature_list = [] + label_list = [] + + if isinstance(predsize, int): + for i in range(len(data) - (window_size + predsize)): + feature_list.append(np.array(data.iloc[i : i + window_size])) + label_list.append( + np.array(label.iloc[i + window_size : i + window_size + predsize]) + ) + else: + for i in range(len(data) - window_size): + feature_list.append(np.array(data.iloc[i : i + window_size])) + label_list.append(np.array(label.iloc[i + window_size])) + + return np.array(feature_list), np.array(label_list) + + + def _get_divided_index(self, data_length, ratio): + """ + return index based on ratio + -------------------------------------------------- + example + + >>> split_data(data_length = 20, ratio = [1,2,3]) + [3, 10] + -------------------------------------------------- + """ + ratio = np.cumsum(np.array(ratio) / np.sum(ratio)) + + idx = [] + for i in ratio[:-1]: + idx.append(round(data_length * i)) + + return idx + + + @abstractmethod + def exec(self): + pass + + +class AtmosTuner(Tuner): + def __init__(self, host_url, exp_name, metric): + self.host_url = host_url + self.exp_name = exp_name + self.metric = metric + self.TUNE_METRIC_DICT = {"mae": "min", + "mse": "min", + "rmse": "min"} + + + def _log_experiments(self, config, metrics, tf_model): + best_score = None + mlflow.set_tracking_uri(self.host_url) + + client = MlflowClient() + exp_id = client.get_experiment_by_name(self.exp_name).experiment_id + runs = mlflow.search_runs([exp_id]) + + if len(runs) > 0: + try: + best_score = runs[f"metrics.{self.metric}"].min() + except Exception as e: + print(e) + + with mlflow.start_run(experiment_id=exp_id): + mlflow.log_metrics(metrics) + mlflow.log_params(config) + + if not best_score or best_score > metrics[self.metric]: + print("log model") + input_schema = Schema([TensorSpec(np.dtype(np.float), (-1, 72, 1))]) + output_schema = Schema([TensorSpec(np.dtype(np.float32), (-1, 24))]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + mlflow.keras.log_model(tf_model, + signature = signature, + artifact_path = "model") + + + def _trainable(self, config): + data = pd.read_sql("select tmp \ + from atmos_stn108 \ + where time > '2020-12-31 23:00';", conn) + data = preprocess(data) + train_feature, train_label = self._split_ts(data, data, 72, 24) + + idx = self._get_divided_index(train_feature.shape[0], [6, 3, 1]) + X_train, X_valid, X_test = ( + train_feature[: idx[0]], + train_feature[idx[0] : idx[1]], + train_feature[idx[1] :], + ) + y_train, y_valid, y_test = ( + train_label[: idx[0]], + train_label[idx[0] : idx[1]], + train_label[idx[1] :], + ) + + model = Sequential() + for layer in range(config["layer_n"]): + if layer == config["layer_n"] - 1: + model.add(GRU(config["cell"])) + else: + model.add( + GRU( + config["cell"], + return_sequences=True, + input_shape=[None, train_feature.shape[2]], + ) + ) + model.add(Dense(24)) + + model.compile(loss=self.metric, optimizer=keras.optimizers.Adam(lr=0.001)) + early_stop = EarlyStopping(monitor="val_loss", patience=5) + + model.fit( + X_train, + y_train, + epochs=2, + batch_size=128, + validation_data=(X_valid, y_valid), + callbacks=[early_stop], + ) + + y_true = y_test.reshape(y_test.shape[0], y_test.shape[1]) + y_hat = model.predict(X_test) + + mae = mean_absolute_error(y_true, y_hat) + mse = mean_squared_error(y_true, y_hat) + + return {"mae":mae, "mse":mse}, model + + + def _run(self, config): + metrics, tf_model = self._trainable(config) + + self._log_experiments(config, metrics, tf_model) + tune.report(**metrics) + + + def exec(self, tune_config=None, num_trials=1): + DEFAULT_CONFIG = { + "layer_n": tune.randint(2, 3), + "cell": tune.randint(24, 30) + } + + config = tune_config if tune_config else DEFAULT_CONFIG + tune.run( + self._run, + config=config, + metric=self.metric, + mode=self.TUNE_METRIC_DICT[self.metric], + num_samples=num_trials, + ) + +def save_best_model( + run_id, model_type, metric, metric_score, model_name +): + + exist_model = conn.execute( + SELECT_EXIST_MODEL.format(model_name) + ).fetchone() + + # 업데이트 + if exist_model and exist_model.metric_score >= metric_score: + conn.execute( + UPDATE_BEST_MODEL.format( + run_id, model_type, metric, metric_score, model_name + ) + ) + else: # 생성 + conn.execute( + INSERT_BEST_MODEL.format( + model_name, run_id, model_type, metric, metric_score + ) + ) \ No newline at end of file diff --git a/prefect/insurance/Pipeline.py b/prefect/insurance/Pipeline.py new file mode 100644 index 0000000..5f71cdd --- /dev/null +++ b/prefect/insurance/Pipeline.py @@ -0,0 +1,91 @@ +from mlflow.entities import experiment +from prefect.run_configs.local import LocalRun +from prefect.schedules.schedules import CronSchedule +from task import etl, log_best_model, train_mlflow_ray + +import prefect +from prefect import Flow, Parameter + + +class Pipeline: + _project_name = None + _flow_name = None + _logger = None + _flow = None + + """ + _param1 = Parameter("data_path", default="default_path") + _param2 = Parameter("model_name", default="GPN") + """ + + def __init__(self, project_name, flow_name, schedule=None): + self._logger = prefect.context.get("logger") + self._logger.info("Create Pipeline") + + self._project_name = project_name + self._flow_name = flow_name + self._schedule = schedule + + def create_flow(self): + self._logger.info(f"Create {self._flow_name} flow") + with Flow(self._flow_name) as flow: + """ + + data = load_data(self._param1) + prep_data = preprocess(data) + model = train(self._param2, prep_data) + save_model(model) + + """ + extract_query = Parameter( + "extract_query", "SELECT * FROM insurance" + ) + + host_url = Parameter("host_url", "http://mlflow-service:5000") + exp_name = Parameter("exp_name", "insurance") + metric = Parameter("metric", "mae") + model_type = Parameter("model_type", "xgboost") + num_trials = Parameter("num_trials", 10) + + X, y = etl(extract_query) + + is_end = train_mlflow_ray( + X, y, host_url, exp_name, metric, num_trials + ) + + if is_end: + log_best_model(is_end, host_url, exp_name, metric, model_type) + + flow.run_config = LocalRun(working_dir="prefect/insurance") + + self._flow = flow + self._register() + + def _register(self): + self._logger.info( + f"Regist {self._flow_name} flow to {self._project_name} project" + ) + self._logger.info(f"Set Cron {self._schedule}") + + self._flow.register( + project_name=self._project_name, + idempotency_key=self.flow.serialized_hash(), + ) + + if self._schedule: + self._set_cron() + + def _set_cron(self): + self.flow.schedule(CronSchedule(self._schedule)) + + @property + def flow(self): + return self._flow + + @property + def project_name(self): + return self._project_name + + @property + def flow_name(self): + return self._flow_name diff --git a/prefect/insurance/db.py b/prefect/insurance/db.py new file mode 100644 index 0000000..bb65534 --- /dev/null +++ b/prefect/insurance/db.py @@ -0,0 +1,23 @@ +import pandas as pd +import sqlalchemy +import os + + +def connect(db): + """Returns a connection and a metadata object""" + + POSTGRES_USER = os.getenv("POSTGRES_USER") + POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD") + POSTGRES_SERVER = os.getenv("POSTGRES_SERVER") + POSTGRES_PORT = os.getenv("POSTGRES_PORT") + POSTGRES_DB = db + + url = f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_SERVER}:{POSTGRES_PORT}/{POSTGRES_DB}" + + connection = sqlalchemy.create_engine(url) + + return connection + + +POSTGRES_DB = os.getenv("POSTGRES_DB") +engine = connect(POSTGRES_DB) \ No newline at end of file diff --git a/prefect/insurance/main.py b/prefect/insurance/main.py new file mode 100644 index 0000000..29ea4bb --- /dev/null +++ b/prefect/insurance/main.py @@ -0,0 +1,9 @@ +from Pipeline import Pipeline +from prefect.schedules.clocks import CronClock + +from prefect import Client + +if __name__ == "__main__": + Client().create_project(project_name="insurance") + pipeline = Pipeline("insurance", "insurance_flow") + pipeline.create_flow() diff --git a/prefect/insurance/query.py b/prefect/insurance/query.py new file mode 100644 index 0000000..8322b5e --- /dev/null +++ b/prefect/insurance/query.py @@ -0,0 +1,32 @@ +INSERT_BEST_MODEL = """ + INSERT INTO best_model_data ( + model_name, + run_id, + model_type, + metric, + metric_score + ) VALUES ( + '{}', + '{}', + '{}', + '{}', + {} + ) + """ + +SELECT_EXIST_MODEL = """ + SELECT * + FROM best_model_data + WHERE model_name = '{}' +""" + +UPDATE_BEST_MODEL = """ + UPDATE best_model_data + SET + run_id = '{}', + model_type = '{}', + metric = '{}', + metric_score = {} + WHERE + model_name = '{}' +""" diff --git a/prefect/insurance/task.py b/prefect/insurance/task.py new file mode 100644 index 0000000..1bed869 --- /dev/null +++ b/prefect/insurance/task.py @@ -0,0 +1,236 @@ +import os +import random +from abc import ABC, abstractmethod + +import mlflow +import pandas as pd +import xgboost as xgb +from db import engine +from mlflow.tracking import MlflowClient +from query import INSERT_BEST_MODEL, SELECT_EXIST_MODEL, UPDATE_BEST_MODEL +from ray import tune +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import LabelEncoder, StandardScaler + +from prefect import task + + +class ETL: + def __init__(self, data_extract_query): + self.df = None + self.data_extract_query = data_extract_query + + def _extract(self): + self.df = pd.read_sql(self.data_extract_query, engine) + + def _scaling(self, scale_list, scaler): + self.df.loc[:, scale_list] = scaler().fit_transform( + self.df.loc[:, scale_list] + ) + + def _encoder(self, enc_list, encoder): + for col in enc_list: + self.df.loc[:, col] = encoder().fit_transform(self.df.loc[:, col]) + + def _load(self): + return self.df.iloc[:, :-1].values, self.df.iloc[:, -1].values + + def exec(self, *args): + self._extract() + if args is not None: + for trans_list, transformer in args: + if "encoder" in transformer.__name__.lower(): + self._encoder(trans_list, transformer) + elif "scaler" in transformer.__name__.lower(): + self._scaling(trans_list, transformer) + else: + break + return self._load() + + +class Tuner(ABC): + def __init__(self): + self.model = None + self.data_X = None + self.data_y = None + self.config = None + + def _split(self, test_size): + """ + self.data_X, self.data_y 를 split + data_X와 data_y는 상속받은 class에서 값을 받게 되어있음. + """ + train_X, valid_X, train_y, valid_y = train_test_split( + self.data_X, + self.data_y, + test_size=test_size, + ) + + return train_X, valid_X, train_y, valid_y + + @abstractmethod + def exec(self): + pass + + +class InsuranceTuner(Tuner): + def __init__(self, data_X, data_y, host_url, exp_name, metric): + self.host_url = host_url + self.exp_name = exp_name + self.metric = metric + self.data_X = data_X + self.data_y = data_y + self.TUNE_METRIC_DICT = {"mae": "min", "mse": "min", "rmse": "min"} + + def _log_experiments(self, config, metrics, xgb_model): + best_score = None + mlflow.set_tracking_uri(self.host_url) + + client = MlflowClient() + exp_id = client.get_experiment_by_name(self.exp_name).experiment_id + runs = mlflow.search_runs([exp_id]) + + if len(runs) > 0: + try: + best_score = runs[f"metrics.{self.metric}"].min() + except Exception as e: + print(e) + + with mlflow.start_run(experiment_id=exp_id): + mlflow.log_metrics(metrics) + mlflow.log_params(config) + + if not best_score or best_score > metrics[self.metric]: + print("log model") + mlflow.xgboost.log_model( + xgb_model, + artifact_path="model", + ) + + def _trainable(self, config): + train_x, test_x, train_y, test_y = super()._split(0.2) + train_set = xgb.DMatrix(train_x, label=train_y) + test_set = xgb.DMatrix(test_x, label=test_y) + + results = {} + xgb_model = xgb.train( + config, + train_set, + evals=[(test_set, "eval")], + evals_result=results, + verbose_eval=False, + ) + return results["eval"], xgb_model + + def _run(self, config): + results, xgb_model = self._trainable(config) + + metrics = { + "mae": min(results["mae"]), + "rmse": min(results["rmse"]), + } + + self._log_experiments(config, metrics, xgb_model) + tune.report(**metrics) + + def exec(self, tune_config=None, num_trials=1): + DEFAULT_CONFIG = { + "objective": "reg:squarederror", + "eval_metric": ["mae", "rmse"], + "max_depth": tune.randint(1, 9), + "min_child_weight": tune.choice([1, 2, 3]), + "subsample": tune.uniform(0.5, 1.0), + "eta": tune.loguniform(1e-4, 1e-1), + } + + config = tune_config if tune_config else DEFAULT_CONFIG + tune.run( + self._run, + config=config, + metric=self.metric, + mode=self.TUNE_METRIC_DICT[self.metric], + num_samples=num_trials, + ) + + +def save_best_model(run_id, model_type, metric, metric_score, model_name): + + exist_model = engine.execute( + SELECT_EXIST_MODEL.format(model_name) + ).fetchone() + + # 업데이트 + if exist_model and exist_model.metric_score >= metric_score: + engine.execute( + UPDATE_BEST_MODEL.format( + run_id, model_type, metric, metric_score, model_name + ) + ) + else: # 생성 + engine.execute( + INSERT_BEST_MODEL.format( + model_name, run_id, model_type, metric, metric_score + ) + ) + + +@task(nout=2) +def etl(query): + etl = ETL(query) + + label_encode = [["sex", "smoker", "region"], LabelEncoder] + standard_scale = [["age", "bmi", "children"], StandardScaler] + + X, y = etl.exec(label_encode, standard_scale) + + return X, y + + +@task +def train_mlflow_ray(X, y, host_url, exp_name, metric, num_trials): + mlflow.set_tracking_uri(host_url) + mlflow.set_experiment(exp_name) + + it = InsuranceTuner( + data_X=X, data_y=y, host_url=host_url, exp_name=exp_name, metric=metric + ) + it.exec(num_trials=num_trials) + + return True + + +@task +def log_best_model(is_end, host_url, exp_name, metric, model_type): + mlflow.set_tracking_uri(host_url) + + client = MlflowClient() + exp_id = client.get_experiment_by_name(exp_name).experiment_id + runs = mlflow.search_runs([exp_id]) + + best_score = runs["metrics.mae"].min() + best_run = runs[runs["metrics.mae"] == best_score] + run_id = best_run.run_id.item() + + save_best_model( + run_id, + model_type, + metric, + metric_score=best_score, + model_name=exp_name, + ) + + +# if __name__ == "__main__": +# extract_query = "SELECT * FROM insurance" +# host_url = "http://localhost:5001" +# exp_name = "insurance" +# metric = "mae" +# model_type = "xgboost" +# num_trials = 1 + +# X, y = etl(extract_query) +# is_end = train_mlflow_ray(X, y, host_url, exp_name, metric, num_trials) + +# if is_end: +# log_best_model(is_end, host_url, exp_name, metric, model_type) diff --git a/prefect/mnist/Pipeline.py b/prefect/mnist/Pipeline.py new file mode 100644 index 0000000..e026ad6 --- /dev/null +++ b/prefect/mnist/Pipeline.py @@ -0,0 +1,100 @@ +from prefect.run_configs import LocalRun +from prefect.schedules.schedules import CronSchedule +from task import ( + case2, + log_experiment, + make_feature_weight, + train_knn, + tune_cnn, +) + +import prefect +from prefect import Flow, Parameter, case + + +class Pipeline: + _project_name = None + _flow_name = None + _logger = None + _flow = None + + """ + _param1 = Parameter("data_path", default="default_path") + _param2 = Parameter("model_name", default="GPN") + """ + + def __init__(self, project_name, flow_name, schedule=None): + self._logger = prefect.context.get("logger") + self._logger.info("Create Pipeline") + + self._project_name = project_name + self._flow_name = flow_name + self._schedule = schedule + + def create_flow(self): + self._logger.info(f"Create {self._flow_name} flow") + with Flow(self._flow_name) as flow: + """ + + data = load_data(self._param1) + prep_data = preprocess(data) + model = train(self._param2, prep_data) + save_model(model) + + """ + + host_url = Parameter("host_url", "http://mlflow-service:5000") + exp_name = Parameter("exp_name", "mnist") + metric = Parameter("metric", "loss") + num_samples = Parameter("num_samples", 1) + max_num_epochs = Parameter("max_num_epochs", 1) + is_cloud = Parameter("is_cloud", True) + data_version = Parameter("data_version", 3) + + results = tune_cnn( + num_samples, max_num_epochs, is_cloud, data_version, exp_name + ) + is_end = log_experiment( + results, host_url, exp_name, metric, data_version, is_cloud + ) + + with case(is_end, True): + feature_weight_df = make_feature_weight( + results, "cpu", is_cloud, data_version, exp_name + ) + train_knn(feature_weight_df, metric, exp_name) + + with case(is_end, False): + case2() + flow.run_config = LocalRun(working_dir="prefect/mnist") + self._flow = flow + self._register() + + def _register(self): + self._logger.info( + f"Regist {self._flow_name} flow to {self._project_name} project" + ) + self._logger.info(f"Set Cron {self._schedule}") + + self._flow.register( + project_name=self._project_name, + idempotency_key=self.flow.serialized_hash(), + ) + + if self._schedule: + self._set_cron() + + def _set_cron(self): + self.flow.schedule((self._schedule)) + + @property + def flow(self): + return self._flow + + @property + def project_name(self): + return self._project_name + + @property + def flow_name(self): + return self._flow_name diff --git a/prefect/mnist/main.py b/prefect/mnist/main.py new file mode 100644 index 0000000..86134f9 --- /dev/null +++ b/prefect/mnist/main.py @@ -0,0 +1,9 @@ +from Pipeline import Pipeline +from prefect.schedules.clocks import CronClock + +from prefect import Client + +if __name__ == "__main__": + Client().create_project(project_name="mnist") + pipeline = Pipeline("mnist", "mnist_flow") + pipeline.create_flow() diff --git a/prefect/mnist/model.py b/prefect/mnist/model.py new file mode 100644 index 0000000..ac4c09e --- /dev/null +++ b/prefect/mnist/model.py @@ -0,0 +1,29 @@ +import torch + + +class MnistNet(torch.nn.Module): + def __init__(self, l1): + super(MnistNet, self).__init__() + self.layer1 = torch.nn.Sequential( + torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1), + torch.nn.ReLU(), + torch.nn.MaxPool2d(kernel_size=2, stride=2), + ) + self.layer2 = torch.nn.Sequential( + torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), + torch.nn.ReLU(), + torch.nn.MaxPool2d(kernel_size=2, stride=2), + ) + self.flatten = torch.nn.Flatten() + self.fc = torch.nn.Linear(7 * 7 * 64, l1, bias=True) + self.fc2 = torch.nn.Linear(l1, 32, bias=True) + self.last_layer = torch.nn.Linear(32, 10, bias=True) + + def forward(self, x): + out = self.layer1(x) + out = self.layer2(out) + out = self.flatten(out) + out = self.fc(out) + out = self.fc2(out) + out = self.last_layer(out) + return out diff --git a/prefect/mnist/query.py b/prefect/mnist/query.py new file mode 100644 index 0000000..8322b5e --- /dev/null +++ b/prefect/mnist/query.py @@ -0,0 +1,32 @@ +INSERT_BEST_MODEL = """ + INSERT INTO best_model_data ( + model_name, + run_id, + model_type, + metric, + metric_score + ) VALUES ( + '{}', + '{}', + '{}', + '{}', + {} + ) + """ + +SELECT_EXIST_MODEL = """ + SELECT * + FROM best_model_data + WHERE model_name = '{}' +""" + +UPDATE_BEST_MODEL = """ + UPDATE best_model_data + SET + run_id = '{}', + model_type = '{}', + metric = '{}', + metric_score = {} + WHERE + model_name = '{}' +""" diff --git a/prefect/mnist/task.py b/prefect/mnist/task.py new file mode 100644 index 0000000..46d5708 --- /dev/null +++ b/prefect/mnist/task.py @@ -0,0 +1,236 @@ +import os +import time +from functools import partial + +import mlflow +import numpy as np +import pandas as pd +import torch +import torchvision.transforms as transforms +from dotenv import load_dotenv +from mlflow.tracking import MlflowClient +from scipy.special import softmax +from model import MnistNet +from ray import tune +from ray.tune.schedulers import ASHAScheduler +from sklearn.neighbors import KNeighborsClassifier +from mlflow.types.schema import Schema, TensorSpec +from mlflow.models.signature import ModelSignature +from torch.utils.data import DataLoader +from utils import ( + MnistDataset, + MnistNet, + cnn_training, + load_data, + save_best_model, + get_mnist_avg +) + +from prefect import task + +load_dotenv() + + +@task +def tune_cnn(num_samples, max_num_epochs, is_cloud, data_version, exp_name): + + config = { + "l1": tune.sample_from(lambda _: 2 ** np.random.randint(7, 9)), + "lr": tune.loguniform(1e-4, 1e-1), + "batch_size": tune.choice([64, 128, 256]), + } + + scheduler = ASHAScheduler( + metric="loss", + mode="min", + max_t=max_num_epochs, + grace_period=1, + reduction_factor=2, + ) + + result = tune.run( + partial( + cnn_training, + is_cloud=is_cloud, + data_version=data_version, + exp_name=exp_name, + ), + config=config, + num_samples=num_samples, + scheduler=scheduler, + ) + + return result + + +@task +def log_experiment(results, host_url, exp_name, metric, data_version, is_cloud): + mlflow.set_tracking_uri(host_url) + mlflow.set_experiment(exp_name) + client = MlflowClient() + exp = client.get_experiment_by_name(exp_name) + + best_trial = results.get_best_trial("loss", "min", "last") + train_df, valid_df = load_data(is_cloud, data_version, exp_name) + train_avg = get_mnist_avg(train_df) + valid_avg = get_mnist_avg(valid_df) + + train_avg = {f'color_avg_{k}':v for k, v in enumerate(train_avg)} + valid_avg = {f'color_avg_{k}':v for k, v in enumerate(valid_avg)} + + metrics = { + "loss": best_trial.last_result["loss"], + "accuracy": best_trial.last_result["accuracy"], + } + configs = { + "l1": best_trial.config["l1"], + "lr": best_trial.config["lr"], + "batch_size": best_trial.config["batch_size"], + "data_version": data_version, + } + result_pred = best_trial.last_result["result_pred"] + metrics.update(result_pred) + configs.update(train_avg) + configs.update(valid_avg) + best_trained_model = MnistNet(configs["l1"]) + best_checkpoint_dir = best_trial.checkpoint.value + model_state, optimizer_state = torch.load( + os.path.join(best_checkpoint_dir, "checkpoint") + ) + best_trained_model.load_state_dict(model_state) + best_trained_model = torch.jit.script(best_trained_model) + exp_id = exp.experiment_id + runs = mlflow.search_runs([exp_id]) + input_schema = Schema([ + TensorSpec(np.dtype(np.uint8), (-1, 28, 28, 1)), + ]) + output_schema = Schema([TensorSpec(np.dtype(np.float32), (-1, 10))]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + if runs.empty: + with mlflow.start_run(experiment_id=exp_id): + mlflow.log_metrics(metrics) + mlflow.log_params(configs) + mlflow.pytorch.log_model(best_trained_model, signature = signature, artifact_path="model") + + save_best_model( + exp_name, "pytorch", metric, metrics[metric], exp_name + ) + return True + else: + best_score = runs[f"metrics.{metric}"].min() + + if best_score > metrics[metric]: + with mlflow.start_run(experiment_id=exp_id): + mlflow.log_metrics(metrics) + mlflow.log_params(configs) + mlflow.pytorch.log_model( + best_trained_model, signature = signature, artifact_path="model" + ) + save_best_model( + exp_name, "pytorch", metric, metrics[metric], exp_name + ) + return True + else: + return False + + +@task +def make_feature_weight(results, device, is_cloud, data_version, exp_name): + best_trial = results.get_best_trial("loss", "min", "last") + + train_df, _ = load_data(is_cloud, data_version, exp_name) + + configs = { + "l1": best_trial.config["l1"], + "lr": best_trial.config["lr"], + "batch_size": best_trial.config["batch_size"], + } + best_trained_model = MnistNet(configs["l1"]) + best_checkpoint_dir = best_trial.checkpoint.value + model_state, _ = torch.load( + os.path.join(best_checkpoint_dir, "checkpoint") + ) + best_trained_model.load_state_dict(model_state) + best_trained_model2 = torch.nn.Sequential( + *list(best_trained_model.children())[:-1] + ) + transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))] + ) + trainset = MnistDataset(train_df, transform) + train_loader = DataLoader(trainset, batch_size=int(configs["batch_size"])) + + temp = pd.DataFrame( + columns=[f"{i}_feature" for i in range(74)], index=train_df.index + ) + batch_index = 0 + batch_size = train_loader.batch_size + optimizer = torch.optim.Adam( + best_trained_model2.parameters(), lr=configs["lr"] + ) + + for i, (mini_batch, _) in enumerate(train_loader): + add_weight = 10 + mini_batch = mini_batch.to(device) + optimizer.zero_grad() + outputs = best_trained_model2(mini_batch) + preds = best_trained_model(mini_batch) + batch_index = i * batch_size + temp.iloc[ + batch_index : batch_index + batch_size, : + ] = np.concatenate((outputs.detach().numpy(), softmax(preds.detach().numpy().astype(float)) * add_weight), axis=1) + + + temp.reset_index(inplace=True) + feature_weight_df = temp + + return feature_weight_df + + +@task +def train_knn(feature_weight_df, metric, exp_name): + KNN = KNeighborsClassifier(n_neighbors=3) + KNN.fit( + feature_weight_df.iloc[:, 1:].values, + feature_weight_df.iloc[:, 0].values, + ) + + mlflow.sklearn.log_model(KNN, artifact_path="model") + mlflow.log_param("time", time.time()) + save_best_model("mnist_knn", "sklearn", metric, 9999, exp_name, True) + + +@task +def case2(): + print("end") + + +# if __name__ == "__main__": +# # data_path = "C:\Users\TFG5076XG\Documents\MLOps\prefect\mnist\mnist.csv" +# host_url = "http://localhost:5000" +# exp_name = "mnist" +# device = "cpu" +# num_samples = 1 +# max_num_epochs = 1 +# metric = 'loss' +# is_cloud=True +# data_version = 3 + +# mlflow.set_tracking_uri(host_url) +# mlflow.set_experiment(exp_name) + +# results = tune_cnn( +# num_samples, max_num_epochs, is_cloud, data_version, exp_name +# ) +# is_end = log_experiment( +# results, host_url, exp_name, metric, data_version, is_cloud +# ) + +# if is_end: +# feature_weight_df = make_feature_weight( +# results, "cpu", is_cloud, data_version, exp_name +# ) +# train_knn(feature_weight_df, metric, exp_name) + +# else: +# print('False') diff --git a/prefect/mnist/utils.py b/prefect/mnist/utils.py new file mode 100644 index 0000000..e737bc3 --- /dev/null +++ b/prefect/mnist/utils.py @@ -0,0 +1,286 @@ +import os +from io import StringIO + +import mlflow +import numpy as np +import pandas as pd +import sqlalchemy +import torch +import torch.nn as nn +import torch.optim as optim +import torchvision.transforms as transforms +from dotenv import load_dotenv +from google.cloud import storage +from mlflow.tracking import MlflowClient +from query import INSERT_BEST_MODEL, SELECT_EXIST_MODEL, UPDATE_BEST_MODEL +from ray import tune +from torch.utils.data import DataLoader, Dataset + +load_dotenv() + + +def connect(db): + """Returns a connection and a metadata object""" + + POSTGRES_USER = os.getenv("POSTGRES_USER") + POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD") + POSTGRES_SERVER = os.getenv("POSTGRES_SERVER") + POSTGRES_PORT = os.getenv("POSTGRES_PORT") + POSTGRES_DB = db + + url = f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_SERVER}:{POSTGRES_PORT}/{POSTGRES_DB}" + + connection = sqlalchemy.create_engine(url) + + return connection + + +POSTGRES_DB = os.getenv("POSTGRES_DB") +engine = connect(POSTGRES_DB) + + +class MnistNet(torch.nn.Module): + def __init__(self, l1): + super(MnistNet, self).__init__() + self.layer1 = torch.nn.Sequential( + torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1), + torch.nn.ReLU(), + torch.nn.MaxPool2d(kernel_size=2, stride=2), + ) + self.layer2 = torch.nn.Sequential( + torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), + torch.nn.ReLU(), + torch.nn.MaxPool2d(kernel_size=2, stride=2), + ) + self.flatten = torch.nn.Flatten() + self.fc = torch.nn.Linear(7 * 7 * 64, l1, bias=True) + self.fc2 = torch.nn.Linear(l1, 64, bias=True) + self.last_layer = torch.nn.Linear(64, 10, bias=True) + + def forward(self, x): + out = self.layer1(x) + out = self.layer2(out) + out = self.flatten(out) + out = self.fc(out) + out = self.fc2(out) + out = self.last_layer(out) + return out + + +class MnistDataset(Dataset): + def __init__(self, data, transform=None): + self.data = data + self.transform = transform + + def __len__(self): + return len(self.data) + + def __getitem__(self, index): + item = self.data.iloc[index] + + image = item[1:].values.astype(np.uint8).reshape((28, 28)) + label = item[0] + + if self.transform is not None: + image = self.transform(image) + + return image, label + + +def save_best_model( + model_name, model_type, metric, metric_score, exp_name, is_knn=False +): + client = MlflowClient() + exp = client.get_experiment_by_name(exp_name) + exp_id = exp.experiment_id + runs = mlflow.search_runs([exp_id]) + best_score = runs[f"metrics.{metric}"].min() + best_run = runs[runs[f"metrics.{metric}"] == best_score] + run_id = best_run.run_id.item() + if is_knn: + recent_knn = ( + runs[~runs["params.time"].isna()]["params.time"] + .astype(float) + .max() + ) + run_id = runs[runs["params.time"] == str(recent_knn)]["run_id"].item() + + exist_model = engine.execute( + SELECT_EXIST_MODEL.format(model_name) + ).fetchone() + + if exist_model and exist_model.metric_score >= metric_score: + engine.execute( + UPDATE_BEST_MODEL.format( + run_id, model_type, metric, metric_score, model_name + ) + ) + else: + engine.execute( + INSERT_BEST_MODEL.format( + model_name, run_id, model_type, metric, metric_score + ) + ) + + +def load_data_cloud(bucket_name, data_path): + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(data_path) + + bytes_data = blob.download_as_bytes() + + s = str(bytes_data, "utf-8") + + data = StringIO(s) + df = pd.read_csv(data) + + return df + + +def get_data_path_from_db(data_version, exp_name): + select_query = """ + SELECT * + FROM data_info + where version = {} and exp_name = '{}' + """ + (train_path, _, _, _), (valid_path, _, _, _) = engine.execute( + select_query.format(data_version, exp_name) + ).fetchall() + + return train_path, valid_path + + +def load_data(is_cloud, data_version, exp_name): + + if is_cloud: + CLOUD_STORAGE_NAME = os.getenv("CLOUD_STORAGE_NAME") + train_path, valid_path = get_data_path_from_db(data_version, exp_name) + train_df = load_data_cloud(CLOUD_STORAGE_NAME, train_path) + valid_df = load_data_cloud(CLOUD_STORAGE_NAME, valid_path) + else: + TRAIN_MNIST = os.getenv("TRAIN_MNIST") + VALID_MNIST = os.getenv("VALID_MNIST") + train_df = pd.read_csv(TRAIN_MNIST) + valid_df = pd.read_csv(VALID_MNIST) + + return train_df, valid_df + + +def cnn_training( + config, data_version, exp_name, checkpoint_dir=None, is_cloud=True +): + Net = MnistNet(config["l1"]) + device = "cpu" + + if torch.cuda.is_available(): + device = "cuda:0" + if torch.cuda.device_count() > 1: + Net = nn.DataParallel(Net) + Net.to(device) + + criterion = nn.CrossEntropyLoss() + optimizer = optim.SGD(Net.parameters(), lr=config["lr"], momentum=0.9) + + if checkpoint_dir: + model_state, optimizer_state = torch.load( + os.path.join(checkpoint_dir, "checkpoint") + ) + Net.load_state_dict(model_state) + optimizer.load_state_dict(optimizer_state) + + transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))] + ) + train_df, valid_df = load_data(is_cloud, data_version, exp_name) + + trainset = MnistDataset(train_df, transform) + validset = MnistDataset(valid_df, transform) + train_loader = DataLoader(trainset, batch_size=int(config["batch_size"])) + valid_loader = DataLoader(validset, batch_size=int(config["batch_size"])) + + for epoch in range(10): # loop over the dataset multiple times + running_loss = 0.0 + epoch_steps = 0 + for i, data in enumerate(train_loader, 0): + inputs, labels = data + inputs, labels = inputs.to(device), labels.to(device) + + optimizer.zero_grad() + + outputs = Net(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + running_loss += loss.item() + epoch_steps += 1 + if i % 2000 == 1999: + print( + "[%d, %5d] loss: %.3f" + % (epoch + 1, i + 1, running_loss / epoch_steps) + ) + running_loss = 0.0 + + val_loss = 0.0 + val_steps = 0 + total = 0 + correct = 0 + + classes = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9") + correct_pred = {classname: 0 for classname in classes} + total_pred = {classname: 0 for classname in classes} + result_pred = { + f"{classname}_acc_percentage": 0 for classname in classes + } + + for i, data in enumerate(valid_loader, 0): + with torch.no_grad(): + inputs, labels = data + inputs, labels = inputs.to(device), labels.to(device) + + outputs = Net(inputs) + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + loss = criterion(outputs, labels) + val_loss += loss.cpu().numpy() + val_steps += 1 + + for label, prediction in zip(labels, predicted): + if label == prediction: + correct_pred[classes[label]] += 1 + total_pred[classes[label]] += 1 + + with tune.checkpoint_dir(epoch) as checkpoint_dir: + path = os.path.join(checkpoint_dir, "checkpoint") + torch.save((Net.state_dict(), optimizer.state_dict()), path) + + for classname, correct_count in correct_pred.items(): + accuracy = round( + 100 * float(correct_count) / total_pred[classname], 2 + ) + result_pred[f"{classname}_acc_percentage"] = accuracy + + tune.report( + loss=(val_loss / val_steps), + accuracy=correct / total, + result_pred=result_pred, + ) + + +def preprocess_train(train_df, valid_df, batch_size): + transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))] + ) + trainset = MnistDataset(train_df, transform) + validset = MnistDataset(valid_df, transform) + train_loader = DataLoader(trainset, batch_size=batch_size) + valid_loader = DataLoader(validset, batch_size=batch_size) + total_batch = len(train_loader) + + return (train_loader, valid_loader, total_batch) + +def get_mnist_avg(df): + return np.round(df.groupby('label').mean().mean(axis=1).values,2).tolist() \ No newline at end of file diff --git a/requirements.sh b/requirements.sh new file mode 100644 index 0000000..27c36e4 --- /dev/null +++ b/requirements.sh @@ -0,0 +1 @@ +pip install fastapi==0.70.0 uvicorn==0.15.0 python-dotenv==0.19.1 sqlalchemy==1.4.25 psycopg2-binary==2.9.1 colorlog==6.5.0 pandas==1.3.3 xgboost==1.4.2 pyyaml==5.4.1 numpy==1.19.5 scikit-learn==1.0 prefect==0.15.6 mlflow==1.20.2 ray==1.7.0 tensorflow-data-validation==1.2.0 torch==1.10.0 torchvision==0.11.1 google-cloud-storage==1.42.3 hiredis==2.0.0 && pip uninstall -y tensorflow==2.6 && pip install tensorflow-cpu==2.4 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index ea0763ca28facccfcff1607539fc835edbd7a5cd..729f8162d0c02c479e695d2e4f6df74507cb4a8d 100644 GIT binary patch literal 3040 zcmZuz%Z}qV5WMqWC|H&~kAn{Zf+R?GfeH2yU!SU`z2lh;po2&@ z`&nI0(TR`A#@nfN-QiGIyQ)@ZKD%%@G*wgWlvzx7w7RusIvloD(@;K* zF4}=2BA@a)FD52S4R=+eOwKVuyskw3DF&F!$1pdPc*Jh4I_k|KcnI#Wvs0ao*$oc& zHn>@Dst45_P3&!^#0G{tZ|3oE*vqf$o)3rn3O2AG)_%c;hYK*t^Wa1D0n&Gs$j5F9 zJ%E{54<8@WOX_Nq4tx~^t7SZC8l=u5iua0o(oFw;BlxoBXt#wz9L+BI9Ky}28@ zXR3x#WTFpUSm6H#dD$vE=XhR%n=^vu@nBLmi&(g)*Rn>s=-CdQa&2eJWQq^C;k@-Q zQR=f*zxm=jtZmicO>Wm=kPGk;J1H#|mA(2`t6|M+M4F)Q0ar#?5MSWU=yKndTtBMc zU4D|9(GrrpQ)39Dw;KNHE>J~XHTZ7#OO=^4gh~P6>)}S=Qtu5)($qip*L)OZtkcy9 z_Vh95#k+PZ&VD!x1`;^r*{-^~-V-F~){Wm*8-eg`wPju}T7R6Pyo3tC@bT~(**$Yp z0xq|RiIgvK*YN+tv0td~Cu2nHYQ~bSkH(g@O)En9A3vh)!Zg_#W?h(*HUbj1(>t%y zVrJljD(Xjo^8F#)y_nvib>APJTyKd)>%AN8+=+*P`3D^*mtg;6Xt8Uy!WX22i_L{t zW;t%0j5e(kbFC-aJDdV9KO6y&&|io$%zB9-2cW#J_M$RcJ9{=h;$kJ@(&>vGXC{5B z1rrh!j!0L~EQV#N#}4J7E4aJP4pl`AfC4I{j`j66{`cfT@DU4l><758MXPSqAJ#0t zx=uX6HFX5zq2qZhqPNgw;$1%@JStLdT0+dgCW6j}xM5E{P$;J!c(5_77frSL)6HKE zAdax%?AOp-mdNY(-O)@T>lDr#ez;+JryBA5PbrbGu{WdhEq&4%UUD2J;($JM(K`r z75*10!-?p5I|13IXT-^3vjZXVfP@Q@_2OA!iB;6)0A7~#-XqW@t=VCe?12hcPiG8? zaSPg-O(88JYB`%2>0?10mT4B?0!uu^N@Jw0-b#u|w96Ur%4L$1+_4UVU<_C+&}gF! zc7#IxoY^INGHfp7-G*0sM)+NJ0AX7kh7r-kS+1em&L;`H_$#~U63|Y;0!kz!L?^$F zZb0=p73oU;j<`7Hkqj(KlVF4BdOH96%jZv5AB4y`Y3EVPBSUoay%3GSiLG(z&4zOY z3*1Q@v1tE26ka#<8^8z=TuaiLFQckad3e=$$x=i#9-}q=f){0%u}P+acVWUm@=4h7^#R;rg-T)-J9&2q_si-! z?A|11)1zY~d*_8t-tt<5tdrT+h}Yz_lu{LjTqDM6+lX&>c*w1%%M5~QV(7)TNjUrF xt;DAM$HwRHb_KB`B)I$%4WEzjm#42|8v@^Jd>wApcbQKV+~9u!CdrE%^&cS|seS+e literal 3928 zcmZ{nT~Av_5Qg`o^b@{%0S7zn9Y|E9tZ_1@&Gv@6e zqS0!rsPl5BUE_#(7wa`kTULtNE5}u=bHW>a#{DU6IVi*al>hwMT2~rjoGGGJ4p590 zai-7ol;Ke^3vszD4?63hf01>j-~D~sVSZ-TinDjDw5QQ$ujq<{6UMy`i^#K94C`B| zVJ+Y=i4Qp!k>jA#Q4Ew5?Vkiz6q}y1txsIQ*#!4n{cfXuUn7fmqaaE-`$iFslw_?s zu!vpB66HZY>GyyYWoL!_>~zMOH6w^~Zgj2gEcE*(7_9~#*ejzLp4Lbq95@83xp0_C z`sKR%QQ9BMIx;7wNqHZ*&336X+o;Q799omfS(e%lZ=7=tFZ8d=vh3YSrjEW01*qgv zx$m`J>gRLEv!<@J<_g;NZj$dzb)I#beSvbRzk7!WJ8-4*IAdNqX?PV_T|2I?jOrBA z1^U!u94C2w)nmyu+%YTq>LAAR(AmF#Ro;dBKgHU`Gp#}Bv(F=HCGP`sUlSHKJ@B3UCaTi`vpSYfp@JrR6 zMiPY^o^?Jmy<9~O&P0d9iNBSi|A^ShXC@+NvGOLm$;j9Gji(>n@jp4OrD0CkR6qAT zYK8jU>Zecj?&NSSZyRCe#L5iMTdjB=cz@Sdy%FcxzX)$rZWNiF2sS$ls~ep>7w7bi z6(jH}lf6-09E9;Ys@&CU9`yg)aK&ASujvC*#4LXehOCXsMd-W>#>~rBUm*14N$mCy zR4Y}&LEq=<-l{>m_F264ngC3Kqq1ZK=sZU3nm&)H_)tz8zf|+-vC6Mz$eOV*}HTR&gs= z>-|W_HBm2h_S9-(m7afkw>_;x97Cf+OcP!X^hqjNYu(P?3TxifteLCVIK|U2agH^w zY77kVViVb^Fea{9?v(XW4x!0vP|@gVwdgY{t-E^95VEI!;E?35x&ITd{S?uT0_6c{xw$WOU62r=dbdid@jGmIzH7m z1GRD|G;|V^s@6%J3eRI+zDLj-P0g1*yb4g9`l_z^)#{$-mFS5HB5KQS{n7UtK0peq~@78?lD&jXE?uOsR{UUieF<)Qqb}?+G~}U=~6i}$~EIC zoY^a`(-*TpV>m1EUdKEE%kz$RC)sJ{s%I2P#)Esj)qdFSB0KoWZiT;;-{t5B^+c*t z*_f$&+4uK8dWWgtSzweyMLJd3(`i4ITCjq(s|Mz-a^}}wJD7_5o;~$gtLEjn?5tU6 z%YAq+M1G@!sk;5G{W~$~)Wyu$k?s=wPVMXb8Sds~$E`!uw=rfE^Bc|ZZusW>|IWQ4 zm~ei#Ck8yULre$yU?zR&1R@v8?0HE(J{fzbDBqm8au#c@Rwg+wTV|L4YD#vzaOkge z$=#3>x_eS}WUbhE!EW@$YhrrRZxZ_ZCD_RsW+^_`E*f_4G4!GOn5pgnJoKCPsJ*ze z6l1?qS%a~w{wQVmt2X~K$mvsG?MyxHZ~o50@$}ENOD!I?PIuG_@N3Tf_n diff --git a/set_prefect.sh b/set_prefect.sh new file mode 100755 index 0000000..ad365fb --- /dev/null +++ b/set_prefect.sh @@ -0,0 +1,5 @@ +python /prefect/mnist/main.py +python /prefect/atmos_tmp_pipeline/main.py +python /prefect/insurance/main.py + +prefect agent local start \ No newline at end of file