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 podstawieOutputFileDatasetConfig
, 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 plikuconfig.json
przy użyciu funkcjifrom_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 poleceniafrom_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:
- Użyj
TabularDataset.as_named_input()
polecenia lubFileDataset.as_named_input()
(bez znaku "s" na końcu), aby utworzyćDatasetConsumptionConfig
obiekt - Tylko dla
FileDataset
:. Użyjas_mount()
polecenia lubas_download()
, aby ustawić tryb dostępu. Tabelaryczny zestaw danych nie obsługuje trybu dostępu ustawionego. - 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"
, cluster
i 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 PythonScriptStepstep1
są zapisywane w magazynie danych usługi ADLS Gen 2 wmy_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 przezstep1_output_data
, krok2 jest gotowy do użyciastep1_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.