【 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

- 建立
datasetsContainer- 點選左邊的
Containers> 點選上方的+ Container

- 於輸入
Name欄位輸入datasets後點選Create


- 建立完成

- 點選左邊的
- 建立
modelsContainer- 點選上方的
+ Container

- 輸入相關資訊
Name欄位輸入modelsPublic 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_CREDENTIALSSecretName欄位請輸入AZURE_CREDENTIALSSecret欄位請輸入產生部署認證段落Step 3所取得的完整 JSON 結果- 以上資訊輸入完成後請點選下方的
Add secret

-
第 2 個
BLOB_SECRETSecretName欄位請輸入BLOB_SECRETSecret欄位請輸入上傳資料集到 Azure Blob 並取得存取 Key段落Step 1所取得的Key- 以上資訊輸入完成後請點選下方的
Add secret


-
第 3 個
SUBSCRIPTION_IDSecretName欄位請輸入SUBSCRIPTION_IDSecret欄位請輸入產生部署認證段落Step 2所取得訂閱 ID- 以上資訊輸入完成後請點選下方的
Add secret


-
第 4 個
IOT_HUB_CONNECTION_STRINGSecretName欄位請輸入IOT_HUB_CONNECTION_STRINGSecret欄位請輸入建立 Azure IoT Hub段落Step 5所取得IoT Hub Connection String- 以上資訊輸入完成後請點選下方的
Add secret


-
第 5 個
TEAMS_WEBHOOKSecretName欄位請輸入TEAMS_WEBHOOKSecret欄位請輸入建立 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

Sample Code
GitHub
List of blogs
