【 MLOps 】透過 GitHub Action 觸發 Azure Machine Learning 中的 Pipeline Job 進行模型訓練與驗證並透過 Microsoft Teams 傳送相關資訊

【 MLOps 】透過 GitHub Action 觸發 Azure Machine Learning 中的 Pipeline Job 
進行模型訓練與驗證並透過 Microsoft Teams 傳送相關資訊
Photo by Hisham Zayadneh / Unsplash

內容

  • 前置準備作業
  • 流程
  • 建立 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
  • 驗證結果

前置準備作業

流程

---2023-05-15---3.55.12

---2023-05-24---8.57.10

建立 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

---2023-05-30---9.08.44

  • 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

    ---2023-05-30---8.55.17

    ---2023-05-30---8.57.13

    ---2023-05-30---8.58.09

    ---2023-05-30---8.56.35

    ---2023-05-30---8.58.51

    • Datastore

    ---2023-05-30---8.59.51

    ---2023-05-30---9.00.32

    ---2023-05-30---9.00.47

    ---2023-05-30---9.01.52

    ---2023-05-30---9.02.27

    • Components

    ---2023-05-30---9.12.30

    • Models

    ---2023-05-30---9.13.41

    ---2023-05-30---9.14.32

    ---2023-05-30---9.15.16

    • AzureML Studio 之 Compute Cluster

    ---2023-05-30---9.17.02

    ---2023-05-30---9.24.06

    ---2023-05-30---9.27.54

    • AzureML Studio 之 Jobs

    ---2023-05-30---9.26.56

    ---2023-05-30---9.29.25

    ---2023-05-30---9.30.39

上傳資料集到 Azure Blob 並取得存取 Key

Step 1. 建立 Azure Blob 服務

  • 在搜尋框輸入 blob 並點選 Storage accounts 的搜尋結果
    ---2023-03-29---9.02.54
  • 點選 Create
    ---2023-03-29---9.06.11
  • 輸入相關資訊後點選左下角的 Review
    • 本範例 Resource group 設定為 iris-rgStorage account name 設定為 irisblobsRegion 設定為 (Asia Pacific) Japan East
      ---2023-03-29---9.07.53
  • 確認相關資訊後點選 Create
    ---2023-05-30---7.07.54
  • 建立過程中
    ---2023-05-30---7.09.26
  • 點選 Go to resource
    ---2023-05-30---7.10.56
  • 建立 datasets Container
    • 點選左邊的 Containers > 點選上方的 + Container
      ---2023-05-30---7.12.01
    • 於輸入 Name 欄位輸入 datasets 後點選 Create
      ---2023-05-30---7.13.23
      ---2023-05-30---7.14.47
    • 建立完成
      ---2023-05-30---7.15.44
  • 建立 models Container
    • 點選上方的 + Container
      ---2023-05-30---7.16.52
    • 輸入相關資訊
      • Name 欄位輸入 models
      • Public access level 欄位選擇 Blob (anonymous read access for blobs only)
      • 以上欄位輸入完成後點選 Create
        ---2023-05-30---7.17.59
    • 建立完成
      ---2023-05-30---7.19.45
  • 取得 Account Name 與 Key
    • 點選左側的 Access keys ( 之後的程式會使用到 Storage account nameKeyConnection string )

      ---2023-05-30---7.20.46


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
    

---2023-05-09---2.34.00


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 的搜尋結果

---2023-05-15---1.17.29


Step 2. 點選上方的 + Create

---2023-05-15---1.21.27


Step 3. Azure IoT Hub 服務

  • 輸入相關資訊
    • Resource group 欄位請輸入唯一且可識別的名稱,本範例使用 iris-rg
    • IoT hub name 欄位請輸入唯一且可識別的名稱,本範例使用 iris-hub
    • Region 欄位請選擇要使用哪個資料中心的 IoT Hub。
    • Tier 欄位請選擇所要使用的規格等級。
    • 以上資訊輸入完成後點選左下角的 Review + create

---2023-05-15---1.23.12

  • 確認相關資訊後,點選 Create

---2023-05-30---7.33.14

  • 建罝過程中

---2023-05-30---7.34.29

  • 建罝完成
    • 點選 Go to resource

---2023-05-30---7.37.19


Step 4. 取得 Device Connection String

  • 點選左側的 Device > 再點選上方的 + Add Device

---2023-05-30---7.38.18

  • 輸入相關資訊
    • Device ID 欄位請輸入唯一且可識別的名稱,本範例使用 device01
    • Device ID 輸入完成後點選 Save

