¿Es tan malo el punto flotante de precisión simple?

8

He estado buscando en algunos de los paquetes de la Alta Potencia tarea vista trato con los cálculos de la GPU, y dado que la mayor parte de la GPU parece ser un orden de magnitud más fuerte en la realización de la aritmética de precisión simple de DP los , me preguntaba:

  1. ¿Por qué ninguno de los paquetes le da más control al usuario sobre el tipo de precisión requerida? Puedo ver muchas aplicaciones en estadísticas donde la aritmética SP (es decir, un número codificado con una precisión de 7 dígitos) es lo suficientemente buena para un uso práctico (si estoy sobreestimando las ganancias involucradas, hágamelo saber).
  2. ¿Python es más flexible en esto? Si es así, ¿por qué? No veo por qué la ausencia de un tipo 'único' en R haría que incluir esa opción (junto con una advertencia) en digamos GPUtools o magma sea imposible (aunque estaré feliz de que me muestren mal).

PD: Estoy pensando específicamente en aplicaciones donde los números ya están dimensionados y centrados en cuanto a dimensiones (de modo que la desigualdad de Chebychev es vinculante) en cuanto a dimensiones.

usuario603
fuente
2
Confieso estar desconcertado por esto, a pesar de luchar varias veces para darle sentido: ¿hay alguna pregunta aquí? "Tan malo" es vago y no tiene referente. ¿Qué es exactamente lo que busca entender o descubrir?
whuber
@Whuber:> Mi pregunta estaba mal redactada. Probablemente se deba a que se debe a la ignorancia: había leído algunos libros blancos sobre el uso de GPU (aunque, desafortunadamente, no es la referencia de comando R de GPUtools) y no podía entender por qué se llevaron a cabo todas las pruebas en DP. Reformularé la pregunta (y el título).
user603

Respuestas:

5

Desde el archivo de ayuda GPUtools , parece que useSingle=TRUEes el valor predeterminado para las funciones.

ars
fuente
@kwak: la respuesta anterior me parece útil, pero realmente no responde a la pregunta planteada: "¿es tan mala la precisión individual?" ¿Tal vez deberías reformular tu pregunta?
csgillespie
@csgellespie: tienes toda la razón. Reformularé esta pregunta para que pueda ser utilizada por futuros lectores. De hecho, la redacción era particularmente pobre.
usuario603
4
  1. Porque antes de las GPU no había sentido práctico de usar reales únicos; nunca tiene demasiada precisión y la memoria generalmente no es un problema. Y admitir solo dobles hizo que el diseño R fuera más simple. (Aunque R admite la lectura / escritura de reales individuales).
  2. Sí, porque Python está destinado a ser más compatible con los lenguajes compilados. Sin embargo, tiene razón en que es posible que los contenedores de las bibliotecas R realicen una conversión en tiempo real (esto, por supuesto, lleva tiempo, pero este es un problema menor); puede intentar enviar correos electrónicos a los encargados de mantenimiento de paquetes de GPU solicitando dichos cambios.

fuente
3

Supongo que por programación de GPU, ¿te refieres a programar tarjetas nvidia? En cuyo caso, las llamadas de código subyacentes de R y python son a C / CUDA .


La simple razón de que solo se ofrece una precisión única es porque eso es lo que admite la mayoría de las tarjetas GPU.

Sin embargo, la nueva arquitectura nvidia Fermi admite doble precisión. Si compró una tarjeta gráfica nvidia este año, entonces probablemente sea una Fermi. Incluso aquí las cosas no son simples:

  • Obtendrá un ligero rendimiento si compila con doble precisión (un factor de dos si no recuerdo mal).
  • En las tarjetas Fermi más baratas, nvidia deshabilitó intencionalmente la doble precisión. Sin embargo, es posible evitar esto y ejecutar programas de doble precisión. Logré hacer esto en mi GeForce GTX 465 en Linux.

Para responder a la pregunta en su título, "¿Está bien la precisión simple?", Depende de su aplicación (¡perdón por la respuesta!). Supongo que ahora todos usan doble precisión porque ya no da un golpe de rendimiento.

Cuando incursioné en las GPU, la programación de repente se volvió mucho más complicada. Tienes que preocuparte por cosas como:

  • deformar y organizar su memoria correctamente.
  • # hilos por núcleo.
  • la depuración es horrible: no hay una declaración de impresión en las declaraciones del núcleo de la GPU
  • falta de generadores de números aleatorios
  • Precisión simple.
