使用 Azure Machine Learning 資料集定型模型
適用於: Python SDK azureml v1 (部分機器翻譯)
在本文中,您將了解如何使用 Azure Machine Learning 資料集以定型機器學習模型。 您可以使用本機或遠端計算目標中的資料集,而不需要擔心連接字串或資料路徑。
針對結構化資料,請參閱在機器學習定型指令碼中取用資料集。
針對非結構化資料,請參閱將檔案掛接至遠端計算目標。
Azure Machine Learning 資料集提供與 Azure Machine Learning 定型功能的順暢整合,例如 ScriptRunConfig、HyperDrive 和 Azure Machine Learning 管線。
如果您尚未準備好將資料用於模型定型,但想要將資料載入至您的筆記本以進行資料探索,請參閱如何探索資料集中的資料。
必要條件
若要建立並使用資料集定型,您需要:
Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。 立即試用免費或付費版本的 Azure Machine Learning。
已安裝適用於 Python 的 Azure Machine Learning SDK (>= 1.13.0),其包含
azureml-datasets
套件。
注意
某些資料集類別具有 azureml-dataprep 套件的相依性。 對於 Linux 使用者,只有下列發行版本才支援這些類別: Red Hat Enterprise Linux、Ubuntu 和 Fedora。
使用機器學習服務定型指令碼中的資料集
如果您的結構化資料尚未註冊為資料集,請建立 TabularDataset,並直接在您本機或遠端實驗的定型指令碼中使用。
在此範例中,您會建立未註冊的 TabularDataset,並將其指定為 ScriptRunConfig 物件中的指令碼引數,以供定型使用。 如果您想要在工作區中重複使用此 TabularDataset 與其他實驗,請參閱如何將資料集註冊至您的工作區。
建立 TabularDataset
下列程式碼會從 web url 建立未註冊的 TabularDataset。
from azureml.core.dataset import Dataset
web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path)
TabularDataset 物件會提供將 TabularDataset 中的資料載入 pandas 或 Spark DataFrame 的方法,讓您可以使用熟悉的資料準備和定型程式庫,而不需要離開您的筆記本。
存取定型指令碼中的資料集
下列程式碼會設定指令碼引數 --input-data
,您可以在設定定型執行時指定該引數 (請參閱下一節)。 當表格式資料集作為引數值傳入時,Azure Machine Learning 會將其解析為資料集識別碼。 然後,您即可使用該引數值來存取定型指令碼中的資料集 (而不必在指令碼中對資料集的名稱或識別碼進行硬式編碼)。 然後,使用 to_pandas_dataframe()
方法,將該資料集載入 pandas 資料框架,以便在定型前進行進一步的資料探索和準備。
注意
如果您的原始資料來源包含 NaN、空字串或空白值,當您使用 to_pandas_dataframe()
時,這些值會取代為 Null 值。
如果您需要將備妥的資料從記憶體內部的 pandas 資料框架載入新的資料集,請將資料寫入本機檔案 (例如 parquet),然後從該檔案建立新的資料集。 深入了解如何建立資料集。
%%writefile $script_folder/train_titanic.py
import argparse
from azureml.core import Dataset, Run
parser = argparse.ArgumentParser()
parser.add_argument("--input-data", type=str)
args = parser.parse_args()
run = Run.get_context()
ws = run.experiment.workspace
# get the input dataset by ID
dataset = Dataset.get_by_id(ws, id=args.input_data)
# load the TabularDataset to pandas DataFrame
df = dataset.to_pandas_dataframe()
設定定型執行
ScriptRunConfig 物件用於設定和提交定型執行。
此程式碼會建立 ScriptRunConfig 物件,src
,藉以指定:
- 適用於您指令碼的指令碼目錄。 在此目錄中的所有檔案都會上傳到叢集節點以便執行。
- 定型指令碼,train_titanic.py。
- 定型的輸入資料集,
titanic_ds
,做為指令碼引數。 Azure Machine Learning 會在傳遞至您的指令碼時,將其解析為資料集的對應識別碼。 - 執行時的計算目標。
- 執行時的環境。
from azureml.core import ScriptRunConfig
src = ScriptRunConfig(source_directory=script_folder,
script='train_titanic.py',
# pass dataset as an input with friendly name 'titanic'
arguments=['--input-data', titanic_ds.as_named_input('titanic')],
compute_target=compute_target,
environment=myenv)
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)
將檔案掛接至遠端計算目標
如果您有非結構化的資料,請建立 FileDataset,並掛接或下載您的資料檔案,使其可供您的遠端計算目標用於定型。 針對您的遠端訓練實驗深入了解使用掛接與下載的時機。
下列範例
- 為您的定型資料建立輸入 FileDataset,
mnist_ds
。 - 指定要寫入定型結果的位置,以及將這些結果升階為 FileDataset。
- 將輸入資料集掛接至計算目標。
注意
如果您使用自訂的 Docker 基礎映像,則需要透過 apt-get install -y fuse
以安裝 fuse 做為相依性,以便資料集掛接正常運作。 了解如何建立自訂建置映像。
如需筆記本範例,請參閱如何使用資料輸入和輸出來設定定型執行。
建立 FileDataset
下列範例會從 web url 建立未註冊的 FileDataset mnist_data
。 此 FileDataset 是您定型執行的輸入資料。
深入了解如何從其他來源建立資料集。
from azureml.core.dataset import Dataset
web_paths = [
'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
]
mnist_ds = Dataset.File.from_files(path = web_paths)
在哪裡寫入定型輸出
您可以使用 OutputFileDatasetConfig 物件,以指定寫入定型結果的位置。
OutputFileDatasetConfig 物件可讓您:
- 將執行的輸出掛接或上傳至您指定的雲端儲存體。
- 以 FileDataset 的形式將輸出另存為這些支援的儲存體類型:
- Azure Blob
- Azure 檔案共用
- Azure Data Lake Storage 世代 1 和 2
- 追蹤定型執行之間的資料譜系。
下列程式碼指定定型結果應儲存為預設 blob 資料存放區 def_blob_store
中 outputdataset
資料夾中的 FileDataset。
from azureml.core import Workspace
from azureml.data import OutputFileDatasetConfig
ws = Workspace.from_config()
def_blob_store = ws.get_default_datastore()
output = OutputFileDatasetConfig(destination=(def_blob_store, 'sample/outputdataset'))
設定定型執行
建議您在透過 ScriptRunConfig
建構函式的 arguments
參數掛接時,以引數形式傳遞資料集。 如此一來,您就能透過引數,取得定型指令碼中 (掛接點) 的資料路徑。 這樣,您就可以在任何雲端平台上,使用相同的定型指令碼進行本機偵錯和遠端訓練。
下列範例會透過 arguments
建立傳遞至 FileDataset 的 ScriptRunConfig。 在您提交執行之後,資料檔案所參考的資料集 mnist_ds
會掛接至計算目標,而定型結果會儲存至預設資料存放區中指定的 outputdataset
資料夾。
from azureml.core import ScriptRunConfig
input_data= mnist_ds.as_named_input('input').as_mount()# the dataset will be mounted on the remote compute
src = ScriptRunConfig(source_directory=script_folder,
script='dummy_train.py',
arguments=[input_data, output],
compute_target=compute_target,
environment=myenv)
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)
簡單定型指令碼
下列指令碼是透過 ScriptRunConfig 提交的。 它會將 mnist_ds
資料集讀取為輸入,並將檔案寫入預設 blob 資料存放區 def_blob_store
中的 outputdataset
資料夾。
%%writefile $source_directory/dummy_train.py
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import sys
import os
print("*********************************************************")
print("Hello Azure Machine Learning!")
mounted_input_path = sys.argv[1]
mounted_output_path = sys.argv[2]
print("Argument 1: %s" % mounted_input_path)
print("Argument 2: %s" % mounted_output_path)
with open(mounted_input_path, 'r') as f:
content = f.read()
with open(os.path.join(mounted_output_path, 'output.csv'), 'w') as fw:
fw.write(content)
掛接與下載
從 Azure Blob 儲存體、Azure 檔案儲存體、Azure Data Lake Storage Gen1、Azure Data Lake Storage Gen2、Azure SQL Database 以及適用於 PostgreSQL 的 Azure 資料庫建立的資料集支援掛接或下載任何格式的檔案。
當您掛接資料集時,您會將資料集所參考的檔案連結至目錄 (掛接點),並使其可在計算目標上使用。 以 Linux 為基礎的計算支援掛接,包括 Azure Machine Learning Compute、虛擬機器和 HDInsight。 如果您的資料大小超過計算磁碟大小,則不可能進行下載。 在此案例中,我們建議您掛接,因為處理時,只會載入指令碼所使用的資料檔案。
當您下載資料集時,資料集參考的所有檔案都會下載至計算目標。 所有計算類型皆支援下載。 如果您的指令碼會處理資料集參考的所有檔案,而您的計算磁碟可以容納您的完整資料集,則建議下載,以避免來自儲存體服務串流資料的額外負荷。 對於多節點下載,請參閱如何防止節流。
注意
Windows OS 的下載路徑名稱不應該超過 255 個英數字元。 對於 Linux OS,下載路徑名稱長度不應該超過 4,096 個英數字元。 此外,對於 Linux OS,檔案名稱 (下載路徑 /path/to/file/{filename}
的最後一個區段) 長度不應該超過 255 個英數字元。
下列程式碼會將 dataset
掛接至位於 mounted_path
的暫存目錄
import tempfile
mounted_path = tempfile.mkdtemp()
# mount dataset onto the mounted_path of a Linux-based compute
mount_context = dataset.mount(mounted_path)
mount_context.start()
import os
print(os.listdir(mounted_path))
print (mounted_path)
取得機器學習指令碼中的資料集
註冊的資料集可在本機或遠端的計算叢集上存取,例如 Azure Machine Learning Compute。 若要跨實驗存取您註冊的資料集,請使用下列程式碼存取您的工作區,並取得先前提交執行中所使用的資料集。 依預設,Dataset
類別上的 get_by_name()
方法會傳回向工作區註冊的最新版本資料集。
%%writefile $script_folder/train.py
from azureml.core import Dataset, Run
run = Run.get_context()
workspace = run.experiment.workspace
dataset_name = 'titanic_ds'
# Get a dataset by name
titanic_ds = Dataset.get_by_name(workspace=workspace, name=dataset_name)
# Load a TabularDataset into pandas DataFrame
df = titanic_ds.to_pandas_dataframe()
在定型期間存取原始程式碼
Azure Blob 儲存體的輸送量速度高於 Azure 檔案共用,並會調整為以平行方式啟動的大量作業。 因此,建議您將執行設定為使用 Blob 儲存體來傳輸原始程式碼檔案。
下列程式碼範例會在執行設定中指定要用於原始程式碼傳輸的 Blob 資料存放區。
# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore"
筆記本範例
- 如需其他資料集範例和概念,請參閱資料集筆記本。
- 請參閱如何在您的 ML 管線中參數化資料集。
疑難排解
資料集初始化失敗:等候掛接點就緒逾時:
- 如果您沒有任何輸出網路安全性群組規則,而且正在使用
azureml-sdk>=1.12.0
,請將azureml-dataset-runtime
及其相依性更新為特定次要版本的最新版本,或如果您在執行中使用,請重新建立環境,使其能夠有最新的修補程式來進行修正。 - 如果使用
azureml-sdk<1.12.0
,請升級至最新版本。 - 如果您有輸出 NSG 規則,請確定有允許服務標籤
AzureResourceMonitor
之所有流量的輸出規則。
資料集初始化失敗:StreamAccessException 是由 ThrottlingException 造成的
對於多節點檔案下載,所有節點都可能會嘗試從 Azure 儲存體服務下載檔案資料集中的所有檔案,而這會造成節流錯誤。 為了防止節流,一開始請將環境變數 AZUREML_DOWNLOAD_CONCURRENCY
設為 CPU 核心數除以節點數的 8 倍。 為此環境變數設定值可能需要進行某種實驗,因此,前述指引是一個起點。
下列範例假設 32 個核心和 4 個節點。
from azureml.core.environment import Environment
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}
AzureFile 儲存體
因為儲存體已多載,所以無法將專案檔上傳至 AzureFile 中的工作目錄:
如果您對其他工作負載(例如資料傳輸)使用檔案共用,建議使用 blob,讓檔案共用可用於提交執行。
您也可以在兩個不同的工作區之間分割工作負載。
ConfigException:因為缺少認證,所以無法建立 AzureFileService 的連線。 帳戶金鑰或 SAS 權杖必須連結預設的工作區 blob 存放區。
為了確保您的儲存體存取認證連結到工作區和相關的檔案存放區,請完成下列步驟:
- 在 Azure 入口網站中巡覽至您的工作區。
- 在工作區的 [概觀] 頁面中,選取儲存體連結。
- 在 [儲存體] 頁面上,在左側功能表上選取 [存取金鑰]。
- 複製金鑰。
- 瀏覽至您工作區的 [Azure Machine Learning 工作室]。
- 在工作室中,選取您要提供驗證登入資訊的檔案資料存放區。
- 選取 [更新驗證]。
- 貼上先前步驟中的金鑰。
- 選取 [儲存]。
以輸入形式傳遞資料
TypeError: FileNotFound:沒有此類檔案或目錄:如果您提供的檔案路徑不是檔案所在位置,就會發生此錯誤。 您需要確定您參照檔案的方式,與計算目標上掛接資料集的位置一致。 為了確保確定性狀態,建議您在將資料集掛接至計算目標時,使用抽象路徑。 例如,在下列程式碼中,我們會將資料集掛接在計算目標 /tmp
的檔案系統根目錄下。
# Note the leading / in '/tmp/dataset'
script_params = {
'--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
}
如果您未包含前置正斜線「/」,則必須在工作目錄前面加上前置詞,例如,計算目標上的 /mnt/batch/.../tmp/dataset
,藉以指出您要掛接資料集的位置。
下一步
透過 TabularDatasets 自動定型機器學習模型。
透過 FileDatasets 定型影像分類模型。