歡迎來到 「 從0開始的MLFLOW應用搭建 」。
Hi 各位我是Josh,也是一名資料工作者,期待透過這次的分享把MLFLOW的知識內容整理起來與各位大大分享,可以把這次內容當作一個MLFlow搭建與使用的雛形整理,希望可以開箱即用,也方便後續做抽換或延伸。如果有甚麼不足的地方,歡迎各位大大多多回饋與交流,很榮幸可以與各位交流。
那我們就來開始本次的系列分享:
如果我們要做一個「企業級動畫推薦系統」,不能只算出推薦模型,還要可追蹤、可比較、可部署、可被前端使用,本次的分享將學習如何使用mlflow來執行模型生命週期,整體技術組合是 MLflow + FastAPI + Streamlit + AB Test,並以 Docker + docker-compose 管好所有服務,確保每台機器一鍵起來、彼此在同一網路上可互通。
/recommend
)。mlops-net
)。Kaggle 的 Anime Recommendations Database:
animes.csv
:動畫基本資訊(名稱、類型、描述、評分…)user_ratings.csv
:使用者對動畫的評分[Kaggle 資料] → [清理/特徵] → [多模型訓練]
│
(MLflow Tracking/Artifacts/Registry)
│
Streamlit UI ← FastAPI → /log-ab-event(AB 記錄)
docker-compose
啟動 Postgres(MLflow 後端)、MLflow 伺服器、Jupyter 開發容器
mlops-net
可互通本次示範會用 usr/ 路徑來建構資料夾與程式碼檔案,相關檔案歡迎使用以下的repo。
cd usr/
git clone https://github.com/JoshuaChen40/mlflow-fastapi-zero-to-prod.git
主要建立postgres當作資料庫、python-dev一個常駐的開發環境以及我們的核心Mflow容器負責提供追蹤模型的服務。隨著文章系列的展開,yaml內容會更動,請以上方repo裡面的為準。
另外,如果要自行使用並且會對外服務,要自行謹慎思考網路與權限(帳號、密碼、Token、環境變數)的管理,本系列僅以方便示範為方向,沒有做任何資安考量。
services:
postgres:
image: postgres:14
container_name: postgres
restart: always
environment:
POSTGRES_USER: mlflow
POSTGRES_PASSWORD: mlflow
POSTGRES_DB: mlflow
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- mlops-net
mlflow:
build:
context: .
dockerfile: docker/Dockerfile.mlflow
container_name: mlflow
depends_on:
- postgres
ports:
- "5000:5000"
environment:
MLFLOW_BACKEND_STORE_URI: postgresql://mlflow:mlflow@postgres:5432/mlflow
MLFLOW_ARTIFACT_ROOT: /mlflow/artifacts
volumes:
- ./workspace/mlruns:/mlflow/artifacts
command: >
mlflow server
--backend-store-uri postgresql://mlflow:mlflow@postgres:5432/mlflow
--default-artifact-root /mlflow/artifacts
--host 0.0.0.0
--port 5000
networks:
- mlops-net
python-dev:
build:
context: .
dockerfile: docker/Dockerfile.dev
container_name: python-dev
working_dir: /usr/mlflow
volumes:
- ./:/usr/mlflow
ports:
- "8888:8888"
command: >
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token=Aa123456
networks:
- mlops-net
volumes:
postgres_data:
networks:
mlops-net:
driver: bridge
# 第一次建置
docker compose up -d --build
# 看容器是否正常
docker compose ps
# 看網路(確認三個服務都在 mlops-net)
docker network inspect anime-recommender_mlops-net
打開:
Aa123456
)連線 Postgres(例如 DBeaver):
Hostlocalhost
、Port5432
、DBmlflow
、Usermlflow
、Passwordmlflow
(容器內互連請用 服務名postgres
當主機名,因為同網路上會自動做 DNS 解析)
在 JupyterLab 新增 notebooks/hello_mlflow.ipynb
,貼上並執行:
import mlflow, random
mlflow.set_tracking_uri("http://mlflow:5000") # 容器內用服務名
mlflow.set_experiment("anime-recsys")
with mlflow.start_run(run_name="hello-day1"):
lr = 0.05
acc = 0.8 + random.random() * 0.05
mlflow.log_param("learning_rate", lr)
mlflow.log_metric("accuracy", acc)
# TODO: 建立 src/models 目錄,日後把 baseline 模型存成 artifact
回到 MLflow UI 就能看到你的第一筆實驗紀錄 🎉
mlops-net
網路,彼此可用服務名互通。