---2023-05-30---7.39.41

  • 取得 Device Connection String

    • 點選所建立的 Device ID

    ---2023-05-30---7.41.17

    • 取得 Device Connection String

    ---2023-05-30---7.42.30


Step 5. 取得 IoT Hub Connection String

  • 回到所建立的 IoT Hub 服務主頁面 > 再點選左側的 Shared access policies > 再點選 iothubowner

---2023-05-30---7.43.55

  • 取得 IoT Hub Connection String

---2023-05-30---7.45.22

建立 Microsoft Teams

Step 1. 建立團隊

  • 開啟 Microsoft Teams > 點選 建立團隊 按鈕

teams1

  • 點選 其他

teams2

  • 輸入相關資訊
    • 團隊名稱 欄位請輸入唯一且可識別的名稱,本範例使用 MLOps
    • 團隊名稱輸入完成後點選 下一步

teams3
pastedImage--1-

  • 建立過程中

teams5

  • 點選 略過

pastedImage--2-

  • 建立完成

pastedImage--3-


Step 2. 建立連接器

  • 點選右上角的 ... > 再點選 連接器
    • 連接器 按鈕會過一陣子才會出現,請等待

pastedImage--4-

  • 點選 傳入 Webhook 右方的 新增

pastedImage--5-

  • 點選 新增 按鈕

pastedImage--6-


Step 3. 取得 Webhook

  • 點選右上角的 ... > 再點選 連接器

pastedImage--4-

  • 點選 傳入 Webhook 右邊的 設定

pastedImage--7-

  • 若要設定 Incoming Webhook,請提供名稱並選取 [建立] 欄位輸入唯一且可識別的名稱,本範例使用 Notify

pastedImage--8-

  • 取得 Webhook URL
    • 請複製此 URL 之後會用到,複製完後點選 完成 按鈕

pastedImage--9-

建立 Microsoft Azure Machine Learning Studio

  • 在輸入框輸入 azure machine learning 後點選 Azure Machine Learning 的搜尋結果

---2023-03-29---9.56.15

  • 點選上方的 + Create > 點選 New workspace

---2023-05-30---7.48.26

  • 輸入相關資訊後點選左下方的 Review + create
    • 請記得所使用的 Resource GroupWorkspace name 名稱 ( 這兩個名稱之後會用到 )
      • 本範例 Resource Group 使用 iris-rg
      • 本範例 Workspace name 使用 iris-ws

---2023-03-29---10.02.43

---2023-05-30---7.52.16

  • 確認相關資訊後點選左下角的 Create

---2023-05-30---7.53.38

  • 建立過程中

---2023-05-30---7.55.33

  • 點選 Go to resource

---2023-05-30---7.56.27

  • 點選 Launch studio

---2023-05-30---7.57.20

  • 開啟 Studio 後的畫面

---2023-05-30---7.58.57

產生部署認證

Step 1. 透過 AZ CLI 登入 Azure

  • 於終端機輸入下方指令

    az login
    

    ---2023-05-09---2.47.05

  • 選擇 Azure 的登入帳號
    ---2023-05-09---2.48.06

  • 登入成功
    ---2023-05-09---2.49.08


Step 2. 設定所要使用的訂閱 ID

  • 取得訂閱 ID

    az account subscription list
    

    ---2023-05-09---2.53.08

  • 設定訂閱 ID

    • 請將 SUBSCRIPTION_ID 修改成上方所取得的訂閱 ID
    az account set --subscription "SUBSCRIPTION_ID"
    

    ---2023-05-09---2.57.03


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
    
    • 指令執行完成後所產生的結果之後會用到

---2023-05-30---8.01.45

建立 GitHub Secret

Step 1. 設定 GitHub Action Secret ( 先於 GitHub 上建立新的且唯一可識別的 Repository )

  • 開啟 Secret 設定頁面
    • 點選右上角的 Settings > 再點選左側的 Secrets and variables 中的 Actions > 再點選右側的 New repository secret

