Pagpadako sa Spark gamit ang MLflow

Kumusta, mga residente sa Khabrovsk. Sama sa nasulat na namo, karong bulana ang OTUS naglansad og duha ka mga kurso sa pagkat-on sa makina nga dungan, nga mao sukaranan ΠΈ advance. Niining bahina, nagpadayon kami sa pagpaambit sa mapuslanon nga materyal.

Ang katuyoan niini nga artikulo mao ang paghisgot bahin sa among una nga kasinatian sa paggamit MLflow.

Atong sugdan ang pagrepaso MLflow gikan sa server sa pagsubay niini ug i-log ang tanan nga mga pag-uli sa pagtuon. Unya among ipaambit ang among kasinatian sa pagkonektar sa Spark sa MLflow gamit ang UDF.

Konteksto

Naa mi sa Alpha Health Gigamit namo ang pagkat-on sa makina ug artificial intelligence aron mahatagan ug gahom ang mga tawo sa pagdumala sa ilang panglawas ug kaayohan. Mao nga ang mga modelo sa pagkat-on sa makina naa sa kasingkasing sa mga produkto sa siyensya sa datos nga among gihimo, ug kana ang hinungdan nga nadani kami sa MLflow, usa ka bukas nga gigikanan nga plataporma nga naglangkob sa tanan nga aspeto sa siklo sa kinabuhi sa pagkat-on sa makina.

MLflow

Ang panguna nga katuyoan sa MLflow mao ang paghatag usa ka dugang nga layer sa ibabaw sa pagkat-on sa makina nga magtugot sa mga siyentipiko sa datos nga magtrabaho sa hapit bisan unsang librarya sa pagkat-on sa makina (h2o, kusgan, mleap, pytorch, sklearn ΠΈ tensorflow), pagdala sa iyang trabaho ngadto sa sunod nga lebel.

Naghatag ang MLflow og tulo ka sangkap:

  • Pagsubay - pagrekord ug mga hangyo alang sa mga eksperimento: code, data, configuration ug mga resulta. Ang pag-monitor sa proseso sa paghimo og modelo hinungdanon kaayo.
  • mga proyekto – Packaging format nga modagan sa bisan unsa nga plataporma (e.g. SageMaker)
  • modelo – usa ka sagad nga pormat para sa pagsumite sa mga modelo sa lainlaing mga gamit sa pag-deploy.

Ang MLflow (sa alpha sa panahon sa pagsulat) usa ka open source platform nga nagtugot kanimo sa pagdumala sa lifecycle sa pagkat-on sa makina, lakip ang pag-eksperimento, paggamit pag-usab, ug pag-deploy.

Pag-set up sa MLflow

Aron magamit ang MLflow kinahanglan nimo nga una nga i-set up ang imong tibuuk nga palibot sa Python, alang niini among gamiton PyEnv (aron i-install ang Python sa Mac, tan-awa dinhi). Niining paagiha makahimo kita og usa ka virtual nga palibot diin atong i-install ang tanang mga librarya nga gikinahanglan sa pagpadagan niini.

```
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
```

Atong i-install ang gikinahanglan nga mga librarya.

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

Mubo nga sulat: Gigamit namo ang PyArrow sa pagpadagan sa mga modelo sama sa UDF. Ang mga bersyon sa PyArrow ug Numpy kinahanglan nga ayohon tungod kay ang ulahi nga mga bersyon nagkasumpaki sa usag usa.

Ilunsad ang Tracking UI

Ang Pagsubay sa MLflow nagtugot kanamo sa pag-log ug pagpangutana sa mga eksperimento gamit ang Python ug PAHULAY API. Dugang pa, mahimo nimong mahibal-an kung asa ibutang ang mga artifact sa modelo (localhost, Amazon S3, Pagtipig sa Azure Blob, Google Cloud Storage o SFTP server). Tungod kay gigamit namon ang AWS sa Alpha Health, ang among pagtipig sa artifact mahimong S3.

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

Girekomenda sa MLflow ang paggamit sa padayon nga pagtipig sa file. Ang pagtipig sa file diin ang server magtipig sa run ug metadata sa eksperimento. Sa pagsugod sa server, siguroha nga kini nagpunting sa padayon nga tindahan sa file. Dinhi para sa eksperimento atong gamiton lang /tmp.

