Udostępnij za pomocą


Tworzenie i uruchamianie potoków uczenia maszynowego przy użyciu składników za pomocą interfejsu wiersza polecenia usługi Azure Machine Learning

DOTYCZY: Rozszerzenie interfejsu wiersza polecenia platformy Azure ml w wersji 2 (bieżąca)

Z tego artykułu dowiesz się, jak tworzyć i uruchamiać potoki uczenia maszynowego przy użyciu interfejsu wiersza polecenia platformy Azure i składników. Można tworzyć kanały bez używania składników, ale dzięki nim można uzyskać elastyczność i możliwość ponownego użycia. Potoki usługi Azure Machine Learning można definiować w języku YAML i uruchamiać z interfejsu wiersza polecenia (CLI), napisanego w Pythonie lub tworzonego w projektancie usługi Azure Machine Learning Studio za pomocą interfejsu przeciągnij i upuść. Ten artykuł koncentruje się na interfejsie wiersza polecenia.

Wymagania wstępne

Sugerowane wstępne odczytywanie

Utwórz swój pierwszy rurociąg przy użyciu komponentów

Najpierw utworzysz przepływ ze składnikami na przykładzie. Daje to początkowe wrażenie tego, jak wygląda pipeline i składnik w usłudze Azure Machine Learning.

W katalogu cli/jobs/pipelines-with-components/basics repozytorium azureml-examples przejdź do podkatalogu 3b_pipeline_with_data. W tym katalogu znajdują się trzy typy plików. Są to pliki, które należy utworzyć przy budowie własnego potoku.

  • pipeline.yml. Ten plik YAML definiuje potok uczenia maszynowego. W tym artykule opisano sposób dzielenia pełnego zadania uczenia maszynowego na wieloetapowy przepływ pracy. Rozważmy na przykład proste zadanie uczenia maszynowego przy użyciu danych historycznych w celu wytrenowania modelu prognozowania sprzedaży. Możesz utworzyć sekwencyjny przepływ pracy zawierający kroki przetwarzania danych, trenowania modelu i oceny modelu. Każdy krok jest składnikiem, który ma dobrze zdefiniowany interfejs i można go opracowywać, testować i optymalizować niezależnie. Potok YAML definiuje również sposób, w jaki kroki podrzędne łączą się z innymi krokami w potoku. Na przykład krok trenowania modelu generuje plik modelu, a plik modelu jest przekazywany do kroku oceny modelu.

  • component.yml. Te pliki YAML definiują składniki. Zawierają one następujące informacje:

    • Metadane: nazwa, nazwa wyświetlana, wersja, opis, typ itd. Metadane ułatwiają opisywanie składnika i zarządzanie nim.
    • Interfejs: dane wejściowe i wyjściowe. Na przykład składnik trenowania modelu pobiera dane treningowe i liczbę epok jako dane wejściowe i generuje wytrenowany plik modelu jako dane wyjściowe. Po zdefiniowaniu interfejsu różne zespoły mogą opracowywać i testować składnik niezależnie.
    • Polecenie, kod i środowisko: polecenie, kod i środowisko do uruchomienia składnika. Polecenie jest poleceniem powłoki do uruchomienia składnika. Kod zwykle odwołuje się do katalogu kodu źródłowego. Środowisko może być środowiskiem usługi Azure Machine Learning (wyselekcjonowane lub utworzone przez klienta), obrazem platformy Docker lub środowiskiem conda.
  • component_src. Są to katalogi kodu źródłowego dla określonych składników. Zawierają kod źródłowy, który jest uruchamiany w składniku. Możesz użyć preferowanego języka, w tym języka Python, R i innych. Kod musi być uruchamiany za pomocą polecenia powłoki. Kod źródłowy może przyjąć kilka danych wejściowych z wiersza polecenia powłoki, aby kontrolować sposób, w jaki uruchamiany jest ten krok. Na przykład, krok trenowania może użyć danych szkoleniowych, szybkości nauki i liczby epok w celu kontrolowania procesu trenowania. Argument polecenia powłoki służy do przekazywania danych wejściowych i wyjściowych do kodu.

Teraz utworzysz pipeline przy użyciu przykładu 3b_pipeline_with_data. Każdy plik jest bardziej szczegółowo opisany w poniższych sekcjach.

Najpierw wyświetl listę dostępnych zasobów obliczeniowych przy użyciu następującego polecenia:

az ml compute list

Jeśli go nie masz, utwórz klaster o nazwie cpu-cluster , uruchamiając następujące polecenie:

Uwaga

Pomiń ten krok, aby użyć bezserwerowych obliczeń.

az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10

