共用方式為


將資料移入機器學習管線步驟並在其中來回移動 (Python)

適用於:適用於 Python 的 Azure Machine Learning SDK v1

這很重要

本文提供使用 Azure Machine Learning SDK v1 的相關信息。 SDK v1 自 2025 年 3 月 31 日起已被取代。 其支援將於 2026 年 6 月 30 日結束。 您可以在該日期之前安裝並使用 SDK v1。 您使用 SDK v1 的現有工作流程將在支援終止日期後繼續運作。 不過,如果產品發生架構變更,它們可能會面臨安全性風險或重大變更。

建議您在 2026 年 6 月 30 日之前轉換至 SDK v2。 如需 SDK v2 的詳細資訊,請參閱 什麼是 Azure Machine Learning CLI 和 Python SDK v2?SDK v2 參考

本文提供了在 Azure Machine Learning 管線中匯入數據、轉換數據,以及在各步驟之間移動數據的程式代碼。 如需 Azure Machine Learning 中的資料如何運作的概觀,請參閱在 Azure 儲存體服務中存取資料 (部分內容可能是機器或 AI 翻譯)。 如需 Azure Machine Learning 管線優點和結構的相關信息,請參閱 什麼是 Azure Machine Learning 管線?

本文將說明如何:

  • 使用 Dataset 物件處理已存在的數據
  • 在步驟中存取資料
  • Dataset 資料分割成子集,例如定型和驗證子集
  • 建立 OutputFileDatasetConfig 物件將資料傳輸至下一個管線步驟
  • 使用 OutputFileDatasetConfig 物件作為管線步驟的輸入
  • Dataset 中建立您想要持久化的新 OutputFileDatasetConfig 物件

先決條件

使用 Dataset 物件處理已存在的數據

將資料內嵌至管線的最佳方式是使用 Dataset 物件。 Dataset 物件代表整個工作區中可用的持續性數據。

建立和註冊 Dataset 物件有許多種方式。 表格式資料集適用於一個或多個檔案中可用的分隔資料。 檔案資料集適用於二進位資料 (例如影像),或您剖析的資料。 建立 Dataset 物件最簡單的程式設計方式,就是使用工作區儲存體或公用 URL 中現有的 Blob:

datastore = Datastore.get(workspace, 'training_data')
iris_dataset = Dataset.Tabular.from_delimited_files(DataPath(datastore, 'iris.csv'))

datastore_path = [
    DataPath(datastore, 'animals/dog/1.jpg'),
    DataPath(datastore, 'animals/dog/2.jpg'),
    DataPath(datastore, 'animals/cat/*.jpg')
]
cats_dogs_dataset = Dataset.File.from_files(path=datastore_path)

如需使用不同選項和不同來源建立數據集、在 Azure Machine Learning UI 中註冊和檢閱數據集、了解數據大小如何與計算容量互動,以及建立版本設定的詳細資訊,請參閱 建立 Azure Machine Learning 數據集

將資料集傳遞至指令碼

若要將資料集的路徑傳遞至您的指令碼,請使用 Dataset 物件的 as_named_input() 方法。 您可以將產生的 DatasetConsumptionConfig 物件作為引數傳遞至您的腳本,或使用 inputs 將引數傳遞給管線腳本,然後您可以利用 Run.get_context().input_datasets[] 來擷取數據集。

建立具名輸入之後,您可以選擇其存取模式(僅適用於 FileDataset ): as_mount()as_download()。 如果您的腳本會處理數據集中的所有檔案,且計算資源上的磁碟足以容納數據集,則下載存取模式是較佳的選擇。 下載存取模式可避免執行時串流資料的額外負荷。 如果您的腳本只能存取資料集的一部分或需要的計算資源過多,請使用掛載存取模式。 如需詳細資訊,請參閱掛接與下載

