Manitatra Spark miaraka amin'ny MLflow

Salama ry mponina ao Khabrovsk. Araka ny efa nosoratantsika, amin'ity volana ity ny OTUS dia manangana taranja fianarana milina roa indray mandeha, izany hoe fototra и mandroso. Amin'io lafiny io, dia manohy mizara fitaovana mahasoa izahay.

Ny tanjon'ity lahatsoratra ity dia ny hiresaka momba ny traikefa voalohany amin'ny fampiasana MLflow.

Hanomboka ny famerenana isika MLflow avy amin'ny mpizara fanaraha-maso azy ary alaivo ny famerimberenan'ny fandalinana rehetra. Avy eo dia hizara ny traikefantsika amin'ny fampifandraisana ny Spark amin'ny MLflow amin'ny fampiasana UDF.

teny manodidina

Ao isika Alpha Health Mampiasa fianarana milina sy faharanitan-tsaina artifisialy izahay mba hanomezana hery ny olona hiandraikitra ny fahasalamany sy ny fahasalamany. Izany no mahatonga ny maodely fianarana milina ho ivon'ny vokatra siantifika novolavolainay, ary izany no antony nahasarika anay ho amin'ny MLflow, sehatra loharano misokatra izay mirakitra ny lafiny rehetra amin'ny tsingerin'ny fiainan'ny fianarana milina.

MLflow

Ny tanjona lehibe amin'ny MLflow dia ny hanome sosona fanampiny eo an-tampon'ny fianarana milina izay ahafahan'ny mpahay siansa momba ny data miasa amin'ny tranomboky fianarana milina rehetra (h2o, keras, mleap, pytorch, sklearn и tensorflow), mitondra ny asany amin'ny ambaratonga manaraka.

MLflow dia manome singa telo:

  • Tracking - firaketana sy fangatahana andrana: code, data, configuration ary valiny. Tena zava-dehibe ny fanaraha-maso ny fizotran'ny famoronana modely.
  • Projects - Endriky ny fonosana azo atao amin'ny sehatra rehetra (oh. SageMaker)
  • Models - endrika mahazatra amin'ny fandefasana modely amin'ny fitaovana fandefasana isan-karazany.

MLflow (amin'ny alpha tamin'ny fotoana nanoratana) dia sehatra loharano misokatra izay ahafahanao mitantana ny fiainan'ny fianarana milina, ao anatin'izany ny fanandramana, ny fampiasana indray ary ny fametrahana.

Fametrahana MLflow

Raha te hampiasa ny MLflow ianao dia mila manangana ny tontolo Python manontolo ianao, amin'izany no hampiasainay PyEnv (hametraka Python amin'ny Mac, jereo eto). Amin'izany fomba izany no ahafahantsika mamorona tontolo virtoaly izay hametrahana ny tranomboky rehetra ilaina hampandehanana azy.

```
pyenv install 3.7.0
pyenv global 3.7.0 # Use Python 3.7
mkvirtualenv mlflow # Create a Virtual Env with Python 3.7
workon mlflow
```

Andao hametraka ireo tranomboky ilaina.

```
pip install mlflow==0.7.0 
            Cython==0.29  
            numpy==1.14.5 
            pandas==0.23.4 
            pyarrow==0.11.0
```

Fanamarihana: Mampiasa PyArrow izahay hampandehanana modely toy ny UDF. Ny dikan-tenin'ny PyArrow sy Numpy dia nila namboarina satria nifanohitra ireo dikan-teny farany.

Alefaso ny Tracking UI

Ny MLflow Tracking dia ahafahantsika misoratra anarana sy manontany andrana mampiasa Python sy HAFA API. Ho fanampin'izany, azonao atao ny mamaritra hoe aiza no hitehirizana artifacts modely (localhost, Amazon S3, Azure Blob Storage, Google Cloud Storage na Mpizara SFTP). Satria mampiasa AWS ao amin'ny Alpha Health izahay, dia S3 ny fitahirizana artifact.

