Matemáticas de punto flotante en python / numpy no reproducibles en máquinas

Comparando los resultados de un cálculo de punto flotante en un par de máquinas diferentes, están produciendo constantemente resultados diferentes. Aquí hay un ejemplo simplificado que reproduce el comportamiento:

import numpy as np from numpy.random import randn as rand M = 1024 N = 2048 np.random.seed(0) a = rand(M,N).astype(dtype=np.float32) w = rand(N,M).astype(dtype=np.float32) b = np.dot(a, w) for i in range(10): b = b + np.dot(b, a)[:, :1024] np.divide(b, 100., out=b) print b[0,:3] 

Diferentes máquinas producen diferentes resultados como

  • [-2.85753540e-05 -5.94204867e-05 -2.62337649e-04]
  • [-2.85751412e-05 -5.94208468e-05 -2.62336689e-04]
  • [-2.85754559e-05 -5.94202756e-05 -2.62337562e-04]

pero también puedo obtener resultados idénticos, por ejemplo, ejecutándolos en dos MacBooks de la misma época. Esto sucede con las máquinas que tienen la misma versión de Python y numpy, pero no necesariamente vinculadas a las mismas bibliotecas BLAS (por ejemplo, acelerar el marco en Mac, OpenBLAS en Ubuntu). Sin embargo, ¿no deberían todas las bibliotecas numéricas cumplir con el mismo estándar de punto flotante IEEE y dar exactamente los mismos resultados?

Los cálculos de punto flotante no siempre son reproducibles.

Puede obtener resultados reproducibles para cálculos flotantes en diferentes máquinas si utiliza la misma imagen ejecutable, entradas, bibliotecas creadas con el mismo comstackdor y configuraciones de comstackdor idénticas (conmutadores).

Sin embargo, si utiliza una biblioteca enlazada dinámicamente, puede obtener resultados diferentes, debido a numerosas razones. En primer lugar, como Veedrac señaló en los comentarios , podría usar diferentes algoritmos para sus rutinas en diferentes architectures. En segundo lugar, un comstackdor puede producir un código diferente dependiendo de los conmutadores (varias optimizaciones, configuración de control). Incluso a+b+c produce resultados no deterministas en máquinas y comstackdores, porque no podemos estar seguros sobre el orden de evaluación y la precisión en los cálculos intermedios.

Lea aquí por qué no se garantiza obtener resultados idénticos en diferentes implementaciones de IEEE 754-1985 . El nuevo estándar ( IEEE 754-2008 ) intenta ir más lejos, pero aún así no garantiza resultados idénticos entre las diferentes implementaciones, ya que, por ejemplo, permite que los implementadores elijan cuándo se detecta la minúscula (excepción de flujo inferior)

Puede encontrar más información sobre el determinismo de punto flotante en este artículo .