Parallele Problembehebung bei Modellen - Amazon SageMaker

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Parallele Problembehebung bei Modellen

Wenn Sie auf einen Fehler stoßen, können Sie anhand der folgenden Liste versuchen, Probleme mit Ihrem Trainingsjob zu beheben. Wenn das Problem weiterhin besteht, wenden Sie sich an den AWS Support.

Überlegungen zur Verwendung des SageMaker Debuggers mit der SageMaker Model Parallelism Library

SageMaker Der Debugger ist für die SageMaker Modellparallelitätsbibliothek nicht verfügbar. Der Debugger ist standardmäßig für alle - SageMaker TensorFlow und - PyTorch Trainingsaufträge aktiviert, und möglicherweise wird ein Fehler angezeigt, der wie folgt aussieht:

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

Um dieses Problem zu beheben, deaktivieren Sie den Debugger, indem Sie debugger_hook_config=False beim Erstellen eines Frameworks estimator übergeben, wie im folgenden Beispiel gezeigt.

bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

Speichern von Prüfpunkten

Beim Speichern von Checkpoints eines großen Modells in kann der folgende Fehler auftreten SageMaker:

InternalServerError: We encountered an internal error. Please try again

Dies kann durch eine SageMaker Einschränkung beim Hochladen des lokalen Checkpoints während des Trainings auf Amazon S3 verursacht werden. Um Checkpointing in zu deaktivieren SageMaker, verwenden Sie das folgende Beispiel, um die Checkpoints explizit hochzuladen.

Wenn der vorherige Fehler auftritt, verwenden Sie nicht checkpoint_s3_uri mit dem SageMaker estimator Aufruf. Beim Speichern von Checkpoints für größere Modelle empfehlen wir, Checkpoints in einem benutzerdefinierten Verzeichnis zu speichern und dieses an die Hilfsfunktion (als ein local_path Argument) zu übergeben.

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

Verwendung von Hilfsfunktionen:

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

Konvergenz mit modellparallelen und TensorFlow

Wenn Sie das Training mit SageMaker mehreren Knoten mit TensorFlow und der Modellparallelitätsbibliothek verwenden, konvergiert der Verlust möglicherweise nicht wie erwartet, da die Reihenfolge der Trainingseingabedateien auf jedem Knoten unterschiedlich sein kann. Dies kann dazu führen, dass unterschiedliche Ränge in derselben Modellparallelgruppe mit unterschiedlichen Eingabedateien arbeiten, was zu Inkonsistenzen führen kann. Um dies zu verhindern, stellen Sie sicher, dass die Eingabedateien in allen Rängen gleich angeordnet sind, bevor sie in TensorFlow Datensätze konvertiert werden. Eine Möglichkeit, dies zu erreichen, besteht darin, die Namen der Eingabedateien im Trainingsskript zu sortieren.

Blockieren oder Abstürzen von verteilten Trainingsaufträgen

