Share via


使用 Azure Machine Learning 資料集定型模型

警告

這篇文章參考 CentOS,這是接近生命週期結束 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用方式和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引

適用於:Python SDK azureml 第 1 版

在本文中,您將了解如何使用 Azure Machine Learning 資料集以定型機器學習模型。 您可以使用本機或遠端計算目標中的資料集,而不需要擔心連接字串或資料路徑。

Azure Machine Learning 資料集提供與 Azure Machine Learning 定型功能的順暢整合,例如 ScriptRunConfigHyperDriveAzure Machine Learning 管線

如果您尚未準備好將資料用於模型定型,但想要將資料載入至您的筆記本以進行資料探索,請參閱如何探索資料集中的資料

必要條件

若要建立並使用資料集定型,您需要:

注意

某些資料集類別具有 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_storeoutputdataset 資料夾中的 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" 

筆記本範例

疑難排解

資料集初始化失敗:等候掛接點就緒逾時

  • 如果您沒有任何輸出網路安全性群組規則,而且正在使用 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 存放區。

為了確保您的儲存體存取認證連結到工作區和相關的檔案存放區,請完成下列步驟:

  1. Azure 入口網站中巡覽至您的工作區。
  2. 在工作區的 [概觀] 頁面中,選取儲存體連結。
  3. 在 [儲存體] 頁面上,在左側功能表上選取 [存取金鑰]
  4. 複製金鑰。
  5. 瀏覽至您工作區的 [Azure Machine Learning 工作室]
  6. 在工作室中,選取您要提供驗證登入資訊的檔案資料存放區。
  7. 選取 [更新驗證]
  8. 貼上先前步驟中的金鑰。
  9. 選取 [儲存]。

以輸入形式傳遞資料

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,藉以指出您要掛接資料集的位置。

下一步