Descripción basic del contenido
- Descripción basic
- Configuración
- Habilitar la promoción del nuevo tipo
- Dos modos: todo modo vs modo seguro
- Dtypes
- Ejemplo de operaciones de pérdida de precisión
- Ejemplo de operaciones de reducción de bits
- Un sistema basado en una purple
- Tipo de purple de promoción
- Tabla de promoción de tipo
- Ventajas de la nueva promoción de tipo
- Tébalo
- Descripción basic
- Construcción de tébiltensor
Descripción basic
Hay 4 opciones para la promoción de tipos en TensorFlow.
- Por defecto, TensorFlow aumenta los errores en lugar de promover tipos para operaciones de tipo mixto.
- Correr
tf.numpy.experimental_enable_numpy_behavior()
Cambia de TensorFlow para usar reglas de promoción de tipo Numpy. - Este physician describe dos nuevas opciones que estarán disponibles en Tensorflow 2.15 (o actualmente en
tf-nightly
)
pip set up -q tf_nightly
Nota: experimental_enable_numpy_behavior
Cambia el comportamiento de todo el flujo de tensor.
Configuración
import numpy as np
import tensorflow as tf
import tensorflow.experimental.numpy as tnp
print("Utilizing TensorFlow model %s" % tf.__version__)
Utilizing TensorFlow model 2.20.0-dev20250306
Habilitar la promoción del nuevo tipo
Para usar la promoción de tipo Jax tipo Jax en TF-Numpy, especifique 'all'
o 'secure'
Como el modo de conversión Dtype al habilitar el comportamiento numpy para TensorFlow.
Este nuevo sistema (con dtype_conversion_mode="all"
) es asociativo, conmutativo y facilita el management de qué ancho de flotación termina (no se convierte automáticamente en flotadores más anchos). Introduce algunos riesgos de desbordamientos y pérdida de precisión, pero dtype_conversion_mode="secure"
te obliga a manejar esos casos explícitamente. Los dos modos se explican más en detalle en la siguiente sección.
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
WARNING:tensorflow:UserWarning: enabling the brand new kind promotion should occur originally of this system. Please guarantee no TF APIs have been used but.
Dos modos: todo modo vs modo seguro
En el nuevo sistema de promoción de tipo, presentamos dos modos: ALL
modo y SAFE
modo. SAFE
El modo se usa para mitigar las preocupaciones de las promociones “riesgosas” que pueden resultar en pérdida de precisión o reducción de bits.
Dtypes
Usaremos las siguientes abreviaturas para la brevedad.
b
mediotf.bool
u8
mediotf.uint8
i16
mediotf.int16
i32
mediotf.int32
bf16
mediotf.bfloat16
f32
mediotf.float32
f64
mediotf.float64
i32*
significa pitónint
o débilmente tipadoi32
f32*
significa pitónfloat
o débilmente tipadof32
c128*
significa pitóncomplicated
o débilmente tipadoc128
El asterisco
Denota que el tipo correspondiente es “débil”: tal dtype es inferido temporalmente por el sistema y podría diferir a otros dtitipos. Este concepto se explica más en detalle aquí.
Ejemplo de operaciones de pérdida de precisión i32
En el siguiente ejemplo, f32
+ + ALL
está permitido en SAFE
modo pero no en
# i32 + f32 returns a f32 lead to ALL mode.
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
a = tf.fixed(10, dtype = tf.int32)
b = tf.fixed(5.0, dtype = tf.float32)
a + b #
WARNING:tensorflow:UserWarning: enabling the brand new kind promotion should occur originally of this system. Please guarantee no TF APIs have been used but.
WARNING: All log messages earlier than absl::InitializeLog() is known as are written to STDERR
I0000 00:00:1741314679.354086 16587 gpu_device.cc:2018] Created gadget /job:localhost/duplicate:0/process:0/gadget:GPU:0 with 13638 MB reminiscence: -> gadget: 0, identify: Tesla T4, pci bus id: 0000:00:05.0, compute functionality: 7.5
I0000 00:00:1741314679.356319 16587 gpu_device.cc:2018] Created gadget /job:localhost/duplicate:0/process:0/gadget:GPU:1 with 13756 MB reminiscence: -> gadget: 1, identify: Tesla T4, pci bus id: 0000:00:06.0, compute functionality: 7.5
I0000 00:00:1741314679.358627 16587 gpu_device.cc:2018] Created gadget /job:localhost/duplicate:0/process:0/gadget:GPU:2 with 13756 MB reminiscence: -> gadget: 2, identify: Tesla T4, pci bus id: 0000:00:07.0, compute functionality: 7.5
I0000 00:00:1741314679.360752 16587 gpu_device.cc:2018] Created gadget /job:localhost/duplicate:0/process:0/gadget:GPU:3 with 13756 MB reminiscence: -> gadget: 3, identify: Tesla T4, pci bus id: 0000:00:08.0, compute functionality: 7.5
# This promotion is just not allowed in SAFE mode.
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="secure")
a = tf.fixed(10, dtype = tf.int32)
b = tf.fixed(5.0, dtype = tf.float32)
attempt:
a + b
besides TypeError as e:
print(f'{kind(e)}: {e}') # TypeError: explicitly specify the dtype or swap to ALL mode.
WARNING:tensorflow:UserWarning: enabling the brand new kind promotion should occur originally of this system. Please guarantee no TF APIs have been used but.
: In promotion mode PromoMode.SAFE, implicit dtype promotion between (, weak=False) and (, weak=False) is disallowed. You must explicitly specify the dtype in your op, or loosen up your dtype promotion guidelines (akin to from SAFE mode to ALL mode).
modo Debido al riesgo de pérdida de precisión.
Ejemplo de operaciones de reducción de bits i8
En el siguiente ejemplo, u32
+ + ALL
está permitido en SAFE
modo pero no en
# i8 + u32 returns an i64 lead to ALL mode.
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
a = tf.fixed(10, dtype = tf.int8)
b = tf.fixed(5, dtype = tf.uint32)
a + b
WARNING:tensorflow:UserWarning: enabling the brand new kind promotion should occur originally of this system. Please guarantee no TF APIs have been used but.
# This promotion is just not allowed in SAFE mode.
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="secure")
a = tf.fixed(10, dtype = tf.int8)
b = tf.fixed(5, dtype = tf.uint32)
attempt:
a + b
besides TypeError as e:
print(f'{kind(e)}: {e}') # TypeError: explicitly specify the dtype or swap to ALL mode.
WARNING:tensorflow:UserWarning: enabling the brand new kind promotion should occur originally of this system. Please guarantee no TF APIs have been used but.
: In promotion mode PromoMode.SAFE, implicit dtype promotion between (, weak=False) and (, weak=False) is disallowed. You must explicitly specify the dtype in your op, or loosen up your dtype promotion guidelines (akin to from SAFE mode to ALL mode).
Modo debido al aumento de bits, lo que significa usar más bits que el número de bits en las entradas. Tenga en cuenta que la semántica de promoción del nuevo tipo solo permite el nivel de bits necesario.
Un sistema basado en una purple
Tipo de purple de promoción
El nuevo comportamiento de promoción de tipo se determina a través de la siguiente purple de promoción de tipo:
Más específicamente, la promoción entre dos tipos se determina al encontrar el primer niño común de los dos nodos (incluidos los nodos). i8
Por ejemplo, en el diagrama anterior, el primer niño común de i32
y i32
es i32
Porque los dos nodos se cruzan por primera vez en
cuando sigue la dirección de las flechas. u64
Del mismo modo como otro ejemplo, el tipo de promoción de resultados entre f16
y f16
sería
.
Tabla de promoción de tipo
Seguir la purple genera la tabla de promoción binaria a continuación: Nota:SAFE
ALL
El modo no permite las celdas resaltadas.
El modo permite todos los casos.
Adoptamos un sistema basado en redes tipo Jax para nuestra nueva promoción de tipo, que ofrece las siguientes ventajas:
Ventajas del sistema basado en la purple
- Primero, el uso de un sistema basado en la purple garantiza tres propiedades muy importantes:
- Existencia: hay un tipo de promoción de resultados único para cualquier combinación de tipos.
a + b = b + a
- Commutatividad:
a + (b + c) = (a + b) = c
Asociatividad:
Estas tres propiedades son críticas para construir una semántica de promoción de tipo que sea consistente y predecible.
Ventajas del sistema de celosía tipo Jax
Otra ventaja essential del sistema de celosía tipo JAX es que fuera de los ints sin firmar, evita todas las promociones más amplias de lo que nota. Esto significa que no puede obtener resultados de 64 bits sin entradas de 64 bits. Esto es especialmente beneficioso para trabajar en aceleradores, ya que evita valores innecesarios de 64 bits, lo que fue frecuente en la promoción de tipo anterior. i64
Sin embargo, esto viene con una compensación: la promoción de flotantes/enteros mixtos es muy propenso a la pérdida de precisión. Por ejemplo, en el ejemplo a continuación, f16
+ + i64
Resulta en la promoción f16
a
# The primary enter is promoted to f16 in ALL mode.
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
tf.fixed(1, tf.int64) + tf.fixed(3.2, tf.float16) #
WARNING:tensorflow:UserWarning: enabling the brand new kind promotion should occur originally of this system. Please guarantee no TF APIs have been used but.
. SAFE
Para migrar esta preocupación, presentamos un
modo que rechazará estas promociones “riesgosas”.
Tébalo
Descripción basic Tensores débiles
WeakTensor
son tensores que están “débilmente escritos”, similares a un concepto en Jax.
El sistema infere temporalmente por el sistema y podría diferir a otros dtypes. Este concepto se introduce en el nuevo tipo de promoción para evitar la promoción del tipo no deseado dentro de las operaciones binarias entre los valores y valores de TF sin tipo explícitamente especificado por el usuario, como literales escalares de Python. tf.fixed(1.2)
Por ejemplo, en el ejemplo a continuación, tf.fixed(1.2)
se considera “débil” porque no tiene un dtype específico. Por lo tanto, tf.fixed(3.1, tf.float16)
defiende al tipo de f16
resultando en un
tf.fixed(1.2) + tf.fixed(3.1, tf.float16) #
producción.
Construcción de tébiltensor
Se crean tídicos si crea un tensor sin especificar un dtype, el resultado es un tébiltensor. Puede verificar si un tensor es “débil” o no verificando el atributo débil al last de la representación de la cadena del tensor.Primer caso tf.fixed
: Cuando
tf.fixed(5) #
se llama con una entrada sin dtype especificado por el usuario.[5.0, 10.0, 3]tf.fixed ([" weak="True">
# A normal Tensor is created when dtype arg is specified.
tf.constant(5, tf.int32) #
Second Case: When an input with no user-specified dtype is passed into a WeakTensor-supporting API.
tf.math.abs([100.0, 4.0]) #
) #
Sitio internet, este artículo aparece aquí en un nuevo titular y tiene licencia bajo CC por 4.0. Muestras de código compartidas bajo la licencia Apache 2.0.
fuente