若要將資料集傳遞至管線步驟:

  1. 使用 TabularDataset.as_named_input()FileDataset.as_named_input() (結尾沒有 來建立 DatasetConsumptionConfig 物件
  2. 僅適用於 FileDataset 使用 as_mount()as_download() 設定存取模式。 使用 TabularDataset時,您無法設定存取模式。
  3. 可以使用 argumentsinputs 來將數據集傳送到管線的各個步驟。

下列代碼段顯示在PythonScriptStep建構函式中使用 iris_dataset (TabularDataset) 結合這些步驟的常見模式:


train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[iris_dataset.as_named_input('iris')]
)

備註

您需要以您自己的資料取代所有這些自變數的值(也就是 、"train_data""train.py"clusteriris_dataset)。 上述代碼段只會顯示呼叫的形式,而且不屬於Microsoft範例的一部分。

您也可以使用 random_split()take_sample() 方法來建立多個輸入,或減少傳遞至管線步驟的數據量。

seed = 42 # PRNG seed
smaller_dataset = iris_dataset.take_sample(0.1, seed=seed) # 10%
train, test = smaller_dataset.random_split(percentage=0.8, seed=seed)

train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[train.as_named_input('train'), test.as_named_input('test')]
)

在指令碼內存取資料集

管線步驟指令碼的具名輸入可作為 Run 物件內的字典。 使用 Run 擷取作用中 Run.get_context() 物件,然後使用 input_datasets 擷取具名輸入的字典。 如果您使用 DatasetConsumptionConfig 參數而非 arguments 參數傳遞inputs物件,請使用ArgumentParser程式碼來存取數據。 下列程式碼片段示範這兩種技巧:

管線定義指令碼

# Code is for demonstration only: It would be confusing to split datasets between `arguments` and `inputs`
train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    # Datasets passed as arguments
    arguments=['--training-folder', train.as_named_input('train').as_download()],
    # Datasets passed as inputs
    inputs=[test.as_named_input('test').as_download()]
)

從 PythonScriptStep 參考的 train.py 指令碼

# In pipeline script
parser = argparse.ArgumentParser()
# Retrieve the dataset passed as an argument
parser.add_argument('--training-folder', type=str, dest='train_folder', help='training data folder mounting point')
args = parser.parse_args()
training_data_folder = args.train_folder
# Retrieve the dataset passed as an input
testing_data_folder = Run.get_context().input_datasets['test']

傳遞的值是數據集檔案或檔案的路徑。

由於已註冊的數據集是持續性的,且會跨工作區共用,因此您可以直接擷取數據集:

run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')

備註

先前的程式碼片段展示了呼叫的形式。 它們不屬於Microsoft範例的一部分。 您需要將引數換成您自己專案的值。

針對中繼資料使用 OutputFileDatasetConfig

雖然 Dataset 物件只代表持久性數據,OutputFileDatasetConfig 物件則可用於來自管線步驟的暫存數據輸出以及持久性輸出數據。 OutputFileDatasetConfig 支援將數據寫入 Blob 記憶體、檔案共用、Azure Data Lake Storage Gen1 或 Data Lake Storage Gen2。 支援掛接模式和上傳模式。 在掛接模式中,寫入掛接目錄的檔案在檔案關閉時永久儲存。 在上傳模式中,寫入輸出目錄的檔案在作業結束時上傳。 如果作業失敗或取消,則不會上傳輸出目錄。

OutputFileDatasetConfig對象的預設行為是寫入工作區的預設數據存放區。 使用OutputFileDatasetConfig參數將PythonScriptStep對象傳遞至您的arguments

from azureml.data import OutputFileDatasetConfig
dataprep_output = OutputFileDatasetConfig()
input_dataset = Dataset.get_by_name(workspace, 'raw_data')

dataprep_step = PythonScriptStep(
    name="prep_data",
    script_name="dataprep.py",
    compute_target=cluster,
    arguments=[input_dataset.as_named_input('raw_data').as_mount(), dataprep_output]
    )

備註

