Udostępnij za pośrednictwem


Przenoszenie danych do kroków potoku uczenia maszynowego i między nimi (Python)

DOTYCZY: Zestaw SDK języka Python w wersji 1

Ten artykuł zawiera kod importowania, przekształcania i przenoszenia danych między krokami w potoku usługi Azure Machine Learning. Aby zapoznać się z omówieniem sposobu działania danych w usłudze Azure Machine Learning, zobacz Access data in Azure storage services (Uzyskiwanie dostępu do danych w usługach Azure Storage). Aby uzyskać korzyści i strukturę potoków usługi Azure Machine Learning, zobacz Co to są potoki usługi Azure Machine Learning?

W tym artykule pokazano, w jaki sposób wykonać następujące czynności:

  • Używanie Dataset obiektów dla istniejących danych
  • Uzyskiwanie dostępu do danych w ramach kroków
  • Dzielenie Dataset danych na podzestawy, takie jak podzestawy trenowania i walidacji
  • Tworzenie OutputFileDatasetConfig obiektów do transferu danych do następnego kroku potoku
  • Używanie OutputFileDatasetConfig obiektów jako danych wejściowych do kroków potoku
  • Utwórz nowe Dataset obiekty na podstawie OutputFileDatasetConfig , które chcesz utrwały

Wymagania wstępne

Należy wykonać:

  • 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 Learning.

  • Zestaw AZURE Machine Learning SDK dla języka Python lub dostęp do usługi Azure Machine Learning Studio.

  • Obszar roboczy usługi Azure Machine Learning.

    Utwórz obszar roboczy usługi Azure Machine Learning lub użyj istniejącego za pomocą zestawu SDK języka Python. Zaimportuj klasę i załaduj Workspace informacje o subskrypcji z pliku config.json przy użyciu funkcji from_config().Datastore Ta funkcja domyślnie wyszukuje plik JSON w bieżącym katalogu, ale można również określić parametr ścieżki, aby wskazać plik przy użyciu polecenia from_config(path="your/file/path").

    import azureml.core
    from azureml.core import Workspace, Datastore
    
    ws = Workspace.from_config()
    
  • Niektóre istniejące dane. W tym artykule krótko przedstawiono użycie kontenera obiektów blob platformy Azure.

  • Opcjonalnie: Istniejący potok uczenia maszynowego, taki jak opisany w artykule Tworzenie i uruchamianie potoków uczenia maszynowego przy użyciu zestawu SDK usługi Azure Machine Learning.

Używanie Dataset obiektów dla istniejących danych

Preferowanym sposobem pozyskiwania danych do potoku jest użycie obiektu Dataset . Dataset obiekty reprezentują trwałe dane dostępne w całym obszarze roboczym.

Istnieje wiele sposobów tworzenia i rejestrowania Dataset obiektów. Tabelaryczne zestawy danych są przeznaczone dla rozdzielanych danych dostępnych w co najmniej jednym pliku. Zestawy danych plików są przeznaczone dla danych binarnych (takich jak obrazy) lub danych, które analizujesz. Najprostszymi metodami programowymi tworzenia Dataset obiektów są użycie istniejących obiektów blob w magazynie obszarów roboczych lub publicznych adresów URL:

datastore = Datastore.get(workspace, 'training_data')
iris_dataset = Dataset.Tabular.from_delimited_files(DataPath(datastore, 'iris.csv'))

datastore_path = [
    DataPath(datastore, 'animals/dog/1.jpg'),
    DataPath(datastore, 'animals/dog/2.jpg'),
    DataPath(datastore, 'animals/cat/*.jpg')
]
cats_dogs_dataset = Dataset.File.from_files(path=datastore_path)

Aby uzyskać więcej opcji tworzenia zestawów danych z różnymi opcjami i z różnych źródeł, rejestrowanie ich i przeglądanie ich w interfejsie użytkownika usługi Azure Machine Learning, zrozumienie sposobu interakcji rozmiaru danych z pojemnością obliczeniową i przechowywanie ich wersji, zobacz Tworzenie zestawów danych usługi Azure Machine Learning.

Przekazywanie zestawów danych do skryptu

Aby przekazać ścieżkę zestawu danych do skryptu, użyj Dataset metody obiektu as_named_input() . Wynikowy DatasetConsumptionConfig obiekt można przekazać do skryptu jako argument lub, używając argumentu inputs do skryptu potoku, możesz pobrać zestaw danych przy użyciu polecenia Run.get_context().input_datasets[].

Po utworzeniu nazwanych danych wejściowych możesz wybrać tryb dostępu (tylko dla opcji FileDataset): as_mount() lub as_download(). Jeśli skrypt przetwarza wszystkie pliki w zestawie danych, a dysk w zasobie obliczeniowym jest wystarczająco duży dla zestawu danych, tryb dostępu pobierania jest lepszym wyborem. Tryb dostępu do pobierania pozwala uniknąć narzutu przesyłania strumieniowego danych w czasie wykonywania. Jeśli skrypt uzyskuje dostęp do podzbioru zestawu danych lub jest zbyt duży dla obliczeń, użyj trybu dostępu instalacji. Aby uzyskać więcej informacji, przeczytaj Instalowanie i pobieranie

