Přesun dat kroků kanálu ML a mezi nimi (Python)
PLATÍ PRO:Sada Python SDK azureml v1
Tento článek obsahuje kód pro import, transformaci a přesun dat mezi kroky v kanálu Azure Machine Learning. Přehled fungování dat ve službě Azure Machine Learning najdete v tématu Přístup k datům ve službách Azure Storage. Výhody a strukturu kanálů Azure Machine Learning najdete v tématu Co jsou kanály Azure Machine Learning?
V tomto článku se dozvíte, jak:
- Použití
Dataset
objektů pro již existující data - Přístup k datům v rámci vašich kroků
- Rozdělení
Dataset
dat do podmnožin, například trénovacích a ověřovacích podmnožin - Vytvoření
OutputFileDatasetConfig
objektů pro přenos dat do dalšího kroku kanálu - Použití
OutputFileDatasetConfig
objektů jako vstupu do kroků kanálu - Vytvoření nových
Dataset
objektů z, kteréOutputFileDatasetConfig
chcete zachovat
Požadavky
Budete potřebovat:
Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet. Vyzkoušejte bezplatnou nebo placenou verzi služby Azure Machine Learning.
Azure Machine Learning SDK pro Python nebo přístup k studio Azure Machine Learning.
Pracovní prostor služby Azure Machine Learning.
Buď vytvořte pracovní prostor Azure Machine Learning , nebo použijte existující pracovní prostor prostřednictvím sady Python SDK. Importujte
Workspace
třídu aDatastore
a načtěte informace o předplatném ze souboruconfig.json
pomocí funkcefrom_config()
. Tato funkce ve výchozím nastavení hledá soubor JSON v aktuálním adresáři, ale můžete také zadat parametr path, který bude odkazovat na soubor pomocífrom_config(path="your/file/path")
příkazu .import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()
Některá již existující data. Tento článek stručně ukazuje použití kontejneru objektů blob Azure.
Volitelné: Existující kanál strojového učení, například kanál popsaný v tématu Vytváření a spouštění kanálů strojového učení pomocí sady Azure Machine Learning SDK.
Použití Dataset
objektů pro již existující data
Upřednostňovaným způsobem, jak ingestovat data do kanálu, je použít objekt Dataset . Dataset
objekty představují trvalá data dostupná v rámci pracovního prostoru.
Existuje mnoho způsobů, jak vytvářet a registrovat Dataset
objekty. Tabulkové datové sady jsou určené pro data s oddělovači, která jsou k dispozici v jednom nebo více souborech. Datové sady souborů jsou určené pro binární data (například obrázky) nebo pro data, která parsujete. Nejjednodušším programovým způsobem vytváření Dataset
objektů je použití existujících objektů blob v úložišti pracovního prostoru nebo veřejných adres URL:
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)
Další možnosti vytváření datových sad s různými možnostmi a z různých zdrojů, jejich registrace a kontrola v uživatelském rozhraní služby Azure Machine Learning, vysvětlení interakce velikosti dat s výpočetní kapacitou a jejich správy verzí najdete v tématu Vytvoření datových sad služby Azure Machine Learning.
Předání datových sad do skriptu
Pokud chcete předat cestu datové sady do skriptu, použijte metodu objektu Dataset
as_named_input()
. Výsledný DatasetConsumptionConfig
objekt můžete buď předat do skriptu jako argument, nebo pomocí argumentu inputs
do skriptu kanálu můžete datovou sadu načíst pomocí Run.get_context().input_datasets[]
.
Jakmile vytvoříte pojmenovaný vstup, můžete zvolit jeho režim přístupu (pouze pro FileDataset): as_mount()
nebo as_download()
. Pokud skript zpracuje všechny soubory v datové sadě a disk ve výpočetním prostředku je pro datovou sadu dostatečně velký, je lepší volbou režim přístupu ke stažení. Režim přístupu ke stažení se vyhne režii streamování dat za běhu. Pokud skript přistupuje k podmnožině datové sady nebo je příliš velká pro vaše výpočetní prostředky, použijte režim připojení. Další informace najdete v článku Připojení vs. Stažení.
Předání datové sady do kroku kanálu:
- K vytvoření objektu
DatasetConsumptionConfig
použijteTabularDataset.as_named_input()
neboFileDataset.as_named_input()
(žádné 's' na konci) - Pouze pro
FileDataset
:. K nastavení režimu přístupu použijteas_mount()
neboas_download()
. TabularDataset nenabídá režim nastavení přístupu. - Předání datových sad do kroků kanálu pomocí argumentu
arguments
inputs
nebo
Následující fragment kódu ukazuje běžný vzor kombinování těchto kroků v rámci konstruktoru PythonScriptStep
pomocí iris_dataset (TabularDataset):
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
inputs=[iris_dataset.as_named_input('iris')]
)
Poznámka
Hodnoty všech těchto argumentů (to znamená "train_data"
, "train.py"
, cluster
a iris_dataset
) byste museli nahradit vlastními daty.
Výše uvedený fragment kódu jenom zobrazuje formu volání a není součástí ukázky Microsoftu.
Pomocí metod, jako random_split()
je a, take_sample()
můžete také vytvořit více vstupů nebo snížit množství dat předaných do kroku kanálu:
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')]
)
Přístup k datovým sadám ve skriptu
Pojmenované vstupy do skriptu kroku kanálu jsou v objektu Run
dostupné jako slovník. Pomocí načtěte aktivní Run
objekt Run.get_context()
a pak načtěte slovník pojmenovaných vstupů pomocí input_datasets
. Pokud jste objekt předali DatasetConsumptionConfig
pomocí argumentu arguments
místo argumentu inputs
, přistupovat k datům pomocí ArgParser
kódu. Obě techniky jsou demonstrovány v následujících fragmentech kódu:
Skript definice kanálu
# Code for demonstration only: It would be very 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()]
)
Skript train.py
, na který odkazuje krok PythonScriptu
# In pipeline script
parser = argparse.ArgumentParser()
# Retreive 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']
Předaná hodnota je cesta k souborům datové sady.
K zaregistrované Dataset
sadě je také možné přistupovat přímo. Vzhledem k tomu, že zaregistrované datové sady jsou trvalé a sdílené napříč pracovním prostorem, můžete je načíst přímo:
run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')
Poznámka
Předchozí fragmenty kódu zobrazují formu volání a nejsou součástí ukázky Microsoftu. Různé argumenty je nutné nahradit hodnotami z vlastního projektu.
Použití OutputFileDatasetConfig
pro zprostředkující data
Zatímco Dataset
objekty představují pouze trvalá data, OutputFileDatasetConfig
objekty se dají použít pro dočasný výstup dat z kroků kanálu a trvalých výstupních dat. OutputFileDatasetConfig
podporuje zápis dat do úložiště objektů blob, sdílené složky, adlsgen1 nebo adlsgen2. Podporuje režim připojení i režim nahrávání. V režimu připojení se soubory zapsané do připojeného adresáře trvale ukládají, když je soubor zavřený. V režimu nahrávání se soubory zapsané do výstupního adresáře nahrají na konci úlohy. Pokud úloha selže nebo je zrušená, výstupní adresář se nenahraje.
OutputFileDatasetConfig
Výchozím chováním objektu je zápis do výchozího úložiště dat pracovního prostoru. Předejte své OutputFileDatasetConfig
objekty do svého PythonScriptStep
pomocí parametru 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]
)
Poznámka
Souběžné zápisy do budou neúspěšné OutputFileDatasetConfig
. Nepokoušejte se použít jeden OutputFileDatasetConfig
současně. Nesdílejte jeden v OutputFileDatasetConfig
situaci s více procesy, například při použití distribuovaného trénování.
Použití OutputFileDatasetConfig
jako výstupu trénovacího kroku
V rámci kroku PythonScriptStep
kanálu můžete načíst dostupné výstupní cesty pomocí argumentů programu. Pokud je tento krok prvním krokem, ve kterém se inicializují výstupní data, musíte v zadané cestě vytvořit adresář. Potom můžete napsat libovolné soubory, které chcete zahrnout do objektu 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")
Čtení OutputFileDatasetConfig
jako vstupy pro neicialní kroky
Jakmile počáteční krok kanálu zapíše nějaká data do OutputFileDatasetConfig
cesty a stane se výstupem tohoto počátečního kroku, můžete je použít jako vstup do pozdějšího kroku.
V následujícím kódu:
step1_output_data
označuje,step1
že výstup PythonScriptStep je zapsán do úložištěmy_adlsgen2
dat ADLS Gen2 v režimu přístupu k nahrání. Přečtěte si další informace o tom, jak nastavit oprávnění rolí , aby bylo možné zapisovat data zpět do úložišť dat ADLS Gen2.Po
step1
dokončení a zápisu výstupu do cíle označenéhostep1_output_data
nástrojem je krok 2 připravený k použitístep1_output_data
jako vstup.
# get adls gen 2 datastore 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])
Tip
Čtení dat ve skriptu step2.py
Pythonu je stejné jako dříve popsané v datových sadách Accessu v rámci vašeho skriptu. Použijte ArgumentParser
k přidání argumentu --pd
do skriptu pro přístup k datům.
Registrace OutputFileDatasetConfig
objektů pro opakované použití
Pokud chcete, aby OutputFileDatasetConfig
byl experiment dostupný po dobu delší, než je doba trvání experimentu, zaregistrujte ho v pracovním prostoru, abyste ho mohli sdílet a opakovaně používat mezi experimenty.
step1_output_ds = step1_output_data.register_on_complete(
name='processed_data',
description = 'files from step1'
)
Odstranění OutputFileDatasetConfig
obsahu, když už není potřeba
Azure automaticky neodstraní zprostředkující data zapsaná pomocí OutputFileDatasetConfig
nástroje . Abyste se vyhnuli poplatkům za úložiště pro velké objemy nepotřebných dat, měli byste provést následující:
Upozornění
Zprostředkující data odstraňte pouze po 30 dnech od data poslední změny dat. Odstranění dřívějších dat by mohlo způsobit selhání spuštění kanálu, protože kanál předpokládá, že zprostředkující data existují během 30 dnů pro opakované použití.
- Pokud už není potřeba, odstraňte zprostředkující data na konci úlohy kanálu prostřednictvím kódu programu.
- Použití úložiště objektů blob se zásadami krátkodobého úložiště pro zprostředkující data (viz Optimalizace nákladů automatizací Azure Blob Storage úrovní přístupu). Tuto zásadu je možné nastavit pouze na jiné než výchozí úložiště dat pracovního prostoru. Slouží
OutputFileDatasetConfig
k exportu zprostředkujících dat do jiného úložiště dat, které není výchozí.# Get adls gen 2 datastore 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()
- Pravidelně kontrolujte a odstraňujte už nepotřebná data.
Další informace najdete v tématu Plánování a správa nákladů na Azure Machine Learning.