A’ leudachadh Spark le MLflow

Halo, luchd-còmhnaidh Khabrovsk. Mar a sgrìobh sinn mu thràth, air a’ mhìos seo tha OTUS a’ cur air bhog dà chùrsa ionnsachadh innealan aig an aon àm, is e sin bonn и adhartach. A thaobh seo, tha sinn a 'leantainn oirnn a' roinn stuthan feumail.

Is e adhbhar an artaigil seo bruidhinn mun chiad eòlas againn a’ cleachdadh ML sruth.

Tòisichidh sinn an lèirmheas ML sruth bhon t-seirbheisiche tracadh aige agus log a h-uile tionndadh den sgrùdadh. An uairsin roinnidh sinn ar n-eòlas mu bhith a’ ceangal Spark le MLflow a’ cleachdadh UDF.

Co-theacs

Tha sinn a-staigh Slàinte Alpha Bidh sinn a’ cleachdadh ionnsachadh innealan agus inntleachd fuadain gus cumhachd a thoirt do dhaoine smachd a ghabhail air an slàinte agus an sunnd. Sin as coireach gu bheil modalan ionnsachaidh inneal aig cridhe nan toraidhean saidheans dàta a bhios sinn a’ leasachadh, agus is ann air sgàth sin a chaidh ar tarraing gu MLflow, àrd-ùrlar stòr fosgailte a tha a’ còmhdach gach taobh de chuairt-beatha ionnsachadh inneal.

ML sruth

Is e prìomh amas MLflow còmhdach a bharrachd a thoirt seachad a bharrachd air ionnsachadh innealan a leigeadh le luchd-saidheans dàta obrachadh le cha mhòr leabharlann ionnsachaidh inneal (h2o, keras, mleap, pytorch, sglearn и tensorflow), a’ toirt a cuid obrach chun ath ìre.

Tha MLflow a’ toirt seachad trì pàirtean:

  • o Thracadh - clĂ radh agus iarrtasan airson deuchainnean: còd, dĂ ta, rèiteachadh agus toraidhean. Tha e glè chudromach sĂšil a chumail air a 'phròiseas airson a bhith a' cruthachadh mhodail.
  • pròiseactan - Cruth pacaidh airson a ruith air Ă rd-Ăšrlar sam bith (me. SageMaker)
  • modailean - cruth cumanta airson modalan a chuir a-steach gu diofar innealan cleachdadh.

Tha MLflow (ann an alpha aig àm sgrìobhaidh) na àrd-ùrlar stòr fosgailte a leigeas leat cearcall-beatha ionnsachadh inneal a riaghladh, a’ toirt a-steach deuchainneachd, ath-chleachdadh agus cleachdadh.

A’ stèidheachadh MLflow

Gus MLflow a chleachdadh feumaidh tu an àrainneachd Python gu lèir agad a stèidheachadh an-toiseach, airson seo cleachdaidh sinn PyEnv (gus Python a stàladh air Mac, thoir sÚil air an seo). San dòigh seo is urrainn dhuinn àrainneachd bhrÏgheil a chruthachadh far an cuir sinn a-steach a h-uile leabharlann a tha riatanach airson a ruith.

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

Nach stĂ laich sinn na leabharlannan a tha a dhĂŹth.

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

Nota: Bidh sinn a’ cleachdadh PyArrow gus modalan leithid UDF a ruith. Dh'fheumadh na dreachan de PyArrow agus Numpy a bhith air an suidheachadh oir bha na dreachan mu dheireadh a 'dol an aghaidh a chèile.

Cuir air bhog Tracking UI

Leigidh MLflow Tracking leinn logadh agus ceasnachadh dheuchainnean a’ cleachdadh Python agus CÒRR API. A bharrachd air an sin, faodaidh tu faighinn a-mach càite an stòraich stuthan modail (localhost, Amazon S3, Stòradh Azure Blob, Stòras Google Cloud no SFTP frithealaiche). Leis gu bheil sinn a’ cleachdadh AWS aig Alpha Health, is e S3 an stòradh artifact againn.

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

Tha MLflow a’ moladh a bhith a’ cleachdadh stòradh fhaidhlichean leantainneach. Is e stòradh faidhle far am bi am frithealaiche a’ stòradh ruith agus a’ feuchainn meata-dàta. Nuair a thòisicheas tu air an fhrithealaiche, dèan cinnteach gu bheil e a’ comharrachadh stòr nam faidhlichean leantainneach. An seo airson an deuchainn bidh sinn dìreach a 'cleachdadh /tmp.

