sábado, 3 de agosto de 2019

Reflexiones sobre computadores e IA



A mis profesores de Univalle Jaime Grú y Edgar Charry

Carlos, yo admiro muchos tus colegas que trabajan con computadores y tus amigos neurocientíficos, mas para un viejo devoto del arte, como yo, pensar que el centro de la vida está en el cerebro suena tan ingenuo como afirmar que el centro de la sexualidad está en los testículos (César Giraldo) 

Y aquí tocamos uno  de los temas más sorprendentes en la actualidad: el crecimiento exponencial de las tecnologías. Los jóvenes las absorben por los poros de la piel y los viejos tendemos a quedarnos con la boca abierta ante tanto volumen de información, complejidad de los nuevos dispositivos, cantidad de opciones a enfrentar y, sobre todo, la ansiedad por la respuesta sobre adónde iremos a llegar.   Cuando decimos exponencial nos referimos a algo que se duplica, cuadriplica, etc., a cada periodo de tiempo. Por ejemplo, el número de transistores que puede colocado en un circuito integrado de silicio se duplica aproximadamente a cada 2 años (teóricamente a cada 18 meses), y esto es conocido como la ley de Moore, en homenaje a Gordon Moore (uno de los fundadores de la Intel) quien describió el fenómeno en un famoso artículo en 1965. Por ejemplo, el primer microprocesador fabricado por la empresa Intel (llamado 4004) en 1971 tenía sólo 2.300 transistores. En 1984 este número llegaba a 134.000, y en 2015 alcanzaba el nivel de 1.750.000.000 transistores. Si un número k de transistores se duplicara a cada 2 años, en 10 años tendríamos un nuevo valor de k= k×25 lo que representa un crecimiento sorprendente en pocos años, que dejaría con la boca abierta a cualquier lector desprevenido. O sea, la ley de Moore es uno de los fenómenos ilustrativos de la exponencialidad ligada a las tecnologías que nos rodean.

La causa principal de la ley de Moore es la reducción del tamaño de los transistores que son diseñados sobre la pastilla de silicio de un circuito integrado (chip). Por ejemplo, en 1985 un transistor de un microprocesador tenía un tamaño en la faja de 1 μm (1 micrómetro). Podemos verificar que un hilo de cabello tiene un diámetro entre 60 y 120 μm. En el año 2000 se estaban fabricando procesadores con transistores de 0,13 μm (casi 10 veces menores). Ya en 2012 tenemos transistores de 22 nm (22 nanómetros, que es igual a 0,022 μm), y actualmente tenemos disponibles circuitos con tecnología de 10 nm. Para 2020 estaremos en la casa de los 5 nm, cuando llegaremos al límite de la tecnología del silicio. ¿Qué vendrá después? Esa es una pregunta difícil de responder, hasta para los propios especialistas en silicio, pues estructuras menores a 5 ns posiblemente deberán ser manipuladas a nivel atómico. 

Lo que se sospecha es el uso de nanotecnologías alternativas al silicio, como los nanotubos de carbono, estructuras que ya son usadas para fabricar transistores y memorias eficientes; o estructuras basadas en Memristors (palabra que agrupa los términos “memoria” y “resistencia”), que son dispositivos en que la resistencia no es constante sino que depende de la historia de la corriente que ha fluido previamente a través del dispositivo. O la computación cuántica, una idea que promete altos niveles de paralelismo.

La predicción de Gordon Moore duró unos 50 años, pero ya no se cumple. Por ejemplo, 2010 un microprocesador Intel tenía unos 1.170.000.000 de transistores. Si la ley de Moore hubiera continuado, podríamos haber esperado que los microprocesadores en 2016 tuvieran 18.720.000.000 transistores. En cambio, el microprocesador Intel equivalente tenía sólo 1.750.000.000 transistores, un desfase de un factor de 10, de lo que la ley de Moore hubiera predicho. Estos datos contradicen lo que la mayoría de las personas afirman, erróneamente, sobre la actual vigencia de la ley de Moore. 

Por algunos aspectos tecnológicos, el decremento del tamaño de los transistores permitió conmutar los procesadores a frecuencias más altas. La conmutación es hecha por un reloj (clock) que sincroniza todas las actividades dentro de un procesador. Por eso este tipo de dispositivos son llamados de circuitos síncronos. Para entender mejor este concepto podemos recordar las navegaciones en el imperio romano, donde los remeros eran sincronizados por un tambor tocado sincronizadamente. O por el ritmo generado por un metrónomo que es impuesto por el director a los instrumentistas de una orquesta sinfónica. 