同時寫入 OutputFileDatasetConfig 會失敗。 請勿嘗試同時使用同一個 OutputFileDatasetConfig。 請勿在多重處理的情況下共用任何OutputFileDatasetConfig,例如,當您使用分散式訓練時。

使用 OutputFileDatasetConfig 作為定型步驟的輸出

在管線的 PythonScriptStep中,您可以使用程式的自變數來擷取可用的輸出路徑。 如果此步驟是第一個,而且會初始化輸出數據,您必須在指定的路徑建立目錄。 然後,您可以撰寫任何檔案並將其包含在OutputFileDatasetConfig中。

parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()

# Make directory for file
os.makedirs(os.path.dirname(args.output_path), exist_ok=True)
with open(args.output_path, 'w') as f:
    f.write("Step 1's output")

讀取 OutputFileDatasetConfig 作為非初始步驟的輸入

在初始管線步驟將部分資料寫入 OutputFileDatasetConfig 路徑,且變成該初始步驟的輸出之後,就可以作為稍後步驟的輸入。

在下列程式碼中:

  • step1_output_data 表示 PythonScriptStepstep1 的輸出已以上傳存取模式寫入至 Data Lake Storage Gen2 資料存放區 my_adlsgen2。 如需關於設定角色許可權以將資料寫回 Data Lake Storage Gen2 存放區的相關資訊,請參閱 使用資料存放區連接至 Azure 上的存放服務

  • 完成 step1之後,輸出會寫入至step1_output_data指示的目的地,step2即可使用step1_output_data作為輸入。

# Get Data Lake Storage Gen2 datastore that's already registered with the workspace
datastore = workspace.datastores['my_adlsgen2']
step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()

step1 = PythonScriptStep(
    name="generate_data",
    script_name="step1.py",
    runconfig = aml_run_config,
    arguments = ["--output_path", step1_output_data]
)

step2 = PythonScriptStep(
    name="read_pipeline_data",
    script_name="step2.py",
    compute_target=compute,
    runconfig = aml_run_config,
    arguments = ["--pd", step1_output_data.as_input()]

)

pipeline = Pipeline(workspace=ws, steps=[step1, step2])

提示

在 Python 腳本 step2.py 中讀取資料的程式與先前 在腳本中存取數據集中所述的程式相同。 使用 ArgumentParser 在您的文稿中新增的 --pd 自變數,以存取數據。

註冊 OutputFileDatasetConfig 物件供重複使用

如果您想要讓 OutputFileDatasetConfig 物件可供使用的時間超過實驗持續時間,請將它註冊到工作區,以在實驗之間共用和重複使用:

step1_output_ds = step1_output_data.register_on_complete(
    name='processed_data', 
    description = 'files from step1'
)

不再需要內容時刪除 OutputFileDatasetConfig 內容

Azure 不會自動刪除以 OutputFileDatasetConfig撰寫的中繼數據。 若要避免大量不必要的數據的記憶體費用,您應該採取下列其中一個動作:

  • 在管線工作執行結束時,以程式設計方式刪除不再需要的中繼資料。

  • 對於中繼資料,請使用具有短期儲存體原則的 Blob 儲存體。 (請參閱 自動化 Azure Blob 記憶體存取層來優化成本。此原則只能在工作區的非預設數據存放區上設定。 使用 OutputFileDatasetConfig 將中繼資料匯出至非預設值的另一個資料存放區。

    # Get Data Lake Storage Gen2 datastore that's already registered with the workspace
    datastore = workspace.datastores['my_adlsgen2']
    step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
    
  • 定期檢閱數據,並刪除您不需要的數據。

注意

只有在資料上次變更日期的 30 天後才刪除中繼資料。 刪除先前的中繼數據可能會導致管線執行失敗,因為管線假設數據存在 30 天的期間,以供重複使用。

如需詳細資訊,請參閱規劃和管理 Azure Machine Learning 的成本 (部分內容可能是機器或 AI 翻譯)。

後續步驟