¿Se puede utilizar Machine Learning en PHP?

 Machine Learning en PHP y Raspberry pi


Vamos al grano, a lo que interesa. La pregunta del millón. ¿Se puede utilizar Machine Learning en PHP? y la respuesta tan esperada por los que lo preguntan.... pues es un.... !!!!! y ya que estamos... ¿Se puede utilizar Machine Learning en PHP en multiprocesadores con multihilo? pues.... , también!!!!! y si no fuese mucho pedir... ¿Se puede utilizar Machine Learning en PHP en multiprocesadores con multihilo en una Raspberry pi? pues.... , también se puede. Qué subidón!!! vamos a intentar rizar el rizo, a ver que me respondes ahora.  ¿Se puede utilizar Machine Learning en PHP en multiprocesadores con multihilo en una Raspberry pi 2 B con 512Mb de ram, 1 solo procesador a 700Mhz y 1.000 threads a la vez? pues claro que  (o incluso más Threads 😱), pero nos hemos pasado tres pueblos (tres pueblos por no decir más). ¿Para que quieres tener tantos hilos en un solo procesador realizando cálculos de aprendizaje profundo 😨? Realmente absurdo. ¿entonces por qué me dices que sí se puede hacer? Porque lo he probado y funciona 😅.
Una cosa es que se pueda y otra que se aconseje. Ya hablaremos de esto, porque como investigación, aprendizaje o realización de pruebas sí que se puede, y personalmente aconsejo investigar y hacer pruebas para ver 'qué pasa', si aguanta, etc..., sirve para captar nuevas ideas o soluciones, pero no es útil en producción. Haré próximamente una entrada en el blog explicando mis experiencias con la Inteligencia Artificial y otras 'salvajadas' con resultados verdaderamente impresionantes que he probado en la Raspberry Pi.

Ala!!!!!! que guay... ya era hora de encontrar la solución a todos mis problemas!!!!!

Ahora entran en escena los verdaderos expertos de ML... que si la velocidad del proceso, que si procesos en paralelo, que si multiprocesador, que si multihilo, que si la GPU con Tensorcores, que si CUDA, que si NVIDIA, que si Tensorflow, que si mejor en python o C, que PHP es un lenguaje interpretado, que ya verás cuando haga el backpropagation, que ni loco utilices una Raspberry para hacer Machine Learning (vaya... esto yo lo he hecho. Mirad la foto de arriba 😁), que si chistes del tipo: que te van a dar las uvas esperando a que acabe, o que cuando acabe de aprender tu primer modelo, tu hijo ya irá a la universidad, ......

Pues sí.... también tienen razón y hay que entender la posición de cada una de las partes.

Cuando se crea el primer programa en PHP destinado al Machine learning con los ejemplos más habituales para solucionar el problema XOR, veréis que funciona bien, rápido incluso en una Raspberry Pi dando valores de ejecución de 0 segundos para 1.000 épocas, por ejemplo. Entonces.... ¿donde está ese gran problema de la velocidad del que todo el mundo habla?

Pues bien. Cuando nos disponemos a utilizar datasets reales existen muchas casuísticas: hay que utilizar decenas o centenas (incluso miles) de datos en los nodos de entrada, número de nodos de salida, de capas ocultas y número de neuronas (perceptrones). No existe una norma concreta para saber cuantos nodos o capas necesitaré. Actualmente la ciencia cierta será la de prueba y error. La gran cantidad de cálculos es exponencial al tamaño, por no hablar de la ingente cantidad de datos que hay que entrar en cada época y de las innumerables pruebas con diferentes configuraciones para hallar el modelo más eficiente, evitar el overfitting, ajustes del parámetro de la tasa de aprendizaje, y en el peor de los casos, tener que revisar las entradas que damos a los Inputs para detectar datos erróneos que nos hace bailar el modelo o que no llegue al mínimo del resultado esperado, modificar el número de nodos de entrada o salida.... y vuelta a empezar con los test de entrenamiento, y piensas.... vaya.... esto está tardando un poco más de lo que yo creía..... y ves que el proceso tarda, y tarda, y tarda cada vez que realizas una nueva prueba. Entonces es cuando os dais cuenta de que realmente los expertos tenían muchísima razón. En serio... os acordaréis de ellos y veréis que sólo intentaban ayudaros, que no tenían nada en contra del PHP. El uso de maquinaria específica y software especializado agiliza los procesos cientos de veces. Tengo intención de publicar algunos benchmarks para que os podáis hacer una idea de los tiempos que estamos hablando cuando hablamos del deep learning y de la necesidad imperativa de agilizar la velocidad de estos cálculos.