La frecuencia del reloj es definida en Hercios (Hz) en donde un Hz representa una oscilación por segundo. En este sentido el aumento de la velocidad del reloj fue de poco menos de 1 MHz (1 megahercio, o un millón de oscilaciones por segundo), en la década de 1970, para alrededor de 3–4 GHz (gigahercios) en los días actuales. Pero de acuerdo con las previsiones iniciales, la frecuencia del reloj debería estar actualmente en la casa de los 20 GHz. La previsión falló por un hecho muy simple: entre mayor sea la frecuencia del reloj el circuito disipará más energía, y por esto se calentará más. Este efecto de calentamiento indebido fue contrarrestado inicialmente con la disminución de la tensión de alimentación de los circuitos integrados. Por ejemplo, los primeros procesadores eran alimentados con tensiones de 5 voltios, y actualmente suelen ser alimentados con tensiones de 1,3 voltios. El problema es que no se puede bajar más la tensión de alimentación de los procesadores pues comienzan a ocurrir problemas de pérdida de las informaciones que están siendo computadas.

En este sentido Robert Dennard observó en 1974 que la densidad de potencia era constante para un área determinada de silicio, incluso a medida que aumentaba el número de transistores debido a las dimensiones más pequeñas de cada transistor. Sorprendentemente, los transistores podrían trabajar más rápido y disipar menos potencia, y no calentarse hasta quemarse. Pero la vigencia de la ley de Dennard terminó alrededor de 2004, porque la corriente y el voltaje no podían seguir bajando, como explicado anteriormente, y aún así mantener la fiabilidad de los circuitos integrados. Este fenómeno de sobrecalentamiento de los procesadores obligó a la industria a tomar otros caminos para aumentar el desempeño de los procesadores, sin tener que aumentar la frecuencia del reloj, y representa un límite de la tecnología actual de fabricación de chips digitales, específicamente la tecnología CMOS (Complementary Metal-Oxide-Semiconductor). Como siempre, es posible crear un término para describir los problemas, y los ingenieros han llamado a este fenómeno de power-wall

Así la industria de los microprocesadores  se vio obligada a utilizar múltiplos procesadores, o núcleos eficientes dentro de un chip (las arquitecturas multi-core), en vez de un único procesador ineficiente. De hecho, en 2004 Intel canceló sus proyectos de un único procesador de alto rendimiento y se unió a otros fabricantes para declarar públicamente que el camino hacia un mayor rendimiento sería a través de múltiples procesadores por chip, en lugar diseñar mono-procesadores más rápidos. O sea que las esperanzas de aumentar el desempeño de sistemas computacionales recayeron sobre la exploración del paralelismo (en el diseño de las aplicaciones), es decir, en los programadores.

Pero la exploración del paralelismo a nivel de instrucción (ILP– Instruction-Level Parallelism) ya era realizada en los diseños mono-procesador, usando estructuraras de múltiplas líneas de montaje, tal como ocurre en las fábricas de la industria automovilística. O sea, las instrucciones que componen un programa son encaminadas para varias lineas de montaje (pipelines), visando una aceleración en la ejecución de los programas. De esta manera, si una fábrica es capaz de producir 2 carros por día, usando 2 lineas de montaje independientes, un procesador podría ejecutar 2 instrucciones por unidad de tiempo usando 2 pipelines

Podemos verificar que el paralelismo fue la salida que encontró la computación como panacea para sus sufrimientos, tal como ocurrió en la música occidental, que buscó libertarse de la monotonía melódica-litúrgica con la invención de la polifonía (casi 3 siglos atrás) –la música basada en acordes, que explora la simultaneidad (regida por formulaciones matemáticas) de las sensaciones sonoras, sin renunciar a los efectos melódicos. O sea, todo ocurrió con objetivos de desempeño, con el fin de explorar las posibilidades sensitivas del oido humano. 

Pero el paralelismo ofrecido por los chips multiprocesadores representa un gran desafío, pues los programadores y sus herramientas (como los compiladores) deben ser capaces de explorar el paralelismo ofrecido por las arquitecturas computacionales. Pero este no es un problema trivial. Esto ocurre porque todo lo que los programadores hacen es resolver problemas, codificándolos usando lenguajes de programación, y no siempre los problemas se dejan resolver vía paralelismo. 