Aby przekazać zestaw danych do kroku potoku:

  1. Użyj TabularDataset.as_named_input() polecenia lub FileDataset.as_named_input() (bez znaku "s" na końcu), aby utworzyć DatasetConsumptionConfig obiekt
  2. Tylko dla FileDataset :. Użyj as_mount() polecenia lub as_download() , aby ustawić tryb dostępu. Tabelaryczny zestaw danych nie obsługuje trybu dostępu ustawionego.
  3. Przekazywanie zestawów danych do kroków potoku przy użyciu argumentu arguments inputs lub

Poniższy fragment kodu przedstawia typowy wzorzec łączenia tych kroków w konstruktorze PythonScriptStep przy użyciu iris_dataset (TabularDataset):


train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[iris_dataset.as_named_input('iris')]
)

Uwaga

Należy zastąpić wartości wszystkich tych argumentów (czyli "train_data", , "train.py", clusteri iris_dataset) własnymi danymi. Powyższy fragment kodu pokazuje tylko formę wywołania i nie jest częścią przykładu firmy Microsoft.

Możesz również użyć metod, takich jak random_split() i take_sample() , aby utworzyć wiele danych wejściowych lub zmniejszyć ilość danych przekazywanych do kroku potoku:

seed = 42 # PRNG seed
smaller_dataset = iris_dataset.take_sample(0.1, seed=seed) # 10%
train, test = smaller_dataset.random_split(percentage=0.8, seed=seed)

train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[train.as_named_input('train'), test.as_named_input('test')]
)

Uzyskiwanie dostępu do zestawów danych w skrycie

Nazwane dane wejściowe skryptu kroku potoku są dostępne jako słownik w Run obiekcie . Pobierz aktywny Run obiekt przy użyciu polecenia Run.get_context() , a następnie pobierz słownik nazwanych danych wejściowych przy użyciu polecenia input_datasets. Jeśli obiekt został DatasetConsumptionConfig przekazany przy użyciu argumentu arguments , a nie argumentu inputs , uzyskaj dostęp do danych przy użyciu ArgParser kodu. Obie techniki przedstawiono w następujących fragmentach kodu:

Skrypt definicji potoku

# Code for demonstration only: It would be very confusing to split datasets between `arguments` and `inputs`
train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    # datasets passed as arguments
    arguments=['--training-folder', train.as_named_input('train').as_download()],
    # datasets passed as inputs
    inputs=[test.as_named_input('test').as_download()]
)

Skrypt train.py , do których odwołuje się skrypt PythonScriptStep

# In pipeline script
parser = argparse.ArgumentParser()
# Retreive the dataset passed as an argument
parser.add_argument('--training-folder', type=str, dest='train_folder', help='training data folder mounting point')
args = parser.parse_args()
training_data_folder = args.train_folder
# Retrieve the dataset passed as an input
testing_data_folder = Run.get_context().input_datasets['test']

Przekazana wartość to ścieżka do plików zestawu danych.

Można również uzyskać bezpośredni dostęp do zarejestrowanego Dataset elementu. Ponieważ zarejestrowane zestawy danych są trwałe i udostępniane w obszarze roboczym, możesz je pobrać bezpośrednio:

run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')

Uwaga

Powyższe fragmenty kodu pokazują formę wywołań i nie są częścią przykładu firmy Microsoft. Należy zastąpić różne argumenty wartościami z własnego projektu.

Korzystanie z OutputFileDatasetConfig danych pośrednich

Obiekty Dataset reprezentują tylko dane trwałe, OutputFileDatasetConfig ale obiekty mogą służyć do tymczasowych danych wyjściowych z kroków potoku i trwałych danych wyjściowych. OutputFileDatasetConfig Obsługuje zapisywanie danych w magazynie obiektów blob, udziałach plików, adlsgen1 lub adlsgen2. Obsługuje zarówno tryb instalacji, jak i tryb przekazywania. W trybie instalacji pliki zapisywane w zainstalowanym katalogu są trwale przechowywane po zamknięciu pliku. W trybie przekazywania pliki zapisywane w katalogu wyjściowym są przekazywane na końcu zadania. Jeśli zadanie zakończy się niepowodzeniem lub zostanie anulowane, katalog wyjściowy nie zostanie przekazany.

OutputFileDatasetConfig Domyślne zachowanie obiektu polega na zapisie w domyślnym magazynie danych obszaru roboczego. OutputFileDatasetConfig Przekaż obiekty do obiektu PythonScriptStep za pomocą parametru arguments .

from azureml.data import OutputFileDatasetConfig
dataprep_output = OutputFileDatasetConfig()
input_dataset = Dataset.get_by_name(workspace, 'raw_data')