Cuimhnich ma tha sinn airson am frithealaiche mlflow a chleachdadh gus seann dheuchainnean a ruith, feumaidh iad a bhith an làthair anns an stòradh faidhle. Ach, eadhon às aonais seo b ’urrainn dhuinn an cleachdadh san UDF, leis nach fheum sinn ach an t-slighe chun mhodail.

Nota: Cumaibh cuimhne gum feum cothrom a bhith aig Tracking UI agus an neach-dèiligidh modail air an àite artifact. Is e sin, ge bith dè an fhìrinn gu bheil an Tracking UI a ’fuireach ann an suidheachadh EC2, nuair a bhios e a’ ruith MLflow gu h-ionadail, feumaidh cothrom dìreach a bhith aig an inneal gu S3 gus modalan artifact a sgrìobhadh.

A’ leudachadh Spark le MLflow
Bidh tracadh UI a’ stòradh stuthan ann am bucaid S3

Modalan ruith

Cho luath 'sa tha an fhrithealaiche Tracking a' ruith, faodaidh tu tòiseachadh air na modailean a thrèanadh.

Mar eisimpleir, cleachdaidh sinn am mion-atharrachadh fĂŹon bhon eisimpleir MLflow ann an Sglearn.

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

Mar a bhruidhinn sinn mu thràth, leigidh MLflow leat paramadairean modail, metrics, agus artifacts a chlàradh gus an urrainn dhut sùil a chumail air mar a thig iad air adhart thairis air ath-aithrisean. Tha am feart seo air leth feumail oir san dòigh seo is urrainn dhuinn am modail as fheàrr ath-riochdachadh le bhith a’ cur fios chun t-seirbheisiche Tracking no a’ tuigsinn dè an còd a rinn an tionndadh riatanach a’ cleachdadh na logaichean git hash de ghealltanasan.

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")

A’ leudachadh Spark le MLflow
Ath-aithrisean fĂŹona

PĂ irt frithealaiche airson a 'mhodail

Tha REST API aig an t-seirbheisiche tracadh MLflow, a chaidh a chuir air bhog a’ cleachdadh an àithne “frithealaiche mlflow”, airson sùil a chumail air ruith agus sgrìobhadh dàta chun t-siostam faidhle ionadail. Faodaidh tu seòladh an fhrithealaiche tracadh a shònrachadh le bhith a’ cleachdadh caochladair na h-àrainneachd “MLFLOW_TRACKING_URI” agus cuiridh an API tracadh MLflow fios gu fèin-ghluasadach ris an t-seirbheisiche tracadh aig an t-seòladh seo gus fiosrachadh cur air bhog, log metrics, msaa a chruthachadh / fhaighinn.

Source: Docs // A’ ruith frithealaiche tracadh

Gus frithealaiche a thoirt don mhodail, feumaidh sinn frithealaiche tracadh ruith (faic an eadar-aghaidh cur air bhog) agus ID Run a’ mhodail.

A’ leudachadh Spark le MLflow
ID ruith

# 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

Gus seirbheis a thoirt do mhodalan a’ cleachdadh comas seirbheis MLflow, feumaidh sinn cothrom air an Tracking UI gus fiosrachadh fhaighinn mun mhodail dìreach le bhith a’ sònrachadh --run_id.

Cho luath ‘s a chuireas am modail fios chun t-seirbheisiche Tracking, gheibh sinn puing crìochnachaidh modail ùr.

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

Modalan ruith bho Spark

