教學課程:上傳資料並定型模型 (SDK v1,第 3 部分,共 3 部分)
本教學課程會示範如何上傳和使用您自己的資料,以在 Azure Machine Learning 中訓練機器學習模型。 本教學課程是三部分教學課程系列的第 3 部分。
在第 2 部分:定型模型中,您使用 PyTorch
的樣本資料,在雲端中定型模型。 您也會在 PyTorch API 中,透過 torchvision.datasets.CIFAR10
方法來下載該資料。 在本教學課程中,您將使用下載的資料來學習工作流程,以在 Azure Machine Learning 中使用您自己的資料。
在本教學課程中,您:
- 將資料上傳至 Azure。
- 建立控制指令碼。
- 了解新的 Azure Machine Learning 概念 (傳遞參數、資料集、資料存放區)。
- 提交並執行您的訓練指令碼。
- 在雲端中檢視程式碼輸出。
必要條件
您將需要先前教學課程中下載的資料。 確定您已完成這些步驟:
調整訓練指令碼
現在,Azure Machine Learning 中有執行中的定型指令碼 (get-started/src/train.py),而且您可以監視模型效能。 讓我們藉由引進引數來將訓練指令碼參數化。 使用引數可讓您輕鬆比較不同的超參數。
我們的定型指令碼目前設定為每次執行時下載 CIFAR10 資料集。 下列 Python 程式碼已調整為從目錄讀取資料。
注意
使用 argparse
參數化指令碼。
開啟 train.py,並將其取代為此程式碼:
import os import argparse import torch import torch.optim as optim import torchvision import torchvision.transforms as transforms from model import Net from azureml.core import Run run = Run.get_context() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( '--data_path', type=str, help='Path to the training data' ) parser.add_argument( '--learning_rate', type=float, default=0.001, help='Learning rate for SGD' ) parser.add_argument( '--momentum', type=float, default=0.9, help='Momentum for SGD' ) args = parser.parse_args() print("===== DATA =====") print("DATA PATH: " + args.data_path) print("LIST FILES IN DATA PATH...") print(os.listdir(args.data_path)) print("================") # prepare DataLoader for CIFAR10 data transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) trainset = torchvision.datasets.CIFAR10( root=args.data_path, train=True, download=False, transform=transform, ) trainloader = torch.utils.data.DataLoader( trainset, batch_size=4, shuffle=True, num_workers=2 ) # define convolutional network net = Net() # set up pytorch loss / optimizer criterion = torch.nn.CrossEntropyLoss() optimizer = optim.SGD( net.parameters(), lr=args.learning_rate, momentum=args.momentum, ) # train the network for epoch in range(2): running_loss = 0.0 for i, data in enumerate(trainloader, 0): # unpack the data inputs, labels = data # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: loss = running_loss / 2000 run.log('loss', loss) # log loss metric to AML print(f'epoch={epoch + 1}, batch={i + 1:5}: loss {loss:.2f}') running_loss = 0.0 print('Finished Training')
儲存檔案。 如果有需要,請關閉索引標籤。
了解程式碼變更
train.py
中的程式碼已使用 argparse
程式庫來設定 data_path
、learning_rate
和 momentum
。
# .... other code
parser = argparse.ArgumentParser()
parser.add_argument('--data_path', type=str, help='Path to the training data')
parser.add_argument('--learning_rate', type=float, default=0.001, help='Learning rate for SGD')
parser.add_argument('--momentum', type=float, default=0.9, help='Momentum for SGD')
args = parser.parse_args()
# ... other code
此外,train.py
指令碼已經過調整,可更新最佳化工具來使用使用者定義的參數:
optimizer = optim.SGD(
net.parameters(),
lr=args.learning_rate, # get learning rate from command-line argument
momentum=args.momentum, # get momentum from command-line argument
)
將資料上傳至 Azure
若要在 Azure Machine Learning 中執行此指令碼,您必須讓您的訓練資料可在 Azure 中使用。 您的 Azure Machine Learning 工作區配備「預設」 資料存放區。 這是您可以用來儲存訓練資料的 Azure Blob 儲存體帳戶。
注意
Azure Machine Learning 可讓您連結其他雲端式資料存放區來儲存您的資料。 如需詳細資訊,請參閱資料存放區文件。
在 [get-started] 資料夾中,建立新的 Python 控制指令碼 (請確定它是在 [get-started] 中,而不是在 [/src] 資料夾中)。 命名指令碼 upload-data.py,並將此程式碼複製到檔案:
# upload-data.py from azureml.core import Workspace from azureml.core import Dataset from azureml.data.datapath import DataPath ws = Workspace.from_config() datastore = ws.get_default_datastore() Dataset.File.upload_directory(src_dir='data', target=DataPath(datastore, "datasets/cifar10") )
target_path
值會指定資料存放區上用來上傳 CIFAR10 資料的路徑。提示
雖然您使用 Azure Machine Learning 來上傳資料,但您可以使用 Azure 儲存體總管來上傳特定檔案。 如果您需要 ETL 工具,可以使用 Azure Data Factory 將您的資料內嵌到 Azure 中。
選取 [儲存並在終端機中執行指令碼],以執行 upload-data.py 指令碼。
您應該會看到下列標準輸出:
Uploading ./data\cifar-10-batches-py\data_batch_2 Uploaded ./data\cifar-10-batches-py\data_batch_2, 4 files out of an estimated total of 9 . . Uploading ./data\cifar-10-batches-py\data_batch_5 Uploaded ./data\cifar-10-batches-py\data_batch_5, 9 files out of an estimated total of 9 Uploaded 9 files
建立控制指令碼
如同您先前所做的,在 [get-started] 資料夾中,建立名為 run-pytorch-data.py 的新 Python 控制指令碼:
# run-pytorch-data.py
from azureml.core import Workspace
from azureml.core import Experiment
from azureml.core import Environment
from azureml.core import ScriptRunConfig
from azureml.core import Dataset
if __name__ == "__main__":
ws = Workspace.from_config()
datastore = ws.get_default_datastore()
dataset = Dataset.File.from_files(path=(datastore, 'datasets/cifar10'))
experiment = Experiment(workspace=ws, name='day1-experiment-data')
config = ScriptRunConfig(
source_directory='./src',
script='train.py',
compute_target='cpu-cluster',
arguments=[
'--data_path', dataset.as_named_input('input').as_mount(),
'--learning_rate', 0.003,
'--momentum', 0.92],
)
# set up pytorch environment
env = Environment.from_conda_specification(
name='pytorch-env',
file_path='pytorch-env.yml'
)
config.run_config.environment = env
run = experiment.submit(config)
aml_url = run.get_portal_url()
print("Submitted to compute cluster. Click link below")
print("")
print(aml_url)
提示
如果您在建立計算叢集時使用不同的名稱,請務必同時調整程式碼 compute_target='cpu-cluster'
中的名稱。
了解程式碼變更
控制指令碼類似於此系列第 3 部分的指令碼,但新增了下列幾行:
dataset = Dataset.File.from_files( ... )
資料集會用來參考您上傳至 Azure Blob 儲存體的資料。 資料集是在您資料之上的抽象層,其設計目的是為了改善可靠性和可信度。
config = ScriptRunConfig(...)
ScriptRunConfig 已修改為包含將傳遞至 train.py
的引數清單。 dataset.as_named_input('input').as_mount()
引數表示指定的目錄將會「掛接」至計算目標。
提交回合至 Azure Machine Learning
選取 [儲存並在終端機中執行指令碼],以執行 run-pytorch-data.py 指令碼。 此執行將會使用您上傳的資料,在計算叢集上定型模型。
此程式碼會在 Azure Machine Learning Studio 中列印實驗的 URL。 如果您移至該連結,就能夠看到您的程式碼正在執行。
注意
您可能會看到開頭為載入 azureml_run_type_providers 時失敗... 的一些警告。您可以忽略這些警告。 使用這些警告底部的連結來檢視您的輸出。
檢查記錄檔
在 Studio 中,移至實驗作業 (藉由選取先前的 URL 輸出),後面接著 [輸出 + 記錄]。 選取 std_log.txt
檔案。 在記錄檔中向下捲動,直到您看見下列輸出:
Processing 'input'.
Processing dataset FileDataset
{
"source": [
"('workspaceblobstore', 'datasets/cifar10')"
],
"definition": [
"GetDatastoreFiles"
],
"registration": {
"id": "XXXXX",
"name": null,
"version": null,
"workspace": "Workspace.create(name='XXXX', subscription_id='XXXX', resource_group='X')"
}
}
Mounting input to /tmp/tmp9kituvp3.
Mounted input to /tmp/tmp9kituvp3 as folder.
Exit __enter__ of DatasetContextManager
Entering Job History Context Manager.
Current directory: /mnt/batch/tasks/shared/LS_root/jobs/dsvm-aml/azureml/tutorial-session-3_1600171983_763c5381/mounts/workspaceblobstore/azureml/tutorial-session-3_1600171983_763c5381
Preparing to call script [ train.py ] with arguments: ['--data_path', '$input', '--learning_rate', '0.003', '--momentum', '0.92']
After variable expansion, calling script [ train.py ] with arguments: ['--data_path', '/tmp/tmp9kituvp3', '--learning_rate', '0.003', '--momentum', '0.92']
Script type = None
===== DATA =====
DATA PATH: /tmp/tmp9kituvp3
LIST FILES IN DATA PATH...
['cifar-10-batches-py', 'cifar-10-python.tar.gz']
注意:
- Azure Machine Learning 已自動為您將 Blob 儲存體掛接到計算叢集。
- 控制指令碼中使用的
dataset.as_named_input('input').as_mount()
會解析為掛接點。
清除資源
如果您打算繼續進行另一個教學課程,或開始自己的定型作業,請跳至下一個步驟。
停止計算執行個體
如果現在不打算使用,請停止計算執行個體:
- 在工作室的左側功能表中,選取 [計算]。
- 在頂端的索引標籤中,選取 [計算執行個體]
- 選取清單中的計算執行個體。
- 在頂端工具列中,選取 [停止]。
刪除所有資源
重要
您所建立的資源可用來作為其他 Azure Machine Learning 教學課程和操作說明文章的先決條件。
如果不打算使用您建立的任何資源,請刪除以免產生任何費用:
在 Azure 入口網站中,選取最左邊的 [資源群組] 。
從清單中,選取您所建立的資源群組。
選取 [刪除資源群組]。
輸入資源群組名稱。 然後選取 [刪除]。
您也可以保留資源群組,但刪除單一工作區。 顯示工作區屬性,然後選取 [刪除]。
後續步驟
在本教學課程中,我們已了解如何使用 Datastore
將資料上傳至 Azure。 資料存放區會作為您工作區的雲端儲存體,提供您持久且彈性的位置來保存資料。
您已了解如何修改您的訓練指令碼,以透過命令列接受資料路徑。 藉由使用 Dataset
,您已能夠將目錄掛接至遠端作業。
現在您已有了模型,接著請了解: