Delen via


Gegevens verplaatsen naar en tussen ML-pijplijnstappen (Python)

VAN TOEPASSING OP: Python SDK azureml v1

Dit artikel bevat code voor het importeren, transformeren en verplaatsen van gegevens tussen stappen in een Azure Machine Learning-pijplijn. Zie Access-gegevens in Azure Storage-services voor een overzicht van de werking van gegevens in Azure Machine Learning. Zie Wat zijn Azure Machine Learning-pijplijnen voor de voordelen en structuur van Azure Machine Learning-pijplijnen ?

Dit artikel laat het volgende zien:

  • Objecten gebruiken Dataset voor bestaande gegevens
  • Toegang tot gegevens binnen uw stappen
  • Gegevens Dataset splitsen in subsets, zoals trainings- en validatiesubsets
  • Objecten maken OutputFileDatasetConfig om gegevens over te dragen naar de volgende pijplijnstap
  • Objecten OutputFileDatasetConfig gebruiken als invoer voor pijplijnstappen
  • Dataset Nieuwe objecten maken van waaruit OutputFileDatasetConfig u wilt behouden

Vereisten

U hebt het volgende nodig:

Objecten gebruiken Dataset voor bestaande gegevens

De voorkeursmethode voor het opnemen van gegevens in een pijplijn is het gebruik van een gegevenssetobject . Dataset objecten vertegenwoordigen permanente gegevens die beschikbaar zijn in een werkruimte.

Er zijn veel manieren om objecten te maken en te registreren Dataset . Gegevenssets in tabelvorm zijn bedoeld voor gegevens met scheidingstekens die beschikbaar zijn in een of meer bestanden. Bestandsgegevenssets zijn bedoeld voor binaire gegevens (zoals afbeeldingen) of voor gegevens die u parseert. De eenvoudigste programmatische manieren om objecten te maken Dataset zijn het gebruik van bestaande blobs in werkruimteopslag of openbare URL's:

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)

Zie Azure Machine Learning-gegevenssets maken voor meer opties voor het maken van gegevenssets met verschillende opties en van verschillende bronnen, het registreren en controleren ervan in de gebruikersinterface van Azure Machine Learning, het begrijpen hoe de gegevensgrootte communiceert met de rekencapaciteit en versiebeheer.

Gegevenssets doorgeven aan uw script

Als u het pad van de gegevensset naar uw script wilt doorgeven, gebruikt u de methode van as_named_input() het Dataset object. U kunt het resulterende DatasetConsumptionConfig object als argument doorgeven aan uw script of door het inputs argument aan uw pijplijnscript te gebruiken, kunt u de gegevensset ophalen met behulp van Run.get_context().input_datasets[].

Nadat u een benoemde invoer hebt gemaakt, kunt u de toegangsmodus kiezen (alleen voor FileDataset): as_mount() of as_download(). Als uw script alle bestanden in uw gegevensset verwerkt en de schijf op uw rekenresource groot genoeg is voor de gegevensset, is de downloadtoegangsmodus de betere keuze. De downloadtoegangsmodus voorkomt de overhead van het streamen van de gegevens tijdens runtime. Als uw script toegang heeft tot een subset van de gegevensset of als het te groot is voor uw rekenproces, gebruikt u de toegangsmodus koppelen. Lees Mount versus Download voor meer informatie

Ga als volgende te werk om een gegevensset door te geven aan uw pijplijnstap:

  1. Gebruik TabularDataset.as_named_input() of FileDataset.as_named_input() (geen 's' aan het einde) om een DatasetConsumptionConfig object te maken
  2. Alleen FileDataset voor:. De toegangsmodus gebruiken as_mount() of as_download() instellen. TabularDataset biedt geen ondersteuning voor de toegangsmodus.
  3. Geef de gegevenssets door aan uw pijplijnstappen met behulp van het arguments argument of het inputs argument

In het volgende fragment ziet u het algemene patroon van het combineren van deze stappen in de PythonScriptStep constructor met behulp van iris_dataset (TabularDataset):


train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[iris_dataset.as_named_input('iris')]
)

Notitie

U moet de waarden voor al deze argumenten (dat wil zeggen, "train_data""train.py", clusteren iris_dataset) vervangen door uw eigen gegevens. Het bovenstaande fragment toont alleen de vorm van de aanroep en maakt geen deel uit van een Microsoft-voorbeeld.

U kunt ook methoden gebruiken, zoals random_split() en take_sample() om meerdere invoergegevens te maken of de hoeveelheid gegevens te verminderen die aan uw pijplijnstap wordt doorgegeven:

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')]
)

Toegang tot gegevenssets in uw script

Benoemde invoer voor uw pijplijnstapscript is beschikbaar als een woordenlijst binnen het Run object. Haal het actieve Run object op met behulp van Run.get_context() en haal vervolgens de woordenlijst van benoemde invoer op met behulp van input_datasets. Als u het DatasetConsumptionConfig object hebt doorgegeven met behulp van het arguments argument in plaats van het inputs argument, opent u de gegevens met behulp van ArgParser code. Beide technieken worden gedemonstreerd in de volgende fragmenten:

Het script voor de pijplijndefinitie

# 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()]
)

Het train.py script waarnaar wordt verwezen vanuit PythonScriptStep

# 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']

De doorgegeven waarde is het pad naar de gegevenssetbestanden.