csgillespie
fuente
@ccgillespie:> creo que mi pregunta puede haber sido mal redactada. En el paquete que veo (GPUtools, magma), la doble precisión parece usarse como estándar (con la pérdida de rendimiento que usted describe). Me preguntaba por qué la precisión simple no se ofrece como una opción.
user603
@kwak: el contenedor debe convertir los valores de precisión doble a precisión simple. El contenedor solo estaba tratando de ser útil.
csgillespie
@ccgillespie:> sí, pero parece que el contenedor viene con costos de rendimiento que exceden el factor 2 que cita (nuevamente, corríjame si me equivoco en esto) y en algunos casos no hay beneficios tangibles (puedo pensar en muchas aplicaciones en estadísticas si la aritmética SP FP estaría bien). Me preguntaba si tiene sentido pedir una opción para apagar dicho envoltorio.
usuario603
2
@kwak: Echando un vistazo al archivo de ayuda de GPUtools, parece que ese useSingle=TRUEes el valor predeterminado en las funciones. ¿Me estoy perdiendo de algo?
ars
@csgillespie: Recuerde, hasta hace relativamente poco tiempo, la mayoría de las tarjetas nvidia simplemente no podían hacer cálculos de doble precisión. El factor de 2 aciertos es lo que observé usando el código C / CUDA sin procesar. Tener un envoltorio python / R puede empeorar esto.
csgillespie
1

La gran mayoría de las GPU en circulación solo admiten punto flotante de precisión simple.

En cuanto a la pregunta del título, debe mirar los datos que manejará para determinar si la precisión única es suficiente para usted. A menudo, encontrará que los solteros son perfectamente aceptables para> 90% de los datos que maneja, pero fallarán espectacularmente en ese último 10%; a menos que tenga una manera fácil de determinar si su conjunto de datos en particular fallará o no, está atascado con doble precisión para todo.

Benjamin Chambers
fuente
¿Puedes elaborar un poco? Parece que algún algoritmo iterativo (matriz invertida, descomposición QR) parece funcionar bien. También tengo curiosidad por saber si la inexactitud de SP se convierte en un problema para las operaciones que involucran matrices más grandes.
user603
Hay dos partes: 1) ¿Qué representan los datos? 2) ¿Cómo procesas los datos? Si está analizando miles de puntos de datos de un estudio médico, una precisión única probablemente sea suficiente para cuantificar el bienestar del paciente, y dudo que alguna vez necesite el doble. La geometría, por otro lado, podría requerir precisión simple o doble dependiendo de su escala y zoom. Calcular la trayectoria de una sonda a Saturno siempre requeriría dobles, ya que incluso pequeños errores podrían afectar drásticamente el resultado. Debe mirar los datos y decidir cuáles son sus tolerancias.
Benjamin Chambers
1
Dependerá de la estabilidad numérica del algoritmo que esté utilizando y de qué tan bien condicionado esté el problema. Recuerde que la precisión doble le da acceso a números más pequeños y a números más grandes.
James
1
No necesariamente números más pequeños o más grandes; recuerde, estamos tratando con coma flotante. Más bien, le permite usar números más grandes y más pequeños entre sí, al tiempo que conserva los dígitos significativos.
Benjamin Chambers
1

OK, una nueva respuesta a una vieja pregunta pero aún más relevante ahora. La pregunta que está haciendo tiene que ver con precisión finita, normalmente el dominio del análisis de señales y las matemáticas experimentales.

Los flotadores de doble precisión (DP) nos permiten pretender que no existen problemas de precisión finita, al igual que lo hacemos con la mayoría de los problemas matemáticos del mundo real. En matemáticas experimentales no hay pretensiones.

Los flotadores de precisión simple (SP) nos obligan a considerar el ruido de cuantización. Si nuestros modelos de aprendizaje automático rechazan inherentemente el ruido, como las redes neuronales (NN), las redes convolucionales (CNN), las redes residuales (ResN), etc., entonces SP generalmente da resultados similares a DP.

Los flotadores de media precisión (HP) (ahora compatibles con el kit de herramientas cuda 7.5) requieren que se consideren los efectos de cuantificación (ruido y redondeo). Lo más probable es que pronto veamos flotantes de HP en los kits de herramientas de aprendizaje automático comunes.

Hay trabajo reciente para crear cálculos de menor precisión en flotantes, así como números de precisión fijos. El redondeo estocástico ha permitido que la convergencia proceda con CNN mientras que la solución diverge sin ella. Estos documentos lo ayudarán a mejorar su comprensión de los problemas con el uso de números de precisión finita en el aprendizaje automático.

Para responder a sus preguntas:

SP no es tan malo. Como señala, es el doble de rápido, pero también le permite poner más capas en la memoria. Una ventaja adicional es ahorrar gastos generales para obtener datos dentro y fuera de la GPU. Los cálculos más rápidos y la sobrecarga más baja resultan en tiempos de convergencia más bajos. Dicho esto, HP, para algunos problemas, será mejor en algunas partes de la red y no en otras.

  1. Me parece que muchos de los kits de herramientas de aprendizaje automático manejan SP y DP. Quizás alguien más con una gama más amplia de experiencia con los juegos de herramientas agregará su nickle.
  2. Python admitirá lo que admite el kit de herramientas de gpu. No desea utilizar los tipos de datos de Python porque entonces ejecutará un script interpretado en la CPU.

Tenga en cuenta que la tendencia en las redes neuronales ahora es ir con capas muy profundas, con ejecuciones de más de unos días comunes en los clústeres de gpu más rápidos.

r3mnant
fuente