Trénování modelů pomocí datových sad služby Azure Machine Learning

PLATÍ PRO:Sada Python SDK azureml v1

V tomto článku se dozvíte, jak pracovat s datovými sadami Azure Machine Learning k trénování modelů strojového učení. Datové sady můžete používat v místním nebo vzdáleném cílovém výpočetním objektu, aniž byste se museli starat o připojovací řetězce nebo cesty k datům.

Datové sady Azure Machine Learning poskytují bezproblémovou integraci s trénovacími funkcemi služby Azure Machine Learning, jako jsou ScriptRunConfig, HyperDrive a kanály Azure Machine Learning.

Pokud nejste připravení zpřístupnit data pro trénování modelu, ale chcete data načíst do poznámkového bloku pro zkoumání dat, podívejte se, jak prozkoumat data v datové sadě.

Požadavky

Pokud chcete vytvářet a trénovat pomocí datových sad, potřebujete:

Poznámka

Některé třídy datových sad mají závislosti na balíčku azureml-dataprep . Pro uživatele Linuxu jsou tyto třídy podporovány pouze v následujících distribucích: Red Hat Enterprise Linux, Ubuntu, Fedora a CentOS.

Využívání datových sad v trénovacích skriptech strojového učení

Pokud máte strukturovaná data, která ještě nejsou zaregistrovaná jako datová sada, vytvořte tabulkovou datovou sadu a použijte ji přímo v trénovacím skriptu pro místní nebo vzdálený experiment.

V tomto příkladu vytvoříte neregistrovanou tabulkovou datovou sadu a zadáte ji jako argument skriptu v objektu ScriptRunConfig pro trénování. Pokud chcete tuto tabulkovou datovou sadu znovu použít s jinými experimenty ve vašem pracovním prostoru, přečtěte si, jak do pracovního prostoru zaregistrovat datové sady.

Vytvoření tabulkové datové sady

Následující kód vytvoří neregistrovanou tabulkovou datovou sadu z webové adresy 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)

Objekty TabularDataset umožňují načíst data z tabulkových dat do datového rámce pandas nebo Sparku, abyste mohli pracovat se známými knihovnami pro přípravu a trénování dat, aniž byste museli opustit poznámkový blok.

Přístup k datové sadě v trénovacím skriptu

Následující kód nakonfiguruje argument --input-data skriptu, který zadáte při konfiguraci trénovacího běhu (viz další část). Když se tabulková datová sada předá jako hodnota argumentu, Azure Machine Learning ji přeloží na ID datové sady, které pak můžete použít pro přístup k datové sadě ve vašem trénovacím skriptu (aniž byste museli pevně kódovat název nebo ID datové sady ve vašem skriptu). Potom použije metodu to_pandas_dataframe() k načtení této datové sady do datového rámce pandas pro další zkoumání a přípravu dat před trénováním.

Poznámka

Pokud původní zdroj dat obsahuje NaN, prázdné řetězce nebo prázdné hodnoty, při použití to_pandas_dataframe()se tyto hodnoty nahradí hodnotou Null .

Pokud potřebujete načíst připravená data do nové datové sady z datového rámce pandas v paměti, zapište data do místního souboru, například parquet, a vytvořte z daného souboru novou datovou sadu. Přečtěte si další informace o vytváření datových sad.

%%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()

Konfigurace trénovacího spuštění

Objekt ScriptRunConfig slouží ke konfiguraci a odeslání trénovacího spuštění.

Tento kód vytvoří objekt ScriptRunConfig , srckterý určuje:

  • Adresář script pro vaše skripty. Všechny soubory v tomto adresáři se nahrají do uzlů clusteru ke spuštění.
  • Trénovací skript , train_titanic.py.
  • Vstupní datová sada pro trénování titanic_dsjako argument skriptu. Azure Machine Learning tento problém přeloží na odpovídající ID datové sady, jakmile se předá vašemu skriptu.
  • Cílový výpočetní objekt pro spuštění.
  • Prostředí pro spuštění.
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)                             

Připojení souborů ke vzdáleným cílovým výpočetním prostředkům

Pokud máte nestrukturovaná data, vytvořte sadu FileDataset a připojte nebo stáhněte datové soubory, aby byly dostupné pro trénování vzdáleného cílového výpočetního objektu. Zjistěte, kdy použít připojení nebo stažení pro experimenty se vzdáleným trénováním.

Následující příklad:

  • Vytvoří vstupní filedataset, mnist_ds, pro vaše trénovací data.
  • Určuje, kam se mají zapisovat trénovací výsledky a upřednostňují tyto výsledky jako FileDataset.
  • Připojí vstupní datovou sadu k cílovému výpočetnímu objektu.