Un ejemplo claro es ejecutar un problema que consiste en calcular un conjunto de dos instrucciones como este: A = B + D y C = A + Q. Podemos verificar que para calcular C necesitamos primero tener el valor de A. O sea que el cálculo de C debe esperar siempre por el cálculo de A, a pesar de que podamos tener 2 procesadores disponibles para este programa simple. Este tipo de problema es definido como dependencia de datos, siendo el talón de Aquiles para la computación paralela. 

Entonces verificamos que todo problema puede tener partes intrínsecamente seriales, que no se dejan paralelizar, y partes que realmente son paralelas y que podrían ser aceleradas mediante el uso de arquitecturas del tipo multiprocesadores. Este problema fue verificado por Gene M. Amdahl, estableciendo límites prácticos para la cantidad de núcleos útiles por chip. Si el 10% de la tarea es serial, el beneficio de rendimiento máximo del paralelismo es 10, sin importar cuántos núcleos coloque en el chip. O sea que no importa cuantos procesadores tengamos disponibles, pues si las tareas tienen características seriales, sólo un procesador estará activado, mientras que los otros estarán en la banca de reserva. Este fenómeno es conocido como la ley de Amdahl.

El problema de explorar el paralelismo en las instrucciones está anclado en otro problema fundamental: el paradigma de computación de von Neumann, que es la base de la mayoría de los procesadores actuales, y de todos sus males. Este modelo computacional asume que un problema debe ser resuelto mediante una ejecución secuencial de instrucciones, que son almacenadas en la memoria del computador. O sea, las instrucciones de un programa residen en la memoria del computador, y deben ser transferidas, una a una, para dentro del procesador, pues sólo allí pueden ser ejecutadas. Así, el modelo sedimentado por el matemático John von Neumann es claramente burocrático, pues tenemos memoria, procesador (CPU) y líneas de comunicación entre estos dos elementos (llamados de buses). La memoria debe informar al procesador que está con instrucciones listas para ejecución, el procesador debe responder que también está listo, la memoria anuncia que acaba de enviar la instrucción, el procesador debe responder ok, y así sucesivamente. Y en este esquema los buses de comunicación se sobrecargan de informaciones, tal como la avenida 5a de Cali, en vísperas de un día de fiesta prolongado. 

De esta manera, otras variaciones de computación están siendo discutidas para superar las restricciones del modelo de ejecución basado en conjuntos de instrucciones (el malévolo paradigma de von Neumann): el paralelismo a nivel de datos (DLP– Data-Level Parallelism), el paralelismo a nivel de threads (TLP– Thread-Level Parallelism) y el paralelismo a nivel de solicitud (RLP–Request-Level Parallelism).  

Mientras que el compilador y el hardware favorecen la exploración implícita de ILP (Instruction-Level Parallelism) sin la intervención del programador, las propuestas de DLP, TLP y RLP son explícitamente paralelas, lo que requiere la reestructuración de la aplicación para que se pueda explotar el paralelismo explícito. En algunos casos, esto es fácil. Pero en su mayoría es una sobrecarga para los programadores, y este problema no tiene una solución definitiva prevista a medio plazo. 

Por otro lado, no existe una correlación perfecta entre la ley de Moore y el aumento del desempeño de los procesadores, y muchas personas afirman, erróneamente, que el desempeño de los computadores se duplica a cada 2 años, tal como lo sugeriría la ley de Moore. 

Para ilustrar esto, antes de mediados de la década de 1980 el crecimiento en el desempeño de los procesadores estaba en gran medida impulsado por la tecnología y promediaba alrededor del 22% por año, o duplicándose a cada 3,5 años (recordar que la ley de Moore prevé una duplicación a cada 2 años). Entre 1986 y 2003 hubo un incremento substancial, llegando a alcanzar un crecimiento de 52% al año (o sea, se duplicaría a cada 2 años), lo que es atribuible a la aplicación de ideas de arquitecturas y organización de computadores más avanzadas, basadas en arquitecturas RISC (un tipo de arquitectura que visa el uso de instrucciones lo más simples posible). En 2004, los límites de disipación de potencia debidos al final de la ley de Dennard (que explica el sobrecalentamiento de lo chips) y el paralelismo en nivel de instrucción (ILP) disponible redujeron el rendimiento del procesador a un 23% por año, hasta 2011 (o sea, se duplicaría sólo a cada 3,5 años). De 2011 a 2015, la mejora anual fue inferior al 12% (se duplicaría a cada 8 años), en parte debido a los límites del paralelismo de la Ley de Amdahl. Desde 2015, con el el final de la Ley de Moore, la mejora ha sido de sólo del 3.5% anual; o sea se duplicaría sólo a cada 20 años. O sea, el desempeño de los procesadores tuvo, en general, un crecimiento  inferior a la métrica de la ley de Moore, facto bien evidente en los últimos años.

