Trenowanie modeli przy użyciu zestawów danych usługi Azure Machine Edukacja

Uwaga

W tym artykule odwołuje się do systemu CentOS — dystrybucji systemu Linux, która zbliża się do stanu zakończenia życia (EOL). Rozważ odpowiednie użycie i planowanie. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zakończenia życia systemu CentOS.

DOTYCZY: Zestaw SDK języka Python azureml w wersji 1

Z tego artykułu dowiesz się, jak pracować z zestawami danych usługi Azure Machine Edukacja w celu trenowania modeli uczenia maszynowego. Zestawy danych można używać w lokalnym lub zdalnym obiekcie docelowym obliczeniowym bez obaw o parametry połączenia lub ścieżki danych.

Zestawy danych usługi Azure Machine Edukacja zapewniają bezproblemową integrację z usługą Azure Machine Edukacja trenowania, takimi jak ScriptRunConfig, HyperDrive i Azure Machine Edukacja potoki.

Jeśli nie jesteś gotowy do udostępnienia danych na potrzeby trenowania modelu, ale chcesz załadować dane do notesu na potrzeby eksploracji danych, zobacz, jak eksplorować dane w zestawie danych.

Wymagania wstępne

Aby utworzyć i wytrenować zestawy danych, potrzebne są następujące elementy:

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto. Wypróbuj bezpłatną lub płatną wersję usługi Azure Machine Edukacja dzisiaj.

  • Obszar roboczy usługi Azure Machine Edukacja.

  • Zainstalowany zestaw AZURE Machine Edukacja SDK dla języka Python (>= 1.13.0), który zawiera azureml-datasets pakiet.

Uwaga

Niektóre klasy zestawów danych mają zależności od pakietu azureml-dataprep . W przypadku użytkowników systemu Linux te klasy są obsługiwane tylko w następujących dystrybucjach: Red Hat Enterprise Linux, Ubuntu, Fedora i CentOS.

Korzystanie z zestawów danych w skryptach trenowania uczenia maszynowego

Jeśli dane ustrukturyzowane nie zostały jeszcze zarejestrowane jako zestaw danych, utwórz zestaw danych tabelarycznych i użyj ich bezpośrednio w skrybacie szkoleniowym dla eksperymentu lokalnego lub zdalnego.

W tym przykładzie utworzysz niezarejestrowany zestaw danych tabelarycznych i określisz go jako argument skryptu w obiekcie ScriptRunConfig na potrzeby trenowania. Jeśli chcesz ponownie użyć tego zestawu tabularDataset z innymi eksperymentami w obszarze roboczym, zobacz , jak zarejestrować zestawy danych w obszarze roboczym.

Tworzenie zestawu danych tabelarycznych

Poniższy kod tworzy niezarejestrowany zestaw tabularDataset z adresu URL sieci Web.

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)

Obiekty TabularDataset umożliwiają ładowanie danych w zestawie danych tabelarycznych do biblioteki pandas lub Spark DataFrame, dzięki czemu można pracować ze znanymi bibliotekami przygotowywania i trenowania danych bez konieczności opuszczania notesu.

Uzyskiwanie dostępu do zestawu danych w skry skrycie szkoleniowym

Poniższy kod konfiguruje argument --input-data skryptu, który określisz podczas konfigurowania przebiegu trenowania (zobacz następną sekcję). Gdy tabelaryczny zestaw danych zostanie przekazany jako wartość argumentu, usługa Azure Machine Edukacja rozpozna identyfikator zestawu danych, którego następnie można użyć do uzyskania dostępu do zestawu danych w skrypcie trenowania (bez konieczności kodowania nazwy lub identyfikatora zestawu danych w skrypcie). Następnie używa to_pandas_dataframe() metody do załadowania tego zestawu danych do ramki danych biblioteki pandas w celu dalszej eksploracji i przygotowania danych przed rozpoczęciem trenowania.

Uwaga

Jeśli oryginalne źródło danych zawiera wartość NaN, puste ciągi lub puste wartości, gdy używasz to_pandas_dataframe()metody , te wartości są zastępowane jako wartość null .