En serio. Si no fuese tan necesaria la velocidad.... ¿Se habrían inventado los Tensorcores de las GPU'S NVIDIA casi dedicadas exclusivamente al mundo de la IA?, ¿Google tendría una granja de servidores para ofrecer servicios exclusivos de Deep Learning en máquinas gigantes de exagerado consumo de procesos, ofreciendo alquiler por uso de CPU o GPU?

Vaya.... pues me has tirado por tierra todos mis planes. Yo necesitaba hacerlo en PHP y me había hecho ilusiones. ¿Y ahora qué?

Espera.... Tranquil@..... No tires la toalla aún. en serio, no todo está perdido. Te voy a dar aliento para poder hacer realidad tu sueño de realizar DEEP LEARNING en PHP con MULTIPROCESOS ejecutándose todos ellos a la vez en MULTI CPU'S. No es mi intención discutir entre si hay que dedicar software y hardware exclusivo para el Deep learning o que si es una salvajada hacerlo con PHP, únicamente trato de dar soluciones alternativas a unas necesidades específicas. Para mí la decisión es clara y PHP se queda corto, pero no es un inútil.

Las personas que buscan desesperadamente un sistema como el aquí expuesto responde a las siguientes necesidades:

  • Programadores demasiado habituados o dependientes de PHP. Algo así como tener Overfitting de PHP.
  • Imposibilidad o limitación de paquetes que se pueden instalar en los servidores de producción. Muchas veces en hosting compartidos.
  • Pocos recursos para empezar en el campo de la Inteligencia Artificial pero con muchas ganas de aprender. PHP es accesible, fácil de entender, implementar y de instalar. Para aprender Inteligencia Artificial desde 0 es muy buena opción.
  • Poco tiempo para estudiar o adaptarse a los diferentes y nuevos lenguajes de programación porque muchas veces la solución requieren de una actuación inmediata.
  • Existen programadores que han desarrollado sistemas enteramente en PHP y necesitan implementar nuevas y actuales soluciones basadas en IA. Hacerlo íntegramente en PHP solucionaría muchísimos problemas de implementación.
Mi caso en concreto. He pasado por muchísimos lenguajes de programación, teniendo que cambiar en cada versión de sistema operativo o de lenguaje de programación muchísimas configuraciones en el sistema y actualizaciones nuevos de componentes, solucionar múltiples y nuevas incompatibilidades, etc... hasta llegar a ser procesos constantes y tediosos. Desde que empecé a trabajar con MySQL, PHP y Apache, todo lo anterior ha quedado eliminado casi al 100%. Todas las aplicaciones desarrolladas hace decenas de años están lejísimos de quedar obsoletas a día de hoy, con un uso continuado y 100% estables (tanto en la forma de haberlo programado como en los servidores utilizados, normalmente GNU/Linux y de hosting compartido muchas veces) , por lo que este entorno de trabajo para mí es ideal, perfecto, fantástico, compatible, de calidad, ágil, estable, robusto y duradero en el tiempo. Entonces, ¿por qué no crear librerías concretas de IA dirigido a este tipo de público tan extendido, aunque no sea la opción más optimizada? Con una instalación muy básica y sencilla al alcance de cualquiera sin grandes conocimientos de sistema operativo, esto es muy factible.