# Running a Tracking Server
mlflow server 
    --file-store /tmp/mlflow/fileStore 
    --default-artifact-root s3://<bucket>/mlflow/artifacts/ 
    --host localhost
    --port 5000

Manoro hevitra ny MLflow ny fampiasana fitehirizana rakitra maharitra. Ny fitehirizana rakitra dia ny toerana hitehirizan'ny mpizara run sy ny metadata fanandramana. Rehefa manomboka ny mpizara dia ataovy azo antoka fa manondro ny fivarotana rakitra maharitra. Eto amin'ny fanandramana dia hampiasaintsika fotsiny /tmp.

Tsarovy fa raha te hampiasa ny mpizara mlflow isika mba hampandehanana andrana taloha, dia tsy maintsy misy ao amin'ny fitehirizana rakitra. Na izany aza, na dia tsy misy izany aza dia afaka mampiasa azy ireo ao amin'ny UDF isika, satria ny lalana mankany amin'ny modely ihany no ilaintsika.

Fanamarihana: Ataovy ao an-tsaina fa ny Tracking UI sy ny mpanjifa modely dia tsy maintsy manana fidirana amin'ny toerana misy artifact. Izany hoe, na inona na inona zava-misy fa ny Tracking UI dia mipetraka amin'ny ohatra EC2, rehefa mandeha ny MLflow eo an-toerana dia tsy maintsy manana fidirana mivantana amin'ny S3 ilay milina hanoratana modely artifact.

Manitatra Spark miaraka amin'ny MLflow
Ny Tracking UI dia mitahiry artifact ao anaty siny S3

Modely mihazakazaka

Raha vao mandeha ny mpizara Tracking dia afaka manomboka manofana ireo modely ianao.

Ho ohatra, hampiasa ny fanovana divay avy amin'ny ohatra MLflow izahay Sklearn.

MLFLOW_TRACKING_URI=http://localhost:5000 python wine_quality.py 
  --alpha 0.9
  --l1_ration 0.5
  --wine_file ./data/winequality-red.csv

Araka ny efa noresahintsika teo, ny MLflow dia mamela anao hampiditra ny mari-pamantarana modely, metrika ary artifacts mba hahafahanao manara-maso ny fivoaran'izy ireo amin'ny famerimberenana. Tena ilaina ity endri-javatra ity satria amin'ity fomba ity dia afaka mamerina ny modely tsara indrindra isika amin'ny alàlan'ny fifandraisana amin'ny mpizara Tracking na ny fahatakarana hoe iza no kaody nahavita ny fanavaozana ilaina amin'ny fampiasana ny git hash logs of commits.

with mlflow.start_run():

    ... model ...

    mlflow.log_param("source", wine_path)
    mlflow.log_param("alpha", alpha)
    mlflow.log_param("l1_ratio", l1_ratio)

    mlflow.log_metric("rmse", rmse)
    mlflow.log_metric("r2", r2)
    mlflow.log_metric("mae", mae)

    mlflow.set_tag('domain', 'wine')
    mlflow.set_tag('predict', 'quality')
    mlflow.sklearn.log_model(lr, "model")

Manitatra Spark miaraka amin'ny MLflow
Famerenana divay

Ampahan'ny server ho an'ny modely

Ny mpizara fanaraha-maso MLflow, natomboka tamin'ny alàlan'ny baiko "server mlflow", dia manana REST API ho an'ny fanaraha-maso ny fandehanana sy ny fanoratana angona amin'ny rafi-drakitra eo an-toerana. Azonao atao ny mamaritra ny adiresin'ny mpizara fanaraha-maso amin'ny fampiasana ny fari-piainan'ny tontolo iainana “MLFLOW_TRACKING_URI” ary ny API mpanenjika MLflow dia hifandray ho azy amin'ny mpizara mpanara-maso amin'ity adiresy ity mba hamoronana/hahazoana vaovao momba ny fandefasana, mari-pandrefesana, sns.