Het is ook mogelijk om rechtstreeks toegang te krijgen tot een geregistreerd apparaat Dataset . Omdat geregistreerde gegevenssets permanent zijn en worden gedeeld in een werkruimte, kunt u ze rechtstreeks ophalen:

run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')

Notitie

De voorgaande fragmenten geven de vorm van de aanroepen weer en maken geen deel uit van een Microsoft-voorbeeld. U moet de verschillende argumenten vervangen door waarden uit uw eigen project.

Gebruiken OutputFileDatasetConfig voor tussenliggende gegevens

Objecten Dataset vertegenwoordigen alleen permanente gegevens, OutputFileDatasetConfig maar objecten kunnen worden gebruikt voor tijdelijke gegevensuitvoer uit pijplijnstappen en permanente uitvoergegevens. OutputFileDatasetConfig ondersteunt het schrijven van gegevens naar blobopslag, fileshare, adlsgen1 of adlsgen2. Het ondersteunt zowel de koppelingsmodus als de uploadmodus. In de koppelingsmodus worden bestanden die naar de gekoppelde map worden geschreven, permanent opgeslagen wanneer het bestand wordt gesloten. In de uploadmodus worden bestanden die naar de uitvoermap zijn geschreven, geüpload aan het einde van de taak. Als de taak mislukt of wordt geannuleerd, wordt de uitvoermap niet geüpload.

OutputFileDatasetConfig het standaardgedrag van het object is het schrijven naar het standaardgegevensarchief van de werkruimte. Geef uw OutputFileDatasetConfig objecten door aan uw PythonScriptStep met de arguments parameter.

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]
    )

Notitie

Gelijktijdige schrijfbewerkingen naar een OutputFileDatasetConfig bestand mislukken. Probeer niet één OutputFileDatasetConfig gelijktijdig te gebruiken. Deel niet één OutputFileDatasetConfig in een situatie met meerdere processen, zoals bij het gebruik van gedistribueerde training.

Gebruiken OutputFileDatasetConfig als uitvoer van een trainingsstap

In de PythonScriptStep van uw pijplijn kunt u de beschikbare uitvoerpaden ophalen met behulp van de argumenten van het programma. Als dit de eerste stap is en hiermee de uitvoergegevens worden geïnitialiseerd, moet u de map in het opgegeven pad maken. Vervolgens kunt u alle bestanden schrijven die u wilt bevatten in de 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")

Lezen OutputFileDatasetConfig als invoer voor niet-initiële stappen

Nadat de eerste pijplijnstap enkele gegevens naar het OutputFileDatasetConfig pad schrijft en deze een uitvoer van die eerste stap wordt, kan deze worden gebruikt als invoer voor een latere stap.

In de volgende code:

  • step1_output_data geeft aan dat de uitvoer van pythonScriptStep step1 wordt geschreven naar het ADLS Gen 2-gegevensarchief in my_adlsgen2 de uploadtoegangsmodus. Meer informatie over het instellen van rolmachtigingen om gegevens terug te schrijven naar ADLS Gen 2-gegevensarchieven.

  • Nadat step1 de bewerking is voltooid en de uitvoer naar het aangegeven step1_output_datadoel is geschreven, is stap2 klaar voor gebruik step1_output_data als invoer.

# 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

Het lezen van de gegevens in het Python-script step2.py is hetzelfde als eerder in Access-gegevenssets in uw script. Gebruik dit om ArgumentParser een argument in --pd uw script toe te voegen voor toegang tot de gegevens.

Objecten registreren OutputFileDatasetConfig voor hergebruik

Als u uw OutputFileDatasetConfig experiment langer beschikbaar wilt maken dan de duur van uw experiment, moet u het registreren bij uw werkruimte om experimenten te delen en opnieuw te gebruiken.

step1_output_ds = step1_output_data.register_on_complete(
    name='processed_data', 
    description = 'files from step1'
)

Inhoud verwijderen OutputFileDatasetConfig wanneer u deze niet meer nodig hebt

Azure verwijdert niet automatisch tussenliggende gegevens die zijn geschreven met OutputFileDatasetConfig. Als u opslagkosten voor grote hoeveelheden overbodige gegevens wilt voorkomen, moet u het volgende doen:

Let op

Verwijder alleen tussenliggende gegevens na 30 dagen na de laatste wijzigingsdatum van de gegevens. Als u de gegevens eerder verwijdert, kan de pijplijnuitvoering mislukken omdat de pijplijn ervan uitgaat dat de tussenliggende gegevens binnen 30 dagen bestaan voor hergebruik.

  • Verwijder via een programma tussenliggende gegevens aan het einde van een pijplijntaak wanneer deze niet meer nodig is.
  • Gebruik blobopslag met een kortetermijnopslagbeleid voor tussenliggende gegevens (zie Kosten optimaliseren door azure Blob Storage-toegangslagen te automatiseren). Dit beleid kan alleen worden ingesteld op het niet-standaardgegevensarchief van een werkruimte. Gebruik OutputFileDatasetConfig dit om tussenliggende gegevens te exporteren naar een ander gegevensarchief dat niet de standaardwaarde is.
    # 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()
    
  • Controleer en verwijder regelmatig niet meer benodigde gegevens.

Zie Kosten voor Azure Machine Learning plannen en beheren voor meer informatie.

Volgende stappen