Mostrando entradas con la etiqueta MODELO COMPUTACIONAL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MODELO COMPUTACIONAL. Mostrar todas las entradas

lunes, 11 de mayo de 2020

‘Deficiente e ininteligible’ el código fuente del modelo computacional pandémico del Imperial College

por Ben Lewis
Esto podrá sorprender a la gran mayoría, pero en la comunidad académica no es un secreto que la calidad de la mayoría de los códigos (programas) de computación utilizados es muy pobre. El grupo del profesor Neil Ferguson en el Imperial College de Londres acaba de hacer público el código fuente de su modelo pandémico, e incluso para los estándares de deficiencia a los que estamos habituados, el modelo del Imperial College es abismalmente deficiente. Lo que es aún más alarmante es que el código publicado supuestamente se ha mejorado durante varias semanas para que sea menos grave. Entonces, los cientos de miles de muertes por COVID-19 predichos en marzo por el profesor Ferguson, en realidad son cifras incoherentes y basadas en un sistema sumamente deficiente.
Pero la calidad del código no es meramente estilística. Va al meollo del problema: si otros no pueden leer lo que ha escrito, entonces no pueden verificar que sea correcto. He entrecerrado los ojos y he mirado este código durante un día y todavía no soy más sabio de lo que está sucediendo en muchas partes. Los jeroglíficos egipcios pueden ser más fáciles de interpretar. Las abreviaturas de los escribas latinos ciertamente lo son.
Pero esto plantea la pregunta: ¿por qué los códigos académicos (en la comunidad de modelos, el sustantivo es códigos, no programas) son tan terriblemente invariables? Eso no quiere decir que todos son incorrectos, por supuesto. Una redacción espantosa solo significa que es irritante e imposible verificarla. O, en otras palabras, simplemente no podemos saber si el código ICL es correcto. El objetivo de un código claramente escrito es que otros puedan auditarlo y comprenderlo.
Casi ningún programador científico está capacitado como tal. En cambio, C o FORTRAN, o cualquier lenguaje que use, es simplemente una herramienta para resolver problemas con los que se aprende sobre la marcha. Por lo tanto, nadie imparte buenas prácticas al principio. Luego, al trabajar solo o en pequeños grupos, tampoco hay un controlador externo para mejorar las cosas. Solo aprendí buenas prácticas cuando comencé a enseñar C a otros, por ejemplo.
¿Por qué surge este problema crónico? Debido al problema secundario a veces llamado “publicar o perecer”. En realidad, es mejor para la carrera de uno publicar un resultado rápidamente, a partir de uno de estos códigos no verificados antes mencionados, y luego simplemente decir en un documento futuro “oh, sí, debido a un error, la noche es en realidad día”. Hice exactamente esto, aunque sin querer, cuando era estudiante de doctorado. Lewis, Bate y Price (2015) fueron esencialmente revocados por una errata (Lewis, Bate, Price 2017a), donde un error que había acechado en nuestro código de magnetohidrodinámica desde aproximadamente 2005 comprometió fatalmente los resultados. Y los de al menos otros siete documentos.
Pero en el mundo académico, aún podría enumerar el artículo de 2015 (y omitir escandalosamente la errata) en mi CV, y enumerar el segundo documento que publiqué en 2017 que era la versión “correcta”, ya sea que creas que es otro asunto.
Peor aún, el artículo de 2015 todavía tenía “impacto”, y toda esa importante métrica académica. De hecho, hasta hoy la gente a veces lo cita todavía, incluso con una errata. Lo que también te hace preguntarte con qué frecuencia las personas leen los periódicos que citan. Además, ¿qué pasa con todos los artículos cuyos autores no fueron tan desapasionados y no publicaron erratas?
Incluso peor que esto, si ustedes fueran un académico que decidió pasar un tiempo escribiendo un código decente, bien documentado y verificable, existen muy pocas recompensas por hacerlo. Es casi imposible hacer una carrera con “documentos de código” (es decir, documentos que describen en detalle no un algoritmo o sus resultados, sino cómo se implementa en una computadora). Créanme, lo intenté. En cambio, el trabajo dedicado a mejorar un código es visto por el resto de la comunidad a menudo como un esfuerzo perdido. Después de todo, si “funciona” y produce “resultados”, entonces eso es todo lo que importa. Si esos resultados son necesariamente correctos o no importa menos de lo que cabría esperar.
Entonces, no solo no hay recompensa por una buena codificación, en realidad hay un incentivo perverso para no preocuparse demasiado por la calidad del código. Y eso es antes de hablar sobre escribir exámenes. Peor aún, pasar tiempo arreglando o mejorando un código no solo no se recompensa, sino que al reducir la producción de documentos impactantes, en realidad tiene un efecto negativo en las perspectivas de carrera. En otras palabras, el status quo recompensa la producción de códigos incomprensiblemente terribles como el de ICL, y castigaría activamente a cualquiera que haya pasado un período de tiempo tratando de mejorarlo.
Esto podría solucionarse si los académicos publicaran sus códigos. Pero dejando de lado algunas excepciones menores, no hay obligación de hacerlo desde las revistas. Y tampoco hay un incentivo interno para hacerlo, más aún si otros pueden ver cuán malas son las cosas. La narrativa sobre el modelo del grupo ICL en marzo habría sido muy diferente si este código se hubiera publicado con él, después de todo.
Pero debe ser arreglado. Debe haber una expectativa de que cuando se publican los resultados de un modelo, la herramienta utilizada para producirlos también lo es. Ya requerimos la publicación de la descripción matemática del algoritmo; con razón, un documento que no lo hizo sería rechazado. Por lo tanto, es un pequeño salto incluir también la implementación. Algunas revistas ya requieren la publicación de parámetros de entrada y archivos de datos de salida, por lo que esto es, en todo caso, simplemente completar el círculo.
Algunos académicos estarán preocupados de que serán “pillados” si publican sus códigos. Pero para ser así, hay que ver el problema completamente a la inversa: sí, otros podrían usar el código, si es claro e inteligible, por supuesto. Esto es mejor que el otro grupo escribiendo su propio código, igualmente secreto, probablemente igualmente grave. Hacerlo es un esfuerzo perdido. Igualmente, el argumento de que el código no debe publicarse para que otros no lo usen “mal” tampoco es válido. Otros pueden usar mal sus matemáticas por igual, y todavía publicamos eso.
Si fuera por mí, iría aún más lejos y requeriría que esos códigos también hayan publicado casos de prueba y pruebas de que la versión utilizada en el documento los aprobó. Además, necesitamos una progresión profesional adecuada para los académicos que codifican.
El código Covid-19 del Imperial College es posiblemente el peor código de producción que he visto. No digo esto a la ligera, he usado códigos de dinámica de fluidos con una herencia de la década de 1980.
Esto debería ser una llamada de atención para toda la academia, que necesita resolver las prácticas de codificación o, con razón, la gente comenzará a cuestionar los resultados. Para la astronomía teórica, este es un problema anodino. Para la epidemiología, es, literalmente, letal.

