Preparazione ed esecuzione di un job di addestramento con SageMaker Profiler
La configurazione per l’esecuzione di un job di addestramento con SageMaker Profiler prevede due fasi: adattamento dello script di addestramento e configurazione del programma di avvio del job di addestramento SageMaker.
Argomenti
Fase 1: adattamento dello script di addestramento tramite i moduli SageMaker Profiler Python
Per iniziare a registrare le esecuzioni del kernel sulle GPU mentre il job di addestramento è in esecuzione, modifica lo script di addestramento utilizzando i moduli SageMaker Profiler Python. Importa la libreria e aggiungi i metodi start_profiling() e stop_profiling() per definire l’inizio e la fine della profilazione. È inoltre possibile utilizzare annotazioni personalizzate opzionali per aggiungere evidenziatori nello script di addestramento per visualizzare le attività hardware durante particolari operazioni in ogni fase.
Nota che gli annotatori estraggono le operazioni dalle GPU. Per le operazioni di profilazione nelle CPU, non è necessario aggiungere ulteriori annotazioni. La profilazione della CPU viene attivata anche quando specifichi la configurazione di profilazione, con la quale ti eserciterai in Fase 2: creazione di uno strumento di valutazione del framework SageMaker AI e attivazione di SageMaker Profiler.
Nota
La profilazione di un intero job di addestramento non è l’uso più efficiente delle risorse. Consigliamo di profilare al massimo 300 fasi di un job di addestramento.
Importante
La versione delle 14 dicembre 2023 contiene una modifica sostanziale. Il nome del pacchetto Python di SageMaker Profiler viene modificato da smppy a smprof. Questo è effettivo nei container framework di SageMaker AI
Se utilizzi una delle versioni precedenti dei container framework di SageMaker AIsmppy. Se non hai la certezza di quale versione o nome del pacchetto utilizzare, sostituisci l’istruzione di importazione del pacchetto SageMaker Profiler con il seguente frammento di codice.
try: import smprof except ImportError: # backward-compatability for TF 2.11 and PT 1.13.1 images import smppy as smprof
Approccio 1. Utilizza il gestore di contesto smprof.annotate per annotare funzioni complete
Con il gestore di contesto smprof.annotate() puoi eseguire il wrapping di funzioni complete. Questo wrapper è consigliato se desideri creare profili per funzioni anziché per righe di codice. Lo script di esempio seguente mostra come implementare il gestore di contesto per eseguire il wrapping del ciclo di addestramento e delle funzioni complete in ogni iterazione.
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()
Approccio 2. Utilizza smprof.annotation_begin() e smprof.annotation_end() per annotare una riga di codice specifica nelle funzioni
Inoltre, puoi definire annotazioni per profilare righe di codice specifiche. È possibile impostare il punto di inizio e il punto di fine esatti della profilazione a livello di singole righe di codice, non in base alle funzioni. Ad esempio, nello script seguente, step_annotator viene definito all’inizio di ogni iterazione e termina alla fine dell’iterazione. Nel frattempo, vengono definiti altri annotatori dettagliati per ciascuna operazione, i quali eseguono il wrapping delle operazioni di destinazione durante ogni iterazione.
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()
Dopo aver annotato e configurato i moduli di avvio del profilatore, salva lo script da inviare utilizzando un programma di avvio dei processi di addestramento SageMaker nella successiva fase 2. L’utilità di avvio di esempio presuppone che lo script di addestramento sia denominato train_with_profiler_demo.py.
Fase 2: creazione di uno strumento di valutazione del framework SageMaker AI e attivazione di SageMaker Profiler
La procedura seguente mostra come preparare uno strumento di valutazione del framework SageMaker AI per l’addestramento utilizzando SageMaker Python SDK.
-
Configura un oggetto
profiler_configutilizzando i moduliProfilerConfigeProfilernel modo seguente.from sagemaker import ProfilerConfig, Profiler profiler_config = ProfilerConfig( profile_params = Profiler(cpu_profiling_duration=3600) )Di seguito è riportata la descrizione del modulo
Profilere il relativo argomento.-
Profiler: il modulo per attivare Profilatore SageMaker con il job di addestramento.-
cpu_profiling_duration(int): specifica la durata in secondi per la profilazione sulle CPU. L’impostazione predefinita è 3600 secondi.
-
-
-
Crea uno strumento di valutazione del framework SageMaker AI con l’oggetto
profiler_configcreato nella fase precedente. Il codice seguente mostra un esempio di creazione di uno strumento di valutazione PyTorch. Se desideri creare uno strumento di valutazione TensorFlow, importa invecesagemaker.tensorflow.TensorFlowe specifica una delle versioni di TensorFlow supportate da SageMaker Profiler. Per ulteriori informazioni sui framework e i tipi di istanza supportati, consulta Immagini del framework SageMaker AI preinstallate con SageMaker Profiler.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) -
Avvia il job di addestramento eseguendo il metodo
fit. Conwait=False, puoi silenziare i log dei job di addestramento e lasciarli funzionare in background.estimator.fit(wait=False)
Durante l’esecuzione del job di addestramento o dopo il completamento del job, puoi passare all’argomento successivo in Apertura dell’applicazione dell’interfaccia utente di SageMaker Profiler e iniziare a esplorare e visualizzare i profili salvati.
Se desideri accedere direttamente ai dati del profilo salvati nel bucket Amazon S3, utilizza lo script seguente per recuperare l’URI S3.
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) )
(Facoltativo) Installazione del pacchetto Python di SageMaker Profiler
Per utilizzare SageMaker Profiler su immagini del framework PyTorch o TensorFlow non elencate in Immagini del framework SageMaker AI preinstallate con SageMaker Profiler o sul proprio container Docker personalizzato per l’addestramento, puoi installare SageMaker Profiler utilizzando uno dei File binari del pacchetto Python di SageMaker Profiler.
Opzione 1: installazione del pacchetto SageMaker Profiler durante l’avvio di un job di addestramento
Se desideri utilizzare SageMaker Profiler per job di addestramento con immagini PyTorch o TensorFlow non incluse in Immagini del framework SageMaker AI preinstallate con SageMaker Profiler, crea un file requirements.txt e posizionalo nel percorso che specifichi nel parametro source_dir dello strumento di valutazione del framework SageMaker AI nella Fase 2. Per ulteriori informazioni sulla configurazione di un file requirements.txt in generale, consulta l’argomento relativo all’utilizzo di librerie di terze partirequirements.txt, aggiungi uno dei percorsi dei bucket S3 per il File binari del pacchetto Python di SageMaker Profiler.
# requirements.txt https://smppy.s3.amazonaws.com/tensorflow/cu112/smprof-0.3.332-cp39-cp39-linux_x86_64.whl
Opzione 2: installazione del pacchetto SageMaker Profiler nei container Docker personalizzati
Se utilizzi un container Docker personalizzato per l’addestramento, aggiungi uno dei File binari del pacchetto Python di SageMaker Profiler al tuo Dockerfile.
# 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
Per indicazioni sull’esecuzione di un container Docker personalizzato per l’addestramento su SageMaker AI in generale, consulta Adattamento del container di addestramento.