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:

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 Datasetas_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:

  1. K vytvoření objektu DatasetConsumptionConfig použijte TabularDataset.as_named_input() nebo FileDataset.as_named_input() (žádné 's' na konci)
  2. Pouze pro FileDataset :. K nastavení režimu přístupu použijte as_mount() nebo as_download() . TabularDataset nenabídá režim nastavení přístupu.
  3. Předání datových sad do kroků kanálu pomocí argumentu argumentsinputs 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", clustera 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ého step1_output_dataná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í OutputFileDatasetConfigná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.

Další kroky