Teraz utwórz zadanie potoku zdefiniowane w pliku pipeline.yml, uruchamiając następujące polecenie. Docelowy obiekt obliczeniowy jest przywołyny w pliku pipeline.yml jako azureml:cpu-cluster. Jeśli docelowy obiekt obliczeniowy używa innej nazwy, pamiętaj, aby zaktualizować go w pliku pipeline.yml.

az ml job create --file pipeline.yml

Powinieneś otrzymać słownik JSON zawierający informacje o zadaniu potoku, w tym:

Klawisz opis
name Nazwa zadania oparta na identyfikatorze GUID.
experiment_name Nazwa, w ramach której zadania będą zorganizowane w studio.
services.Studio.endpoint Adres URL monitorowania i przeglądania zadania potoku.
status Stan zadania. To prawdopodobnie będzie Preparing w tym momencie.

Przejdź do adresu URL, services.Studio.endpoint aby wyświetlić wizualizację potoku:

Zrzut ekranu przedstawiający wizualizację procesu.

Omówienie definicji potoku YAML

Teraz przyjrzysz się definicji pipeline w pliku 3b_pipeline_with_data/pipeline.yml .

Uwaga

Aby użyć bezserwerowych obliczeń, zastąp ciąg default_compute: azureml:cpu-cluster ciągiem default_compute: azureml:serverless w tym pliku.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies

settings:
  default_compute: azureml:cpu-cluster

outputs:
  final_pipeline_output:
    mode: rw_mount

jobs:
  component_a:
    type: command
    component: ./componentA.yml
    inputs:
      component_a_input: 
        type: uri_folder
        path: ./data

    outputs:
      component_a_output: 
        mode: rw_mount
  component_b:
    type: command
    component: ./componentB.yml
    inputs:
      component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
    outputs:
      component_b_output: 
        mode: rw_mount
  component_c:
    type: command
    component: ./componentC.yml
    inputs:
      component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
    outputs:
      component_c_output: ${{parent.outputs.final_pipeline_output}}
      #  mode: upload

W poniższej tabeli opisano najczęściej używane pola schematu YAML potoku. Aby dowiedzieć się więcej, zobacz pełny schemat YAML potoku.

Klawisz opis
type Wymagany. Typ zadania. Musi być pipeline dla zadań w potoku.
display_name Nazwa wyświetlana zadania potoku w interfejsie użytkownika programu Studio. Możliwość edycji w interfejsie użytkownika programu Studio. Nie musi być wyjątkowa we wszystkich pracach w obszarze roboczym.
jobs Wymagany. Słownik zestawu poszczególnych zadań do uruchomienia jako etapy w potoku przetwarzania. Te zadania są uznawane za podrzędne zadania nadrzędnego potoku. W bieżącej wersji obsługiwane typy zadań w potoku to command i sweep.
inputs Zbiór danych wejściowych do zadania w potoku. Klucz jest nazwą danych wejściowych w kontekście zadania, a wartość jest wartością wejściową. Dane wejściowe potoku można odnosić do danych wejściowych poszczególnego zadania w ramach tego potoku, używając wyrażenia ${{ parent.inputs.<input_name> }}.
outputs Słownik konfiguracji wyników operacji przetwarzania danych. Klucz jest nazwą danych wyjściowych w kontekście zadania, a wartość jest konfiguracją danych wyjściowych. Możesz odwoływać się do tych danych wyjściowych potoku poprzez dane wyjściowe pojedynczego zadania kroku w potoku, używając wyrażenia ${{ parents.outputs.<output_name> }}.

Przykład 3b_pipeline_with_data zawiera trzyetapowy potok danych.

  • Trzy kroki są definiowane w obszarze jobs. Wszystkie trzy kroki mają typ command. Definicja każdego kroku znajduje się w odpowiednim component*.yml pliku. Pliki YAML składnika można znaleźć w katalogu 3b_pipeline_with_data. componentA.yml jest opisany w następnej sekcji.
  • Ten pipeline ma zależność danych, która jest powszechna w rzeczywistych pipeline'ach. Składnik A pobiera dane wejściowe z folderu lokalnego w obszarze ./data (wiersze 18–21) i przekazuje dane wyjściowe do składnika B (wiersz 29). Dane wyjściowe składnika A mogą być przywołyne jako ${{parent.jobs.component_a.outputs.component_a_output}}.
  • default_compute definiuje domyślne obliczenia dla potoku. Jeśli składnik jobs definiuje inne obliczenia, ustawienia specyficzne dla składnika są przestrzegane.

Zrzut ekranu potoku z przykładem danych.

Odczytywanie i zapisywanie danych w strumieniu

