Modellen trainen met Azure Machine Learning-gegevenssets
VAN TOEPASSING OP: Python SDK azureml v1
In dit artikel leert u hoe u met Azure Machine Learning-gegevenssets kunt werken om machine learning-modellen te trainen. U kunt gegevenssets in uw lokale of externe rekendoel gebruiken zonder dat u zich zorgen hoeft te maken over verbindingsreeks s of gegevenspaden.
Zie Gegevenssets gebruiken in machine learning-trainingsscripts voor gestructureerde gegevens.
Zie Bestanden koppelen aan externe rekendoelen voor niet-gestructureerde gegevens.
Azure Machine Learning-gegevenssets bieden een naadloze integratie met De trainingsfunctionaliteit van Azure Machine Learning, zoals ScriptRunConfig, HyperDrive en Azure Machine Learning-pijplijnen.
Als u niet klaar bent om uw gegevens beschikbaar te maken voor modeltraining, maar uw gegevens wilt laden in uw notebook voor gegevensverkenning, raadpleegt u hoe u de gegevens in uw gegevensset kunt verkennen.
Vereisten
Als u gegevenssets wilt maken en trainen, hebt u het volgende nodig:
Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint. Probeer vandaag nog de gratis of betaalde versie van Azure Machine Learning.
De Azure Machine Learning SDK voor Python is geïnstalleerd (>= 1.13.0), waaronder het
azureml-datasets
pakket.
Notitie
Sommige gegevenssetklassen hebben afhankelijkheden van het pakket azureml-dataprep . Voor Linux-gebruikers worden deze klassen alleen ondersteund op de volgende distributies: Red Hat Enterprise Linux, Ubuntu en Fedora.
Gegevenssets gebruiken in machine learning-trainingsscripts
Als u gestructureerde gegevens nog niet hebt geregistreerd als een gegevensset, maakt u een TabularDataset en gebruikt u deze rechtstreeks in uw trainingsscript voor uw lokale of externe experiment.
In dit voorbeeld maakt u een niet-geregistreerde TabularDataset en geeft u deze op als een scriptargument in het ScriptRunConfig-object voor training. Als u deze TabularDataset opnieuw wilt gebruiken met andere experimenten in uw werkruimte, raadpleegt u hoe u gegevenssets registreert in uw werkruimte.
Een TabularDataset maken
Met de volgende code wordt een niet-geregistreerde TabularDataset gemaakt op basis van een web-URL.
from azureml.core.dataset import Dataset
web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path)
TabularDataset-objecten bieden een manier om de gegevens in uw TabularDataset te laden in een pandas of Spark DataFrame, zodat u kunt werken met vertrouwde gegevensvoorbereidings- en trainingsbibliotheken zonder uw notebook te verlaten.
Toegang tot gegevensset in trainingsscript
Met de volgende code wordt een scriptargument --input-data
geconfigureerd dat u opgeeft wanneer u de trainingsuitvoering configureert (zie de volgende sectie). Wanneer de tabellaire gegevensset wordt doorgegeven als argumentwaarde, wordt deze door Azure Machine Learning omgezet in de gegevensset-id. Vervolgens kunt u die argumentwaarde gebruiken om toegang te krijgen tot de gegevensset in uw trainingsscript (zonder dat u de naam of id van de gegevensset in uw script hoeft te coderen). Vervolgens wordt de to_pandas_dataframe()
methode gebruikt om die gegevensset in een pandas-dataframe te laden voor verdere gegevensverkenning en voorbereiding voordat de training wordt uitgevoerd.
Notitie
Als de oorspronkelijke gegevensbron NaN, lege tekenreeksen of lege waarden bevat, to_pandas_dataframe()
worden deze waarden vervangen als een Null-waarde .
Als u de voorbereide gegevens vanuit een pandas-dataframe in het geheugen wilt laden in een nieuwe gegevensset, schrijft u de gegevens naar een lokaal bestand, zoals een parquet, en maakt u een nieuwe gegevensset op basis van dat bestand. Meer informatie over het maken van gegevenssets.
%%writefile $script_folder/train_titanic.py
import argparse
from azureml.core import Dataset, Run
parser = argparse.ArgumentParser()
parser.add_argument("--input-data", type=str)
args = parser.parse_args()
run = Run.get_context()
ws = run.experiment.workspace
# get the input dataset by ID
dataset = Dataset.get_by_id(ws, id=args.input_data)
# load the TabularDataset to pandas DataFrame
df = dataset.to_pandas_dataframe()
De trainingsuitvoering configureren
Er wordt een ScriptRunConfig-object gebruikt om de trainingsuitvoering te configureren en te verzenden.
Met deze code maakt u een ScriptRunConfig-object, src
dat het volgende aangeeft:
- Een scriptmap voor uw scripts. Alle bestanden in deze map worden naar de clusterknooppunten geüpload voor uitvoering.
- Het trainingsscript, train_titanic.py.
- De invoergegevensset voor training,
titanic_ds
als scriptargument. Azure Machine Learning lost deze op naar de bijbehorende id van de gegevensset wanneer deze wordt doorgegeven aan uw script. - Het rekendoel voor de uitvoering.
- De omgeving voor de uitvoering.
from azureml.core import ScriptRunConfig
src = ScriptRunConfig(source_directory=script_folder,
script='train_titanic.py',
# pass dataset as an input with friendly name 'titanic'
arguments=['--input-data', titanic_ds.as_named_input('titanic')],
compute_target=compute_target,
environment=myenv)
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)
Bestanden koppelen aan externe rekendoelen
Als u ongestructureerde gegevens hebt, maakt u een FileDataset en koppelt of downloadt u uw gegevensbestanden om ze beschikbaar te maken voor uw externe rekendoel voor training. Meer informatie over het gebruik van mount versus download voor uw externe trainingsexperimenten.
Het volgende voorbeeld
- Hiermee maakt u een ingevoerde FileDataset
mnist_ds
voor uw trainingsgegevens. - Hiermee geeft u op waar trainingsresultaten moeten worden geschreven en om deze resultaten als filedataset te promoveren.
- Koppelt de invoergegevensset aan het rekendoel.
Notitie
Als u een aangepaste Docker-basisinstallatiekopieën gebruikt, moet u fuse installeren als apt-get install -y fuse
een afhankelijkheid voor het koppelen van gegevenssets. Meer informatie over het bouwen van een aangepaste build-installatiekopieën.
Zie Een trainingsuitvoering configureren met gegevensinvoer en uitvoer voor het notebookvoorbeeld.
Een FileDataset maken
In het volgende voorbeeld wordt een niet-geregistreerde FileDataset gemaakt op mnist_data
basis van web-URL's. Deze FileDataset is de invoergegevens voor uw trainingsuitvoering.
Meer informatie over het maken van gegevenssets uit andere bronnen.
from azureml.core.dataset import Dataset
web_paths = [
'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
]
mnist_ds = Dataset.File.from_files(path = web_paths)
Waar moet ik trainingsuitvoer schrijven?
U kunt opgeven waar u uw trainingsresultaten wilt schrijven met een OutputFileDatasetConfig-object.
Met OutputFileDatasetConfig-objecten kunt u het volgende doen:
- Koppel of upload de uitvoer van een uitvoering naar cloudopslag die u opgeeft.
- Sla de uitvoer op als filedataset in deze ondersteunde opslagtypen:
- Azure Blob
- Azure-bestandsshare
- Azure Data Lake Storage generaties 1 en 2
- De gegevensherkomst tussen trainingsuitvoeringen bijhouden.
De volgende code geeft aan dat trainingsresultaten moeten worden opgeslagen als een FileDataset in de outputdataset
map in de standaard blobgegevensopslag, def_blob_store
.
from azureml.core import Workspace
from azureml.data import OutputFileDatasetConfig
ws = Workspace.from_config()
def_blob_store = ws.get_default_datastore()
output = OutputFileDatasetConfig(destination=(def_blob_store, 'sample/outputdataset'))
De trainingsuitvoering configureren
U wordt aangeraden de gegevensset als argument door te geven bij het koppelen via de arguments
parameter van de ScriptRunConfig
constructor. Als u dit doet, krijgt u het gegevenspad (koppelingspunt) in uw trainingsscript via argumenten. Op deze manier kunt u hetzelfde trainingsscript gebruiken voor lokale foutopsporing en externe training op elk cloudplatform.
In het volgende voorbeeld wordt een ScriptRunConfig gemaakt die via FileDataset wordt doorgegeven.arguments
Nadat u de uitvoering hebt verzonden, worden gegevensbestanden waarnaar wordt verwezen door de gegevensset mnist_ds
gekoppeld aan het rekendoel en worden trainingsresultaten opgeslagen in de opgegeven outputdataset
map in het standaardgegevensarchief.
from azureml.core import ScriptRunConfig
input_data= mnist_ds.as_named_input('input').as_mount()# the dataset will be mounted on the remote compute
src = ScriptRunConfig(source_directory=script_folder,
script='dummy_train.py',
arguments=[input_data, output],
compute_target=compute_target,
environment=myenv)
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)
Eenvoudig trainingsscript
Het volgende script wordt verzonden via ScriptRunConfig. Deze leest de mnist_ds
gegevensset als invoer en schrijft het bestand naar de outputdataset
map in het standaardgegevensarchief van de blob. def_blob_store
%%writefile $source_directory/dummy_train.py
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import sys
import os
print("*********************************************************")
print("Hello Azure Machine Learning!")
mounted_input_path = sys.argv[1]
mounted_output_path = sys.argv[2]
print("Argument 1: %s" % mounted_input_path)
print("Argument 2: %s" % mounted_output_path)
with open(mounted_input_path, 'r') as f:
content = f.read()
with open(os.path.join(mounted_output_path, 'output.csv'), 'w') as fw:
fw.write(content)
Koppelen versus downloaden
Het koppelen of downloaden van bestanden van elke indeling wordt ondersteund voor gegevenssets die zijn gemaakt vanuit Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen1, Azure Data Lake Storage Gen2, Azure SQL Database en Azure Database for PostgreSQL.
Wanneer u een gegevensset koppelt , koppelt u de bestanden waarnaar wordt verwezen door de gegevensset aan een map (koppelpunt) en maakt u deze beschikbaar op het rekendoel. Koppelen wordt ondersteund voor berekeningen op basis van Linux, waaronder Azure Machine Learning Compute, virtuele machines en HDInsight. Als uw gegevens groter zijn dan de grootte van de rekenschijf, is downloaden niet mogelijk. Voor dit scenario raden we u aan te koppelen omdat alleen de gegevensbestanden die door uw script worden gebruikt, tijdens de verwerking worden geladen.
Wanneer u een gegevensset downloadt , worden alle bestanden waarnaar wordt verwezen door de gegevensset gedownload naar het rekendoel. Downloaden wordt ondersteund voor alle rekentypen. Als uw script alle bestanden verwerkt waarnaar wordt verwezen door de gegevensset en uw rekenschijf past bij uw volledige gegevensset, wordt het downloaden aanbevolen om de overhead van streaminggegevens van opslagservices te voorkomen. Zie voor downloads met meerdere knooppunten hoe u beperking kunt voorkomen.
Notitie
De naam van het downloadpad mag niet langer zijn dan 255 alfanumerieke tekens voor het Windows-besturingssysteem. Voor het Linux-besturingssysteem mag de naam van het downloadpad niet langer zijn dan 4096 alfanumerieke tekens. Voor het Linux-besturingssysteem mag de bestandsnaam (het laatste segment van het downloadpad /path/to/file/{filename}
) niet langer zijn dan 255 alfanumerieke tekens.
De volgende code wordt gekoppeld dataset
aan de tijdelijke map op mounted_path
import tempfile
mounted_path = tempfile.mkdtemp()
# mount dataset onto the mounted_path of a Linux-based compute
mount_context = dataset.mount(mounted_path)
mount_context.start()
import os
print(os.listdir(mounted_path))
print (mounted_path)
Gegevenssets ophalen in machine learning-scripts
Geregistreerde gegevenssets zijn zowel lokaal als extern toegankelijk op rekenclusters zoals de Azure Machine Learning-berekening. Als u toegang wilt krijgen tot uw geregistreerde gegevensset in verschillende experimenten, gebruikt u de volgende code voor toegang tot uw werkruimte en haalt u de gegevensset op die is gebruikt in de eerder ingediende uitvoering. Standaard retourneert de get_by_name()
methode in de Dataset
klasse de meest recente versie van de gegevensset die is geregistreerd bij de werkruimte.
%%writefile $script_folder/train.py
from azureml.core import Dataset, Run
run = Run.get_context()
workspace = run.experiment.workspace
dataset_name = 'titanic_ds'
# Get a dataset by name
titanic_ds = Dataset.get_by_name(workspace=workspace, name=dataset_name)
# Load a TabularDataset into pandas DataFrame
df = titanic_ds.to_pandas_dataframe()
Toegang tot broncode tijdens de training
Azure Blob Storage heeft hogere doorvoersnelheden dan een Azure-bestandsshare en wordt geschaald naar grote aantallen taken die parallel zijn gestart. Daarom raden we u aan om uw uitvoeringen te configureren voor het gebruik van Blob Storage voor het overdragen van broncodebestanden.
In het volgende codevoorbeeld wordt aangegeven in de uitvoeringsconfiguratie welke blobgegevensopslag moet worden gebruikt voor broncodeoverdrachten.
# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore"
Notebook-voorbeelden
- Zie de notebooks voor gegevenssets voor meer voorbeelden en concepten van gegevenssets.
- Bekijk hoe u gegevenssets in uw ML-pijplijnen kunt parametrizeren.
Probleemoplossing
Initialisatie van de gegevensset is mislukt: er is een time-out opgetreden bij het wachten tot het koppelpunt gereed is:
- Als u geen regels voor uitgaande netwerkbeveiligingsgroepen hebt en u de
azureml-sdk>=1.12.0
bijbehorende afhankelijkheden gebruikt, bijwerktazureml-dataset-runtime
en de afhankelijkheden ervan als de meest recente versie voor de specifieke secundaire versie, of als u deze in een uitvoering gebruikt, maakt u uw omgeving opnieuw zodat deze de meest recente patch met de oplossing kan hebben. - Als u gebruikmaakt
azureml-sdk<1.12.0
, voert u een upgrade uit naar de nieuwste versie. - Als u uitgaande NSG-regels hebt, controleert u of er een uitgaande regel is die al het verkeer voor de servicetag
AzureResourceMonitor
toestaat.
Initialisatie van gegevensset is mislukt: StreamAccessException is veroorzaakt door ThrottlingException
Bij het downloaden van bestanden met meerdere knooppunten kunnen alle knooppunten proberen alle bestanden in de bestandsgegevensset te downloaden vanuit de Azure Storage-service, wat resulteert in een beperkingsfout. Om beperking te voorkomen, stelt u de omgevingsvariabele AZUREML_DOWNLOAD_CONCURRENCY
in eerste instantie in op een waarde van acht keer het aantal CPU-kernen gedeeld door het aantal knooppunten. Het instellen van een waarde voor deze omgevingsvariabele kan enige experimenten vereisen, dus de eerdere richtlijnen zijn een uitgangspunt.
In het volgende voorbeeld wordt uitgegaan van 32 kernen en 4 knooppunten.
from azureml.core.environment import Environment
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}
AzureFile-opslag
Kan projectbestanden niet uploaden naar de werkmap in AzureFile omdat de opslag overbelast is:
Als u een bestandsshare gebruikt voor andere werkbelastingen, zoals gegevensoverdracht, is het raadzaam om blobs te gebruiken, zodat de bestandsshare gratis kan worden gebruikt voor het verzenden van uitvoeringen.
U kunt de workload ook splitsen tussen twee verschillende werkruimten.
ConfigException: Kan geen verbinding maken met de AzureFileService vanwege ontbrekende referenties. Een accountsleutel of SAS-token moet worden gekoppeld aan het standaardwerkruimte-blobarchief.
Voer de volgende stappen uit om ervoor te zorgen dat uw referenties voor opslagtoegang zijn gekoppeld aan de werkruimte en het bijbehorende bestandsgegevensarchief:
- Navigeer naar uw werkruimte in Azure Portal.
- Selecteer de opslagkoppeling op de pagina Overzicht van de werkruimte.
- Selecteer op de opslagpagina toegangssleutels in het menu aan de linkerkant.
- Kopieer de sleutel.
- Navigeer naar de Azure Machine Learning-studio voor uw werkruimte.
- Selecteer in de studio het bestandsgegevensarchief waarvoor u verificatiereferenties wilt opgeven.
- Selecteer Verificatie bijwerken.
- Plak de sleutel uit de vorige stappen.
- Selecteer Opslaan.
Gegevens doorgeven als invoer
TypeError: FileNotFound: Geen dergelijk bestand of dergelijke map: deze fout treedt op als het bestandspad dat u opgeeft zich niet bevindt waar het bestand zich bevindt. U moet ervoor zorgen dat de manier waarop u naar het bestand verwijst, consistent is met de locatie waar u uw gegevensset aan uw rekendoel hebt gekoppeld. Om een deterministische status te garanderen, raden we u aan het abstracte pad te gebruiken bij het koppelen van een gegevensset aan een rekendoel. In de volgende code koppelen we bijvoorbeeld de gegevensset onder de hoofdmap van het bestandssysteem van het rekendoel. /tmp
# Note the leading / in '/tmp/dataset'
script_params = {
'--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
}
Als u de voorloopslash '/' niet opneemt, moet u bijvoorbeeld /mnt/batch/.../tmp/dataset
de werkmap voorvoegsel geven op het rekendoel om aan te geven waar u de gegevensset wilt koppelen.
Volgende stappen
Machine learning-modellen automatisch trainen met TabularDatasets.
Modellen voor afbeeldingsclassificatie trainen met FileDatasets.