使用 Azure Machine Learning 資料集定型模型
警告
這篇文章參考 CentOS,這是接近生命週期結束 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用方式和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引。
在本文中,您將了解如何使用 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 和 CentOS。
使用機器學習服務定型指令碼中的資料集
如果您的結構化資料尚未註冊為資料集,請建立 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 資料框架,讓您可以使用熟悉的資料準備和定型程式庫,而不需要離開您的筆記本。
存取定型指令碼中的資料集
下列程式碼會設定指令碼引數 --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 定型影像分類模型。