Jednym z typowych scenariuszy jest odczytywanie i zapisywanie danych w potoku. W usłudze Azure Machine Learning używasz tego samego schematu do odczytywania i zapisywania danych dla wszystkich typów zadań (zadań potoku, zadań poleceń i zadań zamiatania). Poniżej przedstawiono przykłady zastosowania danych w potokach dla typowych scenariuszy.

Omówienie definicji składnika YAML

Oto plik componentA.yml , przykład yaML definiujący składnik:

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command

name: component_a
display_name: componentA
version: 1

inputs:
  component_a_input:
    type: uri_folder

outputs:
  component_a_output:
    type: uri_folder

code: ./componentA_src

environment: 
  image: python

command: >-
  python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}

Ta tabela definiuje najczęściej używane pola składnika YAML. Aby dowiedzieć się więcej, zobacz pełny schemat YAML składnika.

Klawisz opis
name Wymagany. Nazwa składnika. Musi być unikatowa w obszarze roboczym usługi Azure Machine Learning. Musi zaczynać się od małej litery. Małe litery, cyfry i podkreślenia (_) są dozwolone. Maksymalna długość to 255 znaków.
display_name Nazwa wyświetlana składnika w interfejsie użytkownika programu Studio. Nie musi być unikatowa w obszarze roboczym.
command Wymagany. Polecenie do uruchomienia.
code Ścieżka lokalna do katalogu kodu źródłowego, który ma zostać przekazany i użyty dla składnika.
environment Wymagany. Środowisko używane do uruchamiania składnika.
inputs Słownik danych wejściowych składników. Klucz jest nazwą danych wejściowych w kontekście składnika, a wartość jest definicją danych wejściowych składnika. W poleceniu można odwoływać się do danych wejściowych, używając wyrażenia ${{ inputs.<input_name> }}.
outputs Słownik danych wyjściowych składników. Klucz jest nazwą danych wyjściowych w kontekście składnika, a wartość jest definicją danych wyjściowych składnika. Możesz odwoływać się do danych wyjściowych w poleceniu ${{ outputs.<output_name> }} przy użyciu wyrażenia .
is_deterministic Czy ponownie użyć wyniku poprzedniego zadania, jeśli dane wejściowe składnika nie ulegają zmianie. Wartość domyślna to true. To ustawienie jest również znane jako reuse by default. Typowym scenariuszem, w którym ustawiono wartość , false jest wymuszenie ponownego załadowania danych z magazynu w chmurze lub adresu URL.

W przykładzie w 3b_pipeline_with_data/componentA.yml składnik A zawiera jedno dane wejściowe i jedno dane wyjściowe, które można połączyć z innymi krokami w potoku nadrzędnym. Wszystkie pliki w sekcji w code składniku YAML zostaną przekazane do usługi Azure Machine Learning po przesłaniu zadania potoku. W tym przykładzie pliki pod ./componentA_src zostaną załadowane. (Wiersz 16 w componentA.yml). Możesz zobaczyć załadowany kod źródłowy w interfejsie użytkownika Studio: kliknij dwukrotnie krok componentA na wykresie i przejdź do karty Kod, jak pokazano na poniższym zrzucie ekranu. Widać, że jest to skrypt hello-world wykonujący proste operacje drukowania i zapisujący bieżącą datę oraz godzinę na ścieżce componentA_output. Składnik pobiera dane wejściowe i dostarcza dane wyjściowe za pośrednictwem wiersza polecenia. Jest on obsługiwany w hello.py za pośrednictwem metody argparse.

Zrzut ekranu pipeline'u z przykładem danych. Przedstawia składnik A.

Dane wejściowe i wyjściowe

Dane wejściowe i wyjściowe definiują interfejs składnika. Dane wejściowe i wyjściowe mogą być wartościami literałów (typu string, number, integer lub boolean) lub obiektem zawierającym schemat wejściowy.

Wejście obiektu (typu uri_file, uri_folder, mltable, mlflow_model lub custom_model) może łączyć się z innymi krokami w zadaniu potoku nadrzędnego, aby przekazać dane/modele do innych kroków. Na wykresie przepływu dane wejściowe typu obiektu są renderowane jako kropka połączenia.

Literalne dane wejściowe (string, number, integer, boolean) to parametry, które można przekazać do składnika podczas wykonywania. W polu default można dodać domyślną wartość danych wejściowych literału. W przypadku typów number i integer można również dodawać wartości minimalne i maksymalne przy użyciu pól min i max. Jeśli wartość wejściowa jest mniejsza niż wartość minimalna lub większa niż maksymalna, potok nie przechodzi walidacji. Walidacja jest wykonywana przed przesłaniem zadania potoku, co może zaoszczędzić czas. Walidacja działa dla CLI, zestawu SDK Pythona i interfejsu projektanta. Poniższy zrzut ekranu przedstawia przykład weryfikacji w interfejsie użytkownika projektanta. Podobnie można zdefiniować dozwolone wartości w enum polach.

