Přesun dat kroků kanálu ML a mezi nimi (Python)
PLATÍ PRO: Python SDK azureml v1
Tento článek obsahuje kód pro import, transformaci a přesouvání dat mezi kroky v kanálu Služby 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 úložiště Azure. Výhody a struktura 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 kroků
- Rozdělení
Dataset
dat na podmnožinu, jako jsou podmnožina trénování a ověřování - Vytvoření
OutputFileDatasetConfig
objektů pro přenos dat do dalšího kroku kanálu - Použití
OutputFileDatasetConfig
objektů jako vstupu ke krokům kanálu - Vytvořte nové
Dataset
objekty, kteréOutputFileDatasetConfig
chcete zachovat.
Požadavky
Potřebujete:
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.
Sada 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
aDatastore
třídu 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 cesty, který má odkazovat na soubor pomocífrom_config(path="your/file/path")
.import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()
Některá před 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 Vytvoření a spuš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žití objektu Dataset . Dataset
objekty představují trvalá data dostupná v celém pracovním 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á analyzujete. Nejjednodušším programovým způsobem vytvoř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áva verzí najdete v tématu Vytváření datových sad Azure Machine Learning.
Předání datových sad do skriptu
K předání cesty datové sady do skriptu použijte metodu objektu Dataset
as_named_input()
. Výsledný DatasetConsumptionConfig
objekt můžete předat do skriptu jako argument, nebo pomocí argumentu inputs
do skriptu kanálu můžete načíst datovou sadu 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 váš skript zpracuje všechny soubory v datové sadě a disk na 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í zabraňuje režii streamování dat za běhu. Pokud váš skript přistupuje k podmnožině datové sady nebo je pro výpočetní prostředky příliš velký, použijte režim přístupu k připojení. Další informace najdete v tématu Připojení vs. Stažení.
Předání datové sady do kroku kanálu:
- Použití
TabularDataset.as_named_input()
neboFileDataset.as_named_input()
(ne na konci) k vytvoření objektuDatasetConsumptionConfig
- Pouze pro
FileDataset
:. Použijteas_mount()
neboas_download()
nastavte režim přístupu. TabularDataset nenastavuje režim přístupu. - Předání datových sad do kroků kanálu pomocí argumentu
arguments
inputs
Následující fragment kódu ukazuje běžný způsob kombinování těchto kroků v 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ů (tj "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.
Můžete také použít metody, jako random_split()
je vytvoření take_sample()
více vstupů nebo snížení 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 v rámci skriptu
Pojmenované vstupy do skriptu kroku kanálu jsou k dispozici jako slovník v rámci objektu Run
. Načtěte aktivní Run
objekt pomocí 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
, použijte k datům přístup pomocí ArgParser
kódu. Obě techniky jsou demonstrována 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
odkazovaný z PythonScriptStepu
# 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 registrovanému Dataset
přístupu je také možné přistupovat přímo. Vzhledem k tomu, že registrované 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 lze 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í při zavření souboru. 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í chování objektu je zápis do výchozího úložiště dat pracovního prostoru. Předejte objekty OutputFileDatasetConfig
do parametru 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]
)
Poznámka:
Souběžné zápisy do A selžou OutputFileDatasetConfig
. Nepokoušejte se použít jeden OutputFileDatasetConfig
souběžně. Nesdílejte jeden OutputFileDatasetConfig
v situaci s více procesy, například při použití distribuovaného trénování.
Použití OutputFileDatasetConfig
jako výstupy kroku trénování
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ář. Pak můžete napsat libovolné soubory, které chcete zahrnout do OutputFileDatasetConfig
souboru .
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 vstupů do neinicializace kroků
Jakmile počáteční krok kanálu zapíše některá 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, že výstup PythonScriptStepstep1
je zapsán do úložištěmy_adlsgen2
dat ADLS Gen2 v režimu přístupu pro nahrání. Přečtěte si další informace o tom, jak nastavit oprávnění role pro zápis dat zpět do úložišť dat ADLS Gen2.Po
step1
dokončení a výstup se zapíše do cíle označenéhostep1_output_data
pomocí kroku 2 je připravený použítstep1_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 zdokumentované v datových sadách Accessu v rámci skriptu. Slouží ArgumentParser
k přidání argumentu --pd
ve skriptu pro přístup k datům.
Registrace OutputFileDatasetConfig
objektů pro opakované použití
Pokud chcete, aby OutputFileDatasetConfig
byl experiment dostupný déle, než je doba trvání experimentu, zaregistrujte ho do svého pracovního prostoru a sdílejte je a znovu použijte v rámci experimentů.
step1_output_ds = step1_output_data.register_on_complete(
name='processed_data',
description = 'files from step1'
)
Odstranění OutputFileDatasetConfig
obsahu, pokud už není potřeba
Azure automaticky neodstraní zprostředkující data zapsaná pomocí OutputFileDatasetConfig
. Pokud se chcete vyhnout poplatkům za úložiště u velkých objemů nepotřebných dat, měli byste:
Upozornění
Odstraňte pouze zprostředkující data po 30 dnech od data poslední změny. Odstraněním dat dříve může dojít k selhání spuštění kanálu, protože kanál předpokládá, že mezilehá 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 s krátkodobými zásadami úložiště pro zprostředkující data (viz Optimalizace nákladů pomocí automatizace úrovní přístupu ke službě Azure Blob Storage). 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 data, která už nepotřebujete.
Další informace najdete v tématu Plánování a správa nákladů na Azure Machine Learning.