Road to Production with H2O , spark and R
Machine Learning easy
José Luis Cañadas Reche
José Luis Cañadas es estadístico de formación, científico de datos de profesión y entusiasta del software libre en general y de R en particular. Actualmente trabaja como senior data scientist en Orange, después de haber pasado por el mundo de la consultoría y por el IESA -CSIC (Instituto de Estudios Sociales Avanzados).
No video of the event yet, sorry!
Qué tenemos
- Grandes volumenes de datos
- Dificultad en poner en producción
Qué se usa en la industria, problemática
- Lenguajes usados por los científicos de datos. R, python
- Entornos de sistemas no preparados
- Spark, hadoop
- Librerías analíticas de spark
Posible solución
- Aunar dos mundos. Fácil desarrollo y productivización
- H2o . software libre, basado en java, con apis para R y python y scala
- DS desarrollan modelo en su lenguaje favorito.
- Una vez entrenado, descargar modelo, poner en producción en spark
Salvar modelo para poner en producción
Guardamos un fichero zip con el modelo y un .jar que será el que nos permitirá ponerlo en producción en un entorno con spark. Ese jar sólo hay que bajarlo una vez.
Había un problema con los modelos de xgboost,puse un issue y lo apañaron
Turno de los ingenieros de datos
- Con el jar y el modelo salvado se construye una app de spark
- Funcionará sin necesidad de tener h2o ni R instalado en ningún sitio
Prueba funcional
- Sería añadir el jar cuando se abre la sesión de spark.
En un spark-shell sería algo como esto.
~/spark/spark-2.4.0-bin-hadoop2.7/bin/spark-shell \
--conf spark.driver.memory="3g" \
--conf spark.executor.memory="2g" \
--conf spark.executor.instances=2 \
--conf spark.executor.cores=2 \
--jars genmodel_xgboost2.jar
En spark
import _root_.hex.genmodel.GenModel
import _root_.hex.genmodel.easy.{EasyPredictModelWrapper, RowData}
import _root_.hex.genmodel.easy.prediction
import _root_.hex.genmodel.MojoModel
import _root_.hex.genmodel.easy.RowData
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType, DoubleType}
// cargar mi modelo
val modelPath = "epa_xgboost.zip"
// Cargar datos de test para predecir
val dataPath = "data/epa_test.csv"
// Import data
val epa_origin = spark.read.option("header", "true").
csv(dataPath)
val epa = epa_origin.select(epa_origin.columns.map(c => col(c).cast(StringType)) : _*)
// Import MOJO model
val mojo = MojoModel.load(modelPath)
## En spark
val easyModel = new EasyPredictModelWrapper( new EasyPredictModelWrapper.Config(). setModel(mojo). setConvertUnknownCategoricalLevelsToNa(true). setConvertInvalidNumbersToNa(true))
// -------------
// Convertir todas las columnas a rowdata // -------------
val header = epa.columns // TODO: castear en spark antes
// Predict val epa_score = epa.map { x => val r = new RowData header.indices.foreach(idx => r.put(header(idx), x.getAs[String](idx) )) val score = easyModel.predictBinomial(r).classProbabilities (x.getAs[String](0),x.getAs[String](1),x.getAs[String](3), score(1)) }.toDF("label","edad","prov","predict")
epa_score.show(false) ```
Conclusiones
- En Orange lo hemos probado en caso de uso real
- Uso de h2o junto con spark usando la librería de R
rsparkling
- Generar aplicación en spark que entrena y predice en distribuido usando
h2o
Predicción sobre más de 40 millones de filas y 100 columnas en menos de 10 minutos. Incluyendo lectura de tablas en spark y escribiendo en tabla hive
Modelos mucho mejores y más rápidos que otras soluciones big data.
Vamos a las demos
- Ejecutar el ejemplo de esta presentación
- Proyecto gradle para productivizar de verdad. Con IntelliJ IDEA, explicado aquí pero vamos a ver una versión actualizada
- Con datos reales en un cluster grande. Predecir un dataframe de 384 millones de filas
- Informes html de los modelos usando el mojo
Extra: Entrenamiento en distribuido
- Entrenamiento distribuido con sparkling-water. En R y en spark-scala
- Date:
- 2020 April 24 - 13:00
- Duration:
- 45 min
- Room:
- Sala 1
- Conference:
- Opensouthcode 2020
- Language:
- Track:
- Data Science / BigData
- Difficulty:
- Medium
- Desarrollo Incremental con Behavioral Programming
- Start Time:
- 2020 April 24 12:00
- Room:
- Aula 1
- When Python meets GraphQL: Managing contributors identities in your open source project
- Start Time:
- 2020 April 24 13:00
- Room:
- Sala 2
- Blazor, o cómo llevar .Net hasta el navegador.
- Start Time:
- 2020 April 24 13:00
- Room:
- Sala 3