Falls es bei Ihrem Trainingsjob zu Problemen kommt, die zum Stillstand kommen, abstürzen oder nicht reagieren, lesen Sie sich die folgenden Hinweise zur Problembehebung durch, um herauszufinden, was die Ursache des Problems ist. Wenn Sie weitere Unterstützung benötigen, wenden Sie sich über den AWS Support an das SageMaker verteilte Schulungsteam.

  • Wenn Sie feststellen, dass ein verteilter Trainingsjob beim NCCL-Initialisierungsschritt ins Stocken gerät, sollten Sie Folgendes beachten:

    • Wenn Sie eine der EFA-fähigen Instances ( ml.p4d oder ml.p3dn Instances) mit einer benutzerdefinierten VPC und ihrem Subnetz verwenden, stellen Sie sicher, dass die verwendete Sicherheitsgruppe eingehende und ausgehende Verbindungen für alle Ports zu und von derselben SG hat. In der Regel benötigen Sie außerdem ausgehende Verbindungen zu einer beliebigen IP als separate Regel (für den Internetzugang). Anweisungen zum Hinzufügen von Regeln für eingehenden und ausgehenden Datenverkehr für die EFA-Kommunikation finden Sie unter SageMaker Verteilte Trainingsaufträge werden während der Initialisierung zum Stillstand gebracht.

  • Wenn Sie feststellen, dass ein verteilter Trainingsjob beim Checkpoint des vollständigen Modells ins Stocken gerät, kann das daran liegen, dass der state_dict() Aufruf des Modells oder Optimierers nicht auf allen Rängen mit rdp_rank()==0 (bei Verwendung von Tensorparallelität) oder dp_rank()==0 (bei ausschließlicher Verwendung von Pipeline-Parallelität) erfolgt ist. Diese Ränge müssen miteinander kommunizieren, um den Checkpoint zu erstellen, der gespeichert werden soll. Ähnliche Probleme können auch beim Checkpointing des partiellen Optimierers auftreten, wenn shard_optimizer_state aktiviert ist.

    Weitere Informationen zum Checkpointing eines Modells mit Modellparallelität finden Sie unter Allgemeine Anweisungen zum Speichern und Laden und Checkpointing eines verteilten PyTorch Modells (für die SageMaker Modellparallelitätsbibliothek zwischen v1.6.0 und v1.9.0).

  • Wenn der Trainingsjob mit dem Fehler CUDA Out of Memory abstürzt, bedeutet dies, dass die verteilte Trainingskonfiguration an das Modell auf dem GPU-Cluster angepasst werden muss. Weitere Informationen und bewährte Verfahren finden Sie unter Die richtige Konfiguration für ein bestimmtes Modell einrichten.

  • Wenn der Trainingsjob mit einem nicht behebbaren ECC-Fehler abstürzt, bedeutet dies, dass eine der GPUs im Cluster defekt ist. Wenn du technischen Support benötigst, teile den Job-ARN mit dem AWS Team und starte deinen Trainingsjob, wenn möglich, von einem Checkpoint aus neu.

  • In seltenen Fällen kann es vorkommen, dass eine Jobkonfiguration, die zuvor funktioniert hat, aber nahe an den Grenzen des GPU-Speichers liegt, später mit einem anderen Cluster aufgrund eines CUDA-Fehlers Nicht genügend Arbeitsspeicher fehlschlägt. Dies könnte daran liegen, dass einige GPUs aufgrund von ECC-Fehlern über weniger verfügbaren Arbeitsspeicher als gewöhnlich verfügen.

  • Ein Netzwerk-Timeout-Absturz kann auftreten, wenn ein Auftrag mit mehreren Knoten ausgeführt wird, der nicht alle GPUs im Knoten verwendet. Um dieses Problem zu umgehen, verwenden Sie alle GPUs auf dem Knoten, indem Sie sicherstellen, dass der processes_per_host Parameter auf die Anzahl der GPUs in jeder Instanz gesetzt ist. Zum Beispiel ist dies processes_per_host=8 für ml.p3.16xlarge, ml.p3dn.24xlarge und ml.p4d.24xlarge-Instanzen.

  • Wenn Sie feststellen, dass Ihr Trainingsauftrag während der Phase des Datendownloads sehr lange dauert, stellen Sie sicher, dass der Amazon S3-Pfad, den Sie checkpoint_s3_uri für die SageMaker Estimator Klasse angegeben haben, für den aktuellen Trainingsauftrag eindeutig ist. Wenn dieser Pfad für mehrere Trainingsjobs, die gleichzeitig ausgeführt werden, wiederverwendet wird, werden all diese Checkpoints auf denselben Amazon S3-Pfad hoch- und heruntergeladen, was die Ladezeit der Checkpoints erheblich verlängern kann.

  • Verwenden Sie FSx for Lustre, wenn Sie mit großen Datenmengen und Modellen arbeiten.

    • Wenn Ihr Datensatz groß ist und das Abrufen lange dauert, empfehlen wir, Ihren Datensatz in FSx für Lustre aufzubewahren.

    • Wenn Trainingsmodelle mehr als 10 Milliarden Parameter enthalten, empfehlen wir die Verwendung von FSx for Lustre für das Checkpointing.

    • Nachdem Sie ein Dateisystem erstellt haben, warten Sie, bis der Status verfügbar ist, bevor Sie einen Trainingsjob mit diesem Dateisystem starten.

Empfangen eines NCCL-Fehlers für einen PyTorch Schulungsauftrag

Wenn Sie auf den folgenden Fehler gestoßen sind, liegt dies möglicherweise daran, dass bei einem Prozess nicht mehr genügend GPU-Speicher zur Verfügung steht.

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

Sie können dieses Problem beheben, indem Sie die Batchgröße reduzieren oderactive_microbatches. Wenn die auto Partitionierung nicht zu einer ausgewogenen Partitionierung führt, müssen Sie möglicherweise eine manuelle Partitionierung in Betracht ziehen. Weitere Informationen finden Sie unter Pipeline-Parallelität zwischen Knoten.

Empfangen RecursionError eines PyTorch Trainingsauftrags

Die Bibliothek unterstützt das Aufrufen super.forward() innerhalb des Forward-Aufrufs eines Moduls nicht. Wenn Sie super.forward() verwenden, erhalten Sie möglicherweise die folgende Fehlermeldung.

RecursionError: maximum recursion depth exceeded

Um den Fehler zu beheben, sollten Sie nicht super.forward() anrufen, sondern super()._orig_forward().