# Amazon SageMaker MLOps
工作坊手冊連結:[bit.ly/SMMLOps](https://bit.ly/SMMLOps)
工作坊程式碼:[GitHub](https://github.com/aws-samples/mlops-sagemaker-mlflow)
## MLOps 總覽

## 商業情境
**免費遊戲 Free-to-play** 讓玩家無需付費就能體驗大部分或有時甚至是全部的遊戲內容。現今使用多種商業模式來使這類遊戲盈利,如遊戲內廣告或遊戲內容購買。
免費遊戲最初出現在社交和移動平台上,以吸引玩家。現在它們已成為遊戲產業最賺錢的商業模式,並被所有遊戲平台上的 AAA 遊戲所採用。
遊戲開發者和發行商需要仔細監控遊戲營運狀況並追蹤大量指標,以確保遊戲運行正常且玩家玩得開心。玩家留存是免費遊戲商業模式的核心,原因如下:
1. 活躍玩家是其他人的免費內容,他們是可以相遇的朋友或要打敗的對手,從而降低了您的內容製作成本。
2. 在社交或多人遊戲中,活躍玩家也會邀請他們的朋友一起玩,從而降低您的獲客成本。
3. 活躍玩家會看到遊戲內廣告或購買遊戲內物品,有望實現您遊戲的營收。
「流失預測」提供了洞察和機會,來了解為什麼玩家離開以及可以對遊戲做出什麼樣的改變來嘗試留住這些玩家。例如,一個由機器學習(ML)驅動的流失預測系統可以在玩家決定離開遊戲之前的適當時機,觸發特定的個性化優惠或針對性的遊戲內促銷,以嘗試留住玩家。
然而,公司在使用 ML 時面臨的挑戰之一是缺乏深度機器學習專業知識,或缺乏討論完整 ML 工作流程的知識和時間。它通常首先需要資料工程師來獲取和清理大量數據,以了解哪些特徵可用於預測。其次,數據科學家必須建構模型並根據參數組合進行訓練。工作流程需要多次迭代,以確保模型在測試和部署前是最佳的,並在每個階段比較其行為。
為了加速 ML 開發,我們將利用 SageMaker Data Wrangler 來執行特徵工程任務,無需編寫任何程式碼。我們將結果匯出到 Amazon SageMaker Feature Store,用於存儲、共享和管理機器學習(ML)模型的特徵。
## 商業目的
- 預測玩家留存率和流失風險
- 分析玩家行為模式
- 評估玩家活躍度和高價值遊戲玩家
## 資料說明
### 資料欄位
下載資料 [player-churn.csv](https://static.us-east-1.prod.workshops.aws/public/99eaf7cb-757b-4794-8002-48e65cd62831/static/data/player-churn.csv)
```
--基本玩家資料--
player_id:玩家唯一識別碼
cohort_id:玩家群組識別碼 (按照加入遊戲時間分組)
cohort_day_of_week:玩家加入時的星期幾
player_type:玩家類型 (例如:業餘玩家)
player_lifetime:玩家生命週期(遊戲時長)
session_count:總遊戲場次
player_churn:玩家是否流失 (TRUE/FALSE)
--遊戲場次計數(統計值)--
每日統計(最近7天)
每週統計(最近3週)
每月統計(最近2個月)
--遊戲時間統計(統計值)--
每日平均遊戲時間(mean)
每週平均遊戲時間
每月平均遊戲時間
--遊戲時間標準差統計(統計值)--
遊戲時間標準差(std)
```
**資料說明:**
計算統計值進行行為分析:
- 場次計數可以反映玩家的活躍度
- 時間相關的統計數據可以反映玩家的遊戲習慣
- 標準差數據可以反映玩家行為的穩定性
訂定商業指標(KPI):
- 預測玩家流失風險
- 找尋高價值遊戲客戶
## MLOps 工作坊
### Lab 1: 特徵值擷取 使用 SageMaker Canvas Data Wrangler
:::danger
- 須開啟 SageMaker Canvas,並建議啟用 Bedrock 模型
- 須開啟 SageMaker Studio JupyterLab
- (Optional) 若您使用自己的 AWS 帳戶,請自行下載 [GitHub repo](https://github.com/aws-samples/mlops-sagemaker-mlflow.git)
- 執行完本步驟後,請下載 `player-churn-feature-engineering.zip`
:::
[Lab 1 連結](https://catalog.us-east-1.prod.workshops.aws/workshops/b9405337-9690-4fb2-9f7d-76e6babb7a2c/en-US/01-lab-01)


### Lab 2: 使用 SageMaker Studio 筆記本 手動建立 MLOps Pipelines
:::danger
- 須下載 Lab 1 的資料流檔案 `.flow` 和筆記本
- 執行 Lab 2 時,匯入資料時間約莫 8 分鐘
:::
[Lab 2 連結](https://catalog.us-east-1.prod.workshops.aws/workshops/b9405337-9690-4fb2-9f7d-76e6babb7a2c/en-US/02-lab-02)
#### Prerequisite
:::danger
執行完本步驟後,請紀錄`mlflow_tracking_server_arn`
:::
請執行 `00-start-here.ipynb` 取得 `mlflow_tracking_server_arn`。
若您使用自己的 AWS 帳戶,需要自行 [建立 MLflow 追蹤伺服器](https://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/mlflow-create-tracking-server.html)。

:::spoiler 什麼是 MLflow
MLflow 是一個**開源的機器學習生命週期管理平台**,主要用於:
**實驗追蹤 (Experiment Tracking)**
記錄並比較模型訓練的參數、指標和結果
保存程式碼、數據和模型版本
提供可視化界面查看實驗結果
**專案打包 (Project Packaging)**
將 ML 專案程式碼和dependencies打包,確保可重現性
支持多種執行環境(如 Conda、Docker)
**模型管理 (Model Management)**
將模型以標準格式保存和版本控制
支持多種機器學習框架(如 scikit-learn、TensorFlow)
方便部署到不同的執行環境
**模型服務 (Model Serving)**
提供 REST API 接口部署模型
支持即時預測服務
:::
```python
import mlflow
experiment_name = None
mlflow_tracking_server_arn = None
mlflow.set_tracking_uri(mlflow_tracking_server_arn)
experiment = mlflow.set_experiment(experiment_name=experiment_name)
suffix = strftime('%d-%H-%M-%S', gmtime())
# 開始追蹤實驗
mlflow.start_run(run_name=f"{step}-{suffix}", nested=True)
# 記錄參數
mlflow.log_param("learning_rate", 0.01)
mlflow.log_param("epochs", 100)
# 訓練模型...
# 記錄指標
mlflow.log_metric("accuracy", 0.85)
mlflow.log_metric("loss", 0.15)
# 保存模型
mlflow.sklearn.log_model(model, "model")
# 保存 artifacts
mlflow.log_artifact()
mlflow.end_run()
```
#### Step 1: 建立資料目錄
:::danger
執行完本步驟後,請紀錄`feature_group_name`
:::
上傳 Lab 1 下載的檔案到 `01-feature-store-ingestion` 並執行: `player-churn-feature-engineering.flow` 和 `player-churn-feature-engineering.ipynb`


#### Step 2: 資料預處理
:::danger
須要 `mlflow_tracking_server_arn`
:::
在原始數據集被導入到 SageMaker Feature Store 後,我們可以提取數據並針對訓練算法進行特定的數據集處理。
#### Step 3: 模型訓練
處理步驟創建了專門用於使用 XGBoost 算法訓練 ML 模型的格式化數據集。此外,數據集被分為訓練集、驗證集和測試集以避免過擬合(overfitting):
訓練集(training):用於訓練模型的數據部分
驗證集(validation):用於調整學習過程參數的數據集
測試集(test):用於最終模型測試並與之前的數據集進行比較的部分
#### Step 4: 模型評估
模型評估是使用定義的指標來測試模型在未見數據上的表現的過程。此外,評估指標提供了分析以了解模型潛在的弱點或偏差。對於分類模型,常用的性能衡量指標包括:
* 準確率(Accuracy)
* 精確率(Precision)
* 召回率(Recall)
* F1分數(F1 score)
* 曲線下面積(Area under Curve, AUC)
* 混淆矩陣(Confusion Matrix)
評估模型有多種方法。留出法(Holdout)是 ML 分類器中最常用的簡單方法。在之前的工作坊中,我們明確創建了測試集作為留出數據集,用於評估 XGBoost 中訓練模型的性能。
#### Step 5: 註冊模型
模型註冊表是一個集中式存儲庫,用於存儲和管理機器學習(ML)模型及其相關元數據。它是一個版本控制系統,有助於 ML 模型的開發、部署和維護。使用 Amazon SageMaker Model Registry,您可以:
* 對生產模型進行編目
* 管理模型版本
* 將元數據(如訓練指標)與模型關聯
* 在註冊的模型中查看來自 Amazon SageMaker Model Cards 的信息
* 管理模型的批准狀態
* 將模型部署到生產環境
* 使用 CI/CD 自動化模型部署
* 與其他用戶共享模型
### Lab 3: 建構 MLOps Pipelines 使用 SageMaker Pipelines 的 Drag-and-Drop UI 使用者開發介面
:::danger
- 須使用到 Lab 1 的 `player-churn-feature-engineering.zip`
- 須使用到 Lab 2 的 `feature_group_name` 和 `mlflow_tracking_server_arn`
- 須下載 Lab 2 筆記本和相關程式碼
:::
[Lab 3 連結](https://catalog.us-east-1.prod.workshops.aws/workshops/b9405337-9690-4fb2-9f7d-76e6babb7a2c/en-US/03-lab-03)
建立兩個 pipelines:
1. SageMaker Data Wrangler to Feature Store Ingestion workflow
2. SageMaker ML Training Pipeline
#### Pipeline 的參數
```json
parameters = {
"region": {
"type": "String",
"value": "us-east-1",
"description": "AWS 區域"
},
"feature_group_name": {
"type": "String",
"value": "[the feature group that was created in the previous lab]",
"description": "在之前實驗中創建的特徵群組名稱"
},
"bucket_name": {
"type": "String",
"value": "sagemaker-[region]-[account-nbr]",
"description": "S3 儲存桶名稱"
},
"bucket_prefix": {
"type": "String",
"value": "player-churn/xgboost",
"description": "S3 儲存桶前綴路徑"
},
"experiment_name": {
"type": "String",
"value": "player-churn-model-experiment-pipeline",
"description": "實驗名稱"
},
"train_instance_type": {
"type": "String",
"value": "ml.m5.xlarge",
"description": "訓練實例類型"
},
"test_score_threshold": {
"type": "Float",
"value": "0.75",
"description": "測試分數閾值"
},
"model_package_group_name": {
"type": "String",
"value": "player-churn-model-group",
"description": "模型包群組名稱"
},
"model_approval_status": {
"type": "String",
"value": "PendingManualApproval",
"description": "模型批准狀態"
},
"mlflow_tracking_server_arn": {
"type": "String",
"value": "[a valid MLFlow tracking server URL]",
"description": "MLFlow 追蹤伺服器 URL"
}
}
```
#### Trouble Shooting

請注意:
- 務必注意參數名稱後方<font color="red">沒有多餘的空白格</font>
- 上傳筆記本 zip 檔案時,請務必<font color="red">注意檔案打包時的路徑</font>
- 設定 Pipeline 參數時,參數可以為空白值,爾後在執行 Pipeline 的時候填入參數值即可
### Lab 4: 建構 CI/CD Pipeline 使用 SageMaker Project
[Lab 4 連結](https://catalog.us-east-1.prod.workshops.aws/workshops/b9405337-9690-4fb2-9f7d-76e6babb7a2c/en-US/04-lab-04)

### Lab 5: 建構部署 Pipeline 使用 SageMaker Project
[Lab 5 連結](https://catalog.us-east-1.prod.workshops.aws/workshops/b9405337-9690-4fb2-9f7d-76e6babb7a2c/en-US/05-lab-05)

## MLflow 和 SageMaker Pipelines 差異比較

## LLMOps 概覽
AWS blog: [LLM experimentation at scale using Amazon SageMaker Pipelines and MLflow](https://aws.amazon.com/blogs/machine-learning/llm-experimentation-at-scale-using-amazon-sagemaker-pipelines-and-mlflow/)
[GitHub](https://github.com/aws-samples/llm-experimentation-sagemaker-mlflow)

## 參考資料
AWS blog: [LLM experimentation at scale using Amazon SageMaker Pipelines and MLflow](https://aws.amazon.com/blogs/machine-learning/llm-experimentation-at-scale-using-amazon-sagemaker-pipelines-and-mlflow/)
GitHub sample code: [LLM experimentation at scale using Amazon SageMaker Pipelines and MLflow](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-mlflow)