Hinumdumi nga kung gusto namon gamiton ang mlflow server aron magpadagan sa mga daan nga eksperimento, kinahanglan nga naa sila sa pagtipig sa file. Bisan pa, bisan kung wala kini magamit namon kini sa UDF, tungod kay kinahanglan ra namon ang agianan sa modelo.

Hinumdomi: Hinumdomi nga ang Tracking UI ug ang modelo nga kliyente kinahanglan adunay access sa lokasyon sa artifact. Kana mao, bisan unsa pa ang kamatuoran nga ang Tracking UI nagpuyo sa usa ka EC2 nga pananglitan, kung nagpadagan sa MLflow sa lokal, ang makina kinahanglan adunay direkta nga pag-access sa S3 aron magsulat mga modelo sa artifact.

Pagpadako sa Spark gamit ang MLflow
Ang pagsubay sa UI nagtipig sa mga artifact sa usa ka balde nga S3

Nagdagan nga mga modelo

Sa diha nga ang Tracking server nagdagan, mahimo ka magsugod sa pagbansay sa mga modelo.

Ingon usa ka pananglitan, gamiton namon ang pagbag-o sa bino gikan sa pananglitan sa MLflow sa Sklearn.

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

Sama sa nahisgotan na namo, ang MLflow nagtugot kanimo sa pag-log sa mga parameter sa modelo, metrics, ug artifacts aron imong masubay kung giunsa kini pag-uswag sa mga pag-uli. Kini nga bahin mapuslanon kaayo tungod kay niining paagiha mahimo natong kopyahon ang pinakamaayo nga modelo pinaagi sa pagkontak sa server sa Pagsubay o pagsabut kung unsang code ang naghimo sa gikinahanglan nga pag-uli gamit ang 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")

Pagpadako sa Spark gamit ang MLflow
Pag-usab sa bino

Ang bahin sa server alang sa modelo

Ang MLflow tracking server, nga gilunsad gamit ang "mlflow server" nga sugo, adunay REST API alang sa pagsubay sa mga dagan ug pagsulat sa datos ngadto sa lokal nga sistema sa file. Mahimo nimong ipiho ang adres sa pagsubay sa server gamit ang variable sa palibot nga "MLFLOW_TRACKING_URI" ug ang API sa pagsubay sa MLflow awtomatik nga makontak ang server sa pagsubay sa kini nga adres aron makamugna / makadawat kasayuran sa paglansad, mga sukatan sa log, ug uban pa.

Source: Docs // Nagdagan sa usa ka server sa pagsubay

Aron mahatagan ang modelo og server, kinahanglan namo ang running tracking server (tan-awa ang launch interface) ug ang Run ID sa modelo.

Pagpadako sa Spark gamit ang 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

Sa pag-alagad sa mga modelo gamit ang MLflow serve functionality, magkinahanglan kami og access sa Tracking UI aron makadawat og impormasyon mahitungod sa modelo pinaagi lamang sa pagtino --run_id.

Kung makontak na sa modelo ang server sa Pagsubay, makakuha kami usa ka bag-ong endpoint sa modelo.

# 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]}

Nagdagan nga mga modelo gikan sa Spark