Una pregunta importante es cómo los ingenieros de computadores verifican el desempeño de sus máquinas. En el comienzo usaban algunos conceptos básicos, que cualquier persona podría imaginarse, tales como el número de instrucciones ejecutadas por unidad de tiempo (MIPS: millones de instrucciones por segundo), o el número de operaciones matemáticas en punto fluctuante, un formato numérico para representar grandes números (MegaFlops: millones de operaciones en punto fluctuante por segundo). Sin embargo, por la diversidad en las arquitecturas de computadores imaginadas por los ingenieros, y porque era difícil comparar máquinas con un sólo criterio (tal como ocurre en las ciencias humanas, y en el arte), el desempeño comenzó a ser medido usando un conjunto de problemas, escogidos a dedo y usados por un pacto de caballeros. Estos conjuntos de ejemplos representan problemas de procesamiento de imágenes, procesamiento de señales, inteligencia artificial y temas por el estilo, representando puntos de referencia (benchmarks) para comparaciones. O sea, el desempeño de los procesadores es evaluado de la misma forma que en los atletas de los juegos olímpicos: todos deben ser sometidos a las mismas pruebas, sobre las mismas condiciones. Gana quien realizar más rápido su ejercicio. 

Propuestas basadas em DLP (Data-Level Parallelism) son interesantes, pues prevén que un sistema tenga como entrada únicamente los datos, sin necesitar a ejecución de instrucciones. Un ejemplo claro son las redes neuronales artificiales (ANNs– Artifical Neural Networks), propuestas en los primordios de la computación al comienzo de los años 40 por el neurofisiologista Warren McCulloch y el matemático Walter Pitts. En 1949, Donald Hebb escribió “The Organization of Behavior”, un trabajo que señalaba el hecho de que las vías neuronales se fortalecen cada vez que se usan, un concepto esencial para la forma en que los humanos aprenden. Si dos nervios se disparan al mismo tiempo, argumentó, se mejora la conexión entre ellos. 

En 1956, la reunión de Dartmouth sobre Inteligencia Artificial proporcionó un impulso tanto a la Inteligencia Artificial (IA) como a las Redes Neuronales (ANNs). Un resultado de este proceso fue estimular la investigación de IA en la parte del procesamiento neural. En los años posteriores al proyecto Dartmouth, John von Neumann sugirió imitar funciones neuronales simples utilizando relés telegráficos o tubos de vacío. Además, Frank Rosenblatt, neurobiólogo, comenzó a trabajar en el Perceptron, una red neural de múltiples camadas, como una estructura más compleja, en que las neuronas son agrupadas en camadas, y cada camada tiene una conexión definida con la camada siguiente. 

La idea era crear sistemas de computación que pudieran conectar pequeñas estructuras (neuronas artificiales) por medio de conexiones (sinapsis artificiales), que serían ponderadas con valores (refuerzos en la sinapsis), previamente calculados mediante algoritmos de entrenamiento apropiados. 

Es importante enfatizar que nuestro cerebro no tiene nada que ver, en su funcionamiento, con el paradigma burocrático de von Neumann. O sea, no ejecuta ninguna instrucción. En verdad, los datos (señales neurales) viajan, se refuerzan o se atenúan en las sinapsis, dinámicamente, mediante procesos electro-químicos conforme las vivencias de los humanos. Procesa datos, se automodifica en su estructura dinámicamente, y no existe separación entre lo que podemos llamar de memoria y sistema de procesamiento (al contrario de lo que ocurre con el paradigma de von Neumann). Así afirmar que nuestro cerebro es un computador es bastante cuestionable. 

El problema de imitar el dinamismo del cerebro es un gran desafío para los ingenieros de computación, pues las plataformas de hardware no permiten imitar este dinamismo, pues el cerebro se entrena y resuelve los problemas de manera simultanea. Lo que tenemos actualmente son programas que son ejecutados en arquitecturas tipo von Neumann, y que emulan las estructuras de las ANNs, siendo entrenadas off-line para resolver cada tipo de problema, para posteriormente ser utilizadas efectivamente. 

