Adattare uno script di addestramento TensorFlow
Per iniziare a raccogliere i tensori di output del modello ed eseguirne il debug per individuare problemi di addestramento, apporta le seguenti modifiche allo script di addestramento TensorFlow.
Creare un hook per i job di addestramento all’interno di SageMaker AI
import smdebug.tensorflow as smd hook=smd.get_hook(hook_type="keras", create_if_not_exists=True)
Questo crea un problema quando si avvia un processo di addestramento su SageMaker. All’avvio di un job di addestramento in Avvio dei job di addestramento con Debugger utilizzando SageMaker Python SDK con uno qualsiasi degli oggetti DebuggerHookConfig, TensorBoardConfig o Rules dello strumento di stima, SageMaker AI aggiunge un file di configurazione JSON all’istanza di addestramento raccolta dal metodo smd.get_hook. Nota che se non includi nessuna delle API di configurazione nel tuo strumento di valutazione, non ci sarà alcun file di configurazione che l'hook possa trovare e la funzione restituirà None.
(Facoltativo) Creare un hook per job di addestramento esterni a SageMaker AI
Se esegui processi di addestramento in modalità locale, direttamente sulle istanze SageMaker Notebook, sulle istanze Amazon EC2 o sui tuoi dispositivi locali, usa la classe smd.Hook per creare un hook. Tuttavia, questo approccio può memorizzare solo le raccolte di tensori ed è utilizzabile per la visualizzazione di TensorBoard. Le regole integrate di Debugger SageMaker non funzionano con la modalità locale. Il metodo smd.get_hook restituisce None anche in questo caso.
Se desideri creare un hook manuale, usa il seguente frammento di codice con la logica per verificare se l'hook restituisce None restituisce e crea un hook manuale utilizzando la classe smd.Hook.
import smdebug.tensorflow as smd hook=smd.get_hook(hook_type="keras", create_if_not_exists=True) if hook is None: hook=smd.KerasHook( out_dir='/path/to/your/local/output/', export_tensorboard=True )
Dopo aver aggiunto il codice di creazione dell'hook, passa al seguente argomento per TensorFlow Keras.
Nota
Debugger SageMaker attualmente supporta solo TensorFlow Keras.
Registra l'hook nello script di addestramento TensorFlow Keras
La seguente procedura illustra come utilizzare l'hook e i suoi metodi per raccogliere scalari e tensori di output dal modello e dall'ottimizzatore.
-
Esegui il wrapping del tuo modello e ottimizzatore Keras con i metodi di classe dell'hook.
Il metodo
hook.register_model()prende il tuo modello e scorre attraverso ogni livello, cercando i tensori che corrispondono alle espressioni regolari che fornirai attraverso la configurazione in Avvio dei job di addestramento con Debugger utilizzando SageMaker Python SDK. I tensori raccolti tramite questo metodo hook sono pesi, bias e attivazioni.model=tf.keras.Model(...) hook.register_model(model) -
Esegui il wrapping dell'ottimizzatore secondo il metodo
hook.wrap_optimizer().optimizer=tf.keras.optimizers.Adam(...) optimizer=hook.wrap_optimizer(optimizer) -
Compila il modello in modalità eager in TensorFlow.
Per raccogliere tensori dal modello, come i tensori di input e output di ogni livello, è necessario eseguire l'addestramento in modalità eager. Altrimenti, SageMaker AI Debugger non è in grado di raccogliere i tensori. Tuttavia, altri tensori, come i pesi dei modelli, i bias e la perdita, possono essere raccolti senza che vengano eseguiti esplicitamente in modalità eager.
model.compile( loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"], # Required for collecting tensors of each layer run_eagerly=True ) -
Registra l'hook nel metodo
tf.keras.Model.fit(). Per raccogliere i tensori dagli hook che hai registrato, aggiungi
callbacks=[hook]al metodo della classemodel.fit()Keras. Questo passerà l'hooksagemaker-debuggercome callback Keras.model.fit( X_train, Y_train, batch_size=batch_size, epochs=epoch, validation_data=(X_valid, Y_valid), shuffle=True, callbacks=[hook] ) -
TensorFlow 2.x fornisce solo variabili di gradiente simbolico che non forniscono l'accesso ai loro valori. Per raccogliere i gradienti, esegui il wrapping di
tf.GradientTapesecondo il metodohook.wrap_tape(), che richiede di scrivere la tua fase di addestramento come segue. def training_step(model, dataset): with hook.wrap_tape(tf.GradientTape()) as tape: pred=model(data) loss_value=loss_fn(labels, pred) grads=tape.gradient(loss_value, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables))Eseguendo il wrapping del nastro, l’hook
sagemaker-debuggerè in grado di identificare tensori di uscita come gradienti, parametri e perdite. Il wrapping del nastro assicura che il metodohook.wrap_tape()basato sulle funzioni dell'oggetto nastro, ad esempio,push_tape(),pop_tape(),gradient(), configuri le istanze di scrittura di Debugger SageMaker e salvi i tensori forniti come input ingradient()(variabili addestrabili e perdita) e output digradient()(gradienti).Nota
Per raccogliere con un ciclo di addestramento personalizzato, assicurati di utilizzare la modalità eager. Altrimenti, Debugger SageMaker non sarà in grado di raccogliere alcun tensore.
Per un elenco completo delle azioni offerte dalle API dell’hook sagemaker-debugger per costruire hook e salvare tensori, consulta Metodi di hooksagemaker-debugger Python SDK.
Dopo aver completato l'adattamento dello script di addestramento, procedi con Avvio dei job di addestramento con Debugger utilizzando SageMaker Python SDK.