Bisan pa sa kamatuoran nga ang Tracking server adunay igong gahum sa pag-alagad sa mga modelo sa tinuod nga panahon, pagbansay kanila ug paggamit sa server functionality (tinubdan: mlflow // docs // mga modelo # lokal), ang paggamit sa Spark (batch o streaming) usa ka mas gamhanan nga solusyon tungod sa pag-apod-apod.

Hunahunaa nga gihimo ra nimo ang pagbansay sa offline ug dayon gipadapat ang modelo sa output sa tanan nimo nga datos. Dinhi nagsidlak ang Spark ug MLflow.

I-install ang PySpark + Jupyter + Spark

Source: Pagsugod sa PySpark - Jupyter

Aron ipakita kung giunsa namo paggamit ang mga modelo sa MLflow sa Spark dataframes, kinahanglan namo nga i-set up ang Jupyter nga mga notebook aron magtrabaho kauban ang PySpark.

Pagsugod pinaagi sa pag-instalar sa pinakabag-o nga stable nga bersyon 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Μ€

I-install ang PySpark ug Jupyter sa virtual nga palibot:

pip install pyspark jupyter

I-set up ang environment variables:

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"

Nakahukom notebook-dir, mahimo natong tipigan ang atong mga notebook sa gusto nga folder.

Paglansad sa Jupyter gikan sa PySpark

Tungod kay nakahimo kami sa pag-configure sa Jupiter isip usa ka drayber sa PySpark, mahimo na namo nga ipadagan ang Jupyter notebook sa konteksto sa PySpark.

(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

Pagpadako sa Spark gamit ang MLflow

Sama sa gihisgutan sa ibabaw, ang MLflow naghatag usa ka bahin alang sa mga artifact sa modelo sa pag-log sa S3. Sa diha nga naa na namo ang pinili nga modelo sa among mga kamot, naa miy kahigayonan sa pag-import niini isip UDF gamit ang module 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)

Pagpadako sa Spark gamit ang MLflow
PySpark - Pag-output sa mga panagna sa kalidad sa bino

Hangtud niini nga punto, naghisgot kami bahin sa kung giunsa ang paggamit sa PySpark sa MLflow, nga nagpadagan sa mga panagna sa kalidad sa bino sa tibuuk nga dataset sa bino. Apan unsa man kung kinahanglan nimo gamiton ang mga module sa Python MLflow gikan sa Scala Spark?

Gisulayan usab namo kini pinaagi sa pagbahin sa konteksto sa Spark tali sa Scala ug Python. Kana mao, girehistro namon ang MLflow UDF sa Python, ug gigamit kini gikan sa Scala (oo, tingali dili ang labing kaayo nga solusyon, apan kung unsa ang naa kanamo).

Scala Spark + MLflow

Alang niini nga pananglitan atong idugang Toree Kernel ngadto sa kasamtangan nga Jupiter.

I-install ang 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
```

Sama sa imong makita gikan sa gilakip nga notebook, ang UDF gipaambit tali sa Spark ug PySpark. Kami nanghinaut nga kini nga bahin mahimong mapuslanon sa mga nahigugma sa Scala ug gusto nga mag-deploy sa mga modelo sa pagkat-on sa makina sa produksiyon.

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       |
+-----------+--------+-----------+---------+-----------+

Sunod nga mga lakang

Bisan kung ang MLflow naa sa bersyon sa Alpha sa panahon sa pagsulat, kini daw nagsaad. Ang abilidad lang sa pagpadagan sa daghang mga balangkas sa pagkat-on sa makina ug pagkonsumo niini gikan sa usa ka katapusan nga punto nagdala sa mga sistema sa rekomendasyon sa sunod nga lebel.

Dugang pa, gipaduol sa MLflow ang mga Data Engineers ug mga espesyalista sa Data Science, nga nagbutang usa ka sagad nga layer sa taliwala nila.

Pagkahuman niini nga pagsuhid sa MLflow, masaligon kami nga magpadayon kami ug gamiton kini alang sa among mga pipeline sa Spark ug mga sistema sa rekomendasyon.

Maayo nga i-synchronize ang pagtipig sa file sa database imbes sa file system. Kini kinahanglan maghatag kanamo daghang mga endpoint nga magamit sa parehas nga pagtipig sa file. Pananglitan, gamita ang daghang mga higayon Presto ΠΈ Athena nga adunay parehas nga Glue metastore.

Sa pag-summarize, gusto kong magpasalamat sa komunidad sa MLFlow sa paghimo sa among trabaho nga adunay datos nga mas makapaikag.

Kung nagdula ka sa MLflow, ayaw pagpanuko sa pagsulat kanamo ug isulti kanamo kung giunsa nimo kini gigamit, ug labi pa kung gigamit nimo kini sa produksiyon.

Pagkat-on og dugang mahitungod sa mga kurso:
Pagkat-on sa makina. Basic nga kurso
Pagkat-on sa makina. Advanced nga kurso

Basaha ang dugang pa:

Source: www.habr.com

Idugang sa usa ka comment