Jeśli musisz załadować przygotowane dane do nowego zestawu danych z ramki danych pandas w pamięci, zapisz dane w pliku lokalnym, takim jak parquet, i utwórz nowy zestaw danych z tego pliku. Dowiedz się więcej na temat tworzenia zestawów danych.

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

Konfigurowanie przebiegu trenowania

Obiekt ScriptRunConfig służy do konfigurowania i przesyłania przebiegu trenowania.

Ten kod tworzy obiekt ScriptRunConfig , srcktóry określa:

  • Katalog skryptów dla skryptów. Wszystkie pliki w tym katalogu są przekazywane do węzłów klastra w celu wykonania.
  • Skrypt szkoleniowy train_titanic.py.
  • Wejściowy zestaw danych do trenowania , titanic_dsjako argument skryptu. Usługa Azure Machine Edukacja rozwiąże ten problem z odpowiednim identyfikatorem zestawu danych po przekazaniu go do skryptu.
  • Docelowy obiekt obliczeniowy dla przebiegu.
  • Środowisko przebiegu.
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)                             

Instalowanie plików do zdalnych celów obliczeniowych

Jeśli masz dane bez struktury, utwórz zestaw plików FileDataset i zainstaluj lub pobierz pliki danych, aby udostępnić je zdalnemu celowi obliczeniowemu na potrzeby trenowania. Dowiedz się, kiedy używać instalacji a pobierania dla eksperymentów trenowania zdalnego.

Poniższy przykład:

  • Tworzy wejściowy element FileDataset, mnist_ds, dla danych szkoleniowych.
  • Określa, gdzie mają być zapisywane wyniki trenowania, oraz podwyższanie poziomu tych wyników jako fileDataset.
  • Instaluje wejściowy zestaw danych do docelowego obiektu obliczeniowego.

Uwaga

Jeśli używasz niestandardowego obrazu podstawowego platformy Docker, musisz zainstalować bezpiecznik za pośrednictwem jako apt-get install -y fuse zależność do instalacji zestawu danych. Dowiedz się, jak utworzyć niestandardowy obraz kompilacji.

Aby zapoznać się z przykładem notesu, zobacz How to configure a training run with data input and output (Jak skonfigurować przebieg trenowania przy użyciu danych wejściowych i wyjściowych).

Tworzenie zestawu danych pliku

Poniższy przykład tworzy niezarejestrowany zestaw plików na mnist_data podstawie adresów URL sieci Web. Ten zestaw PlikówDataset to dane wejściowe dla przebiegu trenowania.

Dowiedz się więcej na temat tworzenia zestawów danych z innych źródeł.


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)

Gdzie pisać dane wyjściowe trenowania

Możesz określić miejsce zapisu wyników trenowania za pomocą obiektu OutputFileDatasetConfig.

Obiekty OutputFileDatasetConfig umożliwiają:

  • Zainstaluj lub przekaż dane wyjściowe przebiegu do określonego magazynu w chmurze.
  • Zapisz dane wyjściowe jako plikDataset w następujących obsługiwanych typach magazynu:
    • Obiekt blob platformy Azure
    • Udział plików platformy Azure
    • Usługa Azure Data Lake Storage generacji 1 i 2
  • Śledzenie pochodzenia danych między przebiegami trenowania.

Poniższy kod określa, że wyniki trenowania powinny być zapisywane jako plikDataset w outputdataset folderze w domyślnym magazynie danych obiektów 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'))

Konfigurowanie przebiegu trenowania

Zalecamy przekazanie zestawu danych jako argumentu podczas instalowania za pomocą arguments parametru konstruktora ScriptRunConfig . W ten sposób ścieżka danych (punkt instalowania) w skrycie trenowania jest pobierana za pośrednictwem argumentów. Dzięki temu możesz użyć tego samego skryptu szkoleniowego na potrzeby lokalnego debugowania i zdalnego trenowania na dowolnej platformie w chmurze.

W poniższym przykładzie zostanie utworzona konfiguracja ScriptRunConfig, która przekazuje element FileDataset za pośrednictwem elementu arguments. Po przesłaniu przebiegu pliki danych, do których odwołuje się zestaw danych mnist_ds , są instalowane do docelowego obiektu obliczeniowego, a wyniki trenowania są zapisywane w określonym outputdataset folderze w domyślnym magazynie danych.

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)