Source: Docs // Mihazakazaka mpizara mpanara-maso

Mba hanomezana ny modely amin'ny mpizara dia mila mpizara mpanara-maso mihazakazaka (jereo ny interface fanombohana) sy ny ID Run an'ny modely.

Manitatra Spark miaraka amin'ny MLflow
Run ID

# Serve a sklearn model through 127.0.0.0:5005
MLFLOW_TRACKING_URI=http://0.0.0.0:5000 mlflow sklearn serve 
  --port 5005  
  --run_id 0f8691808e914d1087cf097a08730f17 
  --model-path model

Mba hanompoana maodely amin'ny fampiasana ny fampiasa MLflow serve dia mila miditra amin'ny UI Fanaraha-maso isika mba handraisana vaovao momba ilay maodely amin'ny alalan'ny famaritana tsotra izao. --run_id.

Rehefa mifandray amin'ny mpizara Tracking ny modely dia afaka mahazo teboka farany modely vaovao isika.

# Query Tracking Server Endpoint
curl -X POST 
  http://127.0.0.1:5005/invocations 
  -H 'Content-Type: application/json' 
  -d '[
	{
		"fixed acidity": 3.42, 
		"volatile acidity": 1.66, 
		"citric acid": 0.48, 
		"residual sugar": 4.2, 
		"chloridessssss": 0.229, 
		"free sulfur dsioxide": 19, 
		"total sulfur dioxide": 25, 
		"density": 1.98, 
		"pH": 5.33, 
		"sulphates": 4.39, 
		"alcohol": 10.8
	}
]'

> {"predictions": [5.825055635303461]}

Modely mihazakazaka avy amin'ny Spark