Poznámka

Pokud používáte vlastní základní image Dockeru, budete muset nainstalovat pojistku jako apt-get install -y fuse závislost, aby připojení datové sady fungovalo. Zjistěte, jak vytvořit vlastní image sestavení.

Příklad poznámkového bloku najdete v tématu Konfigurace trénovacího spuštění se vstupem a výstupem dat.

Vytvoření sady FileDataset

Následující příklad vytvoří neregistrovaný FileDataset mnist_data z webových adres URL. Tato sada FileDataset jsou vstupní data pro trénovací běh.

Přečtěte si další informace o vytváření datových sad z jiných zdrojů.


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)

Kam psát trénovací výstup

Můžete určit, kam se mají zapisovat trénovací výsledky pomocí objektu OutputFileDatasetConfig.

Objekty OutputFileDatasetConfig umožňují:

  • Připojte nebo nahrajte výstup spuštění do cloudového úložiště, které určíte.
  • Uložte výstup jako FileDataset do těchto podporovaných typů úložiště:
    • Objekt blob Azure
    • Sdílená složka Azure
    • Azure Data Lake Storage generace 1 a 2
  • Sledujte rodokmen dat mezi trénovacími běhy.

Následující kód určuje, že výsledky trénování by se měly uložit jako FileDataset do outputdataset složky ve výchozím úložišti dat objektů blob , 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'))

Konfigurace trénovacího spuštění

Při připojování prostřednictvím arguments parametru ScriptRunConfig konstruktoru doporučujeme datovou sadu předat jako argument. Tím získáte cestu k datům (spojovací bod) ve svém trénovacím skriptu prostřednictvím argumentů. Díky tomu budete moct použít stejný trénovací skript pro místní ladění a vzdálené trénování na libovolné cloudové platformě.

Následující příklad vytvoří ScriptRunConfig, který předává FileDataset prostřednictvím arguments. Po odeslání spuštění se datové soubory, na které datová sada mnist_ds odkazuje, připojí k cílovému výpočetnímu objektu a výsledky trénování se uloží do zadané outputdataset složky ve výchozím úložišti dat.

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)

Jednoduchý trénovací skript

Následující skript se odešle prostřednictvím skriptu ScriptRunConfig. Načte mnist_ds datovou sadu jako vstup a zapíše soubor do outputdataset složky ve výchozím úložišti def_blob_storedat objektů blob .

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

Připojení vs. stažení

Připojení nebo stahování souborů v libovolném formátu se podporuje pro datové sady vytvořené ze služby Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen1, Azure Data Lake Storage Gen2, Azure SQL Database a Azure Database for PostgreSQL.

Když připojíte datovou sadu, připojíte soubory, na které datová sada odkazuje, k adresáři (přípojný bod) a zpřístupníte je na cílovém výpočetním objektu. Připojení se podporuje pro výpočetní prostředky založené na Linuxu, včetně výpočetních prostředků služby Azure Machine Learning, virtuálních počítačů a HDInsightu. Pokud velikost dat překračuje velikost výpočetního disku, stažení není možné. Pro tento scénář doporučujeme připojení, protože v době zpracování se načtou jenom datové soubory používané vaším skriptem.

Když si stáhnete datovou sadu, všechny soubory, na které datová sada odkazuje, se stáhnou do cílového výpočetního objektu. Stahování se podporuje pro všechny typy výpočetních prostředků. Pokud skript zpracovává všechny soubory, na které datová sada odkazuje, a výpočetní disk se hodí pro celou datovou sadu, doporučujeme stažení, abyste se vyhnuli náročnému streamování dat ze služeb úložiště. V případě stahování s více uzly si přečtěte, jak se vyhnout omezování.

Poznámka

Název cesty ke stažení nesmí být delší než 255 alfanumerických znaků pro operační systém Windows. V operačním systému Linux by název cesty ke stažení neměl být delší než 4 096 alfanumerických znaků. Pro operační systém Linux by také název souboru (což je poslední segment cesty /path/to/file/{filename}ke stažení) neměl být delší než 255 alfanumerických znaků.

Následující kód se připojí dataset k dočasnému adresáři na adrese 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)

Získání datových sad ve skriptech strojového učení

Registrované datové sady jsou přístupné místně i vzdáleně na výpočetních clusterech, jako je výpočetní služba Azure Machine Learning. Pokud chcete získat přístup k registrované datové sadě napříč experimenty, použijte následující kód pro přístup k pracovnímu prostoru a získání datové sady, která se použila při dříve odeslaném spuštění. Ve výchozím nastavení get_by_name() metoda ve Dataset třídě vrací nejnovější verzi datové sady, která je zaregistrovaná v pracovním prostoru.

