Delen via


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.

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:

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, srcdat 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_dsals 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_dsvoor 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

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.0bijbehorende afhankelijkheden gebruikt, bijwerkt azureml-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 AzureResourceMonitortoestaat.

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:

  1. Navigeer naar uw werkruimte in Azure Portal.
  2. Selecteer de opslagkoppeling op de pagina Overzicht van de werkruimte.
  3. Selecteer op de opslagpagina toegangssleutels in het menu aan de linkerkant.
  4. Kopieer de sleutel.
  5. Navigeer naar de Azure Machine Learning-studio voor uw werkruimte.
  6. Selecteer in de studio het bestandsgegevensarchief waarvoor u verificatiereferenties wilt opgeven.
  7. Selecteer Verificatie bijwerken.
  8. Plak de sleutel uit de vorige stappen.
  9. 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