Prosty skrypt trenowania

Poniższy skrypt jest przesyłany za pośrednictwem skryptu ScriptRunConfig. Odczytuje mnist_ds zestaw danych jako dane wejściowe i zapisuje plik outputdataset w folderze w domyślnym magazynie danych obiektów 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)

Instalowanie a pobieranie

Instalowanie lub pobieranie plików dowolnego formatu jest obsługiwane w przypadku zestawów danych utworzonych na podstawie usługi Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen1, Azure Data Lake Storage Gen2, Azure SQL Database i Azure Database for PostgreSQL.

Podczas instalowania zestawu danych należy dołączyć pliki, do których odwołuje się zestaw danych, do katalogu (punkt instalacji) i udostępnić go w docelowym obiekcie obliczeniowym. Instalowanie jest obsługiwane w przypadku obliczeń opartych na systemie Linux, w tym usługi Azure Machine Edukacja Compute, maszyn wirtualnych i usługi HDInsight. Jeśli rozmiar danych przekracza rozmiar dysku obliczeniowego, pobieranie nie jest możliwe. W tym scenariuszu zalecamy instalowanie, ponieważ podczas przetwarzania są ładowane tylko pliki danych używane przez skrypt.

Po pobraniu zestawu danych wszystkie pliki, do których odwołuje się zestaw danych, zostaną pobrane do docelowego obiektu obliczeniowego. Pobieranie jest obsługiwane dla wszystkich typów obliczeniowych. Jeśli skrypt przetwarza wszystkie pliki, do których odwołuje się zestaw danych, a dysk obliczeniowy może zmieścić się w pełnym zestawie danych, zaleca się uniknięcie obciążenia związanego z przesyłaniem strumieniowym danych z usług magazynu. Aby uzyskać informacje o pobieraniu z wieloma węzłami, zobacz , jak uniknąć ograniczania przepustowości.

Uwaga

Nazwa ścieżki pobierania nie powinna być dłuższa niż 255 znaków alfanumerycznych dla systemu operacyjnego Windows. W przypadku systemu operacyjnego Linux nazwa ścieżki pobierania nie powinna być dłuższa niż 4096 znaków alfanumerycznych. Ponadto w przypadku systemu operacyjnego Linux nazwa pliku (która jest ostatnim segmentem ścieżki /path/to/file/{filename}pobierania) nie powinna być dłuższa niż 255 znaków alfanumerycznych.

Poniższy kod instaluje dataset się w katalogu tymczasowym pod adresem 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)

Pobieranie zestawów danych w skryptach uczenia maszynowego

Zarejestrowane zestawy danych są dostępne lokalnie i zdalnie w klastrach obliczeniowych, takich jak środowisko obliczeniowe usługi Azure Machine Edukacja. Aby uzyskać dostęp do zarejestrowanego zestawu danych między eksperymentami, użyj następującego kodu, aby uzyskać dostęp do obszaru roboczego i pobrać zestaw danych, który został użyty w poprzednim przesłanym przebiegu. Domyślnie get_by_name() metoda w Dataset klasie zwraca najnowszą wersję zestawu danych zarejestrowanego w obszarze roboczym.

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

Uzyskiwanie dostępu do kodu źródłowego podczas trenowania

Usługa Azure Blob Storage ma większą szybkość przepływności niż udział plików platformy Azure i będzie skalowana do dużej liczby zadań uruchomionych równolegle. Z tego powodu zalecamy skonfigurowanie przebiegów do używania usługi Blob Storage do przesyłania plików kodu źródłowego.

Poniższy przykład kodu określa w konfiguracji przebiegu, który magazyn danych obiektu blob ma być używany na potrzeby transferów kodu źródłowego.

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

Przykłady notesów

Rozwiązywanie problemów