Zrzut ekranu przedstawiający dane wejściowe i wyjściowe składnika modelu regresji liniowej trenowania.

Jeśli chcesz dodać dane wejściowe do składnika, musisz wprowadzić zmiany w trzech miejscach:

  • Pole inputs w składniku YAML.
  • Pole command w składniku YAML.
  • W kodzie źródłowym składnika do obsługi danych wejściowych wiersza polecenia.

Te lokalizacje są oznaczone zielonymi polami na powyższym zrzucie ekranu.

Aby dowiedzieć się więcej na temat danych wejściowych i wyjściowych, zobacz Zarządzanie danymi wejściowymi i wyjściowymi składników i potoków.

Środowiska

Środowisko to środowisko, w którym jest uruchamiany składnik. Może to być środowisko Azure Machine Learning (opracowane lub niestandardowe), obraz Dockera lub środowisko conda. Zobacz następujące przykłady:

Rejestrowanie składnika do ponownego użycia i udostępniania

Chociaż niektóre składniki są specyficzne dla określonego potoku, prawdziwe korzyści ze składników wynikają z ponownego użycia i udostępniania innym. Możesz zarejestrować składnik w obszarze roboczym usługi Machine Learning, aby udostępnić go do ponownego użycia. Zarejestrowane składniki obsługują automatyczne przechowywanie wersji, dzięki czemu można zaktualizować składnik, ale upewnij się, że potoki wymagające starszej wersji będą nadal działać.

W repozytorium azureml-examples przejdź do katalogu cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components.

Aby zarejestrować składnik, użyj az ml component create polecenia :

az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml

Po uruchomieniu tych poleceń do końca, można zobaczyć składniki w studio, w obszarze Zasoby>Składniki.

Zrzut ekranu przedstawiający program Studio. Zawiera on zarejestrowane składniki.

Wybierz składnik. Zostaną wyświetlone szczegółowe informacje dotyczące każdej wersji składnika.

Karta Szczegóły zawiera podstawowe informacje, takie jak nazwa składnika, która ją utworzyła i wersja. Istnieją pola edytowalne dla tagów i opisu. Możesz użyć tagów, aby dodać słowa kluczowe wyszukiwania. Pole opisu obsługuje formatowanie języka Markdown. Należy go użyć do opisania funkcjonalności i podstawowego użycia składnika.

Na karcie Zadania zostanie wyświetlona historia wszystkich zadań, które używają składnika.

Używanie zarejestrowanych składników w pliku YAML zadania potoku

Zastosujesz teraz 1b_e2e_registered_components jako przykład zastosowania zarejestrowanego składnika w potoku YAML. Przejdź do 1b_e2e_registered_components katalogu i otwórz pipeline.yml plik. Klucze i wartości w polach inputs i outputs są podobne do tych, które zostały już omówione. Jedyną znaczącą różnicą jest wartość component pola w jobs.<job_name>.component wpisach. Wartość component ma postać azureml:<component_name>:<component_version>. Definicja train-job określa na przykład, że powinna być używana najnowsza wersja zarejestrowanego składnika my_train :

type: command
component: azureml:my_train@latest
inputs:
  training_data: 
    type: uri_folder 
    path: ./data      
  max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
  learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
  learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
outputs:
  model_output: ${{parent.outputs.pipeline_job_trained_model}}
services:
  my_vscode:

Zarządzanie składnikami

Szczegóły składnika i zarządzanie składnikami można sprawdzić przy użyciu interfejsu wiersza polecenia w wersji 2. Użyj az ml component -h polecenia, aby uzyskać szczegółowe instrukcje dotyczące poleceń dotyczących składników. W poniższej tabeli wymieniono wszystkie dostępne polecenia. Zobacz więcej przykładów w dokumentacji interfejsu wiersza polecenia platformy Azure.

Komenda opis
az ml component create Utwórz składnik.
az ml component list Wyświetl listę składników w obszarze roboczym.
az ml component show Pokaż szczegóły składnika.
az ml component update Aktualizowanie składnika. Tylko kilka pól (opis, nazwa_wyświetlana) może zostać zaktualizowanych.
az ml component archive Archiwizowanie kontenera składników.
az ml component restore Przywracanie zarchiwizowanego składnika.

Następny krok