Rozwiązywanie problemów z klasą ParallelRunStep
DOTYCZY:Zestaw SDK języka Python w wersji 1
Z tego artykułu dowiesz się, jak rozwiązywać problemy z błędami przy użyciu klasy ParallelRunStep z zestawu SDK usługi Azure Machine Learning.
Aby uzyskać ogólne porady dotyczące rozwiązywania problemów z potokiem, zobacz Rozwiązywanie problemów z potokami uczenia maszynowego.
Lokalne testowanie skryptów
Element ParallelRunStep działa jako krok w potokach uczenia maszynowego. Możesz przetestować skrypty lokalnie jako pierwszy krok.
Wymagania dotyczące skryptu wejściowego
Skrypt wejściowy elementu ParallelRunStep
musi zawieraćrun()
funkcję i opcjonalnie zawiera init()
funkcję:
init()
: ta funkcja służy do jakichkolwiek kosztowych lub typowych przygotowań do późniejszego przetwarzania. Na przykład użyj go do załadowania modelu do obiektu globalnego. Ta funkcja będzie wywoływana tylko raz na początku procesu.Uwaga
Jeśli metoda
init
tworzy katalog wyjściowy, określ tenparents=True
katalog iexist_ok=True
. Metoda jest wywoływanainit
z każdego procesu roboczego w każdym węźle, na którym jest uruchomione zadanie.run(mini_batch)
: Funkcja zostanie uruchomiona dla każdegomini_batch
wystąpienia.mini_batch
:ParallelRunStep
wywoła metodę run i przekaże listę lub bibliotekę pandasDataFrame
jako argument do metody . Każdy wpis w mini_batch będzie ścieżką pliku, jeśli dane wejściowe toFileDataset
lub pandasDataFrame
, jeśli dane wejściowe toTabularDataset
.response
: metoda run() powinna zwracać bibliotekę pandasDataFrame
lub tablicę. W przypadku append_row output_action zwracane elementy są dołączane do wspólnego pliku wyjściowego. W przypadku summary_only zawartość elementów jest ignorowana. Dla wszystkich akcji wyjściowych każdy zwrócony element wyjściowy wskazuje jeden pomyślny przebieg elementu wejściowego w minisadowej danych wejściowych. Upewnij się, że w wyniku uruchomienia jest uwzględniona wystarczająca ilość danych, aby zamapować dane wejściowe w celu uruchomienia wyniku wyjściowego. Uruchom dane wyjściowe zostaną zapisane w pliku wyjściowym i nie ma gwarancji, że w danych wyjściowych będzie używany klucz, aby zamapować go na dane wejściowe.Uwaga
Jeden element wyjściowy jest oczekiwany dla jednego elementu wejściowego.
%%writefile digit_identification.py
# Snippets from a sample script.
# Refer to the accompanying digit_identification.py
# (https://github.com/Azure/MachineLearningNotebooks/tree/master/how-to-use-azureml/machine-learning-pipelines/parallel-run)
# for the implementation script.
import os
import numpy as np
import tensorflow as tf
from PIL import Image
from azureml.core import Model
def init():
global g_tf_sess
# Pull down the model from the workspace
model_path = Model.get_model_path("mnist")
# Construct a graph to execute
tf.reset_default_graph()
saver = tf.train.import_meta_graph(os.path.join(model_path, 'mnist-tf.model.meta'))
g_tf_sess = tf.Session()
saver.restore(g_tf_sess, os.path.join(model_path, 'mnist-tf.model'))
def run(mini_batch):
print(f'run method start: {__file__}, run({mini_batch})')
resultList = []
in_tensor = g_tf_sess.graph.get_tensor_by_name("network/X:0")
output = g_tf_sess.graph.get_tensor_by_name("network/output/MatMul:0")
for image in mini_batch:
# Prepare each image
data = Image.open(image)
np_im = np.array(data).reshape((1, 784))
# Perform inference
inference_result = output.eval(feed_dict={in_tensor: np_im}, session=g_tf_sess)
# Find the best probability, and add it to the result list
best_result = np.argmax(inference_result)
resultList.append("{}: {}".format(os.path.basename(image), best_result))
return resultList
Jeśli masz inny plik lub folder w tym samym katalogu co skrypt wnioskowania, możesz odwoływać się do niego, wyszukując bieżący katalog roboczy. Jeśli chcesz zaimportować pakiety, możesz również dołączyć folder pakietu do folderu sys.path
.
script_dir = os.path.realpath(os.path.join(__file__, '..',))
file_path = os.path.join(script_dir, "<file_name>")
packages_dir = os.path.join(file_path, '<your_package_folder>')
if packages_dir not in sys.path:
sys.path.append(packages_dir)
from <your_package> import <your_class>
Parametry dla parametrów ParallelRunConfig
ParallelRunConfig
jest główną konfiguracją na ParallelRunStep
przykład w potoku usługi Azure Machine Learning. Służy do zawijania skryptu i konfigurowania niezbędnych parametrów, w tym wszystkich następujących wpisów:
entry_script
: Skrypt użytkownika jako lokalna ścieżka pliku, która będzie uruchamiana równolegle w wielu węzłach. Jeślisource_directory
jest obecny, użyj ścieżki względnej. W przeciwnym razie użyj dowolnej ścieżki dostępnej na maszynie.mini_batch_size
: rozmiar minisadowej partii przekazanej do pojedynczegorun()
wywołania. (opcjonalnie; wartość domyślna to10
pliki dlaFileDataset
i1MB
dla .TabularDataset
- W przypadku
FileDataset
parametru jest to liczba plików o minimalnej wartości1
. Można połączyć wiele plików w jedną minisadę. - W przypadku
TabularDataset
elementu jest to rozmiar danych. Przykładowe wartości to1024
,1024KB
,10MB
i1GB
. Zalecana wartość to1MB
. Mini-batch zTabularDataset
nigdy nie przekroczy granic plików. Jeśli na przykład masz .csv plików o różnych rozmiarach, najmniejszy plik to 100 KB, a największy to 10 MB. Jeśli ustawisz wartośćmini_batch_size = 1MB
, pliki o rozmiarze mniejszym niż 1 MB będą traktowane jako jedna minisadowa. Pliki o rozmiarze większym niż 1 MB zostaną podzielone na wiele minisadów.Uwaga
Nie można partycjonować zestawów danych tabelarycznych opartych na języku SQL. Tabelaryczne zestawy danych z pojedynczego pliku parquet i grupy pojedynczych wierszy nie mogą być partycjonowane.
- W przypadku
error_threshold
: liczba niepowodzeń rekordów dlaTabularDataset
błędów i plików,FileDataset
które należy zignorować podczas przetwarzania. Jeśli liczba błędów dla całego danych wejściowych przekroczy tę wartość, zadanie zostanie przerwane. Próg błędu dotyczy całego wejścia, a nie pojedynczej minisadowej wysłanejrun()
do metody . Zakres to[-1, int.max]
. Część-1
wskazuje na ignorowanie wszystkich błędów podczas przetwarzania.output_action
: Jedna z następujących wartości wskazuje sposób organizowania danych wyjściowych:summary_only
: skrypt użytkownika będzie przechowywać dane wyjściowe.ParallelRunStep
Użyje danych wyjściowych tylko dla obliczenia progu błędu.append_row
: Dla wszystkich danych wejściowych w folderze wyjściowym zostanie utworzony tylko jeden plik, aby dołączyć wszystkie dane wyjściowe oddzielone wierszem.
append_row_file_name
: Aby dostosować nazwę pliku wyjściowego dla append_row output_action (opcjonalnie; wartość domyślna toparallel_run_step.txt
).source_directory
: ścieżki do folderów, które zawierają wszystkie pliki do wykonania w obiekcie docelowym obliczeniowym (opcjonalnie).compute_target
: Obsługiwana jest tylkoAmlCompute
wartość .node_count
: liczba węzłów obliczeniowych, które mają być używane do uruchamiania skryptu użytkownika.process_count_per_node
: liczba procesów roboczych na węzeł do równoległego uruchamiania skryptu wejściowego. W przypadku maszyny z procesorem GPU wartość domyślna to 1. W przypadku maszyny procesora CPU wartość domyślna to liczba rdzeni na węzeł. Proces roboczy będzie wywoływanyrun()
wielokrotnie, przekazując minisadową partię. Łączna liczba procesów roboczych w zadaniu toprocess_count_per_node * node_count
, która decyduje o maksymalnej liczbie wykonywanychrun()
równolegle.environment
: definicja środowiska języka Python. Można ją skonfigurować tak, aby korzystała z istniejącego środowiska języka Python lub skonfigurować środowisko tymczasowe. Definicja jest również odpowiedzialna za ustawienie wymaganych zależności aplikacji (opcjonalnie).logging_level
: Szczegółowość dziennika. Wartości w coraz większej szczegółowości to:WARNING
,INFO
iDEBUG
. (opcjonalnie; wartość domyślna toINFO
)run_invocation_timeout
run()
: limit czasu wywołania metody w sekundach. (opcjonalnie; wartość domyślna to60
)run_max_try
: Maksymalna liczbarun()
prób dla minisadowej partii. Wartość Arun()
kończy się niepowodzeniem, jeśli zgłaszany jest wyjątek lub po osiągnięciu niczego nie jest zwracanyrun_invocation_timeout
(opcjonalnie; wartość domyślna to3
).
Można określić mini_batch_size
, , node_count
, process_count_per_node
logging_level
, run_invocation_timeout
, i run_max_try
jako PipelineParameter
, aby po ponownym wysłaniu uruchomienia potoku można dostosować wartości parametrów. W tym przykładzie użyjesz elementu PipelineParameter
mini_batch_size
i Process_count_per_node
zmienisz te wartości podczas ponownego ponownego uruchomienia.
Widoczność urządzeń CUDA
W przypadku obiektów obliczeniowych wyposażonych w procesory GPU zmienna CUDA_VISIBLE_DEVICES
środowiskowa zostanie ustawiona w procesach roboczych. W aplikacji AmlCompute można znaleźć łączną liczbę urządzeń z procesorem GPU w zmiennej środowiskowej AZ_BATCHAI_GPU_COUNT_FOUND
, która jest ustawiana automatycznie. Jeśli chcesz, aby każdy proces roboczy miał dedykowany procesor GPU, ustaw process_count_per_node
wartość równą liczbie urządzeń z procesorem GPU na maszynie. Każdy proces roboczy przypisze unikatowy indeks do CUDA_VISIBLE_DEVICES
elementu . Jeśli proces roboczy zostanie zatrzymany z jakiegokolwiek powodu, następny uruchomiony proces roboczy użyje opublikowanego indeksu procesora GPU.
Jeśli łączna liczba urządzeń z procesorem GPU jest mniejsza niż process_count_per_node
, procesy robocze zostaną przypisane do indeksu procesora GPU do momentu użycia wszystkich.
Biorąc pod uwagę łączną liczbę urządzeń z procesorem GPU 2, a process_count_per_node = 4
na przykład proces 0 i proces 1 będą miały indeks 0 i 1. Proces 2 i 3 nie będzie miał zmiennej środowiskowej. W przypadku biblioteki używającej tej zmiennej środowiskowej do przypisania procesora GPU proces 2 i 3 nie będzie miał procesorów GPU i nie będzie próbował uzyskać urządzeń z procesorem GPU. Jeśli proces 0 zostanie zatrzymany, zostanie wydany indeks procesora GPU 0. Następny proces, który jest procesem 4, będzie miał przypisany indeks procesora GPU 0.
Aby uzyskać więcej informacji, zobacz CUDA Pro Tip: Control GPU Visibility with CUDA_VISIBLE_DEVICES (Porada CUDA Pro: kontrola widoczności procesora GPU za pomocą CUDA_VISIBLE_DEVICES).
Parametry służące do tworzenia elementu ParallelRunStep
Utwórz element ParallelRunStep przy użyciu skryptu, konfiguracji środowiska i parametrów. Określ docelowy obiekt obliczeniowy, który został już dołączony do obszaru roboczego jako element docelowy wykonywania dla skryptu wnioskowania. Użyj ParallelRunStep
polecenia , aby utworzyć krok potoku wnioskowania wsadowego, który przyjmuje wszystkie następujące parametry:
name
: nazwa kroku z następującymi ograniczeniami nazewnictwa: unikatowe, 3–32 znaki i wyrażenie regularne ^[a-z]([-a-z0-9]*[a-z0-9])?$.parallel_run_config
ParallelRunConfig
: obiekt, zgodnie z definicją wcześniej.inputs
: co najmniej jeden zestaw danych usługi Azure Machine Learning do partycjonowania na potrzeby przetwarzania równoległego.side_inputs
: Co najmniej jedno dane referencyjne lub zestawy danych używane jako dane wejściowe po stronie bez konieczności partycjonowania.output
OutputFileDatasetConfig
: obiekt reprezentujący ścieżkę katalogu, w której będą przechowywane dane wyjściowe.arguments
: lista argumentów przekazanych do skryptu użytkownika. Użyj unknown_args, aby pobrać je w skrypcie wpisu (opcjonalnie).allow_reuse
: czy krok powinien ponownie używać poprzednich wyników podczas uruchamiania z tymi samymi ustawieniami/danymi wejściowymi. Jeśli ten parametr toFalse
, nowy przebieg będzie zawsze generowany dla tego kroku podczas wykonywania potoku. (opcjonalnie; wartość domyślna toTrue
.)
from azureml.pipeline.steps import ParallelRunStep
parallelrun_step = ParallelRunStep(
name="predict-digits-mnist",
parallel_run_config=parallel_run_config,
inputs=[input_mnist_ds_consumption],
output=output_dir,
allow_reuse=True
)
Debugowanie skryptów z kontekstu zdalnego
Przejście z debugowania skryptu oceniania lokalnie do debugowania skryptu oceniania w rzeczywistym potoku może być trudnym skokiem. Aby uzyskać informacje na temat znajdowania dzienników w portalu, zobacz sekcję Potoki uczenia maszynowego na temat debugowania skryptów z kontekstu zdalnego. Informacje w tej sekcji dotyczą również elementu ParallelRunStep.
Na przykład plik 70_driver_log.txt
dziennika zawiera informacje z kontrolera, który uruchamia kod ParallelRunStep.
Ze względu na rozproszony charakter zadań ParallelRunStep istnieją dzienniki z kilku różnych źródeł. Tworzone są jednak dwa skonsolidowane pliki, które zapewniają ogólne informacje:
~/logs/job_progress_overview.txt
: Ten plik zawiera ogólne informacje o liczbie minisadów (znanych również jako zadania) utworzonych do tej pory i liczbie minisadów przetworzonych do tej pory. Na tym końcu zostanie wyświetlony wynik zadania. Jeśli zadanie nie powiodło się, zostanie wyświetlony komunikat o błędzie i gdzie rozpocząć rozwiązywanie problemów.~/logs/sys/master_role.txt
: Ten plik udostępnia główny węzeł (znany również jako koordynator) widok uruchomionego zadania. Obejmuje tworzenie zadań, monitorowanie postępu, wynik uruchomienia.
Dzienniki wygenerowane na podstawie skryptu wpisu przy użyciu pomocnika Języka EntryScript i instrukcji drukowania będą znajdować się w następujących plikach:
~/logs/user/entry_script_log/<node_id>/<process_name>.log.txt
: Te pliki są dziennikami zapisanymi z entry_script przy użyciu pomocnika Języka EntryScript.~/logs/user/stdout/<node_id>/<process_name>.stdout.txt
: Te pliki to dzienniki ze stdout (na przykład instrukcja print) entry_script.~/logs/user/stderr/<node_id>/<process_name>.stderr.txt
: Te pliki są dziennikami ze stderr entry_script.
W celu zwięzłego zrozumienia błędów w skrycie istnieją następujące usterki:
~/logs/user/error.txt
: ten plik spróbuje podsumować błędy w skrycie.
Aby uzyskać więcej informacji na temat błędów w skryscie, istnieją następujące informacje:
~/logs/user/error/
: zawiera pełne ślady stosu wyjątków zgłaszanych podczas ładowania i uruchamiania skryptu wpisu.
Jeśli potrzebujesz pełnej wiedzy na temat wykonywania skryptu oceny dla każdego węzła, zapoznaj się z poszczególnymi dziennikami procesów dla każdego węzła. Dzienniki procesów można znaleźć w folderze sys/node
pogrupowane według węzłów roboczych:
~/logs/sys/node/<node_id>/<process_name>.txt
: Ten plik zawiera szczegółowe informacje o każdej minisadowej partii, ponieważ jest on pobierany lub ukończony przez proces roboczy. Dla każdej minisadowej ten plik zawiera następujące elementy:- Adres IP i identyfikator PID procesu roboczego.
- Całkowita liczba elementów, liczba przetworzonych pomyślnie przetworzonych elementów i liczba elementów zakończonych niepowodzeniem.
- Czas rozpoczęcia, czas trwania, czas przetwarzania i czas wykonywania.
Możesz również wyświetlić wyniki okresowych kontroli użycia zasobów dla każdego węzła. Pliki dziennika i pliki instalacyjne znajdują się w tym folderze:
~/logs/perf
: ustaw--resource_monitor_interval
, aby zmienić interwał sprawdzania w sekundach. Domyślny interwał to600
, czyli około 10 minut. Aby zatrzymać monitorowanie, ustaw wartość na0
. Każdy<node_id>
folder zawiera:os/
: informacje o wszystkich uruchomionych procesach w węźle. Jedno sprawdzenie uruchamia polecenie systemu operacyjnego i zapisuje wynik w pliku. W systemie Linux polecenie tops
. W systemie Windows użyj poleceniatasklist
.%Y%m%d%H
: nazwa podfolderu to godzina.processes_%M
: plik kończy się minutą czasu sprawdzania.
node_disk_usage.csv
: Szczegółowe użycie dysku węzła.node_resource_usage.csv
: Omówienie użycia zasobów węzła.processes_resource_usage.csv
: Omówienie użycia zasobów dla każdego procesu.
Jak mogę zalogować się ze skryptu użytkownika z kontekstu zdalnego?
ParallelRunStep może uruchamiać wiele procesów w jednym węźle na podstawie process_count_per_node. Aby zorganizować dzienniki z każdego procesu w węźle i połączyć instrukcję drukowania i dziennika, zalecamy użycie rejestratora ParallelRunStep, jak pokazano poniżej. Dziennik jest pobierany z języka EntryScript i sprawia, że dzienniki są wyświetlane w folderze logs/user w portalu.
Przykładowy skrypt wpisu przy użyciu rejestratora:
from azureml_user.parallel_run import EntryScript
def init():
"""Init once in a worker process."""
entry_script = EntryScript()
logger = entry_script.logger
logger.info("This will show up in files under logs/user on the Azure portal.")
def run(mini_batch):
"""Call once for a mini batch. Accept and return the list back."""
# This class is in singleton pattern and will return same instance as the one in init()
entry_script = EntryScript()
logger = entry_script.logger
logger.info(f"{__file__}: {mini_batch}.")
...
return mini_batch
Gdzie jest wyświetlany komunikat z ujścia języka Python logging
?
ParallelRunStep ustawia procedurę obsługi na głównym rejestratorze, który powoduje ujście komunikatu na logs/user/stdout/<node_id>/processNNN.stdout.txt
wartość .
logging
wartość domyślna to INFO
poziom. Domyślnie poniższe poziomy INFO
nie będą wyświetlane, takie jak DEBUG
.
Jak mogę zapisać plik, aby był wyświetlany w portalu?
Pliki w logs
folderze zostaną przekazane i wyświetlone w portalu.
Możesz pobrać folder logs/user/entry_script_log/<node_id>
podobny do poniższego i utworzyć ścieżkę pliku do zapisu:
from pathlib import Path
from azureml_user.parallel_run import EntryScript
def init():
"""Init once in a worker process."""
entry_script = EntryScript()
log_dir = entry_script.log_dir
log_dir = Path(entry_script.log_dir) # logs/user/entry_script_log/<node_id>/.
log_dir.mkdir(parents=True, exist_ok=True) # Create the folder if not existing.
proc_name = entry_script.agent_name # The process name in pattern "processNNN".
fil_path = log_dir / f"{proc_name}_<file_name>" # Avoid conflicting among worker processes with proc_name.
Jak obsługiwać logowanie w nowych procesach?
Możesz zduplikować nowe procesy w skrypicie wpisu za pomocą modułu, połączyć się z potokami subprocess
danych wejściowych/wyjściowych/błędów i uzyskać kody powrotne.
Zalecaną metodą jest użycie run()
funkcji z capture_output=True
programem . Błędy będą wyświetlane w pliku logs/user/error/<node_id>/<process_name>.txt
.
Jeśli chcesz użyć Popen()
polecenia , należy przekierować plik stdout/stderr do plików, takich jak:
from pathlib import Path
from subprocess import Popen
from azureml_user.parallel_run import EntryScript
def init():
"""Show how to redirect stdout/stderr to files in logs/user/entry_script_log/<node_id>/."""
entry_script = EntryScript()
proc_name = entry_script.agent_name # The process name in pattern "processNNN".
log_dir = Path(entry_script.log_dir) # logs/user/entry_script_log/<node_id>/.
log_dir.mkdir(parents=True, exist_ok=True) # Create the folder if not existing.
stdout_file = str(log_dir / f"{proc_name}_demo_stdout.txt")
stderr_file = str(log_dir / f"{proc_name}_demo_stderr.txt")
proc = Popen(
["...")],
stdout=open(stdout_file, "w"),
stderr=open(stderr_file, "w"),
# ...
)
Uwaga
Proces roboczy uruchamia kod "system" i kod skryptu wpisu w tym samym procesie.
Jeśli nie stdout
zostanie określony lub stderr
określony, podproces utworzony za pomocą Popen()
skryptu wpisu odziedziczy ustawienie procesu roboczego.
stdout
będzie zapisywać do i logs/sys/node/<node_id>/processNNN.stdout.txt
stderr
na logs/sys/node/<node_id>/processNNN.stderr.txt
.
Jak mogę zapisać plik w katalogu wyjściowym, a następnie wyświetlić go w portalu?
Katalog wyjściowy można pobrać z EntryScript
klasy i zapisać w nim. Aby wyświetlić zapisane pliki, w widoku Przebiegu kroku w portalu usługi Azure Machine Learning wybierz kartę Dane wyjściowe i dzienniki . Wybierz link Dane wyjściowe , a następnie wykonaj kroki opisane w oknie dialogowym.
Użyj EntryScript
w skryscie wpisu, tak jak w tym przykładzie:
from pathlib import Path
from azureml_user.parallel_run import EntryScript
def run(mini_batch):
output_dir = Path(entry_script.output_dir)
(Path(output_dir) / res1).write...
(Path(output_dir) / res2).write...
Jak przekazać dane wejściowe po stronie, takie jak plik lub pliki zawierające tabelę odnośników, do wszystkich moich procesów roboczych?
Użytkownik może przekazać dane referencyjne do skryptu przy użyciu parametru side_inputs Parametru ParalleRunStep. Wszystkie zestawy danych podane jako side_inputs zostaną zainstalowane w każdym węźle roboczym. Użytkownik może uzyskać lokalizację instalacji, przekazując argument.
Skonstruuj zestaw danych zawierający dane referencyjne, określ lokalną ścieżkę instalacji i zarejestruj go w obszarze roboczym. Przekaż go do side_inputs
parametru .ParallelRunStep
Ponadto możesz dodać swoją ścieżkę w arguments
sekcji, aby łatwo uzyskać dostęp do jej zainstalowanej ścieżki.
Uwaga
Użyj zestawów FileDataset tylko dla side_inputs.
local_path = "/tmp/{}".format(str(uuid.uuid4()))
label_config = label_ds.as_named_input("labels_input").as_mount(local_path)
batch_score_step = ParallelRunStep(
name=parallel_step_name,
inputs=[input_images.as_named_input("input_images")],
output=output_dir,
arguments=["--labels_dir", label_config],
side_inputs=[label_config],
parallel_run_config=parallel_run_config,
)
Następnie możesz uzyskać do niego dostęp w skrypcie wnioskowania (na przykład w metodzie init() w następujący sposób:
parser = argparse.ArgumentParser()
parser.add_argument('--labels_dir', dest="labels_dir", required=True)
args, _ = parser.parse_known_args()
labels_path = args.labels_dir
Jak używać wejściowych zestawów danych z uwierzytelnianiem jednostki usługi?
Użytkownik może przekazywać wejściowe zestawy danych z uwierzytelnianiem jednostki usługi używanym w obszarze roboczym. Użycie takiego zestawu danych w elemecie ParallelRunStep wymaga zarejestrowania zestawu danych w celu skonstruowania konfiguracji ParallelRunStep.
service_principal = ServicePrincipalAuthentication(
tenant_id="***",
service_principal_id="***",
service_principal_password="***")
ws = Workspace(
subscription_id="***",
resource_group="***",
workspace_name="***",
auth=service_principal
)
default_blob_store = ws.get_default_datastore() # or Datastore(ws, '***datastore-name***')
ds = Dataset.File.from_files(default_blob_store, '**path***')
registered_ds = ds.register(ws, '***dataset-name***', create_new_version=True)
Jak sprawdzić postęp i przeanalizować go
W tej sekcji o tym, jak sprawdzić postęp zadania ParallelRunStep i sprawdzić przyczynę nieoczekiwanego zachowania.
Jak sprawdzić postęp zadania?
Oprócz sprawdzenia ogólnego stanu kroku, liczba zaplanowanych/przetworzonych minisadów i postęp generowania danych wyjściowych można wyświetlić w pliku ~/logs/job_progress_overview.<timestamp>.txt
. Plik jest obracany codziennie, możesz sprawdzić ten z największą sygnaturą czasowa, aby uzyskać najnowsze informacje.
Co należy sprawdzić, czy na jakiś czas nie ma postępu?
Możesz przejść do ~/logs/sys/errror
sekcji , aby sprawdzić, czy istnieje jakikolwiek wyjątek. Jeśli nie ma żadnego, prawdopodobnie skrypt wprowadzania trwa długo, możesz wydrukować informacje o postępie w kodzie, aby zlokalizować część czasochłonną lub dodać "--profiling_module", "cProfile"
do ParallelRunStep
arguments
elementu w celu wygenerowania pliku profilu o nazwie w <process_name>.profile
folderze~/logs/sys/node/<node_id>
.
Kiedy zadanie zostanie zatrzymane?
jeśli nie zostanie anulowane, zadanie zostanie zatrzymane ze stanem:
- Zakończone. Jeśli wszystkie minisady zostały przetworzone, a dane wyjściowe zostały wygenerowane dla
append_row
trybu. - Niepowodzenie. Jeśli
error_threshold
wartość inParameters for ParallelRunConfig
jest przekroczona lub wystąpił błąd systemowy podczas zadania.
Gdzie znaleźć główną przyczynę awarii?
Aby znaleźć przyczynę i szczegółowy dziennik błędów, możesz skorzystać z potencjalnych klientów ~logs/job_result.txt
.
Czy awaria węzła wpłynie na wynik zadania?
Nie, jeśli istnieją inne dostępne węzły w wyznaczonym klastrze obliczeniowym. Orkiestrator uruchomi nowy węzeł jako zamiennik, a element ParallelRunStep jest odporny na taką operację.
Co się stanie, jeśli init
funkcja w skry skrycie wejściowym zakończy się niepowodzeniem?
ParallelRunStep ma mechanizm ponawiania próby przez określony czas, aby dać szansę na odzyskanie z powodu przejściowych problemów bez opóźnienia niepowodzenia zadania przez zbyt długi czas, mechanizm jest następujący:
- Jeśli po uruchomieniu
init
węzła na wszystkich agentach kończy się niepowodzeniem, przestaniemy próbować po3 * process_count_per_node
awariach. - Jeśli po uruchomieniu
init
zadania na wszystkich agentach wszystkich węzłów kończy się niepowodzeniem, przestaniemy próbować, jeśli zadanie będzie działać dłużej niż 2 minuty i wystąpią2 * node_count * process_count_per_node
błędy. - Jeśli wszyscy agenci są zablokowani
init
przez więcej niż3 * run_invocation_timeout + 30
kilka sekund, zadanie zakończy się niepowodzeniem z powodu zbyt długiego postępu.
Co się stanie w outOfMemory? Jak sprawdzić przyczynę?
Parametr ParallelRunStep ustawi bieżącą próbę przetworzenia stanu niepowodzenia mini-batch i spróbuje ponownie uruchomić proces, który zakończył się niepowodzeniem. Aby znaleźć proces zużywania pamięci, możesz sprawdzić ~logs/perf/<node_id>
.
Dlaczego mam wiele plików processNNN?
ParallelRunStep uruchomi nowe procesy robocze w zamian tych, które zakończą się nieprawidłowo, a każdy proces wygeneruje processNNN
plik jako dziennik. Jeśli jednak proces nie powiódł się z powodu wyjątku podczas init
działania skryptu użytkownika i że błąd jest powtarzany w sposób ciągły, 3 * process_count_per_node
nie zostanie uruchomiony nowy proces roboczy.
Następne kroki
Zobacz te notesy jupyter demonstrujące potoki usługi Azure Machine Learning
Zobacz dokumentację zestawu SDK, aby uzyskać pomoc dotyczącą pakietu azureml-pipeline-steps .
Wyświetl dokumentację referencyjną dla klasy ParallelRunConfig i dokumentacji dla klasy ParallelRunStep.
Postępuj zgodnie z zaawansowanym samouczkiem dotyczącym używania potoków z elementem ParallelRunStep. W samouczku pokazano, jak przekazać inny plik jako dane wejściowe po stronie.