%%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()

Přístup ke zdrojovému kódu během trénování

Úložiště objektů blob v Azure má vyšší rychlost propustnosti než sdílená složka Azure a bude se škálovat na velký počet paralelně spuštěných úloh. Z tohoto důvodu doporučujeme nakonfigurovat spuštění tak, aby k přenosu souborů zdrojového kódu používala úložiště objektů blob.

Následující příklad kódu určuje v konfiguraci spuštění, které úložiště dat objektů blob se má použít pro přenosy zdrojového kódu.

# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore" 

Příklady poznámkových bloků

Řešení potíží

Inicializace datové sady se nezdařila: Vypršel časový limit čekání na připravení přípojného bodu:

  • Pokud nemáte žádná odchozí pravidla skupiny zabezpečení sítě a používáte azureml-sdk>=1.12.0, aktualizujte azureml-dataset-runtime a její závislosti na nejnovější verzi pro konkrétní podverzi, nebo pokud ji používáte za běhu, vytvořte prostředí znovu, aby mohlo mít nejnovější opravu s příslušnou opravou.
  • Pokud používáte azureml-sdk<1.12.0, upgradujte na nejnovější verzi.
  • Pokud máte odchozí pravidla NSG, ujistěte se, že existuje pravidlo odchozích přenosů, které povoluje veškerý provoz pro značku AzureResourceMonitorslužby .

Inicializace datové sady se nezdařila: StreamAccessException způsobila výjimka ThrottlingException.

Při stahování souborů s více uzly se všechny uzly můžou pokusit stáhnout všechny soubory v datové sadě souborů ze služby Azure Storage, což vede k chybě omezování. Abyste se vyhnuli omezování, nastavte nejprve proměnnou AZUREML_DOWNLOAD_CONCURRENCY prostředí na hodnotu osminásobku počtu jader procesoru děleného počtem uzlů. Nastavení hodnoty pro tuto proměnnou prostředí může vyžadovat určité experimentování, takže výše uvedené pokyny jsou výchozím bodem.

Následující příklad předpokládá 32 jader a 4 uzly.

from azureml.core.environment import Environment 
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}

AzureFile Storage

Soubory projektu nejde nahrát do pracovního adresáře v AzureFile, protože úložiště je přetížené:

  • Pokud sdílenou složku používáte pro jiné úlohy, jako je přenos dat, doporučujeme použít objekty blob, aby se sdílená složka zdarma používala k odesílání spuštění.

  • Další možností je rozdělit úlohu mezi dva různé pracovní prostory.

ConfigException: Kvůli chybějícím přihlašovacím údajům se nepodařilo vytvořit připojení ke službě AzureFileService. Klíč účtu nebo token SAS je potřeba propojit s výchozím úložištěm objektů blob pracovního prostoru.

Pokud chcete zajistit propojení přihlašovacích údajů pro přístup k úložišti s pracovním prostorem a přidruženým úložištěm dat souboru, proveďte následující kroky:

  1. V Azure Portal přejděte do svého pracovního prostoru.
  2. Na stránce Přehled pracovního prostoru vyberte odkaz na úložiště.
  3. Na stránce úložiště vyberte v nabídce vlevo přístupové klíče .
  4. Zkopírujte klíč.
  5. Přejděte na studio Azure Machine Learning pro váš pracovní prostor.
  6. Ve studiu vyberte úložiště dat souboru, pro které chcete zadat přihlašovací údaje pro ověřování.
  7. Vyberte Aktualizovat ověřování .
  8. Vložte klíč z předchozích kroků.
  9. Vyberte Uložit.

Předávání dat jako vstupu

TypeError: FileNotFound: Žádný takový soubor nebo adresář: K této chybě dochází, pokud cesta k souboru, kterou zadáte, není tam, kde se soubor nachází. Musíte zajistit, aby způsob, jakým na soubor odkazujete, byl konzistentní s místem, kde jste datovou sadu připojili k cílovému výpočetnímu objektu. Pokud chcete zajistit deterministický stav, doporučujeme při připojování datové sady k cílovému výpočetnímu objektu použít abstraktní cestu. Například v následujícím kódu připojíme datovou sadu pod kořen systému souborů cílového výpočetního objektu /tmp.

# Note the leading / in '/tmp/dataset'
script_params = {
    '--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
} 

Pokud nezadáte počáteční lomítko "/", budete muset zadat předponu pracovního adresáře, například u cílového výpočetního objektu, abyste označili, /mnt/batch/.../tmp/dataset kam chcete datovou sadu připojit.

Další kroky