Sdílet prostřednictvím


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

PLATÍ PRO: Python SDK azureml v1

V tomto článku se dozvíte, jak pracovat s datovými sadami Azure Machine Learning pro trénování modelů strojového učení. Datové sady můžete použít 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ězec 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řipraveni 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 s datovými sadami, potřebujete:

  • Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet. Vyzkoušejte si bezplatnou nebo placenou verzi služby Azure Machine Learning ještě dnes.

  • Pracovní prostor Azure Machine Learning.

  • Nainstalovaná sada Azure Machine Learning SDK pro Python (>= 1.13.0), která obsahuje azureml-datasets balíček.

Poznámka:

Některé třídy datové sady 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 a Fedora.

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

Pokud jste strukturovaná data ještě nezaregistrovali jako datovou sadu, vytvořte tabulkovou datovou sadu a použijte ji přímo ve svém trénovacím skriptu pro místní nebo vzdálený experiment.

V tomto příkladu vytvoříte neregistrovanou TabularDataset 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 v pracovním prostoru, podívejte se, jak zaregistrovat datové sady do pracovního prostoru.

Vytvoření datové sady typu TabularDataset

Následující kód vytvoří neregistrovanou TabularDataset 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 nabízejí způsob, jak načíst data v tabulkové datovém rámci pandas nebo Spark, 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 spuštění (viz další část). Když se tabulková datová sada předá jako hodnota argumentu, Azure Machine Learning ji přeloží na ID datové sady. Tuto hodnotu argumentu pak můžete použít pro přístup k datové sadě ve vašem trénovacím skriptu (aniž byste museli pevně zakódovat název nebo ID datové sady ve skriptu). Potom pomocí to_pandas_dataframe() metody načte datovou sadu 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ář skriptů 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 ji přeloží na odpovídající ID datové sady, když 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 FileDataset a buď připojte nebo stáhněte datové soubory, abyste je mohli zpřístupnit vzdálenému cílovému výpočetnímu objektu pro trénování. Přečtěte si, kdy použít připojení a stažení experimentů vzdáleného trénování.

Následující příklad

  • Vytvoří vstupní FileDataset pro mnist_dstrénovací data.
  • Určuje, kde se mají zapisovat trénovací výsledky a zvýšit jejich úroveň 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 fuse jako apt-get install -y fuse závislost pro připojení datové sady k práci. 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í datové sady typu FileDataset

Následující příklad vytvoří neregistrovaný FileDataset mnist_data z webových adres URL. Tato sada FileDataset je 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)

Kde psát trénovací výstup

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

Objekty OutputFileDatasetConfig umožňují:

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

Následující kód určuje, že trénovací výsledky by se měly uložit jako FileDataset ve outputdataset složce 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í pomocí arguments parametru ScriptRunConfig konstruktoru doporučujeme předat datovou sadu jako argument. Tím získáte v trénovacím skriptu cestu k datům (bod připojení) prostřednictvím argumentů. Tímto způsobem můžete 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 odkazované datovou sadou mnist_ds 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 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 stažení souborů libovolného formátu se podporují u datových sad vytvořených 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 odkazované datovou sadou k adresáři (přípojný bod) a zpřístupníte ho v 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ů azure Machine Learning, virtuálních počítačů a HDInsight. Pokud velikost dat překročí velikost výpočetního disku, stahování není možné. Pro tento scénář doporučujeme připojit, protože se v době zpracování načtou jenom datové soubory používané vaším skriptem.

Při stahování datové sady se všechny soubory odkazované datovou sadou 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 váš skript zpracuje všechny soubory odkazované datovou sadou a váš výpočetní disk může vyhovovat celé datové sadě, doporučuje se stažení, aby se zabránilo režii streamovaných dat ze služeb úložiště. Pokud chcete stáhnout více uzlů, podívejte se, jak se vyhnout omezování.

Poznámka:

Název cesty ke stažení nesmí být delší než 255 alfanumerické znaky 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é znaky. V případě operačního systému 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 alfanumerních znaků.

Následující kód se dataset připojí 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í prostředí 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ískejte datovou sadu použitou v dříve odeslaném spuštění. Metoda ve Dataset třídě ve výchozím nastavení get_by_name() vrátí 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í

Azure Blob Storage má vyšší propustnost než sdílená složka Azure a škáluje se na velký počet spuštěných úloh paralelně. Z tohoto důvodu doporučujeme nakonfigurovat spuštění tak, aby pro přenos 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í, kterou úložiště dat objektů blob 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í problému

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

  • Pokud nemáte žádná pravidla odchozí skupiny zabezpečení sítě a používáte azureml-sdk>=1.12.0, aktualizujte azureml-dataset-runtime a její závislosti tak, aby byly nejnovější pro konkrétní podverzi nebo pokud je používáte ve spuštění, vytvořte prostředí znovu, aby mohlo mít nejnovější opravu.
  • 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 odchozí pravidlo, které povoluje veškerý provoz pro značku AzureResourceMonitorslužby .

Inicializace datové sady selhala: Výjimka StreamAccessException způsobila výjimka ThrottlingException

U stahování souborů s více uzly se může všechny uzly pokusit stáhnout všechny soubory v datové sadě souborů ze služby Azure Storage, což má za následek chybu omezování. Abyste se vyhnuli omezování, nastavte zpočátku proměnnou AZUREML_DOWNLOAD_CONCURRENCY prostředí na hodnotu osminásobku počtu jader procesoru vyděleného počtem uzlů. Nastavení hodnoty pro tuto proměnnou prostředí může vyžadovat určité experimentování, takže dřívější 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 nelze nahrát do pracovního adresáře ve službě AzureFile, protože úložiště je přetížené:

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

  • Úlohu můžete také rozdělit mezi dva různé pracovní prostory.

ConfigException: Nepodařilo se vytvořit připojení ke službě AzureFileService kvůli chybějícím přihlašovacím údajům. 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, aby přihlašovací údaje pro přístup k úložišti úložiště byly propojené s pracovním prostorem a přidruženým úložištěm dat souborů, proveďte následující kroky:

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

Předávání dat jako vstupu

TypeError: FileNotFound: Žádný takový soubor nebo adresář: K této chybě dochází, pokud zadáváte cestu k souboru, kde se soubor nachází. Musíte se ujistit, že způsob, jakým odkazujete na soubor, je konzistentní s tím, kam 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řenem 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 nezahrnete počáteční lomítko /, musíte předponu pracovního adresáře, například na cílovém výpočetním objektu určit, /mnt/batch/.../tmp/dataset kam chcete datovou sadu připojit.

Další kroky