---2023-05-30---8.08.12

  • 建立 5 個 Secret 資訊

    • 第 1 個 AZURE_CREDENTIALS Secret

      • Name 欄位請輸入 AZURE_CREDENTIALS
      • Secret 欄位請輸入 產生部署認證 段落 Step 3 所取得的完整 JSON 結果
      • 以上資訊輸入完成後請點選下方的 Add secret
        ---2023-05-30---8.10.19
    • 第 2 個 BLOB_SECRET Secret

      • Name 欄位請輸入 BLOB_SECRET
      • Secret 欄位請輸入 上傳資料集到 Azure Blob 並取得存取 Key 段落 Step 1 所取得的 Key
      • 以上資訊輸入完成後請點選下方的 Add secret
        ---2023-05-30---8.12.00
        ---2023-05-30---8.13.22
    • 第 3 個 SUBSCRIPTION_ID Secret

      • Name 欄位請輸入 SUBSCRIPTION_ID
      • Secret 欄位請輸入 產生部署認證 段落 Step 2 所取得 訂閱 ID
      • 以上資訊輸入完成後請點選下方的 Add secret
        ---2023-05-30---8.14.12
        ---2023-05-30---8.16.17
    • 第 4 個 IOT_HUB_CONNECTION_STRING Secret

      • Name 欄位請輸入 IOT_HUB_CONNECTION_STRING
      • Secret 欄位請輸入 建立 Azure IoT Hub 段落 Step 5 所取得 IoT Hub Connection String
      • 以上資訊輸入完成後請點選下方的 Add secret
        ---2023-05-30---8.17.05
        ---2023-05-30---8.18.29
    • 第 5 個 TEAMS_WEBHOOK Secret

      • Name 欄位請輸入 TEAMS_WEBHOOK
      • Secret 欄位請輸入 建立 Microsoft Teams 段落 Step 3 所取得 `Webhook
      • 以上資訊輸入完成後請點選下方的 Add secret
        ---2023-05-30---8.19.26
        ---2023-05-30---8.20.31
  • 建立完 5 個 Secret 畫面
    ---2023-05-30---8.22.08

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

Step 4. 修改 Pipeline 資訊

  • run_configs/jobs/pipeline.yml
    • 請修改第 9 行的 blob_account_name 後的值為 上傳資料集到 Azure BlobStep 1 所建立名稱

Step 3. 修改 Datasets 資訊

  • pipeline-python/datasets.py
    • 請修改第 17 行的 blob_train_dataset_datetime 請修改成 上傳訓練資料集到 Azure BlobStep 3 所顯示的上傳日期與時間
    • 請修改第 18 行的 blob_test_dataset_datetime 請修改成 上傳測試資料集到 Azure BlobStep 3 所顯示的上傳日期與時間
    • 請修改第 19 行的 blob_account_name 後的值為 上傳資料集到 Azure BlobStep 1 所建立的 blob 名稱

Step 4. 修改 IoT Hub Device ID 與 blob base url 資訊

  • pipeline-info/save_info.py
    • 請修改第 36 行的 IOT_HUB_DEVICE_ID 請修改成 建立 Azure IoT HubStep 4 所輸入的 Device ID
    • 請修改第 37 行的 BLOB_MODEL_BASE_URL 請將 irisblobs 修改成所建立的 Azure Blob 名稱。

Step 5. 修改 actions.yml 資訊

  • .github/workflows
    • 請修改第 9 行的 RESOURCE_GROUP: 後方的值修改成所建立的 AzureML 所使用的資源群組名稱。
    • 請修改第 10 行的 WORKSPACE_NAME: 後方的值修改成所建立的 AzureML 所使用的 Workspace name。

Step 6. 將程式部署到 建立 GitHub Secret 段落所建立的 Repository 並查看 Action 觸發的狀況

  • 點選 Repository 上方的 Action

---2023-05-30---8.35.28

---2023-05-30---8.35.37

---2023-05-30---9.35.57

驗證結果

Step 1. 查看 AzureML Studio 中的 Pipeline

  • Pipeline 正在執行中

---2023-05-30---8.40.03

---2023-05-30---8.40.18

  • Pipeline 執行完成

---2023-05-30---8.53.26


Step 2. 查看 AzureML Studio 中的 Data

  • Data assets

---2023-05-30---8.55.17

---2023-05-30---8.57.13

---2023-05-30---8.58.09

---2023-05-30---8.56.35

---2023-05-30---8.58.51

  • Datastore

---2023-05-30---8.59.51

---2023-05-30---9.00.32

---2023-05-30---9.00.47

---2023-05-30---9.01.52

---2023-05-30---9.02.27


Step 3. 查看 AzureML Studio 中的 Metrics

---2023-05-30---9.20.09


Step 4. 查看 AzureML Studio 中的 Output + logs

---2023-05-30---9.22.54


Step 5. 查看 Edge 端已下載的 Model

  • 剛才執行的下載程式

---2023-05-30---9.03.16

  • ./MLOps_GitHub_Action_AzureML/Models 資料夾中會出現兩個檔案

---2023-05-30---9.03.51


Step 6. 查看 Microsoft Teams

pastedImage

Sample Code

GitHub

List of blogs