Fuente:
MENTE ALTERNATIVA

sábado, 9 de mayo de 2020

Modelo computacional que puso al mundo en cuarentena ha resultado ser ‘anticientífico y está lleno de errores’

El modelo computacional que puso al mundo en cuarentena ha resultado ser ‘anticientífico y está lleno de errores’. El código fuente completo del modelo computacional que impuso el Imperial College de Londres para predecir las tazas de propagación e infección de COVID-19, por fin ha sido publicado en GitHub. Y según una revisión completa practicada por un ex ingeniero de software anónimo de Google, el modelo está “tan profundamente plagado de errores” que literalmente “la información que produce es basura, independientemente de la información que se ingrese al mismo”. Este fue el modelo impuesto por la OMS a los tomadores de decisiones alrededor del mundo. Y el resultado que estamos experimentando a partir de este modelo “basura” es el de una cuarentena planetaria que está acelerando la destrucción de la economía global, que ya era de por sí insolvente antes de la crisis de COVID-16. Y realmente no sabemos si la cuarentena era necesario o no, porque aún no tenemos datos reales (aparte de los de Suecia), y en cambio sí tenemos la evidencia de un modelo computacional severamente defectuoso. La pregunta sigue siendo: ¿Por qué el equipo del Imperial College de Londres no se dio cuenta de que su software era tan defectuoso?
Fue un modelo computacional desarrollado por el Imperial College de Londres el que pronosticó 500,000 muertes en el Reino Unido (y 2.5 millones en los EE.UU.) lo que influyó a los tomadores de decisiones para optar por las cuarentenas totales en vez de aplicar un enfoque de “inmunidad colectiva” al estilo sueco.
El modelo fue desarrollado por un equipo encabezado por Neil Ferguson, (un charlatán) quien recientemente renunció a su puesto como asesor del gobierno del Reino Unido después de que un importante medio británico divulgó cómo el propio Ferguson violaba las directivas de cuarentena y aislamiento social para mantener una aventura amorosa con una mujer casada.
El código fuente detrás del modelo debía estar disponible para el público, y después de numerosos retrasos y excusas para hacerlo, finalmente se publicó en GitHub.
Un ex ingeniero de software anónimo de Google ha llevado a cabo una revisión del código, y dice que el código del repositorio de GitHub ha sido muy utilizado por los ingenieros de Microsoft y otros, en un esfuerzo por poner el código en forma para exponerlo de manera segura al público. Por desgracia, parecen haber fallado y en la versión lanzada persisten numerosos defectos y errores del software original. Las solicitudes de la versión sin editar del código original detrás del modelo no han recibido respuesta.
El resultado más preocupante de la revisión es que el código produce “resultados no deterministas”.

