使用 Azure 服務工作區訓練 ML 模型

目的:依據 參考連結1 的模式,將等待訓練的 ML 模型送到 Azure ML Service Workspace 使用 GPU 來進行訓練(Experiment),以提高訓練效率

效果:用 ResNet50 訓練圖片 (128*128) 約 2 萬張,1 epoch CUP i5 訓練時間約 8700 秒;Azure GPU 約 800 秒

準備:(1) 在 Jupyter Notebook 上執行 Azure 工作區的建立和上傳資料 (2) 實際訓練內容 training script (train.py)

步驟:(1) 安裝 Azure SDK,建立 workspace (2) 上傳圖檔到儲存體帳戶中 (3) 設定 script parameters (4) 上傳 training script 到 worksapce (5) 設定並啟動實驗 (Experiment)


1.安裝 SDK,建立workspace

因為是在 Jupyter Notebook 上操作,所以安裝了給 Notebook 用的 SDK

pip install azureml-sdk[notebooks]

開啟新的 Notebook 檔案,載入必要套件

import os
import shutil
import azureml

from azureml.core import Experiment
from azureml.core import Workspace, Run
from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

from azureml.train.dnn import TensorFlow

print("SDK version:", azureml.core.VERSION)

建立新的 workspace

# 資源群組名稱
resource_group_name = "mlgroup"

# 訂用帳戶識別碼
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"

# 位置
azure_region="eastus2"

# ML服務工作區名稱
aml_workspace_name = "keras_on_azure"

ws = Workspace.create(subscription_id = subscription_id,
					  resource_group = resource_group_name,
					  create_resource_group = True,
					  name = aml_workspace_name,                
					  location = azure_region)

# 匯出 config
ws.write_config()

或者直接載入 config

ws = Workspace.from_config()

2.上傳圖檔到儲存體帳戶中

# Upload input data
ds = ws.get_default_datastore()
ds.upload(src_dir='../train', target_path='train', overwrite=True, show_progress=True)
ds.upload(src_dir='../test', target_path='test', overwrite=True, show_progress=True)

儲存體帳戶顯示我們剛剛上傳的圖片

Picture006

3.設定 script parameters

在 Notebook 繼續設定檔案來源位置等模型訓練時要匯入的參數

script_params = {
    '--train_folder': ds.path('train').as_mount(),
    '--test_folder': ds.path('test').as_mount(),
}

相對應的,在 training script 也要取得參數

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--train_folder', type=str, dest='train_folder',
					help='train data folder mounting point')
parser.add_argument('--test_folder', type=str, dest='test_folder', 
					help='test data folder mounting point')
args = parser.parse_args()
train_folder = args.train_folder
test_folder = args.test_folder

4.上傳 training script 到 worksapce

上傳 training script 前,裡面先設定要取得的 log ,並儲存檔案

from azureml.core import Run
score = model.evaluate(x_test, y_test, verbose=0)
run = Run.get_context()
run.log('Test loss:', score[0])
run.log('Test accuracy:', score[1])

run.log_list('history_train', model_history.history["loss"])
run.log_list('history_valid', model_history.history["val_loss"])

將 training script 和其他必要檔案複製到 script_folder 資料夾中,等一下建立 Experiment 時一起上傳

# Upload training script
script_folder = './run'
os.makedirs(script_folder, exist_ok=True)

shutil.copy('train.py', script_folder)
shutil.copy('test.csv', script_folder)
shutil.copy('train.csv', script_folder)

5.設定並啟動實驗 (Experiment)

在 Notebook 啟動實驗

# Create Experiment
exp = Experiment(workspace=ws, name='keras_test')

# Get default compute target
compute_target = ws.get_default_compute_target(type='GPU')
print(compute_target)

# Create an estimator
est = TensorFlow(source_directory=script_folder,
                 entry_script='train.py',
                 compute_target=compute_target,
                 script_params=script_params,
                 pip_packages=['keras', 'scikit-image', 'sklearn', 'pandas', 'numpy'],
                 use_gpu=True)

# Submit the job
run = exp.submit(est)
run

最後在 Workspace 中可以檢視目前 Experiment 的進度,以及傳回來的 log (Test Loss/Test Accuracy) 等

Picture007

如果有將訓練模型存下來(.h5檔等),則會存到儲存體帳戶中


參考連結1:(GitHub) Img classification training

參考連結2:(Microsoft) How to train keras

參考連結3:(YouTube) How to install and use the Azure Machine Learning Python SDK


<如有轉載,請附上本文連結網址>