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 waaruitOutputFileDatasetConfig
u wilt behouden
Vereisten
U hebt het volgende nodig:
Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint. Probeer de gratis of betaalde versie van Azure Machine Learning.
De Azure Machine Learning SDK voor Python of toegang tot Azure Machine Learning-studio.
Een Azure Machine Learning-werkruimte.
Maak een Azure Machine Learning-werkruimte of gebruik een bestaande werkruimte via de Python SDK. Importeer de
Workspace
enDatastore
klasse en laad uw abonnementsgegevens uit het bestandconfig.json
met behulp van de functiefrom_config()
. Met deze functie wordt standaard gezocht naar het JSON-bestand in de huidige map, maar u kunt ook een padparameter opgeven die naar het bestand verwijst met behulp vanfrom_config(path="your/file/path")
.import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()
Sommige bestaande gegevens. In dit artikel wordt kort het gebruik van een Azure Blob-container beschreven.
Optioneel: Een bestaande machine learning-pijplijn, zoals de pijplijn die wordt beschreven in Machine Learning-pijplijnen maken en uitvoeren met azure Machine Learning SDK.
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:
- Gebruik
TabularDataset.as_named_input()
ofFileDataset.as_named_input()
(geen 's' aan het einde) om eenDatasetConsumptionConfig
object te maken - Alleen
FileDataset
voor:. De toegangsmodus gebruikenas_mount()
ofas_download()
instellen. TabularDataset biedt geen ondersteuning voor de toegangsmodus. - Geef de gegevenssets door aan uw pijplijnstappen met behulp van het
arguments
argument of hetinputs
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"
, cluster
en 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 pythonScriptStepstep1
wordt geschreven naar het ADLS Gen 2-gegevensarchief inmy_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 aangegevenstep1_output_data
doel is geschreven, is stap2 klaar voor gebruikstep1_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.