A dh’ aindeoin gu bheil an t-seirbheisiche Tracking cumhachdach gu leòr airson modalan a fhrithealadh ann an àm fìor, trèanadh iad agus cleachd comas an fhrithealaiche (stòr: mlflow // docs // models # ionadail), tha cleachdadh Spark (baidse no sruthadh) na fhuasgladh eadhon nas cumhachdaiche air sgàth cuairteachadh.

Smaoinich gun do rinn thu dìreach an trèanadh far-loidhne agus an uairsin chuir thu am modal toraidh an sàs anns an dàta agad gu lèir. Seo far a bheil Spark agus MLflow a’ deàrrsadh.

StĂ laich PySpark + Jupyter + Spark

Source: Tòisich PySpark - Jupyter

Gus sealltainn mar a chuireas sinn modalan MLflow an sàs ann an frèamaichean dàta Spark, feumaidh sinn leabhraichean notaichean Jupyter a stèidheachadh gus obrachadh còmhla ri PySpark.

Tòisich le bhith a 'stàladh an tionndadh seasmhach as Úire 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̀

StĂ laich PySpark agus Jupyter san Ă rainneachd bhrĂŹgheil:

pip install pyspark jupyter

Stèidhich caochladairean àrainneachd:

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"

An dèidh co-dhùnadh notebook-dir, is urrainn dhuinn na leabhraichean notaichean againn a stòradh anns a’ phasgan a tha thu ag iarraidh.

A' cur air bhog Jupyter bho PySpark

Leis gun robh e comasach dhuinn Jupiter a rèiteachadh mar dhràibhear PySpark, is urrainn dhuinn a-nis leabhar notaichean Jupyter a ruith ann an co-theacsa 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

A’ leudachadh Spark le MLflow

Mar a chaidh ainmeachadh gu h-àrd, tha MLflow a’ toirt seachad feart airson a bhith a’ logadh artifacts modail ann an S3. Cho luath ‘s a bhios am modail taghte againn nar làmhan, tha cothrom againn a thoirt a-steach mar UDF a’ cleachdadh a ’mhodal 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)

A’ leudachadh Spark le MLflow
PySpark - Ro-innse cĂ ileachd fĂŹon a-mach

Gu ruige seo, tha sinn air bruidhinn mu mar a chleachdas tu PySpark le MLflow, a’ ruith ro-innse càileachd fìon air an t-seata fìona gu lèir. Ach dè ma dh’ fheumas tu modalan Python MLflow a chleachdadh bho Scala Spark?

Rinn sinn deuchainn air seo cuideachd le bhith a’ roinn co-theacs Spark eadar Scala agus Python. Is e sin, chlàraich sinn MLflow UDF ann am Python, agus chleachd sinn e bho Scala (tha, is dòcha nach e am fuasgladh as fheàrr, ach na tha againn).

Scala Spark + MLflow

Airson an eisimpleir seo cuiridh sinn ris Toree Kernel a-steach don Jupiter a th’ ann.

StĂ laich 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
```

Mar a chÏ thu bhon leabhar notaichean ceangailte, tha an UDF air a roinn eadar Spark agus PySpark. Tha sinn an dòchas gum bi am pàirt seo feumail dhaibhsan a tha dèidheil air Scala agus a tha airson modalan ionnsachaidh inneal a chleachdadh ann an cinneasachadh.

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

Na h-ath cheumannan

Eadhon ged a tha MLflow ann an dreach Alpha aig àm sgrìobhaidh, tha e a’ coimhead gu math gealltanach. Is e dìreach an comas grunn fhrèamaichean ionnsachaidh inneal a ruith agus an ithe bho aon phuing crìochnachaidh a’ toirt siostaman molaidh chun ath ìre.

A bharrachd air an sin, bidh MLflow a’ toirt Einnseanairean Dàta agus eòlaichean Saidheans Dàta nas fhaisge air a chèile, a’ suidheachadh còmhdach cumanta eatorra.

Às deidh an sgrùdadh seo air MLflow, tha sinn misneachail gun gluais sinn air adhart agus gun cleachd sinn e airson ar pìoban Spark agus siostaman molaidh.

Bhiodh e math an stòradh fhaidhlichean a shioncronachadh leis an stòr-dàta an àite an t-siostam faidhle. Bu chòir dha seo grunn phuingean crÏochnachaidh a thoirt dhuinn as urrainn an aon stòradh faidhle a chleachdadh. Mar eisimpleir, cleachd iomadh suidheachadh Presto и Athena leis an aon metastore Glue.

Gus geàrr-chunntas a dhèanamh, bu mhath leam taing a thoirt don choimhearsnachd MLFlow airson ar n-obair le dàta a dhèanamh nas inntinniche.

Ma tha thu a’ cluich mun cuairt le MLflow, na bi leisg sgrìobhadh thugainn agus innse dhuinn mar a chleachdas tu e, agus eadhon nas motha ma chleachdas tu e ann an cinneasachadh.

Faigh a-mach tuilleadh mu na cĂšrsaichean:
Ionnsachadh inneal. CĂšrsa bunaiteach
Ionnsachadh inneal. CĂšrsa adhartach

Leugh tuilleadh:

Source: www.habr.com

Ceannaich aoigheachd earbsach airson làraich le dìon DDoS, frithealaichean VPS VDS 🔥 Ceannaich aoigheachd làrach-lìn earbsach le dìon DDoS, frithealaichean VPS VDS | ProHoster