dataprep_step = PythonScriptStep(
    name="prep_data",
    script_name="dataprep.py",
    compute_target=cluster,
    arguments=[input_dataset.as_named_input('raw_data').as_mount(), dataprep_output]
    )

Uwaga

Współbieżne zapisy w obiekcie kończą się niepowodzeniem OutputFileDatasetConfig . Nie należy próbować używać pojedynczego OutputFileDatasetConfig elementu jednocześnie. Nie udostępniaj pojedynczego OutputFileDatasetConfig elementu w sytuacji przetwarzania wieloprocesowego, na przykład w przypadku korzystania z trenowania rozproszonego.

Użyj OutputFileDatasetConfig jako danych wyjściowych kroku trenowania

W kroku PythonScriptStep potoku możesz pobrać dostępne ścieżki wyjściowe, używając argumentów programu. Jeśli ten krok jest pierwszy i powoduje inicjowanie danych wyjściowych, należy utworzyć katalog w określonej ścieżce. Następnie możesz napisać dowolne pliki, które mają być zawarte w pliku OutputFileDatasetConfig.

parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()

# Make directory for file
os.makedirs(os.path.dirname(args.output_path), exist_ok=True)
with open(args.output_path, 'w') as f:
    f.write("Step 1's output")

Odczytywanie OutputFileDatasetConfig jako danych wejściowych do kroków innych niż początkowe

Gdy początkowy krok potoku zapisze dane w OutputFileDatasetConfig ścieżce i stanie się wynikiem tego początkowego kroku, może służyć jako dane wejściowe do późniejszego kroku.

W poniższym kodzie:

  • step1_output_data wskazuje, że dane wyjściowe elementu PythonScriptStep step1 są zapisywane w magazynie danych usługi ADLS Gen 2 w my_adlsgen2 trybie przekazywania dostępu. Dowiedz się więcej o sposobie konfigurowania uprawnień roli w celu zapisywania danych z powrotem do magazynów danych usługi ADLS Gen 2.

  • Po step1 zakończeniu i zapis danych wyjściowych do miejsca docelowego wskazanego przez step1_output_data, krok2 jest gotowy do użycia step1_output_data jako dane wejściowe.

# get adls gen 2 datastore already registered with the workspace
datastore = workspace.datastores['my_adlsgen2']
step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()

step1 = PythonScriptStep(
    name="generate_data",
    script_name="step1.py",
    runconfig = aml_run_config,
    arguments = ["--output_path", step1_output_data]
)

step2 = PythonScriptStep(
    name="read_pipeline_data",
    script_name="step2.py",
    compute_target=compute,
    runconfig = aml_run_config,
    arguments = ["--pd", step1_output_data.as_input()]

)

pipeline = Pipeline(workspace=ws, steps=[step1, step2])

Napiwek

Odczytywanie danych w skry skrygmencie step2.py języka Python jest takie samo jak opisane wcześniej w artykule Access datasets within your script (Uzyskiwanie dostępu do zestawów danych w skrywcie). Użyj polecenia ArgumentParser , aby dodać argument --pd w skry skrycie w celu uzyskania dostępu do danych.

Rejestrowanie OutputFileDatasetConfig obiektów do ponownego użycia

Jeśli chcesz udostępnić swój OutputFileDatasetConfig eksperyment dłużej niż czas trwania eksperymentu, zarejestruj go w obszarze roboczym, aby udostępnić eksperymenty i użyć ich ponownie.

step1_output_ds = step1_output_data.register_on_complete(
    name='processed_data', 
    description = 'files from step1'
)

Usuń OutputFileDatasetConfig zawartość, gdy nie jest już potrzebna

Platforma Azure nie usuwa automatycznie danych pośrednich zapisanych za pomocą polecenia OutputFileDatasetConfig. Aby uniknąć opłat za magazyn dla dużych ilości niepotrzebnych danych, należy wykonać jedną z następujących czynności:

Uwaga

Usuń dane pośrednie tylko po upływie 30 dni od daty ostatniej zmiany danych. Usunięcie danych wcześniej może spowodować niepowodzenie uruchomienia potoku, ponieważ potok przyjmie, że dane pośrednie istnieją w ciągu 30 dni na potrzeby ponownego użycia.

  • Programowe usuwanie danych pośrednich na końcu zadania potoku, gdy nie jest już potrzebne.
  • Używanie magazynu obiektów blob z krótkoterminowymi zasadami magazynowania dla danych pośrednich (zobacz Optymalizowanie kosztów przez automatyzację warstw dostępu usługi Azure Blob Storage). Te zasady można ustawić tylko na domyślny magazyn danych obszaru roboczego. Służy OutputFileDatasetConfig do eksportowania danych pośrednich do innego magazynu danych, który nie jest domyślny.
    # Get adls gen 2 datastore already registered with the workspace
    datastore = workspace.datastores['my_adlsgen2']
    step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
    
  • Regularnie przeglądaj i usuwaj niepotrzebne dane.

Aby uzyskać więcej informacji, zobacz Planowanie kosztów usługi Azure Machine Learning i zarządzanie nimi.

Następne kroki