適用於:
適用於 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物件
先決條件
Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。 試用免費或付費版本的 Azure Machine Learning。
適用於 Python 的 Azure Machine Learning SDK (部分內容可能是機器或 AI 翻譯),或 Azure Machine Learning 工作室的存取權。
Azure Machine Learning 工作區。
建立 Azure Machine Learning 工作區 (部分內容可能是機器或 AI 翻譯),或透過 Python SDK 使用現有的工作區。 匯入
Workspace和Datastore類別,並使用 函式從config.json檔案載入您的訂用from_config()帳戶資訊。 此函式預設會尋找目前目錄中的 JSON 檔案,但您也可以使用from_config(path="your/file/path")來指定指向檔案的路徑參數。import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()某些預先存在的數據。 本文簡要說明如何使用 Azure Blob 容器 (部分內容可能是機器或 AI 翻譯)。
選擇性:現有的機器學習管線,例如使用 Azure Machine Learning SDK 來建立及執行機器學習管線 (部分內容可能是機器或 AI 翻譯) 中所述的管線。
使用 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()。 如果您的腳本會處理數據集中的所有檔案,且計算資源上的磁碟足以容納數據集,則下載存取模式是較佳的選擇。 下載存取模式可避免執行時串流資料的額外負荷。 如果您的腳本只能存取資料集的一部分或需要的計算資源過多,請使用掛載存取模式。 如需詳細資訊,請參閱掛接與下載。
若要將資料集傳遞至管線步驟:
- 使用
TabularDataset.as_named_input()或FileDataset.as_named_input()(結尾沒有 ) 來建立DatasetConsumptionConfig物件 -
僅適用於
FileDataset: 使用as_mount()或as_download()設定存取模式。 使用TabularDataset時,您無法設定存取模式。 - 可以使用
arguments或inputs來將數據集傳送到管線的各個步驟。
下列代碼段顯示在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"、 cluster和 iris_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 翻譯)。
後續步驟
- 建立 Azure Machine Learning 資料集
- 使用 Azure Machine Learning SDK 來建立及執行機器學習管線 (部分內容可能是機器或 AI 翻譯)