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.
Informace o strukturovaných datech najdete v tématu Využívání datových sad ve skriptech trénování strojového učení.
Nestrukturovaná data najdete v tématu Připojení souborů ke vzdáleným cílovým výpočetním objektů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, src
který 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_ds
jako 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_ds
tré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_store
dat 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ů
- Další příklady a koncepty datových sad najdete v poznámkových blocích datových sad.
- Zjistěte, jak parametrizovat datové sady v kanálech ML.
Ř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
, aktualizujteazureml-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
AzureResourceMonitor
služ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:
- Na webu Azure Portal přejděte do svého pracovního prostoru.
- Na stránce Přehled pracovního prostoru vyberte odkaz úložiště.
- Na stránce úložiště vyberte v nabídce na levé straně přístupové klíče .
- Zkopírujte klíč.
- Přejděte na studio Azure Machine Learning vašeho pracovního prostoru.
- V sadě Studio vyberte úložiště dat souborů, pro které chcete zadat ověřovací přihlašovací údaje.
- Vyberte Aktualizovat ověřování.
- Vložte klíč z předchozích kroků.
- 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
Automatické trénování modelů strojového učení pomocí tabulkových datových sad
Trénujte modely klasifikace obrázků pomocí FileDatasets.