“Salidas no deterministas. Debido a errores, el código puede producir resultados muy diferentes con entradas idénticas. Rutinariamente actúan como si esto no fuera importante.
Este problema hace que el código sea inutilizable para fines científicos, dado que una parte clave del método científico es la capacidad de replicar resultados. Sin replicación, los hallazgos podrían no ser reales, ya que el campo de la psicología ha estado descubriendo su costo. Incluso si se lanzó su código original, es evidente que los mismos números que en el Informe 9 podrían no provenir de él.”
La documentación ofrece la racionalización de que las iteraciones del modelo deben ejecutarse y luego promediar resultados diferentes para producir un modelo resultante. Sin embargo, cualquier software decente, especialmente uno que esté creando un modelo, debería producir el mismo resultado si recibe los mismos datos iniciales, o “semilla”. Este código no lo hace.
La documentación dice:
“El modelo es estocástico. Se deben realizar varias ejecuciones con diferentes semillas para ver el comportamiento promedio.
‘Estocástico’ es solo un termino que suena muy científico para referirse a ‘aleatorio’. Eso no es un problema si la aleatoriedad es seudoaleatoria intencional, es decir, la aleatoriedad se deriva de una ‘semilla’ inicial que se itera para producir los números aleatorios. Tal aleatoriedad se usa a menudo en las técnicas de Monte Carlo. Es seguro porque la semilla puede registrarse y los mismos números (pseudo-) aleatorios producidos a partir de ella en el futuro. Cualquier niño que haya jugado Minecraft está familiarizado con la pseudoaleatoriedad porque Minecraft le da las semillas que usa para generar mundos aleatorios, por lo que al compartir semillas puede compartir mundos.
Claramente, la documentación quiere que pensemos que, dada una semilla inicial, el modelo siempre producirá los mismos resultados.
La investigación revela la verdad: el código produce resultados críticamente diferentes, incluso para semillas y parámetros iniciales idénticos.”
En un caso, un equipo de la Universidad de Edimburgo intentó modificar el código para poder almacenar los datos en tablas que harían más eficiente la carga y ejecución. Dejando a un lado los problemas de rendimiento, simplemente mover u optimizar de dónde provienen los datos de entrada no debería tener ningún efecto en la salida del procesamiento, dados los mismos datos de entrada. Sin embargo, lo que el equipo de Edimburgo encontró fue que esta optimización produjo una variación en la producción, “las predicciones resultantes variaron en alrededor de 80,000 muertes después de 80 días”, que es casi 3 veces el número total de muertes en el Reino Unido hasta la fecha.
Edimburgo informó el error al Imperial College, que lo descartó como “un pequeño no determinismo” y les dijo que el problema desaparece si se ejecuta el código en una sola CPU (lo que el crítico señala “está muy lejos de nuestra realidad con respecto a supercomputación”).
Por desgracia, el equipo de Edimburgo descubrió que el software todavía producía resultados diferentes si se ejecutaba en una sola CPU. Y no debería hacerlo, siempre que esté codificado correctamente. Ya sea que el software se ejecute en una sola CPU o en varios subprocesos, la única diferencia debería ser la velocidad a la que se produce la salida. Dadas las mismas condiciones de entrada, las salidas deben ser las mismas. Pero es así, y el Imperial College lo sabía.
“No obstante, así es como Imperial College usa el código: saben que se rompe cuando intentan ejecutarlo más rápido. Al leer el código resulta claro que en 2014 el Imperial intentó hacerlo usable en múltiples CPU para acelerarlo, pero nunca lo hizo funcionar de manera confiable. Se sabe que este tipo de programación es difícil y generalmente requiere ingenieros experimentados para obtener buenos resultados. Los resultados que cambian aleatoriamente de una ejecución a otra son una consecuencia común de los errores de seguridad de subprocesos. Más coloquialmente, estos se conocen como ‘Heisenbugs’.»
Otro equipo incluso descubrió que la salida variaba según el tipo de computadora en la que se ejecutaba.
“En el número 30, alguien informa que el modelo produce diferentes resultados según el tipo de computadora en la que se ejecuta (independientemente de la cantidad de CPU). Una vez más, la explicación es que, aunque este nuevo problema ‘se sumará a los problemas… Este no es un problema para ejecutar el modelo en su totalidad, ya que de todos modos es estocástico”.
La respuesta ilustra la pregunta candente: ¿por qué el equipo del Imperial College no se dio cuenta de que su software era tan defectuoso?
Debido a que su código está tan profundamente plagado de errores similares y lucharon tanto para solucionarlos que se acostumbraron a simplemente promediar los resultados de múltiples ejecuciones para ocultarlo … y finalmente este comportamiento se normalizó dentro del equipo.
La mayoría de nosotros estamos familiarizados con el adagio informático, “Garbage In / Garbage Out” (basura hacia dentro / basura hacia fuera) y el lector no capacitado podría pensar que eso es lo que se afirma en esta revisión del código. Pero no es así. Literalmente lo que se afirma es que lo que sale es basura, independientemente de la entrada.
En este caso, el resultado que estamos experimentando como resultado una cuarentena planetaria y de la economía global, y realmente no sabemos si esto era necesario o no, porque no tenemos datos reales (aparte de Suecia) y en cambio sí tenemos modelos severamente defectuosos.
Fuentes:
Lockdown Sceptics — Code Review of Ferguson’s Model.
MENTE ALTERNATIVA.