【 MLOps 】透過 GitHub Action 觸發 Azure Machine Learning 中的 Pipeline Job 進行模型訓練與驗證並透過 Microsoft Teams 傳送相關資訊
內容
- 前置準備作業
- 流程
- 建立 Azure 服務所使用的名稱
- Repository、Blob 與 AzureML Studio 之 Data、Components 與 Models 結構
- 上傳資料集到 Azure Blob 並取得存取 Key
- 建立 Azure IoT Hub
- 建立 Microsoft Teams
- 建立 Microsoft Azure Machine Learning Studio
- 產生部署認證
- 建立 GitHub Secret
- Edge 端下載訓練完成的 Model
- 修改程式並 Push 到 GitHub
- 驗證結果
前置準備作業
- 已建立 Azure 帳號並能正常登入與使用
- 已建立 GitHub 帳號並能正常登入與使用
- 已於電腦端安裝 IDE,本範例使用 Visual Studio Code
- 已於電腦端安裝 Python
- 已於電腦端安裝 Azure CLI
流程
建立 Azure 服務所使用的名稱
屬性 | 名稱 |
---|---|
Resource group | iris-rg |
Storage account name | irisblobs |
AzureML Workspace name | iris-ws |
AzureML Container registry | iriscontainers |
IoT Hub Name | iris-hub |
IoT Hub Device ID | device01 |
Repository、Blob 與 AzureML Studio 之 Data、Components 與 Models 結構
└── MLOps_GitHub_Action_AzureML
├── .github
│ └── workflows
│ └── actions.yml
├── AzureBlob
│ └── UploadFiles
│ ├── app.py
│ └── requirements.txt
├── Datasets
│ ├── Test
│ │ └── iris_test.csv
│ └── Training
│ └── iris_training.csv
├── Models
├── Edge-Receive-Notify
│ ├── .env
│ ├── receive.py
│ └── requirements.txt
├── README.md
├── pipeline-info
│ └── save_info.py
├── pipeline-python
│ ├── datasets.py
│ ├── evaluate.py
│ ├── teams_notify.py
│ └── training.py
├── run_configs
│ ├── cluster
│ │ └── create_cluster.yml
│ ├── component
│ │ ├── component_evaluate.yml
│ │ └── component_train.yml
│ ├── environment
│ │ └── environment.yml
│ └── jobs
│ └── pipeline.yml
├── scripts
│ ├── create-cluster.sh
│ ├── create-component.sh
│ ├── run-job.sh
│ └── setup.sh
└── secret
├── requirements.txt
└── set_secret.py
- Azure Blob 結構
└── irisblobs ( ㊟ Azure Blob 名稱 )
├── $logs ( ㊟ 系統自行建立的 Container )
├── datasets ( ㊟ 本範例所建立的 Container 名稱,存放資料集用 )
│ ├── Test ( ㊟ 放罝測試用資料集的資料夾 )
│ │ └── 20230530_073041 ( ㊟ 資料集從電腦端上傳的日期與時間 )
│ │ └── iris_test.csv ( ㊟ 測試用資料集 )
│ └── Training ( ㊟ 放罝訓練用資料集的資料夾 )
│ └── 20230530_073041 ( ㊟ 資料集從電腦端上傳的日期與時間 )
│ └── iris_training.csv ( ㊟ 訓練用資料集 )
└── models ( ㊟ 本範例所建立的 Container 名稱 )
└── 20230530_083512 ( ㊟ 資料集從電腦端上傳的日期與時間 )
├── 614f658f9632f63602560ac44cb660e7d1053799.json
├── 614f658f9632f63602560ac44cb660e7d1053799.zip
└── train_loss.jpg
- 614f658f9632f63602560ac44cb660e7d1053799.json 檔案內容
{
"date_time":"20230530_083512",
"data_assets_version":{
"fileIrisTrainData":1,
"fileIrisTestData":1
},
"commit_info":{
"github_repository":"ArcherHuang/MLOps_GitHub_Action_AzureML",
"commit_url":"https://github.com/ArcherHuang/MLOps_GitHub_Action_AzureML/commit/614f658f9632f63602560ac44cb660e7d1053799",
"committer":"ArcherHuang",
"commit_timestamp":"2023-05-30T08:35:12+08:00",
"commit_message":"Update",
"github_workflow":"Create-AzureML-Pipeline-Jobs-Using-AZ-Cli",
"commit_sha":"614f658f9632f63602560ac44cb660e7d1053799",
"github_action_run_id":"5116330573",
"github_action_run_number":"7"
},
"train_info":{
"train_loss":[
1.2957799434661865,
1.1860945224761963,
1.1027504205703735,
1.033798336982727,
0.975488543510437,
0.9316227436065674,
0.8992618322372437,
0.8705821633338928,
0.8423559069633484,
0.8188531398773193
],
"epoch":50,
"accuracy":0.9333333373069763
},
"model_version":1,
"images":{
"train_loss_name":"train_loss.jpg"
},
"evaluate_info":{
"train_loss":0.3854455053806305,
"accuracy":0.9333333373069763
}
}
- 614f658f9632f63602560ac44cb660e7d1053799.zip 壓縮檔內容
├── assets
├── fingerprint.pb
├── keras_metadata.pb
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
-
AzureML Studio 之 Data、Components 與 Models 結構
- Data assets
- Datastore
- Components
- Models
- AzureML Studio 之 Compute Cluster
- AzureML Studio 之 Jobs
上傳資料集到 Azure Blob 並取得存取 Key
Step 1. 建立 Azure Blob 服務
- 在搜尋框輸入
blob
並點選Storage accounts
的搜尋結果
- 點選
Create
- 輸入相關資訊後點選左下角的
Review
- 本範例
Resource group
設定為iris-rg
、Storage account name
設定為irisblobs
、Region
設定為(Asia Pacific) Japan East
- 本範例
- 確認相關資訊後點選
Create
- 建立過程中
- 點選
Go to resource
- 建立
datasets
Container- 點選左邊的
Containers
> 點選上方的+ Container
- 於輸入
Name
欄位輸入datasets
後點選Create
- 建立完成
- 點選左邊的
- 建立
models
Container- 點選上方的
+ Container
- 輸入相關資訊
Name
欄位輸入models
Public access level
欄位選擇Blob (anonymous read access for blobs only)
- 以上欄位輸入完成後點選
Create
- 建立完成
- 點選上方的
- 取得 Account Name 與 Key
-
點選左側的
Access keys
( 之後的程式會使用到Storage account name
、Key
與Connection string
)
-
Step 2. 上傳 Datasets 到 Azure Blob
- 下載相關程式與資料夾
- 下載後的檔案結果
└── MLOps_GitHub_Action_AzureML
├── .github
│ └── workflows
│ └── actions.yml
├── AzureBlob
│ └── UploadFiles
│ ├── app.py
│ └── requirements.txt
├── Datasets
│ ├── Test
│ │ └── iris_test.csv
│ └── Training
│ └── iris_training.csv
├── Models
├── Edge-Receive-Notify
│ ├── .env
│ ├── receive.py
│ └── requirements.txt
├── README.md
├── pipeline-info
│ └── save_info.py
├── pipeline-python
│ ├── datasets.py
│ ├── evaluate.py
│ ├── teams_notify.py
│ └── training.py
├── run_configs
│ ├── cluster
│ │ └── create_cluster.yml
│ ├── component
│ │ ├── component_evaluate.yml
│ │ └── component_train.yml
│ ├── environment
│ │ └── environment.yml
│ └── jobs
│ └── pipeline.yml
├── scripts
│ ├── create-cluster.sh
│ ├── create-component.sh
│ ├── run-job.sh
│ └── setup.sh
└── secret
├── requirements.txt
└── set_secret.py
-
在
AzureBlob/UploadFiles
資料夾中建立.env
檔案內容如下 -
安裝相關套件
① 開啟終端機並切換路徑到 AzureBlob/UploadFiles ② pip3 install -r requirements.txt
-
執行上傳程式
python3 app.py
Step 3. 資料集上傳到 Azure Blob 後其檔案結構如下
└── irisblobs ( ㊟ Azure Blob 名稱 )
├── $logs ( ㊟ 系統自行建立的 Container )
├── datasets ( ㊟ 本範例所建立的 Container 名稱,存放資料集用 )
│ ├── Test ( ㊟ 放罝測試用資料集的資料夾 )
│ │ └── 20230530_073041 ( ㊟ 資料集從電腦端上傳的日期與時間 )
│ │ └── iris_test.csv ( ㊟ 測試用資料集 )
│ └── Training ( ㊟ 放罝訓練用資料集的資料夾 )
│ └── 20230530_073041 ( ㊟ 資料集從電腦端上傳的日期與時間 )
│ └── iris_training.csv ( ㊟ 訓練用資料集 )
└── models ( ㊟ 本範例所建立的 Container 名稱,存放 Models 與 Images )
建立 Azure IoT Hub
Step 1. 在輸入框輸入 iot hub
後點選 IoT Hub
的搜尋結果
Step 2. 點選上方的 + Create
Step 3. Azure IoT Hub 服務
- 輸入相關資訊
Resource group
欄位請輸入唯一且可識別的名稱,本範例使用iris-rg
。IoT hub name
欄位請輸入唯一且可識別的名稱,本範例使用iris-hub
。Region
欄位請選擇要使用哪個資料中心的 IoT Hub。Tier
欄位請選擇所要使用的規格等級。- 以上資訊輸入完成後點選左下角的
Review + create
。
- 確認相關資訊後,點選
Create
- 建罝過程中
- 建罝完成
- 點選
Go to resource
- 點選
Step 4. 取得 Device Connection String
- 點選左側的
Device
> 再點選上方的+ Add Device
- 輸入相關資訊
- 於
Device ID
欄位請輸入唯一且可識別的名稱,本範例使用device01
- Device ID 輸入完成後點選
Save
- 於
-
取得 Device Connection String
- 點選所建立的 Device ID
- 取得 Device Connection String
Step 5. 取得 IoT Hub Connection String
- 回到所建立的 IoT Hub 服務主頁面 > 再點選左側的
Shared access policies
> 再點選iothubowner
- 取得 IoT Hub Connection String
建立 Microsoft Teams
Step 1. 建立團隊
- 開啟 Microsoft Teams > 點選
建立團隊
按鈕
- 點選
其他
- 輸入相關資訊
團隊名稱
欄位請輸入唯一且可識別的名稱,本範例使用MLOps
- 團隊名稱輸入完成後點選
下一步
- 建立過程中
- 點選
略過
- 建立完成
Step 2. 建立連接器
- 點選右上角的
...
> 再點選連接器
連接器
按鈕會過一陣子才會出現,請等待
- 點選
傳入 Webhook
右方的新增
- 點選
新增
按鈕
Step 3. 取得 Webhook
- 點選右上角的
...
> 再點選連接器
- 點選
傳入 Webhook
右邊的設定
- 於
若要設定 Incoming Webhook,請提供名稱並選取 [建立]
欄位輸入唯一且可識別的名稱,本範例使用Notify
- 取得
Webhook URL
- 請複製此 URL 之後會用到,複製完後點選
完成
按鈕
- 請複製此 URL 之後會用到,複製完後點選
建立 Microsoft Azure Machine Learning Studio
- 在輸入框輸入
azure machine learning
後點選Azure Machine Learning
的搜尋結果
- 點選上方的
+ Create
> 點選New workspace
- 輸入相關資訊後點選左下方的
Review + create
- 請記得所使用的
Resource Group
與Workspace name
名稱 ( 這兩個名稱之後會用到 )- 本範例
Resource Group
使用iris-rg
- 本範例
Workspace name
使用iris-ws
- 本範例
- 請記得所使用的
- 確認相關資訊後點選左下角的
Create
- 建立過程中
- 點選
Go to resource
- 點選
Launch studio
- 開啟 Studio 後的畫面
產生部署認證
Step 1. 透過 AZ CLI 登入 Azure
-
於終端機輸入下方指令
az login
-
選擇 Azure 的登入帳號
-
登入成功
Step 2. 設定所要使用的訂閱 ID
-
取得訂閱 ID
az account subscription list
-
設定訂閱 ID
- 請將
SUBSCRIPTION_ID
修改成上方所取得的訂閱 ID
az account set --subscription "SUBSCRIPTION_ID"
- 請將
Step 3. 取得認證相關資訊
- 於終端機輸入下方指令
- 請將
NAME
修改成唯一且可識別的名稱 - 請將
SUBSCRIPTION_ID
修改成上方所取得的訂閱 ID - 請將
RESOURCE_GROUPS
修改成上方建立 Microsoft Azure Machine Learning Studio
區段中所使用的資源群組名稱
az ad sp create-for-rbac --name "NAME" --role contributor \ --scopes /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUPS \ --sdk-auth
- 指令執行完成後所產生的結果之後會用到
- 請將
建立 GitHub Secret
Step 1. 設定 GitHub Action Secret ( 先於 GitHub 上建立新的且唯一可識別的 Repository )
- 開啟 Secret 設定頁面
- 點選右上角的
Settings
> 再點選左側的Secrets and variables
中的Actions
> 再點選右側的New repository secret
- 點選右上角的
-
建立 5 個 Secret 資訊
-
第 1 個
AZURE_CREDENTIALS
SecretName
欄位請輸入AZURE_CREDENTIALS
Secret
欄位請輸入產生部署認證
段落Step 3
所取得的完整 JSON 結果- 以上資訊輸入完成後請點選下方的
Add secret
-
第 2 個
BLOB_SECRET
SecretName
欄位請輸入BLOB_SECRET
Secret
欄位請輸入上傳資料集到 Azure Blob 並取得存取 Key
段落Step 1
所取得的Key
- 以上資訊輸入完成後請點選下方的
Add secret
-
第 3 個
SUBSCRIPTION_ID
SecretName
欄位請輸入SUBSCRIPTION_ID
Secret
欄位請輸入產生部署認證
段落Step 2
所取得訂閱 ID
- 以上資訊輸入完成後請點選下方的
Add secret
-
第 4 個
IOT_HUB_CONNECTION_STRING
SecretName
欄位請輸入IOT_HUB_CONNECTION_STRING
Secret
欄位請輸入建立 Azure IoT Hub
段落Step 5
所取得IoT Hub Connection String
- 以上資訊輸入完成後請點選下方的
Add secret
-
第 5 個
TEAMS_WEBHOOK
SecretName
欄位請輸入TEAMS_WEBHOOK
Secret
欄位請輸入建立 Microsoft Teams
段落Step 3
所取得 `Webhook- 以上資訊輸入完成後請點選下方的
Add secret
-
-
建立完 5 個 Secret 畫面
Edge 端下載訓練完成的 Model
Step 1. 建立 .env
- 於
Edge-Receive-Notify
目錄中建立.env
的檔案並輸入以下的內容
Step 2. 安裝相關套件
① 開啟終端機並切換路徑到 Edge-Receive-Notify
② pip3 install -r requirements.txt
Step 3. 啟動接收程式
python3 receive.py
修改程式並 Push 到 GitHub
Step 1. 檔案結構
└── MLOps_GitHub_Action_AzureML
├── .github
│ └── workflows
│ └── actions.yml
├── AzureBlob
│ └── UploadFiles
│ ├── app.py
│ └── requirements.txt
├── Datasets
│ ├── Test
│ │ └── iris_test.csv
│ └── Training
│ └── iris_training.csv
├── Models
├── Edge-Receive-Notify
│ ├── .env
│ ├── receive.py
│ └── requirements.txt
├── README.md
├── pipeline-info
│ └── save_info.py
├── pipeline-python
│ ├── datasets.py
│ ├── evaluate.py
│ ├── teams_notify.py
│ └── training.py
├── run_configs
│ ├── cluster
│ │ └── create_cluster.yml
│ ├── component
│ │ ├── component_evaluate.yml
│ │ └── component_train.yml
│ ├── environment
│ │ └── environment.yml
│ └── jobs
│ └── pipeline.yml
├── scripts
│ ├── create-cluster.sh
│ ├── create-component.sh
│ ├── run-job.sh
│ └── setup.sh
└── secret
├── requirements.txt
└── set_secret.py
Step 2. 修改 Cluster 規格
run_configs/cluster/create_cluster.yml
- 請修改第 4 行的
size
後的值為所要使用的 VM 規格 - 請修改第 8 行的
location
後的值為所要使用的 Region- 可用
az account list-locations --output table
指令查詢 Region
- 可用
- 請修改第 4 行的
Step 4. 修改 Pipeline 資訊
run_configs/jobs/pipeline.yml
- 請修改第 9 行的
blob_account_name
後的值為上傳資料集到 Azure Blob
中Step 1
所建立名稱
- 請修改第 9 行的
Step 3. 修改 Datasets 資訊
pipeline-python/datasets.py
- 請修改第 17 行的
blob_train_dataset_datetime
請修改成上傳訓練資料集到 Azure Blob
中Step 3
所顯示的上傳日期與時間 - 請修改第 18 行的
blob_test_dataset_datetime
請修改成上傳測試資料集到 Azure Blob
中Step 3
所顯示的上傳日期與時間 - 請修改第 19 行的
blob_account_name
後的值為上傳資料集到 Azure Blob
中Step 1
所建立的 blob 名稱
- 請修改第 17 行的
Step 4. 修改 IoT Hub Device ID 與 blob base url 資訊
pipeline-info/save_info.py
- 請修改第 36 行的
IOT_HUB_DEVICE_ID
請修改成建立 Azure IoT Hub
中Step 4
所輸入的Device ID
。 - 請修改第 37 行的
BLOB_MODEL_BASE_URL
請將irisblobs
修改成所建立的 Azure Blob 名稱。
- 請修改第 36 行的
Step 5. 修改 actions.yml 資訊
.github/workflows
- 請修改第 9 行的
RESOURCE_GROUP
的:
後方的值修改成所建立的 AzureML 所使用的資源群組名稱。 - 請修改第 10 行的
WORKSPACE_NAME
的:
後方的值修改成所建立的 AzureML 所使用的 Workspace name。
- 請修改第 9 行的
Step 6. 將程式部署到 建立 GitHub Secret
段落所建立的 Repository 並查看 Action 觸發的狀況
- 點選 Repository 上方的
Action
驗證結果
Step 1. 查看 AzureML Studio 中的 Pipeline
- Pipeline 正在執行中
- Pipeline 執行完成
Step 2. 查看 AzureML Studio 中的 Data
- Data assets
- Datastore
Step 3. 查看 AzureML Studio 中的 Metrics
Step 4. 查看 AzureML Studio 中的 Output + logs
Step 5. 查看 Edge 端已下載的 Model
- 剛才執行的下載程式
- 於
./MLOps_GitHub_Action_AzureML/Models
資料夾中會出現兩個檔案
Step 6. 查看 Microsoft Teams