He encontrado una solución mixta que soluciona quizás 1/3 de los problemas de velocidad (sin entrar en entornos de GPU o lenguajes compilados), que ya es mucho y aunque insuficiente para gran cantidad de usuarios, por otra parte, facilitará la vida de otros muchísimos programadores. He colgado en Github una librería de Machine learning que he escrito en PHP con las siguientes características:
  • Código escrito en Puro PHP. No hay que instalar absolutamente nada. Se puede utilizar tanto en servidores de pruebas como en los de producción o hosting compartido.
  • Puede importar/exportar en formato JSON la configuración de la red neuronal aprendida.
  • No hay límite (a excepción de la memoria) en el número de capas ni nodos.
  • Cada capa puede tener una función de activación diferente.
  • Funciones de activación implementadas: sigm, tanh, relu.
  • Incluye parámetro de tasa de aprendizaje.
  • Funciona tanto en entornos windows como GNU/Linux.
CONSEJO: Lo mejor que podéis hacer es entrenar vuestros modelos localmente en un servidor de pruebas en entorno CLI, y con el mismo código y datos exportados en JSON, utilizarlo en los servidores de producción (hosting compartido, servidores web o lo que queráis), con vuestro modelo ya entrenado.

Aún no, pero muy pronto.


Esta librería en su versión 1.0.1 aún no utiliza multithreads, por lo que por muchos procesadores que tengas, lamentablemente, aún trabajará en una única CPU.

O sea.... que me estás hablando de PHP en multihilo y multiprocesadores y ¿ahora me dices que solo funciona en un solo procesador? ¿en qué quedamos?

Paciencia. Tengo casi a punto la siguiente versión que sí funciona con multithreads, multiproceso, multihilos, multi cpu's, etc.... De hecho ya funciona a la perfección, pero antes de publicar el código hay que realizar varias pruebas en diferentes entornos y con diferentes datos, limpiarlo, ordenarlo para que sea claro para cualquier programador, y estoy en ese proceso, pero os aseguro promete muchísimo. Lo que os puedo avanzar es que las pruebas de momento son satisfactorias, y sí, utilizando todos los procesadores del sistema, con Puro PHP.

Os dejo unos enlaces a unas librerías que podéis utilizar en PHP para empezar con el Deep Learning. Todas están correctamente documentadas. No creo que tengáis ningún tipo de problema para implementarlas.

  • Código de la librería Machine learning en Puro PHP
https://github.com/vivesweb/rn-Neural-Network-in-pure-PHP-ML-AI

 

He liberado también una librería que se utilizará en la próxima versión y que os pueden ser muy útiles en los primeros pasos de aprendizaje del Machine Learning:
  • Código de la librería para gestionar los datos Train, Validation & Test, tanto para los inputs como los outputs deseados, directamente gestionando los datos .CSV en paralelo. Utilidades como por ejemplo ordenar aleatoriamente los datos de entrada y de salida manteniendo la correspondencia entre ellos o bien dividir los datasets en varias partes para obtener datos de entrenamiento, datos de validación y datos de test:
https://github.com/vivesweb/csv_pair_file

 

Y por último, os dejo con otra librería que también se utilizará en la próxima versión y que os puede ser de mucha utilidad para otros proyectos:
  • Código para el control de los recursos del sistema (Temperatura de la CPU/GPU, memoria, almacenamiento, sistema operativo, .....): 
https://github.com/vivesweb/system-resources

 

De momento os dejo con esto. Paciencia que ya queda poco. En el próximo capítulo de Machine learning en PHP os explicaré detalladamente como se ha creado la versión Multithread en Puro PHP, así como los problemas y soluciones encontrados, el uso de las nuevas librerías que os he enlazado arriba y ventajas/desventajas del sistema.

Todo es aprender para mejorar nuestros conocimientos.

Comentarios

Artículos más populares

Clase en PHP para encender/apagar LED en Raspberry pi

Raspberry Pi. Encender/Apagar LED desde PHP. Acceso directo a los puertos GPIO ultrarápido.

Ja es poden veure els programes de 'REDES' de TVE2 per internet