Path: blob/master/site/es-419/guide/migrate/migrating_checkpoints.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Migración de los puntos de verificación del modelo
Nota: Se suele llamar a los puntos de verificación guardados con tf.compat.v1.Saver
como puntos de verificación TF1 o basados en nombres. A los puntos de verificación guardados con tf.train.Checkpoint
se les llama puntos de verificación TF2 o basados en objetos.
Descripción general
Esta guía asume que usted tiene un modelo que guarda y carga puntos de verificación con tf.compat.v1.Saver
, y desea migrar el código para usar la API tf.train.Checkpoint
de TF2, o usar puntos de verificación preexistentes en su modelo TF2.
A continuación le presentamos algunos escenarios comunes con los que puede encontrarse:
Escenario 1
Existen puntos de verificación TF1 de entrenamientos anteriores que deben cargarse o convertirse a TF2.
Para cargar el punto de verificación TF1 en TF2, consulte el recorte Cargar un punto de verificación TF1 en TF2.
Para convertir el punto de verificación a TF2, consulte Conversión de puntos de verificación.
Escenario 2
Está ajustando su modelo de forma que corre el riesgo de cambiar los nombres y las rutas de las variables (como cuando migra incrementalmente de get_variable
a la creación explícita de tf.Variable
), y le gustaría mantener el guardado/carga de los puntos de verificación existentes a lo largo del camino.
Consulte la sección sobre Cómo mantener la compatibilidad de puntos de verificación durante la migración de modelos
Escenario 3
Usted está migrando su código de entrenamiento y sus puntos de verificación a TF2, pero su canalización de inferencia sigue necesitando por ahora puntos de verificación de TF1 (para la estabilidad de la producción).
Option 1
Guarde los puntos de verificación de TF1 y TF2 durante el entrenamiento.
Option 2
Convierta el punto de verificación TF2 en TF1.
Los ejemplos siguientes muestran todas las combinaciones de guardado y carga de puntos de verificación en TF1/TF2, para que tenga cierta flexibilidad para determinar cómo migrar su modelo.
Preparación
Cambios de TF1 a TF2
Esta sección se incluye por si tiene curiosidad sobre lo que ha cambiado entre el TF1 y el TF2, y lo que entendemos por puntos de verificación "basados en nombres" (TF1) frente a "basados en objetos" (TF2).
Los dos tipos de puntos de verificación se guardan en realidad en el mismo formato, que es esencialmente una tabla clave-valor. La diferencia radica en cómo se generan las claves.
Las claves en los puntos de verificación basados en nombres son los nombres de las variables. Las claves en los puntos de verificación basados en objetos se refieren a la ruta desde el objeto raíz hasta la variable (para comprender mejor lo que esto significa, vea los ejemplos siguientes).
En primer lugar, guarde algunos puntos de verificación:
Si observa las claves en tf2-ckpt
, todas ellas se refieren a las rutas de los objetos de cada variable. Por ejemplo, la variable a
es el primer elemento de la lista variables
, por lo que su clave pasa a ser variables/0/...
(siéntase libre de ignorar la constante .ATTRIBUTES/VARIABLE_VALOR).
A continuación, una inspección más detallada del objeto Checkpoint
:
Experimente con el siguiente fragmento y vea cómo cambian las claves del punto de verificación con la estructura del objeto:
¿Por qué TF2 usa este mecanismo?
Como ya no hay grafo global en TF2, los nombres de las variables no son fiables y pueden ser inconsistentes entre programas. TF2 fomenta el enfoque de modelado orientado a objetos, en el que las variables son propiedad de capas, y las capas son propiedad de un modelo:
Cómo mantener la compatibilidad de los puntos de verificación durante la migración de modelos
Un paso importante en el proceso de migración es asegurarse de que todas las variables se inicializan con los valores correctos, que le permitirá a su vez validar que las op/funciones realizan los cálculos correctos. Para lograrlo, debe tener en cuenta la compatibilidad de puntos de verificación entre los modelos en las distintas etapas de la migración. Básicamente, esta sección responde a la pregunta cómo conservo el mismo punto de verificación mientras cambio el modelo.
A continuación se presentan tres formas de mantener la compatibilidad de los puntos de verificación, por orden de flexibilidad creciente:
El modelo tiene los mismos nombres de variables que antes.
El modelo tiene diferentes nombres de variables, y mantiene un mapa de asignación que esquematiza los nombres de las variables en el punto de verificación a los nuevos nombres.
El modelo tiene diferentes nombres de variables y conserva un objeto Checkpoint TF2 que almacena todas las variables.
Cuando los nombres de las variables coinciden
Título largo: Cómo reutilizar los puntos de verificación cuando los nombres de las variables coinciden.
Respuesta corta: Puede cargar directamente el punto de verificación preexistente con tf1.train.Saver
o tf.train.Checkpoint
.
Si está usando tf.compat.v1.keras.utils.track_tf1_style_variables
, entonces se asegurará de que los nombres de las variables de su modelo son los mismos que antes. También puede asegurarse manualmente de que los nombres de las variables coinciden.
Cuando los nombres de las variables coinciden en los modelos migrados, puede usar directamente tf.train.Checkpoint
o tf.compat.v1.train.Saver
para cargar el punto de verificación. Ambas API son compatibles con eager mode y modo grafo, por lo que puede usarlas en cualquier fase de la migración.
Nota: Puede usar tf.train.Checkpoint
para cargar puntos de verificación TF1, pero no puede usar tf.compat.v1.Saver
para cargar puntos de verificación TF2 sin una complicada coincidencia de nombres.
A continuación se muestran ejemplos de cómo usar el mismo punto de verificación con diferentes modelos. En primer lugar, guarde un punto de verificación TF1 con tf1.train.Saver
:
El ejemplo siguiente usa tf.compat.v1.Saver
para cargar el punto de verificación mientras está en eager mode:
El siguiente recorte de código carga el punto de verificación usando la APItf.train.Checkpoint
de TF2:
Nombres de variables en TF2
Las variables siguen teniendo todas un argumento
name
que puede configurar.Los modelos Keras también toman un argumento
name
que configuran como prefijo para sus variables.La función
v1.name_scope
puede usarse para configurar los prefijos de los nombres de las variables. Esto es muy diferente detf.variable_scope
. Sólo afecta a los nombres, y no hace un seguimiento de las variables y su reutilización.
El decorador tf.compat.v1.keras.utils.track_tf1_style_variables
es un shim que le ayuda a conservar los nombres de las variables y la compatibilidad con el punto de verificación TF1, conservando sin cambios la semántica de denominación y reutilización de tf.variable_scope
y tf.compat.v1.get_variable
. Consulte la Guía para mapear modelos para saber más.
Nota 1: Si está usando el shim, use las API del TF2 para cargar sus puntos de verificación (incluso cuando use puntos de verificación del TF1 preentrenados).
Consulte la sección Keras de punto de verificación.
Nota 2: Al migrar a tf.Variable
desde get_variable
:
Si su capa o módulo decorado con shim consta de algunas variables (o capas/modelos Keras) que usan tf.Variable
en lugar de tf.compat.v1.get_variable
y se anexan como propiedades/seguimiento según la orientación a objetos, pueden tener una semántica de nomenclatura de variables diferente en los grafos/sesiones TF1.x versus durante la ejecución eager.
En resumen, los nombres pueden no ser lo que usted espera que sean cuando se ejecuta en TF2.
Advertencia: Las variables pueden tener nombres duplicados en ejecución eager, lo que puede causar problemas si es necesario mapear varias variables del punto de verificación basado en nombres con el mismo nombre. Puede ajustar explícitamente la capa y los nombres de las variables usando tf.name_scope
y el constructor de capa o los argumentos name
de tf.Variable
para ajustar los nombres de las variables y asegurarse de que no hay duplicados.
Actualizar los mapas de asignación
Los mapas de asignación se suelen usar para transferir ponderaciones entre modelos TF1, y también se pueden usar durante la migración de su modelo si cambian los nombres de las variables.
Puede usar estos mapas con tf.compat.v1.train.init_from_checkpoint
, tf.compat.v1.train.Saver
, y tf.train.load_checkpoint
para cargar ponderaciones en modelos en los que los nombres de las variables o el ámbito pueden haber cambiado.
Los ejemplos de esta sección usarán un punto de verificación previamente guardado:
Carga con init_from_checkpoint
tf1.train.init_from_checkpoint
debe llamarse mientras se está en un grafo/sesión, porque coloca los valores en los inicializadores de variables en lugar de crear una op de asignación.
Puede usar el argumento assignment_map
para configurar cómo se cargan las variables. De la documentación:
El mapa de asignación admite la siguiente sintaxis:
'checkpoint_scope_name/': 'scope_name/'
: cargará todas las variables del actualscope_name
desdecheckpoint_scope_name
con nombres de tensor coincidentes.'checkpoint_scope_name/some_other_variable': 'scope_name/variable_name'
: inicializará la variablescope_name/variable_name
decheckpoint_scope_name/some_other_variable
.'scope_variable_name': variable
: inicializará el objetotf.Variable
dado con el tensor 'scope_variable_name' del punto de verificación.'scope_variable_name': list(variable)
: inicializará la lista de variables particionadas con el tensor 'scope_variable_name' desde el punto de verificación.'/': 'scope_name/'
: cargará todas las variables delscope_name
actual desde la raíz del punto de verificación (por ejemplo, sin ámbito).
Carga con tf1.train.Saver
A diferencia de init_from_checkpoint
, tf.compat.v1.train.Saver
se ejecuta tanto en modo grafo como en eager mode. El argumento var_list
acepta opcionalmente un diccionario, con la salvedad de que debe mapear los nombres de las variables al objeto tf.Variable
.
Carga con tf.train.load_checkpoint
Esta opción es para usted si necesita un control preciso sobre los valores de las variables. Nuevamente, esto funciona tanto en modo grafo como en eager mode.
Actualizar un objeto de punto de verificación de TF2
Si los nombres de las variables y del ámbito pueden cambiar mucho durante la migración, entonces usa tf.train.Checkpoint
y puntos de verificación TF2. TF2 usa la estructura de objetos en lugar de nombres de variables (más información en Cambios de TF1 a TF2).
En resumen, cuando crees un tf.train.Checkpoint
para guardar o restaurar puntos de verificación, asegúrate de que usa el mismo ordenamiento (para listas) y claves (para diccionarios y argumentos de palabras clave para el inicializador Checkpoint
). Algunos ejemplos de compatibilidad de puntos de verificación:
Las muestras de código que aparecen a continuación muestran cómo usar el "mismo" tf.train.Checkpoint
para cargar variables con nombres diferentes. Primero, guarda un punto de verificación TF2:
Puede conservar el uso de tf.train.Checkpoint
aunque cambien los nombres de las variables/ámbitos:
Y en eager mode:
Puntos de verificación de TF2 en Estimator
Las secciones anteriores describen cómo mantener la compatibilidad de los puntos de verificación mientras migra su modelo. Estos conceptos también se aplican a los modelos Estimator, aunque la forma en que se guarda/carga el punto de verificación es ligeramente diferente. Al migrar su modelo Estimator para usar las API TF2, es posible que desee cambiar los puntos de verificación {nbsp}de TF1 a TF2 mientras el modelo sigue usando Estimator. Esta sección muestra cómo hacerlo.
tf.estimator.Estimator
y MonitoredSession
tienen un mecanismo de guardado llamado scaffold
, un objeto tf.compat.v1.train.Scaffold
. El Scaffold
puede contener un tf1.train.Saver
o tf.train.Checkpoint
, que permite a Estimator
y MonitoredSession
guardar puntos de verificación del estilo TF1 o TF2.
El valor final de v
debería ser 16
, después de haber sido templado desde est-tf1
, y luego entrenado durante 5 pasos adicionales. El valor del paso de entrenamiento no se arrastra desde el punto de verificación warm_start
.
Usar puntos de verificación de Keras
Los modelos creados con Keras siguen usando tf1.train.Saver
y tf.train.Checkpoint
para cargar las ponderaciones preexistentes. Cuando tu modelo esté totalmente migrado, pasa a usar model.save_weights
y model.load_weights
, especialmente si estás usando la retrollamada ModelCheckpoint
durante el entrenamiento.
Algunas cosas que debes saber sobre los puntos de verificación y Keras:
Inicialización vs Construcción
Los modelos Keras y las capas deben pasar por dos pasos antes de crearse por completo. El primero es la inicialización del objeto Python: layer = tf.keras.capas.Dense(x)
. El segundo es el paso build, en el que se crean realmente la mayoría de las ponderaciones: layer.build(input_shape)
. También puede construir un modelo llamándolo o ejecutando un único paso train
, eval
o predict
(sólo la primera vez).
Si encuentras que model.load_weights(path).assert_consumed()
produce un error, es probable que el modelo/las capas no se hayan construido.
Keras usa los puntos de verificación de TF2
tf.train.Checkpoint(model).write
es equivalente a model.save_weights
. Lo mismo ocurre con tf.train.Checkpoint(model).read
y model.load_weights
. Ten en cuenta que Checkpoint(model) != Checkpoint(model=model)
.
Los puntos de verificación TF2 funcionan con el paso build()
de Keras
tf.train.Checkpoint.restore
tiene un mecanismo llamado restauración diferida que permite a tf.Module
y a los objetos Keras almacenar valores de variables si éstas aún no se han creado. Esto permite a los modelos inicializados cargar ponderaciones y construir después.
Debido a este mecanismo, te recomendamos encarecidamente que uses las API de carga de puntos de verificación TF2 con modelos Keras (incluso al restaurar puntos de verificación TF1 preexistentes en las shims de mapeo de modelos). Más información en la guía de puntos de verificación.
Recortes de código
Los recortes siguientes muestran la compatibilidad de las versiones TF1/TF2 en las API de guardado de puntos de verificación.
Guardar un punto de verificación de TF2 en TF1
Cargar un punto de verificación de TF2 en TF1
Convertir el punto de verificación TF1 a TF2
Convierta el punto de verificación guardado en el recorte Save a TF1 checkpoint in TF2
:
Convertir el punto de verificación TF2 a TF1
Convierta el punto de verificación guardado en el recorte Save a TF2 checkpoint in TF1
:
Guías relacionadas
Guía para mapear modelos y
tf.compat.v1.keras.utils.track_tf1_style_variables