Sdílet prostřednictvím


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:

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:

  1. Použití TabularDataset.as_named_input() nebo FileDataset.as_named_input() (ne na konci) k vytvoření objektu DatasetConsumptionConfig
  2. Pouze pro FileDataset :. Použijte as_mount() nebo as_download() nastavte režim přístupu. TabularDataset nenastavuje režim přístupu.
  3. 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", , 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.

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 OutputFileDatasetConfigsouboru .

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 PythonScriptStep step1 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ého step1_output_datapomocí kroku 2 je připravený použít 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 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.

Další kroky