Na dia eo aza ny zava-misy fa ny mpizara Tracking dia matanjaka tsara mba hanompoana modely amin'ny fotoana tena izy, mampiofana azy ireo ary mampiasa ny fiasan'ny mpizara (loharano: mlflow // docs // models # local), ny fampiasana Spark (batch na streaming) dia vahaolana matanjaka kokoa noho ny fizarana.

Alaivo sary an-tsaina raha nanao ny fiofanana ivelan'ny aterineto ianao ary avy eo nampihatra ny modely nivoaka tamin'ny angonao rehetra. Eto no mamirapiratra ny Spark sy MLflow.

Mametraka PySpark + Jupyter + Spark

Source: Manomboka PySpark - Jupyter

Mba hampisehoana ny fomba hampiharana ny maodely MLflow amin'ny rafitra angona Spark dia mila manangana kahie Jupyter hiara-hiasa amin'ny PySpark isika.

Atombohy amin'ny fametrahana ny kinova stable farany indrindra Apache Spark:

cd ~/Downloads/
tar -xzf spark-2.4.3-bin-hadoop2.7.tgz
mv ~/Downloads/spark-2.4.3-bin-hadoop2.7 ~/
ln -s ~/spark-2.4.3-bin-hadoop2.7 ~/spark̀

Mametraka PySpark sy Jupyter amin'ny tontolo virtoaly:

pip install pyspark jupyter

Mametraha fari-piainana manodidina:

export SPARK_HOME=~/spark
export PATH=$SPARK_HOME/bin:$PATH
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --notebook-dir=${HOME}/Projects/notebooks"

Rehefa tapa-kevitra notebook-dir, afaka mitahiry ny kahientsika ao amin'ny lahatahiry tiana isika.

Famoahana ny Jupyter avy amin'ny PySpark

Koa satria afaka nanamboatra an'i Jupiter ho mpamily PySpark izahay, dia afaka mitantana kahie Jupyter amin'ny tontolon'ny PySpark izahay.

(mlflow) afranzi:~$ pyspark
[I 19:05:01.572 NotebookApp] sparkmagic extension enabled!
[I 19:05:01.573 NotebookApp] Serving notebooks from local directory: /Users/afranzi/Projects/notebooks
[I 19:05:01.573 NotebookApp] The Jupyter Notebook is running at:
[I 19:05:01.573 NotebookApp] http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745
[I 19:05:01.573 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 19:05:01.574 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745

Manitatra Spark miaraka amin'ny MLflow

Araka ny voalaza etsy ambony, ny MLflow dia manome endri-javatra ho an'ny artifacts modelin'ny log ao amin'ny S3. Raha vantany vao manana ny modely voafantina eo an-tananay izahay dia manana fahafahana manafatra azy ho UDF amin'ny fampiasana ny maody mlflow.pyfunc.

import mlflow.pyfunc

model_path = 's3://<bucket>/mlflow/artifacts/1/0f8691808e914d1087cf097a08730f17/artifacts/model'
wine_path = '/Users/afranzi/Projects/data/winequality-red.csv'
wine_udf = mlflow.pyfunc.spark_udf(spark, model_path)

df = spark.read.format("csv").option("header", "true").option('delimiter', ';').load(wine_path)
columns = [ "fixed acidity", "volatile acidity", "citric acid",
            "residual sugar", "chlorides", "free sulfur dioxide",
            "total sulfur dioxide", "density", "pH",
            "sulphates", "alcohol"
          ]
          
df.withColumn('prediction', wine_udf(*columns)).show(100, False)

Manitatra Spark miaraka amin'ny MLflow
PySpark - Mamoaka faminaniana momba ny kalitaon'ny divay

Hatramin'io fotoana io, niresaka momba ny fomba fampiasana PySpark miaraka amin'ny MLflow izahay, manatanteraka faminaniana momba ny kalitaon'ny divay amin'ny angona divay manontolo. Ahoana anefa raha mila mampiasa mody Python MLflow avy amin'ny Scala Spark ianao?

Nisedra izany koa izahay tamin'ny fisarahana ny tontolon'ny Spark eo amin'i Scala sy Python. Izany hoe, nisoratra anarana MLflow UDF amin'ny Python izahay, ary nampiasa azy avy amin'ny Scala (eny, angamba tsy ny vahaolana tsara indrindra, fa izay ananantsika).

Scala Spark + MLflow

Ho an'ity ohatra ity dia hanampy izahay Toree Kernel ao amin'ny Jupiter efa misy.

Mametraka Spark + Toree + Jupyter

pip install toree
jupyter toree install --spark_home=${SPARK_HOME} --sys-prefix
jupyter kernelspec list
```
```
Available kernels:
  apache_toree_scala    /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/apache_toree_scala
  python3               /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/python3
```

Araka ny hitanao amin'ny kahie mipetaka, ny UDF dia zaraina amin'ny Spark sy PySpark. Manantena izahay fa ity ampahany ity dia mahasoa ho an'ireo izay tia Scala ary te-hametraka modely fianarana milina amin'ny famokarana.

import org.apache.spark.sql.functions.col
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.{Column, DataFrame}
import scala.util.matching.Regex

val FirstAtRe: Regex = "^_".r
val AliasRe: Regex = "[\s_.:@]+".r

def getFieldAlias(field_name: String): String = {
    FirstAtRe.replaceAllIn(AliasRe.replaceAllIn(field_name, "_"), "")
}

def selectFieldsNormalized(columns: List[String])(df: DataFrame): DataFrame = {
    val fieldsToSelect: List[Column] = columns.map(field =>
        col(field).as(getFieldAlias(field))
    )
    df.select(fieldsToSelect: _*)
}

def normalizeSchema(df: DataFrame): DataFrame = {
    val schema = df.columns.toList
    df.transform(selectFieldsNormalized(schema))
}

FirstAtRe = ^_
AliasRe = [s_.:@]+

getFieldAlias: (field_name: String)String
selectFieldsNormalized: (columns: List[String])(df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame
normalizeSchema: (df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame
Out[1]:
[s_.:@]+
In [2]:
val winePath = "~/Research/mlflow-workshop/examples/wine_quality/data/winequality-red.csv"
val modelPath = "/tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model"

winePath = ~/Research/mlflow-workshop/examples/wine_quality/data/winequality-red.csv
modelPath = /tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model
Out[2]:
/tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model
In [3]:
val df = spark.read
              .format("csv")
              .option("header", "true")
              .option("delimiter", ";")
              .load(winePath)
              .transform(normalizeSchema)

df = [fixed_acidity: string, volatile_acidity: string ... 10 more fields]
Out[3]:
[fixed_acidity: string, volatile_acidity: string ... 10 more fields]
In [4]:
%%PySpark
import mlflow
from mlflow import pyfunc

model_path = "/tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model"
wine_quality_udf = mlflow.pyfunc.spark_udf(spark, model_path)

spark.udf.register("wineQuality", wine_quality_udf)
Out[4]:
<function spark_udf.<locals>.predict at 0x1116a98c8>
In [6]:
df.createOrReplaceTempView("wines")
In [10]:
%%SQL
SELECT 
    quality,
    wineQuality(
        fixed_acidity,
        volatile_acidity,
        citric_acid,
        residual_sugar,
        chlorides,
        free_sulfur_dioxide,
        total_sulfur_dioxide,
        density,
        pH,
        sulphates,
        alcohol
    ) AS prediction
FROM wines
LIMIT 10
Out[10]:
+-------+------------------+
|quality|        prediction|
+-------+------------------+
|      5| 5.576883967129615|
|      5|  5.50664776916154|
|      5| 5.525504822954496|
|      6| 5.504311247097457|
|      5| 5.576883967129615|
|      5|5.5556903912725755|
|      5| 5.467882654744997|
|      7| 5.710602976324739|
|      7| 5.657319539336507|
|      5| 5.345098606538708|
+-------+------------------+

In [17]:
spark.catalog.listFunctions.filter('name like "%wineQuality%").show(20, false)

+-----------+--------+-----------+---------+-----------+
|name       |database|description|className|isTemporary|
+-----------+--------+-----------+---------+-----------+
|wineQuality|null    |null       |null     |true       |
+-----------+--------+-----------+---------+-----------+

Dingana manaraka

Na dia ao amin'ny version Alpha aza ny MLflow tamin'ny fotoana nanoratana dia toa mampanantena tokoa izany. Ny fahaizana mampandeha rafitra fianarana milina marobe sy mandany azy ireo amin'ny teboka iray ihany dia mitondra ny rafitra mpanoro hevitra mankany amin'ny ambaratonga manaraka.

Ankoatr'izay, ny MLflow dia mampifanakaiky kokoa ny Injeniera Data sy ny manam-pahaizana momba ny Siansa Data, mametraka sosona iraisana eo anelanelan'izy ireo.

Aorian'ity fitrandrahana ny MLflow ity dia matoky izahay fa handroso sy hampiasa izany ho an'ny fantsona Spark sy ny rafitra mpanome torohevitra.

Tsara ny mampifanaraka ny fitehirizana rakitra amin'ny angon-drakitra fa tsy ny rafi-drakitra. Izany dia tokony hanome antsika teboka maromaro izay afaka mampiasa fitahirizana rakitra mitovy. Ohatra, mampiasa ohatra maromaro Presto и Athena miaraka amin'ny metastore Glue mitovy.

Raha fintinina dia te-hisaotra ny vondrom-piarahamonina MLFlow aho amin'ny fanaovana ny asantsika miaraka amin'ny angona ho mahaliana kokoa.

Raha milalao miaraka amin'ny MLflow ianao dia aza misalasala manoratra aminay ary lazao anay ny fomba fampiasanao azy, ary mainka fa raha mampiasa azy amin'ny famokarana ianao.

Fantaro bebe kokoa momba ireo cours:
Fianarana milina. Taranja fototra
Fianarana milina. Mazava ho azy

Hamaky bebe kokoa:

Source: www.habr.com

Add a comment