Inicjowanie zestawu danych nie powiodło się: Upłynął limit czasu oczekiwania na przygotowanie punktu instalacji:

  • Jeśli nie masz żadnych reguł sieciowej grupy zabezpieczeń dla ruchu wychodzącego i używasz azureml-sdk>=1.12.0polecenia , zaktualizuj azureml-dataset-runtime i jej zależności, aby być najnowszymi dla określonej wersji pomocniczej lub jeśli używasz jej w przebiegu, utwórz ponownie środowisko, aby mieć najnowszą poprawkę z poprawką.
  • Jeśli używasz programu azureml-sdk<1.12.0, przeprowadź uaktualnienie do najnowszej wersji.
  • Jeśli masz reguły sieciowej grupy zabezpieczeń dla ruchu wychodzącego, upewnij się, że istnieje reguła ruchu wychodzącego, która zezwala na cały ruch dla tagu AzureResourceMonitorusługi .

Inicjowanie zestawu danych nie powiodło się: wyjątek StreamAccessException został spowodowany przez wyjątek ThrottlingException

W przypadku pobierania plików z wieloma węzłami wszystkie węzły mogą próbować pobrać wszystkie pliki z zestawu danych plików z usługi Azure Storage, co powoduje błąd ograniczania przepustowości. Aby uniknąć ograniczania przepustowości, początkowo ustaw zmienną środowiskową AZUREML_DOWNLOAD_CONCURRENCY na wartość osiem razy więcej rdzeni procesora CPU podzieloną przez liczbę węzłów. Skonfigurowanie wartości dla tej zmiennej środowiskowej może wymagać eksperymentowania, więc wyżej wymienione wskazówki są punktem wyjścia.

W poniższym przykładzie przyjęto założenie, że 32 rdzenie i 4 węzły.

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

AzureFile Storage

Nie można przekazać plików projektu do katalogu roboczego w usłudze AzureFile, ponieważ magazyn jest przeciążony:

  • Jeśli używasz udziału plików dla innych obciążeń, takich jak transfer danych, zaleca się użycie obiektów blob, aby udział plików był bezpłatny do przesyłania przebiegów.

  • Inną opcją jest podzielenie obciążenia między dwa różne obszary robocze.

ConfigException: Nie można utworzyć połączenia z usługą AzureFileService z powodu brakujących poświadczeń. Klucz konta lub token SAS musi być połączony z domyślnym magazynem obiektów blob obszaru roboczego.

Aby upewnić się, że poświadczenia dostępu do magazynu są połączone z obszarem roboczym i skojarzonym magazynem danych plików, wykonaj następujące kroki:

  1. Przejdź do obszaru roboczego w witrynie Azure Portal.
  2. Wybierz link magazynu na stronie Przegląd obszaru roboczego.
  3. Na stronie magazynu wybierz pozycję Klucze dostępu w menu po lewej stronie.
  4. Skopiuj klucz.
  5. Przejdź do usługi Azure Machine Edukacja Studio dla obszaru roboczego.
  6. W studio wybierz magazyn danych plików, dla którego chcesz podać poświadczenia uwierzytelniania.
  7. Wybierz pozycję Aktualizuj uwierzytelnianie .
  8. Wklej klucz z poprzednich kroków.
  9. Wybierz pozycję Zapisz.

Przekazywanie danych jako danych wejściowych

TypeError: FileNotFound: Nie ma takiego pliku lub katalogu: ten błąd występuje, jeśli w podanej ścieżce pliku nie ma lokalizacji pliku. Należy upewnić się, że sposób odwoływania się do pliku jest zgodny z miejscem, w którym zestaw danych został zainstalowany na docelowym obiekcie obliczeniowym. Aby zapewnić stan deterministyczny, zalecamy użycie ścieżki abstrakcyjnej podczas instalowania zestawu danych do docelowego obiektu obliczeniowego. Na przykład w poniższym kodzie instalujemy zestaw danych w katalogu głównym systemu plików docelowego /tmpobiektu obliczeniowego .

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

Jeśli nie dołączysz ukośnika wiodącego do przodu "/", musisz na przykład prefiksować katalog roboczy w docelowym obiekcie obliczeniowym, /mnt/batch/.../tmp/dataset aby wskazać, gdzie ma zostać zainstalowany zestaw danych.

Następne kroki