Una luz al final de túnel, en los problemas del modelo de von Neumann, es que tecnologías emergentes están permitiendo implementar realmente ANNs en plataformas de hardware (no en software), que pueden ser reconfiguradas dinámicamente. Esto en principio permitiría emular el dinamismo en las interconexiones de las neuronas, tal como ocurre en nuestro cerebro. Estas plataformas son conocidas como FPGAs (Field Programmable Gate Arrays), y empresas como Intel las están utilizando masivamente en sus nuevos proyectos de arquitecturales. 

De cualquier manera, la historia de las ANNs no ha sido fácil pues en los años 60 Marvin Minsky y Seymour Papert demostraron limitaciones serias de ANNs de una camada. Esto desató el primer periodo de invierno en esta área de investigación, lo que retrasó su desarrollo en los años posteriores. En los años siguientes fue demostrado que tales limitaciones eran superadas por el aumento del número de camadas en las redes. Actualmente existe mucho dinero para investigación en redes neurales de múltiples camadas (redes neurales profundas, deep-ANNs). En general área es llamada de aprendizaje profundo (Deep-Learning). 

Paradigmas basados en flujo de dados (en vez de flujo de instrucciones) representan una área de punta en el proyecto de nuevos computadores. Sobre todo por el paradigma de von Neumann es ineficiente para procesar grandes volúmenes de datos (big-data), debido a sus problemas burocráticos y por su ineficiencia para explorar el paralelismo intrínseco de los algoritmos. Además de esto, existe el problema de su alto consumo de energía, un efecto colateral de este paradigma. 

En este sentido, nuestro cerebro es altamente eficiente del punto de vista de consumo de energía, si comparado con los computadores más potentes de la actualidad. Las neuronas cambian sus conexiones de manera dinámica y eficiente del punto de vista energético, sin seguir estándares predefinidos, con comportamientos que sólo pueden ser modelados por estructuras probabilísticas y estadísticas, tal como ocurre en la física cuántica. Nada mejor que esconder los secretos de la inteligencia y de la conciencia usando una estructura aleatoria en sus principios de funcionamiento. Y como si fuera poco, nuestro cerebro no usa un reloj para sincronizar sus tareas (es un sistema asíncrono), y su funcionamiento ocurre por mecanismos aún oscuros para los neurocientíficos. 

Si Einstein se recusó a aceptar los principios de la física cuántica diciendo que “Dios no juega a los dados con el universo”, tal vez se quedaría con la boca abierta si supiera sobre el comportamiento errático, misterioso y aleatorio de nuestro sistema neuronal. 

Lo que nos depara el futuro es un redireccionamiento para arquitecturas basadas en flujo de datos, implementadas sobre nuevas nanotecnologías, que permitan imitar más fidedignamente las redes neuronales naturales, con nuevas técnicas de entrenamiento, que sean válidas para resolver diferentes tipos de problemas, de manera más flexible y dinámica, tal como ocurre con nuestro sistema nervioso, y con capacidad de trabajar con grandes volúmenes de datos; y tal vez con una mejor eficiencia energética. 

Si es verdad que los humanos tienden a hacer herramientas que se parezcan con ellos, sin duda que el computador tiene este apelo. Lo que veremos serán plataformas integrando gran capacidad de recursos, tal como ocurre con los teléfonos celulares, que agrupan poderosas arquitecturas de computadores, sistemas de telefonía sofisticados, antenas, sensores, actuadores y poderosos sistemas de inteligencia artificial, interconectándose con sistemas en nuve (cloud-computing). Hasta dónde va a llegar esta capacidad de integración sólo el futuro lo dirá. 

Pero ya podemos sospechar que las tecnologías de IA, de realidad aumentada, realidad virtual y cosas por el estilo vendrán a ser integradas a nuestro sistema neuronal, tal vez mediante implantes, o estructuras vestibles, lo que nos permitirá vivir nuevas realidades nunca imaginadas. Esto nos obliga a replantearnos preguntas milenarias como la naturaleza de la realidad y de nuestra propia identidad, más allá de lo que las religiones nos cuentan, o de lo que la ciencia des-cubre, o de lo que las ideologías nos imponen.

Nota: varios datos tecnológicos colocados aquí están documentados en la literatura especializada. Muchas informaciones sobre el tema ya están sedimentadas en la última edición del libro clásico de Hennessy y Patterson "Computer Architecture".