Presented by:

José Luis Cañadas Reche

from Orange Spain

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

issue jira

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

Happening at the same time:

  1. Desarrollo Incremental con Behavioral Programming
  2. Start Time:
    2020 April 24 12:00

    Room:
    Aula 1

  3. When Python meets GraphQL: Managing contributors identities in your open source project
  4. Start Time:
    2020 April 24 13:00

    Room:
    Sala 2

  5. Blazor, o cómo llevar .Net hasta el navegador.
  6. Start Time:
    2020 April 24 13:00

    Room:
    Sala 3