El desarrollo de modelos basados en Machine Learning con Python son caros, temporal y computacionalmente hablando. Reducir el tiempo (y la CPU!) invertido en desarrollar un modelo de Machine Learning es importante, especialmente si usamos entornos cloud como AWS.
En esta charla introduciremos cómo funciona a alto un modelo de Machine Learning y las fases por las que pasa para llegar a ser un modelo en producción. Posteriormente, introduciremos GraalVM, la nueva máquina virtual del ecosistema Java que es capaz de ejecutar código en Python y R mejorando considerablemente su rendimiento.
diseño de una linea de produccion de jabon liquido.pptx
Machine Learning ¿A TODO GAS? con GraalVM
1. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Machine learning
a todo gas?
Con graalvm
Francisco Javier Barrena Castillo
@DogDeveloper
2. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Who’s that guy
• Actualmente Security Advocate & Software Architect en
@ITI_TIC
• Formerly Director de Innovación en Ingeniería del
Software en Instituto Tecnológico de Informática
@ITI_TIC
• +10 años con proyectos comerciales
• Actualmente en proyectos de I+D
• Big Data, Machine Learning, Cloud Computing, etc…
• Formerly CTO en www.onlyeco.com
• Buscador de viajes ecosostenibles
• Actualmente EcoDeveloper Advocate
• Formador y ponente
• +40 cursos impartidos
• +40 charlas
https://www.linkedin.com/in/fjbarrena
https://twitter.com/DogDeveloper
https://github.com/fjbarrena
3. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Yo no se de Machine Learning
• Pero he trabajado de cerca con los que si saben
Who’s (not) that guy
Miguel Bravo
Senior Data Scientist at ITI
@MiguelBraarr
Raúl Hussein
Head of Advanced Data
Analysis Services at ITI
@rahusga
Pablo Ruiz
Senior Data Scientist at ITI
@pabruva
Joan García
Senior Data Scientist at ITI
@Jge_Ryu
4. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Lo que sí he hecho es arquitecturar y ejecutar proyectos con un
fuerte componente de Machine Learning
• Y he compartido sufrimiento con los científicos de datos
• Escasez de recursos de cómputo
• Reservas enteras de clústers durante semanas para computar un modelo
• Broncas de sistemas
• Incomprensión de otros usuarios del clúster
• Tomas de decisiones absurdas
• Etc…
Entonces…
9. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• La detección de malware/ransomware es difícil
• Los sistemas de detección clásicos funcionan en base a firmas
• Enormes bases de datos de firmas
• Básicamente:
El problema
SHA-256
9b65579cdad2eb30aec80b1b2f39e58996e24769964760fd64cfbdf84bbbb274
Obtiene el catálogo de firmas
Analiza adjuntos
Si las firmas coinciden, tenemos malware
10. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• La detección de malware/ransomware es difícil
• Los sistemas de detección clásicos funcionan en base a firmas
• Enormes bases de datos de firmas
• Básicamente:
El problema
SHA-256
9b65579cdad2eb30aec80b1b2f39e58996e24769964760fd64cfbdf84bbbb274
Obtiene el catálogo de firmas
Analiza adjuntos
Si las firmas coinciden, tenemos malware
11. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Pero…
El problema
Modifican su código fuente
SHA-256
db5179f7ecf6706a984c9ec1fa41495347cc08397cbc0d72f342fe1c9e428870
12. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• No podemos centrarnos en el aspecto (lo que es, o dice que es)
• Tenemos que centrarnos en el comportamiento (lo que hace)
• El comportamiento es difícil de cambiar, y más aún
automáticamente
• Para que el ransomware cumpla su función, tiene que seguir una
serie de pasos. Por ejemplo:
• Conectarse a un servidor malicioso para descargar la clave de encriptación
• Inspeccionar el disco, para guardar en un array las rutas que quiere
encriptar (puede que sean todas!)
• Empezar a encriptar las partes más importantes, pero que menos alarman
(documentos, presentaciones, etc.)
• Modificar el arranque del sistema para mostrar el mensaje que pide el
rescate
La solución
13. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Una aproximación es capturar tráfico de la red interna con
WireShark
• Esto nos dará un dataset GIGATRÓNICO
• De manera controlada, hemos lanzado algunos ataques a la red
cuyo resultado conocemos
• Recogidos los datos, y sabiendo los efectos de los ataques
lanzados (qué paquetes TCP generan, con que información, etc.)
pasamos el dataset en bruto por una fase de transformación y
alineamiento de datos
• El resultado es un dataset etiquetado: malicioso, no-malicioso
La solución
14. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Ya con el dataset ‘curado’, iniciamos una fase de training
• Una vez finalizada la fase de training, ya tenemos listo un modelo
de Machine Learning de detección de ataques de red
• En realidad que solo detecta un tipo de ataque…
• Pero el proceso podría ser válido y reutilizable para el resto de ataques
• En resumen, es un clásico problema de Machine Learning:
• Supervised Learning
• Problema de clasificación
La solución
15. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
•Logistic Regression (clasificadores lineales)
•Naive Bayes Classifier (clasificadores lineales)
•Nearest Neighbor
•Support Vector Machines
•Decision Trees
•Boosted Trees
•Random Forest
•Neural Networks
Algoritmos de clasificación
17. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Los modelos de Machine Learning dependen de los datos
• Cuantos más datos hayan disponibles, mejor será el accuracy del
modelo à Acertará más
• De hecho, el Machine Learning resurgió de sus cenizas gracias al
Big Data
• Como concepto, es de los 50
• Pero no podíamos procesar los datos suficientes para que fuera una
alternativa viable
• But now…
• Básicamente el Machine Learning es esto
pero por qué cuesta tanto!
18. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Poner nube de fotos con todos los que hacen Machine Learning en el ITI
• Los modelos de Machine Learning dependen de los datos
• Cuantos más datos hayan disponibles, mejor será el accuracy del
modelo à Acertará más
• De hecho, el Machine Learning resurgió de sus cenizas gracias al
Big Data
• Como concepto, es de los 70
• Pero no podíamos procesar los datos suficientes para que fuera una
alternativa viable
• But now…
• Básicamente el Machine Learning es esto
19. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Primer problema entonces… necesito ZILLONES de datos, y eso
cuesta
• Pero no es lo único…
• Están, además, las herramientas que se utilizan…
• Predilección por lenguajes interpretados como Python
• Los lenguajes interpretados necesitan de mucho backtracking
• El lenguaje no sabe lo que vas a hacer, lo descubre sobre la marcha
• El lenguaje hace hipótesis en la ejecución del código, que si no se
cumplen requiere de invalidar lo hecho hasta el momento, volver atrás
hasta el momento de la hipótesis y probar otra cosa
• Tampoco puede hacer optimizaciones, porque desconoce lo que va a
pasar
pero por qué cuesta tanto!
20. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Otra cosa más a la lista à Lenguaje más usado no es óptimo
computacionalmente hablando
• Además, NO es lo mismo un Developer que un Data Scientist
• No les preocupan las mismas cosas
• No hablan el mismo idioma
• Un Developer tiene en mente que
• Su código debe ser legible
• Su código sea lo más óptimo posible
• Utilizan conceptos que para los Data Scientists es jerga
• Y viceversa
• Y un Data Scientist…
pero por qué cuesta tanto!
22. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Como ve un developer a un data scientist
23. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Algo asi?
Naive Bayes
https://gitlab.iti.upv.es/transformtransport/analysis
This is fine!
24. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Como ve un data scientist a un developer
25. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Y qué es lo que cuesta?
Predict
6
31. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
¿Qué es GraalVM?
GraalVM es una Máquina Virtual universal para
ejecutar aplicaciones escritas en JavaScript,
Python, Ruby, R, lenguajes basados en la JVM
como Java, Scala, Kotlin, y lenguajes basados
en LLVM como C y C++
https://www.graalvm.org/
Graalvm – the game changer
32. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
¿Qué es GraalVM?
GraalVM es un ecosistema y un runtime
compartido que ofrece ventajas de
rendimiento, no solo para los lenguajes
basados en la JVM (Java, Scala, Groovy, Kotlin),
si no también para otros lenguajes (JavaScript,
Python, R, C, C++, Ruby)
Graalvm – the game changer
40. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Twitter
• https://www.youtube.com/watch?v=PtgKmzgIh4c
• Goldman Sachs
• https://www.youtube.com/watch?v=MUECwHdr07Q
• Pivotal (Spring Framework)
• https://www.youtube.com/watch?v=oN3QOsZ1KAw
• Disney Streaming Services
• https://www.youtube.com/watch?v=CM4zA3bdlzA
Esta graalvm preparado para producción?
41. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
https://www.youtube.com/watch?v=2OZysKdrg6o
https://www.slideshare.net/slideshow/embed_code/key/hcukR8QBleDtnE
Cómo lo hace graalvm al detalle
42. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Es tan bueno como parece?
43. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• A mi que Oracle me diga que va a aumentar el rendimiento de mi
código en Python un x4 pues oye… así de entrada no me lo creo
• Vamos a armar un ejemplo, a tope de datos!:
• Primero lo ejecutaremos in the classic way: directamente con Python
• Veremos lo que tarda y lo que consume (CPU y RAM)
• Después, lo compilaremos con GraalVM, veremos qué pasos hay que dar
para que sea posible
• Una vez compilado a código nativo, y ‘supuestamente’ optimizado, lo
ejecutaremos
• Veremos lo que tarda y lo que consume (CPU y RAM)
• Y compararemos los resultados
Trust no one
45. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Usaremos código de Adrian Rosebrok
• Detección de caras con Deep Learning
• URL del artículo (y acceso al código)
• https://www.pyimagesearch.com/2018/06/18/face-
recognition-with-opencv-python-and-deep-learning/
• Como instalar entorno
• https://www.pyimagesearch.com/2018/08/17/install-opencv-
4-on-macos/
• Como obtener datasets
• https://www.pyimagesearch.com/2018/04/09/how-to-quickly-
build-a-deep-learning-image-dataset/
Nuestro caso de prueba
46. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Dataset de 2681 imágenes
• 1 Gb de tamaño
• Entrenamiento por CPU (no GPU)
• Usa por debajo la librería face_recognition (Deep Learning)
• Que utiliza a su vez una CNN (Convolutional Neural Network)
Nuestro caso de prueba
48. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• 100% de CPU
• 100% de RAM
• ZILLONES DE MINUTOS
Nuestro caso de prueba
49. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Primero instalamos GraalVM
• https://www.graalvm.org/downloads/
• Seleccionamos la versión Community
Como lo hacemos con graalvm
Para MacOS
50. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Descomprimimos
• Y lo movemos junto al resto de máquinas virtuales de
Java (en MacOs, cada SO tiene su ruta por defecto)
• Comprobamos que está instalada correctamente
Como lo hacemos con graalvm
51. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Y seleccionamos GraalVM como máquina virtual por
defecto
Como lo hacemos con graalvm
• ¿Porqué selecciona Graal cuando le
decimos –v 1.8 y no la JDK 8 que ya
tenía instalada?
• Misterios de la vida, pero just Works
• También puedes modificar el PATH a
mano…
52. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Comprobamos que cuando llamamos a JAVA, es Graal
quien responde
• Ahora instalaremos native-image, que es un utilidad que
nos permite construir imágenes nativas ejecutables
• Para eso primero damos permisos a la carpeta bin
Como lo hacemos con graalvm
53. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Añadimos al path del sistema la carpeta bin para poder
ejecutar comandos en cualquier punto
Como lo hacemos con graalvm
54. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• E instalamos native-image a través de gu (GraalVM
Updater)
• Comprobamos que podemos ejecutar native-image así
Como lo hacemos con graalvm
55. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• GraalVM Native Image
• Permite la compilación AoT de código Java a un ejecutable standalone,
llamado native image
• Este ejecutable contiene
• La aplicación
• Las librerías necesarias
• Substrate VM à Elementos importantes de la JRE, pero no la JRE completa (memory
management, thread scheduling, garbage collector, etc.)
• Por tanto, no necesita de una JRE para ejecutarse
• El resultado es un software más rápido y con un overhead de memoria en
ejecución menor, si lo comparamos con la JVM
• GraalVM Native Image soporta los siguientes lenguajes
• JVM-based: Java, Scala, Clojure, Kotlin
• Javascript, Ruby, R, Python
Como lo hacemos con graalvm
58. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Básicamente, lo que hace GraalVM es añadir dependencias de
Python a la native-image y luego lanzar la ejecución de nuestro
código sobre ese Python
• Simplemente añadiendo a la construcción de la imagen nativa
esta opción
• Lo cual no está mal, es una forma bastante chula de empaquetar
la aplicación
• Pero a nivel de rendimiento, no ayuda. Es más, probablemente
resta.
Como lo hacemos con graalvm
59. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
Como lo hacemos con graalvm
https://technology.amis.nl/2019/10/28/create-a-native-image-binary-executable-for-a-polyglot-java-application-using-graalvm/#prettyPhoto
60. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Nosotros intentamos meter el código de reconocimiento de caras
en una native-image… sin éxito
• Demasiadas dependencias
• Probablemente la conjunción de OpenCV con Python sea algo para lo que
GraalVM no esté preparado
• No hay documentación, muy complejo, muy mágico…
• Este es el script que lanzamos para generar la native-image
Como lo hacemos con graalvm
61. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Cosas interesantes del script
• -H:Name especifica el nombre que le vamos a dar a la native-image
• -H:Class indica la clase Java que contiene el método main, que será el
entrypoint de la aplicación
• Así que, aunque mi código sea Python 100%, necesito una clase
Java que me sirva de entrypoint… como este:
Como lo hacemos con graalvm
62. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
•Otro asunto interesante es la propia construcción
de la native-image
•Es MUY costoso en términos de recursos
(especialmente RAM), y también temporalmente
•De hecho, tuvimos que subir la asignación de RAM
de la JVM de Graal de 9Gb a 16Gb para que pudiera
construir una native-image
Como lo hacemos con graalvm
63. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Otro problema, es que no se
pueden añadir librerías externas
• No se puede instalar nada con PIP
• O si se puede, no está documentado
• Y nosotros no lo hemos conseguido
L
• Por lo que la cosa se queda un
poco descafeinada
Como lo hacemos con graalvm
65. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Efectivamente, la ‘poliglotía’ de GraalVM, ‘from the scratch’, no
parece servir para conseguir nuestro objetivo
• Desde luego, desde fuera, parecía tener potencial para resolver
nuestro problema, pero el reality-check ha sido claro
• No obstante… la idea no era mala. De hecho, la comunidad ha
empezado un proyecto para conseguir precisamente esto: Graal
Python
• Graal Python proporciona una implementación de Python 3.7
nativa a GraalVM
• Y uno de sus objetivos a corto plazo es incluir SciPy también, e ir
extendiendo esta inclusión de librerías populares poco a poco
Graal python
67. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Tiene muchas diferencias muy interesantes con respecto a la
aproximación basada en native-images
• No incluye por defecto la JVM. Solo el entorno de ejecución de Python
• El punto de entrada es un .py, no necesito una clase Java que use
Polyglot para llamar a mi código Python
• Sencillamente… se lanza así
• Desde luego, puedes seguir ejecutando código de otros lenguajes
con Polyglot
Graal python
68. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• De hecho es interesante la conjunción de lenguajes entre R y
Python
• Por ejemplo, podemos instalar dependencias de R así
• Y combinar Python y R usando Polyglot…
Graal python
71. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Pero es que además… con Graal Python puedes instalar librerías!
• Pero no todas… solo las que estén portadas, o sean compatibles
• La comunidad está trabajando activamente en:
• Numpy
• SciPy
• Scikit-learn
• Pandas
• Tensorflow
Graal python
73. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Primero, tenemos que haber hecho los pasos de instalación
anteriores
• Una vez hechos, tendremos acceso a una herramienta llamada gu
instalando graal python
74. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Si ejecutamos el siguiente comando:
• Observaremos que tenemos disponible el componente
Graal.Python. Lo instalamos así:
instalando graal python
75. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Sal y vuelve a entrar en la terminal para que se apliquen los
cambios
• Para comprobar que todo es correcto, ejecuta el siguiente
comando
instalando graal python
76. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Claro, no tenemos instalado numpy
• En graalpython las dependencias se instalan un poco diferente a
Python…
• Pero la instalación…
• Igual nos falta instalar LLVM, porque numpy por debajo usa C
instalando graal python
77. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Volvemos a instalar numpy
• Y vuelve a fallar
• Resulta que GraalPython no usa LLVM, usa SULONG
• SULONG viene instalado por defecto en la versión de GraalVM
• Entramos en la documentación de SULONG y vemos que hay un
workaround para MacOS
• Instalar las XCode extensions (ya las tenía instaladas)
• Y asegurarse de que la variable de entorno SDKROOT apunta a la carpeta
correcta con:
instalando graal python
78. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• Pero sigue sin funcionar…
• 19.3.0 …
instalando graal python
80. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• ¿Y si instalo…?
• Pandas à Declara como dependencia NumPy à FALLA L
• SciPy à Paquete desconocido
• Scikit-learn à Paquete desconocido
• Tensorflow à Paquete desconocido
instalando graal python
81. Francisco Javier Barrena Castillo - @DogDeveloper#CommitConf19 #ATODOGAS
• GraalVM a secas no es suficiente para ser usado con Python
• Se necesita instalar también
• GraalPython
• LLVC
• XCode Development Tools en MacOS / Herramientas desarrollo C y C++
en Unix
• Aún así, el proyecto aún está muy verde para ser incluso evaluado
• No solo con proyectos reales
• Tampoco para laboratorio, tiene una tasa de error ‘mágico’ muy elevada
• La documentación es escasa y habitualmente no funciona
• Aún así, GraalPython es una tecnología prometedora que merece
la pena seguir su evolución
conclusiones