Mit SageMaker Profiler einen Trainingsauftrag vorbereiten und ausführen
Die Einrichtung zur Ausführung eines Trainingsauftrags mit dem SageMaker Profiler besteht aus zwei Schritten: der Anpassung des Trainingsskripts und der Konfiguration des SageMaker-Startprogramms für Trainingsaufträge.
Themen
Schritt 1: Passen Sie Ihr Trainingsskript mithilfe der Python-Module von SageMaker Profiler an
Um mit der Erfassung von Kernelläufen auf GPUs zu beginnen, während der Trainingsauftrag ausgeführt wird, ändern Sie Ihr Trainingsskript mithilfe der Python-Module von SageMaker Profiler. Importieren Sie die Bibliothek und fügen Sie die Methoden start_profiling() und stop_profiling() hinzu, um den Anfang und das Ende der Profilerstellung zu definieren. Sie können Markierungen im Trainingsskript auch mit Hilfe optionaler benutzerdefinierter Anmerkungen hinzufügen, um die Hardwareaktivitäten während bestimmter Operationen in jedem Schritt zu visualisieren.
Beachten Sie, dass die Kommentatoren aus GPUs Operationen extrahieren. Für Profiling-Operationen in CPUs müssen Sie keine zusätzlichen Anmerkungen hinzufügen. Die CPU-Profilerstellung wird auch aktiviert, wenn Sie die Profilkonfiguration angeben. Dies werden Sie in Schritt 2: Erstellen eines Framework-Schätzers von SageMaker AI und aktivieren von SageMaker AI Profiler üben.
Anmerkung
Die Erstellung eines Profils für einen ganzen Trainingsauftrag ist nicht die effizienteste Form der Ressourcennutzung. Wir empfehlen, Profile mit höchstens 300 Schritten eines Trainingsauftrags zu erstellen.
Wichtig
Die Version von 14. Dezember 2023 beinhaltet eine bahnbrechende Änderung. Der Name des Python-Pakets von SageMaker Profiler wurde von smppy in smprof geändert. Dies ist in den Framework-Containern von SageMaker AI
Wenn Sie eine der früheren Versionen der Framework-Containervon SageMaker AIsmppy verfügbar. Wenn Sie sich nicht sicher sind, welche Version oder welchen Paketnamen Sie verwenden sollten, ersetzen Sie die Importanweisung des SageMaker-Profiler-Pakets durch den folgenden Codeausschnitt.
try: import smprof except ImportError: # backward-compatability for TF 2.11 and PT 1.13.1 images import smppy as smprof
Ansatz 1. Verwenden Sie den Kontext-Managersmprof.annotate, um vollständige Funktionen zu kommentieren
Mit dem smprof.annotate()-Kontextmanager können Sie ganze Funktionen umschließen. Dieser Wrapper wird empfohlen, wenn Sie ein Profil nach Funktionen statt nach Codezeilen erstellen möchten. Das folgende Beispielskript zeigt, wie der Kontext-Manager so implementiert wird, dass er bei jeder Iteration das Trainingsschleife und ganze Funktionen umschließt.
import smprof SMProf = smprof.SMProfiler.instance() config = smprof.Config() config.profiler = { "EnableCuda": "1", } SMProf.configure(config) SMProf.start_profiling() for epoch in range(args.epochs): if world_size > 1: sampler.set_epoch(epoch) tstart = time.perf_counter() for i, data in enumerate(trainloader, 0): with smprof.annotate("step_"+str(i)): inputs, labels = data inputs = inputs.to("cuda", non_blocking=True) labels = labels.to("cuda", non_blocking=True) optimizer.zero_grad() with smprof.annotate("Forward"): outputs = net(inputs) with smprof.annotate("Loss"): loss = criterion(outputs, labels) with smprof.annotate("Backward"): loss.backward() with smprof.annotate("Optimizer"): optimizer.step() SMProf.stop_profiling()
Ansatz 2. Kommentieren Sie mit smprof.annotation_begin() und smprof.annotation_end() bestimmte Codezeilen in Funktionen
Sie können auch Anmerkungen definieren, um bestimmte Codezeilen zu profilieren. Sie können den genauen Anfangs- und Endpunkt der Profilerstellung auf der Ebene einzelner Codezeilen festlegen, nicht nach Funktionen. Im folgenden Skript wird z. B. der step_annotator zu Beginn jeder Iteration definiert und endet am Ende der Iteration. In der Zwischenzeit werden für jede Operation weitere detaillierte Kommentatoren definiert, die die Zieloperationen während jeder Iteration umschließen.
import smprof SMProf = smprof.SMProfiler.instance() config = smprof.Config() config.profiler = { "EnableCuda": "1", } SMProf.configure(config) SMProf.start_profiling() for epoch in range(args.epochs): if world_size > 1: sampler.set_epoch(epoch) tstart = time.perf_counter() for i, data in enumerate(trainloader, 0): step_annotator = smprof.annotation_begin("step_" + str(i)) inputs, labels = data inputs = inputs.to("cuda", non_blocking=True) labels = labels.to("cuda", non_blocking=True) optimizer.zero_grad() forward_annotator = smprof.annotation_begin("Forward") outputs = net(inputs) smprof.annotation_end(forward_annotator) loss_annotator = smprof.annotation_begin("Loss") loss = criterion(outputs, labels) smprof.annotation_end(loss_annotator) backward_annotator = smprof.annotation_begin("Backward") loss.backward() smprof.annotation_end(backward_annotator) optimizer_annotator = smprof.annotation_begin("Optimizer") optimizer.step() smprof.annotation_end(optimizer_annotator) smprof.annotation_end(step_annotator) SMProf.stop_profiling()
Wenn Sie die Profiler-Initiierungsmodule kommentiert und eingerichtet haben, speichern Sie das Skript, um es im folgenden Schritt 2 mit einem Startprogramm für SageMaker-Trainingsaufträge abzusenden. Der Beispiel-Launcher geht davon aus, dass das Trainingsskript train_with_profiler_demo.py heißt.
Schritt 2: Erstellen eines Framework-Schätzers von SageMaker AI und aktivieren von SageMaker AI Profiler
Die folgenden Schritte zeigen, wie Sie einen Framework-Schätzer von SageMaker AI für das Training mit dem SageMaker Python SDK vorbereiten.
-
Richten Sie mithilfe der Module
ProfilerConfigundProfilerwie folgt einprofiler_configObjekt ein.from sagemaker import ProfilerConfig, Profiler profiler_config = ProfilerConfig( profile_params = Profiler(cpu_profiling_duration=3600) )Im Folgenden finden Sie die Beschreibung des
ProfilerModuls und seines Arguments.-
Profiler: Das Modul zur Aktivierung von SageMaker Profiler mit dem Trainingsauftrag.-
cpu_profiling_duration(int): Geben Sie die Dauer für die Profilerstellung auf CPUs in Sekunden an. Der Standardwert beträgt 3600 Sekunden.
-
-
-
Erstellen Sie mit dem obigen Schritt erstellten
profiler_config-Objekt einen Framework-Schätzer von SageMaker AI. Der folgende Code zeigt ein Beispiel für die Erstellung eines PyTorch-Schätzers. Wenn Sie einen TensorFlow-Schätzer erstellen möchten, importieren Sie stattdessensagemaker.tensorflow.TensorFlowund geben Sie eine der von SageMaker Profiler unterstützten TensorFlow-Versionen an. Weitere Informationen zu den unterstützten Frameworks und Instance-Typen finden Sie unter In SageMaker Profiler vorinstallierte Framework-Images von SageMaker AI.import sagemaker from sagemaker.pytorch import PyTorch estimator = PyTorch( framework_version="2.0.0", role=sagemaker.get_execution_role(), entry_point="train_with_profiler_demo.py", # your training job entry point source_dir=source_dir, # source directory for your training script output_path=output_path, base_job_name="sagemaker-profiler-demo", hyperparameters=hyperparameters, # if any instance_count=1, # Recommended to test with < 8 instance_type=ml.p4d.24xlarge, profiler_config=profiler_config) -
Starten Sie den Trainingsauftrag, indem Sie die Methode
fitausführen. Mitwait=Falsekönnen Sie die Protokolle der Trainingsaufträge stummschalten, so dass sie im Hintergrund laufen.estimator.fit(wait=False)
Während der Ausführung des Trainingsauftrags oder nach dessen Abschluss können Sie unter Öffnen Sie die SageMaker Profiler UI-Anwendung mit dem nächsten Thema fortfahren und damit beginnen, die gespeicherten Profile zu erkunden und zu visualisieren.
Wenn Sie direkt auf die im Amazon-S3-Bucket gespeicherten Profildaten zugreifen möchten, verwenden Sie das folgende Skript, um die S3-URI abzurufen.
import os # This is an ad-hoc function to get the S3 URI # to where the profile output data is saved def get_detailed_profiler_output_uri(estimator): config_name = None for processing in estimator.profiler_rule_configs: params = processing.get("RuleParameters", dict()) rule = config_name = params.get("rule_to_invoke", "") if rule == "DetailedProfilerProcessing": config_name = processing.get("RuleConfigurationName") break return os.path.join( estimator.output_path, estimator.latest_training_job.name, "rule-output", config_name, ) print( f"Profiler output S3 bucket: ", get_detailed_profiler_output_uri(estimator) )
(Optional) Installieren des Python-Pakets von SageMaker Profiler
Um SageMaker Profiler auf PyTorch- oder TensorFlow-Framework-Images zu verwenden, die nicht in In SageMaker Profiler vorinstallierte Framework-Images von SageMaker AI aufgeführt sind, oder auf Ihrem eigenen benutzerdefinierten Docker-Container für Trainings, können Sie SageMaker Profiler mithilfe eines der Binärdateien für das Python-Paket von SageMaker Profiler installieren.
Option 1: Installieren des SageMaker-Profiler-Pakets beim Starten eines Trainingsjobs
Wenn Sie SageMaker Profiler für Trainingsjobs mit PyTorch- oder TensorFlow-Images verwenden möchten, die nicht in In SageMaker Profiler vorinstallierte Framework-Images von SageMaker AI aufgeführt sind, erstellen Sie eine requirements.txt-Datei und suchen Sie sie unter dem Pfad, den Sie für den source_dir-Parameter des Framework-Schätzers von SageMaker AI in Schritt 2 angegeben haben. Weitere Informationen zum Einrichten einer requirements.txt-Datei im Allgemeinen finden Sie unter Verwenden von Bibliotheken von Drittanbieternrequirements.txt-Datei einen der S3-Bucket-Pfade zum Binärdateien für das Python-Paket von SageMaker Profiler hinzu.
# requirements.txt https://smppy.s3.amazonaws.com/tensorflow/cu112/smprof-0.3.332-cp39-cp39-linux_x86_64.whl
Option 2: Installieren des SageMaker-Profiler-Pakets in Ihren benutzerdefinierten Docker-Containern
Wenn Sie einen benutzerdefinierten Docker-Container für das Training verwenden, fügen Sie eines der Binärdateien für das Python-Paket von SageMaker Profiler zu Ihrer Dockerfile hinzu.
# Install the smprof package version compatible with your CUDA version RUN pip install https://smppy.s3.amazonaws.com/tensorflow/cu112/smprof-0.3.332-cp39-cp39-linux_x86_64.whl
Eine allgemeine Anleitung zum Ausführen eines benutzerdefinierten Docker-Containers für Trainings auf SageMaker AI finden Sie unter Anpassen Ihres eigenen Trainings-Containers.