---
title: AI Maker(搶鮮版)
description: OneAI 文件
---
[OneAI 文件](/s/user-guide)
# AI Maker(搶鮮版)
:::info
:bulb:**提示:**
AI Maker 是一套管理機器學習生命週期的 MLOps 解決方案。為了強化 ML 訓練任務的深度與廣度,讓每個模型的產生可以有更自由與更詳盡的履歷,推出 **AI Maker(搶鮮版)**。
**AI Maker(搶鮮版)** 為獨立的版本,與原 **AI Maker** 不互通,但共用標註工具、筆記本服務及範本。若要使用 MLflow 的功能,建議您將任務轉移至 **AI Maker(搶鮮版)** 執行。
:::
**AI Maker(搶鮮版)** 整合 [**MLflow™**](https://www.mlflow.org/) 機器學習生命週期管理開源平台。使用 AI Maker 搶鮮版以及相關的服務可以幫助機器學習團隊提升共同作業的效率,並打通與串接機器學習開發到部署上線的工作流程。
- [**標註工具**](#標註工具):使用內建的標註工具來標註您的訓練資料。
- [**筆記本服務**](/s/notebook):提供機器學習的整合開發環境(IDE),協助進行資料前處理、特徵工程與模型開發,以及訓練後的模型驗證與模型佈署等作業。
- [**範本**](#範本):為機器學習訓練環境和工作流程設定範本。
- [**訓練任務**](#訓練任務):可以進行模型訓練或參數自動調整等作業,並自動將訓練過程綁定至 MLflow 追蹤。
- [**MLflow 追蹤**](#MLflow-追蹤):可以記錄及比較模型訓練過程的參數、指標和結果,也能進入 MLflow UI 查看更多細節。
- [**模型**](#模型):可以透過註冊模型來定型,並管理版本及生命週期的迭代。
- [**推論**](#推論):用訓練好的模型執行推論,可以自動判斷模型類別,無需程式碼即可部署推論服務 REST 端點。
:::warning
:warning: **使用 AI Maker(搶鮮版)注意事項:**
* 一旦開始使用 **OneAI**,系統會在 **儲存服務** 中預設一個 **mlflow** 儲存體,用來存放由 AI Maker(搶鮮版) 與 MLflow 所產生的相關資料,若删除 **mlflow** 儲存體,可能會導致 MLflow 無法使用。
:::
# 使用情境
## 快速上手
AI Maker 搶鮮版為各類 AI 應用提供許多現成的 **公用範本** 及 [**案例教學文件**](/s/user-guide#案例教學),方便您快速套用。對於初次使用 AI Maker 搶鮮版的人,建議您先從有興趣的 [**案例教學**](/s/user-guide#案例教學) 上手,體驗 AI Maker 搶鮮版各項服務的使用流程。
## AI 開發
對於 AI 開發人員或是想要在 AI Maker 搶鮮版上執行自己的機器學習開發環境及訓練、推論程式的人,建議您參考 [**範例教學 - 葡萄酒品質偵測**](#範例教學---葡萄酒品質偵測),了解如何利用 AI Maker 搶鮮版加速 AI 應用的開發。
### 資料準備階段
根據不同的資料性質,可以使用不同的工具來進行資料的準備,讓資料的質量能滿足訓練需求。可以參考 [**範例教學 > 資料準備**](#資料準備)。
- 建議使用 [**儲存服務**](/s/storage) 進行資料上傳。透過 UI 或支援 S3 協定的軟體上傳後,即可與計畫成員共享與協作,並於各個服務中輕鬆存取。
- 如果您有資料前處理需求或者有撈取資料的腳本,建議使用 [**筆記本服務**](/s/notebook) 掛載儲存體後,將開發與處理的結果存入儲存體。
- 如果您有尚未標註的影像原始資料,建議使用 [**標註工具**](#標註工具) 幫助您透過簡易介面快速標註訓練資料。
### 機器學習開發階段
建議使用 [**筆記本服務**](/s/notebook) 開發並串接 [**MLflow 追蹤**](#MLflow-追蹤),利用較小的系統運算資源,確認記錄的結果。可以參考 [**範例教學 > 模型開發**](#模型開發)。
### 模型訓練階段
透過 [**訓練任務**](#訓練任務) 串接 [**MLflow 追蹤**](#MLflow-追蹤),使用較強大的系統運算資源執行大規模的訓練任務,任務執行完畢立即釋放佔用的資源,讓系統算力能更有效率地運用。可以參考 [**範例教學 > 轉換至訓練任務與範本**](#轉換至訓練任務與範本)。
### 模型部署服務階段
透過 [**模型**](#模型管理) 進行版本控管與歷程追蹤,再搭配 [**推論**](#推論管理) 快速將模型部署成 REST 端點,提供 Client 端呼叫進行推論。可以參考 [**範例教學 > 模型註冊與推論服務**](#模型註冊與推論服務)。
# 標註工具
AI Maker 搶鮮版內建 CVAT(Computer Vision Annotation Tool)標註工具,幫助您快速標註機器學習的訓練資料,或是將訓練好的模型透過推論服務與 CVAT 連結,進行自動標註。
## CVAT 基本操作
* [**啟用 CVAT**](#啟用-CVAT)
* [**新增標註任務**](#新增標註任務)
* [**匯出標註資料**](#匯出標註資料)
* [**匯入標註資料**](#匯入標註資料)
* [**停用 CVAT**](#停用-CVAT)
## CVAT 進階應用
除了標註工具的基本操作之外,還提供進階的輔助機制及應用,可以更彈性的分配人力與時間。
* **CVAT 輔助標註**:將標註好的資料,依照 [**CVAT 支援的標註資料格式**](https://opencv.github.io/cvat/docs/manual/advanced/formats/) 匯入至 CVAT 中,再進行人工標註校正或重新訓練優化模型,請參考 [**AI Maker 案例教學 - YOLOv7 影像辨識應用 > CVAT 輔助標註**](/s/casestudy-yolov7#6-CVAT-輔助標註)。
* **CVAT 輔助推論模組實作**:將訓練好的模型透過推論服務直接與 CVAT 連結,進行自動標註大幅節省時間與人力成本。請參考 [**AI Maker 案例教學 - CVAT 輔助推論模組實作**](/s/casestudy-cvat-inference-module)。
* **CVAT 多人協同標註**:管理標註作業的分配與人員配置,將標註作業授權給多個非專案成員進行協同操作,在安全可信任的控管機制下,結合外部專業的標註人力,更有效率地完成資料集的準備,請參考 [**AI Maker 案例教學 - CVAT 多人協同標註**](/s/casestudy-cvat-collaboration)。
## 啟用 CVAT
* 點選左側功能列之「**標註工具**」,進入 CVAT 服務首頁。第一次使用需先點擊「**啟用 CVAT 服務**」,每個專案只能開啟一套 CVAT 服務。

* CVAT 啟用成功後,會出現 CVAT 服務的連結及預設的帳號及密碼,此時狀態為 **`running`**。點擊基本資訊之「**開啟**」,可在瀏覽器的新視窗中開啟 CVAT 服務的登入頁面。
:::info
:bulb: **提示:** 首次啟用 CVAT 建議更改預設的密碼,此密碼沒有期限設定,相同專案之成員,皆可使用此密碼登入 CVAT 服務,為安全考量,請定期更改密碼。
:::

* 輸入基本資訊中所提供的帳號及密碼,即可登入 CVAT 服務頁面。

:::warning
:warning: **注意:** 請使用 Google Chrome 瀏覽器登入 CVAT,若使用其他瀏覽器可能會造成不可預期的問題,例如:無法登入或無法成功標註之類的問題。
:::
## 新增標註任務
* 成功登入 CVAT 服務頁面後,點擊「**+**」接著點選「**+ Create a new task**」建立標註任務。

* 接著設定任務名稱、標籤及選擇欲標註的檔案,建議可先將資料集上傳至儲存服務中,就可在 CVAT 服務中選取該儲存體,設定完成後,點選「**Submit**」。
:::warning
:warning: **注意:CVAT 檔案大小限制**
在 CVAT 服務中,建議您的資料集來源使用儲存服務的儲存體。若您的資料集來源是使用本機端上傳資料,則 CVAT 服務限制每個 TASK 的檔案限制大小為 1 GB。
:::

* 標註任務建立後會出現在「**Tasks**」列表的最上方,點擊 「**Open**」進入任務的詳細資訊頁面。

* 點擊 Job #id,進入資料標註頁面後即可開始進行標註。

* 將滑鼠移至左側工具列的矩形標註工具「**Draw new rectangle**」,選取「**Label**」選單的標籤後再點擊「**Shape**」,接著在圖片上框出目標物件。

* 標註完成後,點擊上方「**Save**」,即可儲存標註結果。

:::warning
:warning: **注意:** 在標註過程中保持隨時存檔的好習慣,以免因不可抗力之因素,造成做白工。
:::
:::info
:bulb:**提示:**
* 更多 CVAT 的資訊請參考 **https://github.com/opencv/cvat**。
* CVAT 的 使用文件請參考 **https://opencv.github.io/cvat/docs/manual/**。
:::
## 匯出標註資料
* 標註任務完成後,可將標註好資料匯出至儲存服務中,再於 AI Maker 中進行機器學習模型的訓練。
* 回到「**Tasks**」頁面,點擊欲下載 Task 右側的「**Actions**」再點選「**Export task dataset**」。

* 出現 **Export task as a dataset** 視窗後,選取欲匯出的資料格式及儲存體,再點擊「**OK**」。

## 匯入標註資料
* 如果您已經有標註好資料,可參考 [**CVAT 支援的標註資料格式**](https://opencv.github.io/cvat/docs/manual/advanced/formats/) 準備欲匯入的標註資料檔案。
* 在標註任務頁面,將滑鼠移動到右上方的「**Actions**」選單,接著點選「**Upload annotations**」,再選取標註資料的格式。

* 接著選取欲匯入的標註資料檔案。

* 匯入的標註資料將覆蓋掉目前的標註結果,確認後點擊「**Update**」。

* 匯入完成後點擊 Job,進入資料標註畫面後即可檢視匯入的標註結果。

:::info
:bulb:**提示:** CVAT 支援的標註資料格式說明請參考 [**CVAT 官方說明文件**](https://opencv.github.io/cvat/docs/manual/advanced/formats/)。
:::
## 停用 CVAT 服務
* 點擊上方的停用圖示,再次點擊「**確定**」即可停用 CVAT 服務。
:::info
:bulb:**提示:** 停用 CVAT 服務並不會删除 CVAT 中的資料。
:::

:::info
:bulb: **提示:** 使用 CVAT 結合 YOLOv7 影像辨識應用,請參考: [**AI Maker 案例教學 - YOLOv7 影像辨識應用 > 使用 CVAT 建立標註任務**](/s/casestudy-yolov7#2-標註資料)。
:::
# 筆記本服務
筆記本服務整合了主流的開發環境,包括 JupyterLab 互動式開發環境、深度學習框架(TensorFlow、PyTorch、 MXNet)與套件以及支援資料科學語言(Julia、R)與數據分析引擎(Spark),讓您快速建立深度學習或資料科學的安全開發環境,進行程式開發、測試、執行與除錯,或與團隊成員分享協作。
## 筆記本服務基本操作
* [**建立筆記本服務**](/s/notebook#建立筆記本服務)
* [**筆記本服務管理**](/s/notebook#筆記本服務管理)
* [**修改筆記本服務設定**](/s/notebook#修改筆記本服務設定)
* [**安裝其他 Python 套件**](/s/notebook#安裝其他-Python-套件)
# 範本
AI Maker 範本功能可將在機器學習開發流程中各項任務所需使用的參數或設定儲存成範本,方便日後快速套用,以節省開發的時間。
## 公用範本與私人範本
範本分為公用範本與私人範本兩種:
* **公用範本**:系統內建多種機器學習範本,可在所有專案中使用。只需要準備對應的資料與格式並放至儲存服務,就可以 **低程式碼(low-code)** 訓練出模型,幫助不同領域的使用者快速上手,大幅降低交付模型的時間。公用訓練範本會自動將訓練過程中的 Parameters、Metrics、Tags 與 Artifacts 追蹤紀錄於 MLflow 並同步呈現於 AI Maker 介面,公用範本的詳細使用請參考 [**AI Maker 案例教學**](/s/user-guide#案例教學)。
* **私人範本**:使用者自行創建的範本,僅可在該專案中與團隊成員共用。
## 建立範本
點選左側「**範本**」,進入「**範本管理**」頁面,點擊「**+建立**」。如果是剛開始使用 AI Maker,亦可先跳過建立範本步驟,直接建立「**訓練任務**」。
* 輸入範本名稱及描述,選擇範本類型,接著點擊「**下一步:訓練任務>**」。

* 依照下列步驟完成範本設定,可選擇只設定一種範本或多種範本。
### 設定訓練任務範本
* 選擇範本:點擊「**選擇**」選取 **公用** 或 **私人** 範本,系統會帶出選取範本的設定內容,可直接套用或再進行修改,若不選擇可自行設定。
:::info
:bulb: **提示:** 首次使用建議參考公用範本設定。
:::
* 映像檔來源:點擊「**選擇**」選取 **公用** 或 **私人** 映像檔。
* 映像檔版本:選擇映像檔版本。
* 環境變數:輸入環境變數的名稱及數值,環境變數除了包含訓練執行的相關設定外,也包括了訓練網路所需的參數設定。
* 超參數:當訓練任務的方法選擇 **Smart ML 訓練任務** 時,需設定機器學習演算法所需的超參數,這是告訴訓練任務,有哪些參數需要進行嘗試。每個參數在設定時,須包含參數的名稱、類型及數值(或數值範圍),選擇類型後(整數、小數和陣列),請依提示輸入相對的數值格式。
* 目標參數:當訓練任務的方法選擇 **Smart ML 訓練任務** 且演算法選擇 **Bayesian** 與 **TPE** 時,可設定一組目標參數的名稱及目標方向,透過每次運行回傳的目標參數結果,自動調整下一個運行所採用的超參數。若回傳的數值為準確率,則可命名為 accuracy,並設定其目標方向為最大值;若回傳的值為錯誤率,則命名為 error ,其方向為最小值。
* 命令:輸入欲執行的命令或程式名稱,例如:`python $INPUT/app.py`。
* 輸入來源:指定訓練資料的存放位置。
* 輸出位置:訓練完後模型的存放位置及掛載路徑,預設的輸出位置為 `OUTPUT`,掛載路徑為 `/output`。
完成後,接著點擊「**檢閱 + 建立**」或「**下一步:推論>**」。

### 設定推論範本
* 來源模型:輸入來源模型的名稱及掛載路徑。如需多個模型進行推論,可點擊「**新增**」,增加其他來源模型。
* 選擇範本:點擊「**選擇**」選取 **公用** 或 **私人** 範本,系統會帶出選取範本的設定內容,可直接套用或再進行修改,若不選擇可自行設定。
* 映像檔來源:點擊「**選擇**」選取 **公用** 或 **私人** 映像檔。
* 映像檔版本:選擇映像檔版本。
* 環境變數:輸入環境變數的名稱及數值。
* 命令:輸入欲執行的命令或程式名稱。例如:`python $INPUT/app.py`。
* 監控資料:點擊「**新增**」,接著輸入監控資料的名稱及類別,監控結果會以圖表方式呈現在推論任務的監控頁面中。
:::info
:bulb: **提示:** 此處監控資料的設定與您的推論程式有關,相關說明請參考 [**推論 > 建立方式 - 自訂 > 進階設定**](#5-進階設定)。
:::
完成後點擊「**下一步:檢閱 + 建立>**」,檢閱建立的範本設定,確定後點擊「**建立**」。

## 管理範本
* 範本建立後,會出現在範本管理列表,建立成功的範本項目會出現勾選圖示,點選該範本列表,可進入「**範本詳細資料**」頁面,檢視範本設定。

### 編輯範本
* 進入範本詳細資料頁面,點擊命令列的鉛筆圖示編輯範本設定,完成後點擊「**儲存編輯**」。

### 删除範本
* 在範本管理列表中,將滑鼠移動到右側的更多選項圖示,接著點選「**删除**」。

# 訓練任務
在完成模型開發後,可以透過 **訓練任務** 進行後續的細部調整,例如使用更大量的資料集、嘗試不同資料集、嘗試多種演算法等,並反覆執行訓練作業以取得最適合的模型結果。
使用 **訓練任務** 可以調用 V100 GPU 運算資源協助安排與執行大規模的訓練作業,不僅大幅縮短運算時長,也於運算完即釋放資源,讓系統算力與預算能更有效率地被運用。執行訓練的環境根據需求可以選用 [**公用映像檔(主流演算法框架)**](/s/public-image) 或 [**私人映像檔(使用者自定義)**](/s/container-image)。
:::info
:bulb:**提示:** 若使用私人映像檔作為環境設定來進行訓練作業,建議使用由 [**NVIDIA NGC™**](https://catalog.ngc.nvidia.com/containers) 的容器映像檔作為基礎映像檔,或者於私人映像檔中安裝 `nvidia-smi` 相關套件,以確保成功驅動 GPU 並使用 V100 GPU 的運算資源。
:::
## 訓練任務使用方式
您可透過以下兩種方式使用訓練任務來訓練模型:
- **範本**
- **公用範本**:系統內建多種機器學習範本,只需要準備對應的資料與格式並放至 OneAI 的 [**儲存服務**](/s/storage),就可以 **低程式碼 (low-code)** 訓練出模型,幫助不同領域的使用者快速上手,大幅降低交付模型的時間。
- 以下列舉的公用訓練範本,會自動將訓練過程中的 Parameters、Metrics、Tags 與 Artifacts 追蹤紀錄於 MLflow 並同步呈現於 AI Maker(搶鮮版)介面。各範本詳細說明請參考 [**AI Maker 案例教學**](/s/user-guide#案例教學)。
- **私人範本**:使用者可以自行創建範本,並於同專案中與團隊成員共用。
- **映像檔**
- 您可以選用 [**公用映像檔**](/s/public-image) 或 [**私人映像檔**](/s/container-image),搭配自定義訓練程式碼,並依使用情境需求進行模型訓練。
- 建議的前置作業:
- 將訓練用資料集存放至 OneAI 的 [**儲存服務**](/s/storage)。
- 將自定義訓練程式碼做對應的修改,並存放至 OneAI 的 [**儲存服務**](/s/storage)。
- 於程式碼中用 [**MLflow 紀錄訓練資料**](#5-記錄訓練資料)。
- 準備所需套件列表。
## 使用訓練任務
訓練任務提供 **一般訓練任務** 或 **Smart ML 訓練任務**。
* **一般訓練任務**:根據使用者的設定,執行一次性的訓練。
* **Smart ML 訓練任務**:Smart ML 訓練任務可以自動調整超參數,能夠有效地將計算資源用於多個模型訓練,節省使用者在分析和調整模型訓練參數上的時間和成本。
### 建立訓練任務
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**訓練任務**」。
* 進入「**訓練任務管理**」頁面,從上方頁籤點選切換「**一般訓練任務**」或「**SMART ML 訓練任務**」,點擊「**+建立**」。
#### 1. 基本資訊
* MLflow Experiment:點擊「**選擇**」選取已存在的 MLflow Experiment 進行綁定。
:::info
:bulb:**提示:** 若尚未建立欲綁定的 Experiment,可先至 MLflow Tracking UI 中創建。若不選擇綁定 MLflow Experiment,系統會以訓練任務名稱為開頭加上字串自動產生一組 Experiment Name 進行綁定。
:::
* 名稱:輸入訓練任務的名稱。
* 描述:輸入訓練任務的描述。
* 演算法:當訓練方法為 Smart ML 訓練任務,可選擇系統提供的演算法。
* **Bayesian**:根據環境變數,超參數的設置範圍和訓練的次數,有效地執行多項訓練任務,並找到更好的參數組合。
* **TPE**:Tree-structured Parzen Estimator,與 Bayesian 演算法類似,可優化高維度超參數的訓練任務。
* **Grid**:經驗豐富的機器學習使用者可以指定超參數的多個值,系統將根據超參數列表的組合執行多個訓練任務,並獲得計算結果。
* **Random**:在指定範圍內隨機選擇用於訓練任務的超參數。
* 選擇方法:點擊「**選擇**」選取訓練方法,不同的訓練方法會切換不同的設定頁面。
* 選擇範本:點擊「**選擇**」選取 **公用** 或 **私人** 範本,系統會帶出選取範本的設定內容,可直接套用或再進行修改,若不選擇可自行設定。
* 映像檔來源:點擊「**選擇**」選取 **公用** 或 **私人** 映像檔。
* 映像檔標籤:選擇映像檔標籤。
接著點擊「**下一步:硬體設定>**」。
#### 2. 硬體設定
* 依您的運算需求,選擇合適的硬體規格配置,亦可點擊「**查看目前已用配額**」,檢視目前專案的資源配額及已用量,接著點擊「**下一步:儲存設定>**」。
#### 3. 儲存設定
* 輸入來源:指定訓練資料所在的儲存名稱,或創建一個新的儲存體。
* 輸出位置:訓練結果的的存放位置及掛載路徑,系統預設為各專案專屬的 mlflow 儲存體。
接著點擊「**下一步:變數設定>**」。
#### 4. 變數設定
* 環境變數:輸入環境變數的名稱及數值,環境變數除了包含訓練執行的相關設定外,也包括了訓練網路所需的參數設定。
* 超參數:當訓練任務的方法選擇 **Smart ML 訓練任務** 時,需設定機器學習演算法所需的超參數,這是告訴訓練任務,有哪些參數需要進行嘗試。每個參數在設定時,須包含參數的名稱、類型及數值(或數值範圍),選擇類型後(整數、小數和陣列),請依提示輸入相對的數值格式。
* 目標參數:當訓練任務的方法選擇 **Smart ML 訓練任務** 且演算法選擇 **Bayesian** 與 **TPE** 時,可設定一組目標參數的名稱及目標方向,透過每次運行回傳的目標參數結果,自動調整下一個運行所採用的超參數。若回傳的數值為準確率,則可命名為 accuracy,並設定其目標方向為最大值;若回傳的值為錯誤率,則命名為 error ,其方向為最小值。
* 命令:輸入欲執行的命令或程式名稱。例如:python $INPUT/app.py。
* 任務次數:當訓練任務的方法選擇 **Smart ML 訓練任務** 時,可設定訓練次數,讓訓練任務執行多次,以找到更好的參數組合。
接著點擊「**下一步:檢閱+建立>**」
:::info
:bulb:**提示:自訂程式碼**
#### 環境變數及超參數
* 若希望可以在不用更改程式碼之下,透過 **訓練任務 > 儲存設定** 的輸入來源設定更換資料集,或者透過 **訓練任務 > 變數設定** 的環境變數或超參數自由調整去更動訓練用的參數,可以使用 **`os.environ.get(ENV, DEFAULT)`** 取用環境變數並設定預設值。
```python=1
import os
DATA_PATH = os.environ.get('INPUT', '/input')
OUTPUT_PATH = os.environ.get('OUTPUT', '/output')
BATCH_SIZE = int(os.environ.get('BATCH_SIZE', 8))
LEARNING_RATE = float(os.environ.get('LEARNING_RATE', 0.00001))
```
* **環境變數** 與 **超參數** 可以互相移動。若您想固定該參數,則可將該參數從超參數區域中移除,新增至環境變數區域,並給定固定值;反之,若想讓該參數可加入自由調整,則可將它從環境變數中移除,加入至超參數區域。
#### 目標參數
* 若希望可以透過每次運行回傳的超參數結果,自動調整下一個運行所採用的超參數,需搭配額外的 Python 套件 **`AIMaker`** 的呼叫,並且只適用於 Smart ML 訓練任務中的演算法 **Bayesian** 與 **TPE**。
```python=1
import AIMaker as ai
ai.sendUpdateRequest({result})
```
* {result} 代表欲傳回 AI Maker 的訓練結果,例如 error_rate、 accuracy,AI Maker 只接受一組回傳值。
* {result} 的型態必須為 int 或 float ( Numpy 型態之 int,float 不可接受)。
:::
#### 5. 檢閱+建立
* 檢視建立的訓練任務設定,確定後點擊「**建立**」。
### 管理訓練任務
* 訓練任務建立後,會出現在列表的最上方,點擊列表進入訓練任務詳細資料頁面。
* 進入訓練任務詳細資料頁面後可檢視訓練任務的詳細設定。點擊命令列的圖示可執行 **儲存(儲存為範本)**、**啟動**、**停止**、**編輯**、**删除** 及 **重新整理** 功能。
:::info
:bulb:**提示:** 請參考 [**服務狀態說明**](/s/service-state#AI-Maker-訓練任務),若服務建立不成功,建議先使用 **筆記本服務** 或 **容器服務** 確認環境設定及程式可成功執行。
:::
### 啟動訓練任務
* 進入訓練任務詳細資料頁面,可確認配置頁面的內容,若訓練任務的狀態顯示為 **```Ready```** 時,即可點擊上方的 **啟動** 圖示執行訓練任務,並將訓練任務資訊帶入 MLflow。
:::info
:bulb:**提示:** AI Maker(搶鮮版)的訓練任務綁定 MLflow Experiment 後,兩邊的 UI 會同步建立並更新。任何新增與變更操作請於 AI Maker(搶鮮版)的訓練任務中操作,相關動作皆會同步更新至 MLflow UI 操作,反之則不會同步更新。
:::

* 點擊上方「**運行列表**」,進入運行列表頁面,數分鐘後,列表中會顯示訓練任務工作的狀態。
* 將滑鼠游標移到列表右側的更多選項圖示,可選擇 「**查看 ARTIFACTS**」、「**查看超參數**」、「**查看日誌**」、「**儲存日誌**」或「**查看詳細狀態**」。選單出現的項目,會因不同的訓練方法和狀態而有所不同。

### 檢視訓練結果
* 進入「**訓練任務詳細資料**」的「**運行列表**」頁面,可查看所有透過 MLflow 記錄的 Metrics 結果。
* 在搜尋框中輸入特定的關鍵字(數值)可搜尋符合條件的 Metrics,點擊右上方的 Metrics 篩選選單,可篩選欲顯示的 Metrics。

* 點擊上方命令列的 **下載所有結果**,可將所有的結果匯出成 csv 檔。

* 點擊任一列表可開啟 MLflow 中相對應的 Run,以查看更多的 Parameters、Metrics、Tags 以及 Artifacts 等資訊。

* 勾選多項運行列表 ID 並點擊上方命令列的 **比較所選結果**,可於 MLflow 中以視覺化的圖表比較不同模型訓練的參數與結果。


### 刪除訓練任務
* 進入「**訓練任務詳細資料**」頁面點擊命令列的 **刪除** 圖示,此動作僅會刪除 AI Maker(搶鮮版) 訓練任務的設定與運行紀錄,所綁定的 MLflow Experiment 紀錄資料將不會被刪除。

# MLflow 追蹤
透過 MLflow 追蹤可以實現 ML 模型的可追溯性與可重現性,並追蹤模型訓練設計之間的關聯與效果。MLflow 相關設定與介面操作請參考下列說明。
- [AI Maker(搶鮮版) - MLflow 追蹤](#AI-Maker(搶鮮版)---MLflow-追蹤)
- [程式碼串整 MLflow](#程式碼串整-MLflow)
- [MLflow 使用者介面](#MLflow-使用者介面)
## AI Maker(搶鮮版) - MLflow 追蹤
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**MLflow 追蹤**」。
* **設定資訊**:此為與 MLflow 串接的必要資訊,包括:MLflow SDK、S3 連線資訊及 MLflow 追蹤端點。
* **連線資訊**:點擊「**開啟**」按鈕即可另開分頁查看 MLflow 使用者介面。

## 程式碼串整 MLflow
以下說明如何在開發階段透過 [**筆記本服務**](/s/notebook) 中的 JupyterLab 編輯程式碼,並透過 [**MLflow 追蹤**](#MLflow-追蹤) 取得串接 MLflow 的必要資訊進行開發階段的歷程追蹤。
#### 1. 取得 **MLflow** 設定資訊
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**MLflow 追蹤**」。
* 進入「**MLflow 追蹤**」頁面後可看到 MLflow 的設定資訊,此為與 **MLflow** 串接的必要資訊,包括:MLflow SDK、S3 連線資訊及 MLflow 追蹤端點。
* 點擊右側的 **複製** 圖示,複製「**變數設定**」欄位中的內容並添加至您的訓練程式。

#### 2. 安裝 MLflow 套件
在筆記本服務中使用 MLflow 之前,需先安裝 MLflow 套件,為避免版本衝突導致不可預期的結果,建議在訓練程式中安裝 **MLflow 1.24** 版,亦可將 MLflow 套件寫入 **requirements.txt**,更多資訊請參考 [**筆記本服務 > 安裝其他 Python 套件**](/s/notebook#安裝其他-Python-套件) 說明文件。
```python=
!pip install --upgrade mlflow==1.24
```
#### 3. 加入 MLflow 設定資訊
在訓練程式中加入所取得的 [**MLflow 設定資訊**](#2-取得-MLflow-設定資訊),包括匯入套件、S3 連線資訊及 MLflow Tracking Server URI。

#### 4. 設定 Experiment Name
設定 Experiment Name,若 Experiment Name 不存在會自動建立。
```python=
os.environ["MLFLOW_EXPERIMENT_NAME"] = "Your Experiment"
mlflow.set_experiment(os.environ["MLFLOW_EXPERIMENT_NAME"])
```
#### 5. 記錄訓練資料
透過 MLflow 提供的 Tracking API 記錄每一次訓練的重要資訊,例如超參數、指標或程式碼版本等資訊。詳細資訊請參考 [**MLflow Logging functions**](https://mlflow.org/docs/latest/tracking.html#logging-functions)。訓練任務的產出模型也可以透過 API 記錄至 MLflow,請參考所使用的 [**支援框架**](https://mlflow.org/docs/latest/python_api/index.html) 的 log_model() 說明。
```python=
...
# Log parameter, metrics, and model to MLflow
mlflow.log_param("learning_rate", learning_rate)
mlflow.log_metric("accuracy", accuracy)
mlflow.set_tag("method_type", method_type)
mlflow.sklearn.log_model(lr, "model")
...
```
若您使用熱門的機器學習框架時亦可透過 MLflow 提供的 **`mlflow.autolog()`** API 自動記錄指標、參數及模型,更多資訊請參考 [**MLflow Automatic Logging**](https://www.mlflow.org/docs/latest/tracking.html#automatic-logging)。
```python=
...
mlflow.autolog()
...
```
## MLflow 使用者介面
#### MLflow Experiments
**Experiments** 讓您快速掌握每一次執行機器學習訓練的差異,並可進行多個訓練結果的視覺化比較,挑選出表現較佳的模型。針對個別模型訓練可以進一步查看追蹤的資訊,包含訓練程式時的 Parameters、Metrics、Tags (例如程式碼版本、資料集名稱或其他)與 Artifacts (例如模型資訊)。

#### MLflow Models
**Models** 讓您查看經過註冊的模型目錄與最新版本等資訊,並定義模型的不同階段,如 `Staging` 、 `Production` 與 `Archived` ,更方便地管理模型的生命週期。

# 模型
模型功能可控管已註冊的模型、挑選模型進行推論或删除成效不佳的模型,協助開發人員管理模型的生命週期,加速 ML 開發流程。
## 註冊模型
模型管理功能結合 MLflow Model Registry 功能,您可以從 AI Maker 搶鮮版訓練任務註冊模型或匯入既有的模型,也可以透過 MLflow 的使用者介面或 API 註冊模型,註冊後的模型可統一管理。

#### 1. 從 AI Maker 訓練任務註冊模型
* 從服務列表選擇「**AI Maker**」,再點擊「**訓練任務**」,進入訓練任務管理頁面。
* 點選訓練任務進入「**訓練任務詳細資料**」的「**運行列表**」頁面。
* 針對欲註冊模型的運行列表,點擊右方的「**註冊模型**」按鈕。

* 在註冊模型視窗中,點擊 **模型目錄** 右側選單,輸入名稱建立新的模型目錄或選擇既有的模型目錄。

#### 2. 從 AI Maker 匯入既有模型
* 如果已經有訓練好的模型,可將模型檔上傳到 **儲存服務** 的儲存體中,再匯入到 AI Maker 的模型管理服務,方便集中管理或進行後續的推論任務,上傳檔案請參考 [**儲存服務說明**](/s/storage)。
:::info
:bulb:**提示:** 模型檔請依照框架輸出之原始檔案上傳至 **儲存服務**,不須壓縮成 zip 檔,例如:scikit-learn > `.pkl`、Pytorch > `.pt`、Tensorflow > `.h5`。
:::
* 從服務列表選擇「**AI Maker**」,再點擊「**模型**」進入模型管理頁面後,再點擊列表中的模型,進入模型版本管理頁面。
* 點選欲匯入的模型目錄列表進入該目錄的模型版本管理頁面。
* 點擊上方 **匯入** 圖示,匯入既有的模型。

#### 3. 從 MLflow 使用者介面註冊模型
* 在 MLflow 使用者介面上點選「**Register Model**」按鈕,相關操作請參考 [**Model UI Workflow**](https://www.mlflow.org/docs/latest/model-registry.html#ui-workflow)。

#### 4. 透過 MLflow API 註冊模型
* 透過 MLflow API 執行註冊模型相關的指令,相關操作請參考 [**MLflow Model Registry 說明**](https://www.mlflow.org/docs/latest/model-registry.html#mlflow-model-registry)
:::info
:bulb:**提示:** 針對模型目錄與版本進行管理動作時,如:建立、編輯、刪除,系統會同步更新 **AI Maker > 模型管理** 頁面與 **MLflow Models** 頁面的資訊。原先已產生之模型檔與相關文件則不受影響。
:::
## 管理模型
* 從服務列表選擇「**AI Maker**」,再點擊「**模型**」,進入模型管理頁面。
* 模型管理可以管理 **模型目錄** 與 **模型版本**:
- **模型目錄**:基於不同情境或商業目的可以建立數個模型目錄,而個別目錄下可以管理多種版本。

- **模型版本**:註冊至模型管理的版本號會由 v1 開始命名,並隨著每一次的模型註冊而遞增,而每一個版本都會存在相關的模型檔與模型文件。

### 管理模型目錄
* **建立模型目錄**:在模型管理頁面點擊「**+新增目錄**」,填寫模型目錄的名稱及描述後,再點擊「**確認**」。
* **編輯模型目錄描述**:點擊模型目錄列表右側更多選項圖示中的「**編輯描述**」,完成後再點擊「**確認**」。
* **刪除模型目錄**:點擊模型目錄列表右側更多選項圖示中的「**刪除**」,再點擊「**確認**」。
:::info
:bulb: **提示:** 請注意,此動作將刪除此模型目錄之註冊紀錄,您仍可至儲存服務查看模型之相關檔案,若有需求請自行至儲存服務刪除以節省儲存空間。
:::
### 管理模型版本
* 點擊任一模型目錄列表,進入模型版本管理頁面,列表中會顯示模型版本、[**類別**](#模型類別)、描述、[**來源**](#模型來源)、建立時間和建立者等資訊,點選任一模型版本進入「**模型詳細資料**」頁面。
* 檢視模型詳細資料:點選任一模型版本進入「**模型詳細資料**」頁面。
* **編輯模型版本描述**:點擊模型版本列表右側更多選項圖示中的「**編輯描述**」,完成後再點擊「**確認**」。
* **刪除模型版本**:點擊模型版本列表右側更多選項圖示中的「**刪除**」,再點擊「**確認**」。
:::info
:bulb: **提示:** 請注意,此動作將刪除此模型版本之註冊紀錄,您仍可至儲存服務查看模型之相關檔案,若有需求請自行至儲存服務刪除以節省儲存空間。
:::
#### 模型類別
* [**註冊模型**](#註冊模型) 時,系統會自動判別的 **模型框架**,並顯示在 **類別** 欄位。
* 模型框架分為兩大類,分別是 **MLflow 預設支援框架** 與 **其它**。
- **MLflow 預設支援框架**
* 有透過 MLflow SDK log_model 或 register_model 記錄且屬於 [**MLflow Built-In Model Flavors(MLflow 1.24 版)**](https://mlflow.org/docs/1.24.0/models.html#built-in-model-flavors) 的模型,系統自動判斷與顯示框架類型。
- **其它**:系統會顯示為 [**pyfunc**](https://www.mlflow.org/docs/latest/models.html#python-function-python-function) 的操作如下。
* 有透過 MLflow SDK log_model 或 register_model 記錄的模型,但不屬於 MLflow 預設支援框架的模型
* 沒有透過 MLflow SDK log_model 或 register_model 紀錄的模型。
#### 模型來源
* 其中 **來源** 欄位為從哪一個來源註冊至模型管理,目前支援三種不同的模型來源,操作方式請參考 [**註冊模型**](#註冊模型)。
| 模型註冊方式 | 來源 |
| ------------------------ | -------- |
|從 AI Maker 訓練任務註冊模型 | 訓練任務 |
|從 AI Maker 匯入既有模型 | 匯入 |
|從 MLflow 使用者介面註冊模型 | MLflow |
|透過 MLflow API 註冊模型 | MLflow |
# 推論
**推論** 可以自動辨識已註冊的模型類別,無須程式碼即可部署成 REST 端點,並提供 Client 端呼叫進行推論。
## 建立推論服務
從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**推論**」進入推論管理頁面,接著點擊「**+建立**」。推論的建立方式有兩種:
* [**自動偵測(預設)**](#建立方式---自動偵測):可以自動判斷模型類型,無需程式碼即可部署推論 REST 端點。
* [**自訂**](#建立方式---自訂):可以選用公用範本套用預設設定,或者自行設定,將模型部署成推論 REST 端點。
### 建立方式 - 自動偵測
#### 1. 基本資訊
* **名稱**:設定推論服務的名稱。
* **描述**:設定推論服務的描述。
* **建立方式**:選擇 **自動偵測**,此選項為預設。
* **來源模型**:選擇來源模型名稱及版本,接著點擊「**偵測**」,即可啟用自動偵測模型類型的功能,並於下方呈現偵測的結果。點擊「[**支援類型清單**](#模型類型支援清單)」可查看支援的模型框架。
* **模型類型**:顯示自動偵測的模型類型名稱,例如:tensorflow、pytorch、sklearn...;自動偵測結果若非支援的模型類型會顯示 **未支援**。
* **推論伺服器**:系統會依自動偵測模型的類型並顯示推論伺服器,例如:MLflow Serve、TensorFlow Serving、TorchServe...;自動偵測結果若非支援的模型類型會顯示 **未支援**。
接著點擊「**下一步:硬體設定>**」。
#### 模型類型支援清單
* 目前 **模型類型** 與 **推論伺服器** 的支援列表如下:
| 模型類型 | 推論伺服器 |參考程式範例|
| ---| --- | --- |
| [**MLFlow (1.24 版)支援的類型**](https://mlflow.org/docs/1.24.0/models.html#built-in-model-flavors),<br> 且透過 MLflow SDK 註冊: <br> tensorflow <br> keras <br> pytorch <br> sklearn <br> spark <br> xgboost <br> ... |MLflow Serve | [MLFlow (1.24 版)](https://mlflow.org/docs/1.24.0/tutorials-and-examples/tutorial.html#serving-the-model) |
| tensorflow <br> keras |TensorFlow Serving | [GitHub](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example) |
| pytorch |TorchServe | [GitHub](https://github.com/pytorch/serve/tree/master/examples) |
| sklearn | SKLearn Server | [GitHub](https://github.com/SeldonIO/seldon-core/blob/master/servers/sklearnserver/test/sklearn_iris.ipynb) |
| xgboost |XGBoost Server | [GitHub](https://github.com/SeldonIO/seldon-core/blob/master/servers/xgboostserver/test/xgboost_iris.ipynb) |
| onnx <br> openvino |Triton Inference Server | [GitHub](https://github.com/triton-inference-server/client) |
| huggingface |HuggingFace Server | [HuggingFace 案例教學文件](/s/user-guide#案例教學) |
#### 2. 硬體設定
* 依您的運算需求,選擇合適的硬體規格配置,亦可點擊「**查看目前可用配額**」,檢視目前專案的資源配額及已用量。如果想要推論服務的反應較為即時,請選擇包含 GPU 的規格。接著點擊「**下一步:檢閱+建立**」。
#### 3. 檢閱+建立
* 檢視推論任務的建立設定,確定後點擊「**建立**」。
### 建立方式 - 自訂
#### 1. 基本資訊
* **名稱**:設定推論任務的名稱。
* **描述**:設定推論任務的描述。
* **建立方式**:選擇 **自訂**。
* **選擇範本**:點擊「**選擇**」選取 **公用** 或 **私人** 範本,系統會帶出選取範本的設定內容,可直接套用或再進行修改,若不選擇可自行設定。
* **來源模型**:輸入來源模型的名稱、模型名稱、版本及掛載位置,如需多個模型進行推論,可點擊「**新增**」,增加其他來源模型。
* **映像檔來源**:點擊「**選擇**」選取 **公用** 或 **私人** 映像檔。
* **映像檔標籤**:選擇映像檔標籤。
接著點擊「**下一步:硬體設定>**」。
#### 2. 硬體設定
* 依您的運算需求,選擇合適的硬體規格配置,亦可點擊「**查看目前可用配額**」,檢視目前專案的資源配額及已用量,接著點擊「**下一步:儲存設定>**」。
#### 3. 儲存設定
* 輸入來源:點擊「**新增**」可設定推論資料所在的儲存名稱、掛載位置及路徑,如不需使用亦可略過,接著點擊「**下一步:變數設定>**」。
#### 4. 變數設定
* 環境變數:輸入環境變數的名稱及數值。
* 命令:輸入欲執行的命令或程式名稱。例如:python $INPUT/app.py。
* Port:設定推論服務的埠號,系統預設為 9999。
完成後點擊「**下一步:進階設定>**」。
#### 5. 進階設定
* 監控資料:點擊「**新增**」可建立欲監控資料的名稱及資料類別。
完成後點擊「**下一步:檢閱+建立**」。
:::info
:bulb: **提示:** 監控資料的設定屬於較為進階的自訂功能,需額外設定於推論程式之中。透過 AI Maker 提供的 [**AIMakerMonitor**](https://pypi.org/project/AIMakerMonitor/) 套件可以將推論結果傳回 AI Maker,並在 AI Maker 推論服務中以視覺化的圖表呈現模型調用的次數與結果。
::: spoiler **點擊展開 AIMakerMonitor 套件的用法**
1. **記錄 API 被使用的次數**
- **monitor.api_count_inc()**,每呼叫這個函數一次,就會在統計表中增加一次呼叫紀錄。
```=
import AIMakerMonitor as monitor
// your code
monitor.api_count_inc()
```
2. **資料類別為標籤的資料**
- **monitor.counter_inc(欲監控資料的名稱, 標籤名稱)**,此函數可用於統計分類的問題,可以統計每個標籤出現的次數,以了解資料的分佈狀況。例如影像分類應用中辨識出車子的次數統計。<br>
- **欲監控資料的名稱**:表示紀錄的表格名稱,型態為 string。
- **標籤名稱**:表示出現的標籤名稱,型態為 string。<br>
下面的範例表示在 `object_detect` 這個表格中,`car` 這個標籤的出現次數增加 1 次。
```=
import AIMakerMonitor as monitor
// your code
monitor.counter_inc("object_detect", "car")
```
3. **統計數值類的資料**
- **monitor.gauge_set(欲監控資料的名稱, 標籤名稱, 數值)**,此函數可用於統計數值的問題,例如每次辨識的信心指數。
- **欲監控資料的名稱**:紀錄的表格名稱,型態為 string。
- **標籤名稱**:出現的標籤名稱,型態為 string。
- **數值**:出現的標籤名稱,型態為 int 或 float。<br>
下面的範例表示在 `confidence` 這個表格中,辨識出 `car` 這個標籤時的信心度。
```=
import AIMakerMonitor as monitor
// your code
monitor.gauge_set("confidence", "car", 90)
```
**註**:以上程式範例皆針對 Python 語言撰寫,若不是使用 Python 開發,請依照實際狀況調整。
:::
#### 6. 檢閱+建立
* 檢閱建立的推論任務設定,確定後點擊「**建立**」。
:::info
:bulb: **提示:** **AI Maker 案例教學**
想了解如何透過「**建立方式 - 自訂**」中的「**公用範本**」建立推論服務,可以參考 [**AI Maker 案例教學**](/s/user-guide#案例教學)。
:::
## 管理推論
* 推論服務建立後,會出現在列表的最上方,點擊列表進入推論詳細資料頁面。
* 進入推論詳細資料頁面後可檢視推論任務的詳細設定。點擊命令列的圖示可執行 **儲存**、**連結/取消至 CVAT**、**啟動**、**停止**、**編輯**、**删除** 及 **重新整理**。

:::info
:bulb: **提示:** 請參考 [**服務狀態說明**](/s/service-state#AI-Maker-推論服務),若服務建立不成功或無法順利執行,建議先點擊「**查看日誌**」,依日誌資訊判斷可能的問題,例如:硬體資源不符需求、映像檔或程式執行錯誤等。
:::
* 點擊「**查看日誌**」可查看推論服務的運行日誌。
* 點擊「**儲存日誌**」可選擇欲儲存的日誌開始與結束期間。按下儲存後,日誌檔案將會自動存至 **儲存服務**中 **log** 儲存體對應的位置,可透過 **日誌儲存路徑** 超連結自動導引至日誌檔案位置。

## 進行推論
* 當狀態顯示為 **`Ready`** 時,即可連線到推論服務進行推論,連線資訊會顯示在變數資訊網路區塊的 **網址** 欄位。

* 推論服務本身不開放對外埠,如需快速驗證推論服務:
* 請在同專案建立「**容器服務**」或「**筆記本服務**」作為 Client。
* 透過上述推論服務中的 **網址** 資訊,進行推論驗證。
* 如需 **對外提供服務:**
- 請先複製上述推論服務中的 **網址** 資訊。
- 在同專案建立可以對外服務的「**容器服務**」作為 proxy,映像檔請選擇 **`generic-nginx`**。

- 將先前複製的推論服務網址填寫至 **變數設定** 頁面中的環境變數 `INF_URL` 的數值欄位。

- 再透過容器服務詳細資料中網路區塊的 **網址** 連結到推論服務。

## 推論監控(僅限「自訂」建立方式)
* 點擊上方「**監控**」可查看推論服務的監控資訊及推論 API 計數。
:::info
:bulb: **提示:** 此處監控圖表的呈現設定說明請參考 [**建立方式 - 自訂 > 進階設定**](#5-進階設定)。
:::

## 推論連結至標註工具(CVAT)
如果您建立的推論服務支援連接至 CVAT,可以將推論服務連結之後,於 CVAT 調用推論服務的結果進行自動標註,以節省標註的人力與時間成本。
:::info
:bulb: **提示:** 請參考
* [**AI Maker 案例教學 - YOLOv7 影像辨識應用 > CVAT 輔助標註**](/s/casestudy-yolov7#6-CVAT-輔助標註)
* [**AI Maker 案例教學 - CVAT 輔助推論模組實作**](/s/casestudy-cvat-inference-module)
:::
### 連結 CVAT
將推論服務連結至 CVAT 的設定有三個地方:
1. **推論管理頁面**
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**推論**」,在推論管理列表中,將滑鼠移至欲連接 CVAT 的推論服務列表右側的更多選項圖示,接著點選「**連結至 CVAT**」。

2. **推論詳細資料頁面**
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**推論**」,在推論管理列表點擊欲連接 CVAT 的推論服務,進入推論詳細資料頁面後,點擊上方「**連接至 CVAT**」圖示。

3. **標註工具(CVAT)頁面**
* 進入 CVAT 管理頁面後,往下移至 **連結推論服務至 CVAT** 區塊。
* 若尚未有連接的推論服務,則點擊「**新增**」按鈕後,透過下拉選單選取確定支援 CVAT 的推論服務名稱,再點擊「**確定**」。

成功連結至 CVAT 後,點選左側功能列之「**標註工具**」,進入 CVAT 服務,在頁面下方會列出已連結的推論服務,點擊「**開啟**」並登入 CVAT 服務。

### CVAT 自動標註
* 進入 CVAT 服務的 「**Tasks**」頁面,將滑鼠移動到欲進行自動標註的任務右側「**Actions**」的更多選項圖示,接著點選「**Automatic annotation**」。

* 出現「**Automatic annotation**」視窗後點擊「**Model**」下拉選單,選取已連結的推論任務模型。

* 接著設定模型與任務 Label 對應,最後點擊「**Annotate**」執行自動標註。

* 標註完成後畫面上會出現標註完成的提示。

* 標註完成後,進入 CVAT 標註工具頁面即可檢視自動標註的結果,若對自動標註的結果不滿意,可再進行人工標註校正或重新訓練優化模型。

### 將推論服務取消連結至 CVAT
與連結至 CVAT 的操作相似,將推論服務取消連結至 CVAT 設定的地方也有三個:
1. **推論管理頁面**
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**推論**」,在推論管理列表中,將滑鼠移至欲取消 CVAT 連結的推論服務右側的更多選項圖示,接著點選「**取消 CVAT 連結**」。

2. **推論詳細資料頁面**
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**推論**」,在推論管理列表點擊欲取消連結 CVAT 的推論服務,進入「**推論詳細資料**」頁面後,點擊上方「**取消 CVAT 連結**」圖示。

3. **標註工具(CVAT)頁面**
* 進入 CVAT 管理頁面後,往下移至 **連結推論服務至 CVAT** 區塊。
* 點擊「**編輯**」按鈕後,點擊推論服務右側的刪除圖示。

## 推論服務資源監控
請參考 [**資源監控**](/s/resource-monitor) 文件。
# 範例教學 - 葡萄酒品質偵測
本章節使用 [**MLflow 範例:SKlearn ElasticNet Wine**](https://github.com/mlflow/mlflow/blob/master/examples/sklearn_elasticnet_wine/train.ipynb) 的範例程式來示範如何使用 AI Maker(搶鮮版)的功能服務進行簡單的葡萄酒品質偵測。
## 資料準備
* 從 OneAI 服務列表選擇 「**儲存服務**」 並建立兩個儲存體
* **`code`** 作為筆記本服務的 workspace,用來編輯程式碼
* 無須進行資料的上傳
* **`data`** 用來存放範例的資料集
* 請下載此範例教學中使用的葡萄酒資料集 [**wine-quality.csv**](https://github.com/mlflow/mlflow/blob/master/examples/sklearn_elasticnet_wine/wine-quality.csv)
* 請參考 [**儲存服務 - 檔案管理**](/s/storage#檔案管理) 將資料集上傳至 **`data`** 儲存體中。
## 模型開發
### 1. 建立筆記本服務
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊 「**筆記本服務**」並參考 [**筆記本服務**](/s/notebook) 說明文件建立服務、掛載儲存體以及啟動 JupyterLab。
* **基本資訊**:開發框架請選擇 **`PyTorch-22.08-py3`**
* **儲存設定**:
* 名稱:掛載路徑:**`/workspace`**、儲存:**`code`**
* 名稱:掛載路徑:**`/data`**、儲存:**`data`**

* JupyterLab 啟動後,從起始頁面 Launcher 中點選 **`Python 3`** 以建立出新的檔案作為程式碼的編輯。請透過右鍵將檔案更改名稱為 **`wine-quality.ipynb`**。

### 2. 編輯範例程式碼
* 請將下列範例程式碼複製貼上至 **`wine-quality.ipynb`** 之中。
* ---設定執行環境---
* 訓練程式所需要額外安裝的套件與版本。
* ---導入必備資訊---
* 請參考 [**程式碼串整-MLflow**](#程式碼串整-MLflow) 並從 UI 上複製必要的資訊才能與 MLflow 串整。
* ---串整 MLflow 實驗追蹤---
* 開發階段可以自訂實驗名稱。
* ---參數設定---
* 開發階段可以定義需要調整與測試的參數。
* 後續章節會說明如何透過 **訓練任務** 的環境變數快速調整參數,以及儲存成專案內快速可套用的 **範本**。
* ---將記錄資訊寫入MLflow追蹤---
* 請參考 [**記錄訓練資料**](#5-記錄訓練資料) 並將所需要追蹤紀錄的資訊寫入追蹤,或者使用 `mlflow.autolog()` 自動記錄。
```python=1
'''---設定執行環境---'''
!pip install mlflow==1.24
!pip install numpy==1.23
!pip install scikit-learn
!pip install pandas
'''---匯入所需套件---'''
import os
import warnings
import sys
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
import mlflow
import mlflow.sklearn
import logging
logging.basicConfig(level=logging.WARN)
logger = logging.getLogger(__name__)
warnings.filterwarnings("ignore")
'''---導入必備資訊---'''
os.environ["AWS_ACCESS_KEY_ID"] = "S3連線資訊的 Access Key"
os.environ["AWS_SECRET_KEY_ID"] = "S3連線資訊的 Secret Key"
os.environ["MLFLOW_S3_ENDPOINT_URL"] = "S3連線資訊的服務端點"
os.environ["MLFLOW_TRACKING_URI"] = "MLflow追蹤端點"
'''---串整 MLflow 實驗追蹤---'''
os.environ["MLFLOW_EXPERIMENT_NAME"] = "winequality-tutorial"
mlflow.set_experiment(os.environ["MLFLOW_EXPERIMENT_NAME"])
'''---參數設定---'''
DATA_PATH = "/data/wine-quality.csv"
ALPHA = 0.1
L1_RATIO = 0.3
'''---定義訓練程式碼---'''
# Wine Quality Sample
def train():
def eval_metrics(actual, pred):
rmse = np.sqrt(mean_squared_error(actual, pred))
mae = mean_absolute_error(actual, pred)
r2 = r2_score(actual, pred)
return rmse, mae, r2
warnings.filterwarnings("ignore")
np.random.seed(40)
# Read the wine-quality csv file
data = pd.read_csv(DATA_PATH)
# Split the data into training and test sets. (0.75, 0.25) split.
train, test = train_test_split(data)
# The predicted column is "quality" which is a scalar from [3, 9]
train_x = train.drop(["quality"], axis=1)
test_x = test.drop(["quality"], axis=1)
train_y = train[["quality"]]
test_y = test[["quality"]]
# Useful for multiple runs (only doing one run in this sample notebook)
with mlflow.start_run():
# Execute ElasticNet
lr = ElasticNet(alpha=ALPHA, l1_ratio=L1_RATIO, random_state=42)
lr.fit(train_x, train_y)
# Evaluate Metrics
predicted_qualities = lr.predict(test_x)
(rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)
# Print out metrics
print("Elasticnet model (ALPHA=%f, L1_RATIO=%f):" % (ALPHA, L1_RATIO))
print(" RMSE: %s" % rmse)
print(" MAE: %s" % mae)
print(" R2: %s" % r2)
'''---將記錄資訊寫入MLflow追蹤---'''
# Log parameter, metrics, and model to MLflow
mlflow.log_param("alpha", ALPHA)
mlflow.log_param("l1_ratio", L1_RATIO)
mlflow.log_metric("rmse", rmse)
mlflow.log_metric("r2", r2)
mlflow.log_metric("mae", mae)
mlflow.set_tag("model_type", "ElasticNet")
mlflow.sklearn.log_model(lr, "model")
'''---執行作業---'''
train()
```
### 3. 取得 **MLflow** 設定資訊
* 從 OneAI 服務列表選擇「**AI Maker(搶鮮版)**」,再點擊「**MLflow 追蹤**」。
* 進入「**MLflow 追蹤**」頁面後可看到 MLflow 的設定資訊,此為與 **MLflow** 串接的必要資訊,包括:MLflow SDK、S3 連線資訊及 MLflow 追蹤端點。
* 點擊右側的 **複製** 圖示,複製「**變數設定**」欄位中的內容

* 再回到先前建立的筆記本服務,並添加至 **`wine-quality.ipynb`** 中的 **'''---導入必備資訊---'''** 段落。

:::info
:bulb: **提示:** 複製完變數設定中的資訊後,可以將第一列 `import mlflow` 及第二列 `import os` 的指令刪除,因為範例程式中已包含相關套件安裝的指令。
:::
### 4. 執行開發程式碼
* 資訊都準備完畢後,可以啟動執行 **`wine-quality.ipynb`** 程式碼。

* 執行完畢後可以看到 train() 後的結果。

### 5. 檢視 MLflow 追蹤結果
* 請參考 [**MLflow 追蹤 - 連線資訊**](#AI-Maker(搶鮮版)---MLflow-追蹤),點擊「**開啟**」按鈕即可另開分頁查看 MLflow 使用者介面。
* 進入 **Experiments** 頁面,於左側尋找程式碼中設定的 Experiment 名稱(範例程式使用的是 **`winequality-tutorial`**),可檢視相關資訊,也可針對特定 Parameters 或 Metrics 進行排序或篩選,快速比較模型訓練的結果。

## 轉換至訓練任務與範本
當程式碼修正與結果確認都滿意之後,可以將 Python 套件以及程式碼打包成之後訓練任務要用的格式。
### 1. 將 Python 套件整理至 requirements.txt
* 於筆記本服務左側點選 requirements.txt。

* 請複製下列需打包的軟體套件並貼上,再儲存檔案。
```=
mlflow==1.24
numpy==1.23
scikit-learn
pandas
```
* 請參考 [**筆記本服務 - 安裝其他 Python 套件**](/notebook#安裝其他-Python-套件) 了解 requirements.txt 的說明與用法。
### 2. 將 iPython 檔案轉換成 Python 執行檔
* 透過下列步驟將 JupyterLab 中開發用的檔案 (.ipynb) 轉換格式成 python 執行檔 (.py)。
* JupyterLab 中開啟一個分頁,並選擇 Terminal。

* 透過 `jupyter-nbconvert` 套件將 ipython 檔案轉換格式成 python 執行檔,請於終端機中執行下列指令,執行成功後左側 workspace 中會出現轉檔後的 **`wine-quality.py`**。
```=
jupyter-nbconvert wine-quality.ipynb --to python --stdout | grep -v -e "^get_ipython" > wine-quality.py
```

### 3. 加工處理 Python 執行檔
* (必要)請點選轉換成功的 **`wine-quality.py`**,並將下列段落從程式碼中 **移除**。此動作是由於 AI Maker 訓練任務有自動或手動綁定 MLflow 實驗的功能,而自製程式碼的這幾個段落會造成功能上的重疊而影響後續執行。
* 請移除 **'''---導入必備資訊---'''** 的段落
* 請移除 **'''---串整 MLflow 實驗追蹤---'''** 的段落

* (非必要)若希望可以在不用更改程式碼之下去更動訓練用的參數,可以改成取用環境變數的程式碼,並透過 **訓練任務** 的環境變數或超參數自由調整。
* 請替換 **'''---參數設定---'''** 的段落
``` python=1
'''---參數設定---'''
DATA_BUCKET = os.environ.get('DATA', "/data")
DATA_CSV = os.environ.get('DATA_CSV', "wine-quality.csv")
DATA_PATH = os.path.join(DATA_BUCKET, DATA_CSV)
ALPHA = float(os.environ.get('ALPHA', 0.5))
L1_RATIO = float(os.environ.get('L1_RATIO', 0.5))
```
* (非必要)若希望藉由 **Smart ML 訓練任務** 中的 Bayesian 或 TPE 演算法,透過每次運行回傳的超參數結果,自動調整下一個運行所採用的超參數,可以搭配程式碼的 SDK 呼叫來達成,請參考 [**訓練任務-變數設定**](#4-變數設定)。除了上述 **參數設定** 的替換之外,請額外進行下列步驟。
* 請再額外補一個 Python 套件至 requirements.txt
* `AIMaker`
* 請再額外補一個需要匯入的套件到 **'''---匯入所需套件---'''** 的段落
* `import AIMaker as ai`
* 請再額外補上一段程式碼到 **'''---將記錄資訊寫入 MLflow 追蹤---'''** 的段落
* `ai.sendUpdateRequest(float(mae))`
* 編輯完畢後請記得將 **`wine-quality.py`** 檔案進行**儲存**。
* 加工後的完整範例程式碼(含上述三個步驟)
:::spoiler 請展開查看
* **`requirements.txt`**
```=
mlflow==1.24
numpy==1.23
scikit-learn
pandas
AIMaker
```
* **`wine-quality.py`**
```python=1
'''---匯入所需套件---'''
import os
import warnings
import sys
import AIMaker as ai
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
import mlflow
import mlflow.sklearn
import logging
logging.basicConfig(level=logging.WARN)
logger = logging.getLogger(__name__)
warnings.filterwarnings("ignore")
'''---參數設定---'''
DATA_BUCKET = os.environ.get('DATA', "/data")
DATA_CSV = os.environ.get('DATA_CSV', "wine-quality.csv")
DATA_PATH = os.path.join(DATA_BUCKET, DATA_CSV)
ALPHA = float(os.environ.get('ALPHA', 0.5))
L1_RATIO = float(os.environ.get('L1_RATIO', 0.5))
'''---定義訓練程式碼---'''
# Wine Quality Sample
def train():
def eval_metrics(actual, pred):
rmse = np.sqrt(mean_squared_error(actual, pred))
mae = mean_absolute_error(actual, pred)
r2 = r2_score(actual, pred)
return rmse, mae, r2
warnings.filterwarnings("ignore")
np.random.seed(40)
# Read the wine-quality csv file
data = pd.read_csv(DATA_PATH)
# Split the data into training and test sets. (0.75, 0.25) split.
train, test = train_test_split(data)
# The predicted column is "quality" which is a scalar from [3, 9]
train_x = train.drop(["quality"], axis=1)
test_x = test.drop(["quality"], axis=1)
train_y = train[["quality"]]
test_y = test[["quality"]]
# Useful for multiple runs (only doing one run in this sample notebook)
with mlflow.start_run():
# Execute ElasticNet
lr = ElasticNet(alpha=ALPHA, l1_ratio=L1_RATIO, random_state=42)
lr.fit(train_x, train_y)
# Evaluate Metrics
predicted_qualities = lr.predict(test_x)
(rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)
# Print out metrics
print("Elasticnet model (ALPHA=%f, L1_RATIO=%f):" % (ALPHA, L1_RATIO))
print(" RMSE: %s" % rmse)
print(" MAE: %s" % mae)
print(" R2: %s" % r2)
'''---將記錄資訊寫入MLflow追蹤---'''
# Log parameter, metrics, and model to MLflow
mlflow.log_param("alpha", ALPHA)
mlflow.log_param("l1_ratio", L1_RATIO)
mlflow.log_metric("rmse", rmse)
mlflow.log_metric("r2", r2)
mlflow.log_metric("mae", mae)
mlflow.set_tag("model_type", "ElasticNet")
mlflow.sklearn.log_model(lr, "model")
ai.sendUpdateRequest(float(mae))
'''---執行作業---'''
train()
```
:::
### 4. 透過訓練任務執行 Python 執行檔
* 請參考 [**使用訓練任務**](#使用訓練任務) 的步驟建立訓練任務。
* **基本資訊**
* MLflow Experiment 可選擇開發階段所使用的 `winequality-tutorial` 或者不選擇(由系統自動產生一組新的實驗追蹤)。
* 映像檔來源請選擇 `notebook`。
* 映像檔標籤請選擇 `PyTorch-22.08-py3`。

* **儲存設定**:比照筆記本服務中範例的掛載方式設定兩個儲存體
* 名稱:WORKSPACE、掛載路徑:/workspace、儲存:code
* 名稱:DATA、掛載路徑:/data、儲存:data

* **變數設定(一般訓練任務)**
* 環境變數:
| 變數 | 數值(自訂) | 預設值 | 說明 |
| --- | --- | --- | --- |
| DATA_CSV | wine-quality.csv | wine-quality.csv | 可以替換成其他同格式的資料集,但須上傳至 `data` 儲存體中的第一層 |
| ALPHA | 0.1 | 0.5 | 範例程式中使用的 `ALPHA` |
| L1_RATIO | 0.3 | 0.5 | 範例程式中使用的 `L1_RATIO` |
* 目標參數:名稱請填寫 **`mae`**,目標方向選擇 **`最小值`**。
* 指令:請填寫 **`pip install -r /workspace/requirements.txt; python /workspace/wine-quality.py`**

* **變數設定(SmartML 訓練任務)**
* 環境變數:
| 變數 | 數值(自訂) | 預設值 | 說明 |
| --- | --- | --- | --- |
| DATA_CSV | wine-quality.csv | wine-quality.csv | 可以替換成其他同格式的資料集,但須上傳至 `data` 儲存體中的第一層 |
* 超參數:
| 變數 | 類型 | 最小值(自訂) | 最大值(自訂) | 預設值 | 說明 |
| --- | --- | --- | --- | --- | --- |
| ALPHA | 小數 | 0.1 | 0.9 | 0.5 | 範例程式中使用的 `ALPHA` |
| L1_RATIO | 小數 | 0.1 | 0.9 | 0.5 | 範例程式中使用的 `L1_RATIO` |
* 目標參數:名稱請填寫 **`mae`**,目標方向選擇 **`最小值`**。
* 指令:請填寫 **`pip install -r /workspace/requirements.txt; python /workspace/wine-quality.py`**
* 任務次數:根據選擇的演算法可以設定不同的運行次數。

* 完成訓練任務建立後,請參考 [**訓練任務管理**](#訓練任務管理) 啟動剛剛建立的訓練任務並等訓練任務執行完畢。

* 請參考 [**檢視訓練結果**](#檢視訓練結果) 查看訓練結果。
### 5. 將訓練任務儲存成範本
可以參考 [**範本**](#範本) 將訓練任務的設定資訊記錄成專案內共享的範本,以便其他專案成員可以輕鬆套用並自由調整資料集或參數等設定。
* 在已建立的訓練任務詳細資料頁的左上角,點選 **儲存** 的圖示。

* 填寫範本的名稱後,點選確認即可儲存成訓練任務的範本。

## 模型註冊與推論服務
延續前面的範例教學,訓練任務已完成並且產生對應的模型,可以將模型進行註冊並版本控管,也可以再將模型部署成推論服務。
### 1. 註冊模型
* 請參考 [**註冊模型**](#註冊模型) 中的「**模型來源 - 訓練任務**」步驟將模型註冊,並透過 [**管理模型目錄**](#管理模型目錄) 管理模型的各個版本。

* 此範例可以看到已經有註冊三個來自訓練任務的模型版本。

* 點擊最佳測試結果的模型,進入模型詳細資料頁面,可查看更多細節。

### 2. 建立推論服務
* 請參考 [**建立方式 - 自動偵測**](#建立方式---自動偵測) 選擇註冊的模型名稱與版本,再點擊「**偵測**」按鈕,自動偵測後,頁面上會顯示模型類型 `sklearn` 及推論伺服器是 `MLflow Serve`,接著繼續完成推論服務的建立。

### 3. 進行推論
* 請參考 [**進行推論**](#進行推論),取得推論服務的「**網址**」。

* Client 的部份可以沿用先前模型開發階段 [**建立的筆記本服務**](#1-建立筆記本服務),來開啟動 JupyterLab,此範例使用 `wine-quality`。
#### 3.1 使用 curl 指令驗證
* 記得將 `http://{host}/invocations` 更換成推論服務的「**網址**」。
* 執行後,即可看到推論後的結果 `{"predictions": [6.594901392856684]}`
```bash
curl -X POST -H "Content-Type:application/json" --data '{"dataframe_split": {"columns":["fixed acidity", "volatile acidity", "citric acid", "residual sugar", "chlorides", "free sulfur dioxide", "total sulfur dioxide", "density", "pH", "sulphates", "alcohol"],"data":[[6.2, 0.66, 0.48, 1.2, 0.029, 29, 75, 0.98, 3.33, 0.39, 12.8]]}}' http://{host}/invocations
```
#### 3.2 使用 Python 程式碼驗證
可於 JupyterLab 中新建一個 Python3 Notebook,並將下列範例程式碼複製貼上到新建的 Python3 Notebook 之中。
* 記得將 `http://{host}/invocations` 更換成推論服務的「**網址**」。
* 執行後,即可看到推論後的結果 `{'predictions': [5.638783963790194]}`
``` python=1
import requests
inference_request = {
"dataframe_split": {
"columns": [
"alcohol",
"chlorides",
"citric acid",
"density",
"fixed acidity",
"free sulfur dioxide",
"pH",
"residual sugar",
"sulphates",
"total sulfur dioxide",
"volatile acidity",
],
"data": [[7.4,0.7,0,1.9,0.076,11,34,0.9978,3.51,0.56,9.4]]
}
}
endpoint = "http://{host}/invocations"
response = requests.post(endpoint, json=inference_request)
response.json()
```