Spark a leathnú le MLflow

Dia duit, cónaitheoirí Khabrovsk. Mar a scríobhamar cheana, an mhí seo tá OTUS ag seoladh dhá chúrsa meaisínfhoghlama ag an am céanna, eadhon bonn и chun cinn. Maidir leis seo, leanaimid ag roinnt ábhar úsáideach.

Is é cuspóir an ailt seo ná labhairt ar ár gcéad taithí ag baint úsáide as MLflow.

Cuirfimid tús leis an athbhreithniú MLflow óna fhreastalaí rianaithe agus logáil gach atriall den staidéar. Ansin roinnfimid ár dtaithí maidir le Spark a nascadh le MLflow ag baint úsáide as UDF.

Comhthéacs

Tá muid isteach Sláinte Alfa Bainimid úsáid as meaisínfhoghlaim agus intleacht shaorga chun daoine a chumasú le bheith i gceannas ar a sláinte agus a bhfolláine. Sin an fáth go bhfuil samhlacha meaisínfhoghlama ag croílár na dtáirgí eolaíochta sonraí a fhorbraimid, agus sin an fáth a tarraingíodh muid chuig MLflow, ardán foinse oscailte a chlúdaíonn gach gné den saolré foghlama meaisín.

MLflow

Is é príomhsprioc MLflow ciseal breise a sholáthar ar bharr na meaisínfhoghlama a ligfeadh d’eolaithe sonraí oibriú le beagnach aon leabharlann meaisínfhoghlama (h2o, keras, mleap, pytorch, sklearn и tensorflow), ag tabhairt a cuid oibre go dtí an chéad leibhéal eile.

Soláthraíonn MLflow trí chomhpháirt:

  • Rianú – taifeadadh agus iarratais ar thurgnaimh: cód, sonraí, cumraíocht agus torthaí. Tá sé an-tábhachtach monatóireacht a dhéanamh ar an bpróiseas chun samhail a chruthú.
  • Tionscadail – Formáid phacáistithe le rith ar aon ardán (m.sh. SageMaker)
  • múnlaí – formáid choiteann chun samhlacha a chur isteach chuig uirlisí imlonnaithe éagsúla.

Is ardán foinse oscailte é MLflow (in alpha ag am scríofa) a ligeann duit saolré na foghlama meaisín a bhainistiú, lena n-áirítear turgnamh, athúsáid agus imscaradh.

MLflow a shocrú

Chun MLflow a úsáid ní mór duit do thimpeallacht Python ar fad a shocrú ar dtús, chun é seo a úsáidfimid PyEnv (chun Python a shuiteáil ar Mac, seiceáil amach anseo). Ar an mbealach seo is féidir linn timpeallacht fhíorúil a chruthú ina suiteoimid na leabharlanna go léir is gá chun é a rith.

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

Déanaimis na leabharlanna riachtanacha a shuiteáil.

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

Nóta: Bainimid úsáid as PyArrow chun samhlacha ar nós UDF a rith. Ba ghá na leaganacha de PyArrow agus Numpy a shocrú toisc go raibh na leaganacha deireanacha ag teacht salach ar a chéile.

Seoladh Chomhéadain Rianaithe

Ligeann MLflow Tracking dúinn trialacha a logáil agus a cheistiú ag baint úsáide as Python agus REST API. Ina theannta sin, is féidir leat a chinneadh cá háit le déantúsáin mhúnla a stóráil (localhost, Amazon S3, Stóráil Azure Blob, Google Cloud StóráilFreastalaí SFTP). Ós rud é go n-úsáideann muid AWS ag Alpha Health, beidh ár stóráil déantán S3.

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

Molann MLflow úsáid a bhaint as stóráil leanúnach comhad. Is éard is stóráil comhad ann ná an áit a stórálfaidh an freastalaí meiteashonraí rith agus turgnamh. Agus an freastalaí á thosú agat, déan cinnte go díríonn sé ar an stór comhad leanúnach. Anseo don turgnamh beidh muid a úsáid go simplí /tmp.

Cuimhnigh, más mian linn an freastalaí mlflow a úsáid chun sean-turgnaimh a reáchtáil, ní mór dóibh a bheith i láthair sa stóráil comhad. Mar sin féin, fiú gan é seo d'fhéadfaimis iad a úsáid san UDF, ós rud é nach bhfuil uainn ach an cosán go dtí an tsamhail.

Nóta: Coinnigh i gcuimhne go gcaithfidh rochtain a bheith ag an Chomhéadain Rianaithe agus an cliant múnla ar an suíomh Déantán. Is é sin, beag beann ar an bhfíric go bhfuil an Chomhéadain Rianaithe ina chónaí i gcás EC2, nuair a bhíonn MLflow á reáchtáil go háitiúil, ní mór go mbeadh rochtain dhíreach ag an meaisín ar S3 chun samhlacha déantán a scríobh.

Spark a leathnú le MLflow
Rianú Chomhéadain Stórálann déantáin i mbuicéad S3

Samhlacha rith

Chomh luath agus a bhíonn an freastalaí Rianaithe ar siúl, is féidir leat tosú ag oiliúint na múnlaí.

Mar shampla, úsáidfimid an modhnú fíona ón sampla MLflow i Sclábhaí.

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 phléigh muid cheana féin, ligeann MLflow duit paraiméadair mhúnla, méadracht agus déantáin a logáil ionas gur féidir leat a rian a choinneáil ar an gcaoi a n-éabhlóidíonn siad thar atriallta. Tá an ghné seo thar a bheith úsáideach mar ar an mbealach seo is féidir linn an tsamhail is fearr a atáirgeadh trí theagmháil a dhéanamh leis an bhfreastalaí Rianaithe nó tuiscint a fháil ar an gcód a chríochnaigh an t-atriall riachtanach ag baint úsáide as logs hash git de gealltanais.

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

Spark a leathnú le MLflow
Athruithe fíona

Cuid freastalaí don mhúnla

Tá API REST ag an bhfreastalaí rianaithe MLflow, a seoladh ag baint úsáide as an ordú “freastalaí mlflow”, chun ritheanna a rianú agus sonraí a scríobh chuig an gcóras comhad áitiúil. Is féidir leat seoladh an fhreastalaí rianaithe a shonrú ag baint úsáide as an athróg timpeallachta “MLFLOW_TRACKING_URI” agus déanfaidh an API rianaithe MLflow teagmháil go huathoibríoch leis an bhfreastalaí rianaithe ag an seoladh seo chun faisnéis seolta, méadracht logála, etc. a chruthú/a fháil.

Foinse: Docs// Freastalaí rianaithe a rith

Chun freastalaí a sholáthar don mhúnla, teastaíonn freastalaí rianaithe reatha uainn (féach an comhéadan seolta) agus ID Rith an tsamhail.

Spark a leathnú le MLflow
Rith 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

Chun samhlacha a úsáid ag baint úsáide as feidhmiúlacht riartha MLflow, beidh rochtain againn ar an Chomhéadain Rianaithe chun faisnéis a fháil faoin tsamhail trí shonrú --run_id.

Nuair a théann an tsamhail i dteagmháil leis an bhfreastalaí Rianaithe, is féidir linn críochphointe múnla nua a fháil.

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

Samhlacha rith ó Spark

In ainneoin go bhfuil an freastalaí Rianaithe cumhachtach go leor chun samhlacha a sheirbheáil i bhfíor-am, oiliúint a chur orthu agus feidhmiúlacht an fhreastalaí a úsáid (foinse: mlflow // docs // samhlacha # áitiúil), Is réiteach níos cumhachtaí fós é úsáid Spark (baisc nó sruthú) mar gheall ar dháileadh.

Samhlaigh go ndearna tú an oiliúint as líne agus gur chuir tú an tsamhail aschuir i bhfeidhm ar do shonraí go léir. Seo an áit a bhfuil Spark agus MLflow ag taitneamh.

Suiteáil PySpark + Jupyter + Spark

Foinse: Cuir tús leis PySpark - Jupyter

Chun a thaispeáint conas a chuirimid samhlacha MLflow i bhfeidhm ar fhrámaí sonraí Spark, ní mór dúinn leabhair nótaí Jupyter a bhunú chun oibriú le PySpark.

Tosaigh leis an leagan cobhsaí is déanaí a shuiteáil 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̀

Suiteáil PySpark agus Jupyter sa timpeallacht fhíorúil:

pip install pyspark jupyter

Socraigh athróga timpeallachta:

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"

Tar éis a chinneadh notebook-dir, is féidir linn ár leabhair nótaí a stóráil san fhillteán atá ag teastáil.

Ag seoladh Jupyter ó PySpark

Ós rud é go raibh muid in ann Iúpatar a chumrú mar thiománaí PySpark, is féidir linn leabhar nótaí Jupyter a reáchtáil anois i gcomhthéacs 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

Spark a leathnú le MLflow

Mar a luadh thuas, soláthraíonn MLflow gné chun déantúsáin mhúnla a logáil i S3. Chomh luath agus a bheidh an tsamhail roghnaithe againn inár lámha, tá an deis againn é a allmhairiú mar UDF ag baint úsáide as an modúl 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)

Spark a leathnú le MLflow
PySpark - tuar cáilíochta fíona aschuir

Go dtí an pointe seo, labhair muid faoi conas PySpark a úsáid le MLflow, ag rith tuar cáilíochta fíona ar an tacar sonraí fíona iomlán. Ach cad más gá duit modúil Python MLflow a úsáid ó Scala Spark?

Rinneamar tástáil air seo freisin trí chomhthéacs Spark a roinnt idir Scala agus Python. Is é sin, chláraigh muid MLflow UDF i Python, agus d'úsáid muid é ó Scala (tá, b'fhéidir nach é an réiteach is fearr, ach an méid atá againn).

Scala Spark + MLflow

Chun an sampla seo cuirfimid Eithne Thoraí isteach sa Iúpatar atá ann cheana féin.

Suiteáil 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 fheiceann tú ón leabhar nótaí ceangailte, roinntear an UDF idir Spark agus PySpark. Tá súil againn go mbeidh an chuid seo úsáideach dóibh siúd a bhfuil grá acu do Scala agus ar mian leo samhlacha meaisínfhoghlama a úsáid i dtáirgeadh.

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 chéad chéimeanna eile

Cé go bhfuil MLflow i leagan Alfa tráth scríofa na tuarascála seo, tá cuma an-dearfach air. Ní gá ach an cumas chun creataí foghlama meaisín iolracha a rith agus iad a ithe ó chríochphointe amháin a thógann córais mholtóra go dtí an chéad leibhéal eile.

Ina theannta sin, tugann MLflow Innealtóirí Sonraí agus speisialtóirí Eolaíochta Sonraí níos gaire dá chéile, ag leagan ciseal coiteann eatarthu.

Tar éis an iniúchadh seo ar MLflow, táimid muiníneach go rachaimid ar aghaidh agus go n-úsáidfimid é le haghaidh ár bpíblínte Spark agus ár gcórais molta.

Bheadh ​​sé go deas an stóráil comhad a shioncronú leis an mbunachar sonraí in ionad an chórais comhad. Ba cheart go dtabharfadh sé seo críochphointí iolracha dúinn ar féidir leo an stóráil comhad céanna a úsáid. Mar shampla, bain úsáid as cásanna iolracha Presto и Fiachra leis an metastore céanna Gliú.

Mar achoimre, ba mhaith liom buíochas a ghabháil leis an bpobal MLFlow as ár gcuid oibre le sonraí a dhéanamh níos suimiúla.

Má tá tú ag imirt timpeall le MLflow, ná bíodh drogall ort scríobh chugainn agus inis dúinn conas a úsáideann tú é, agus níos mó fós má úsáideann tú é i dtáirgeadh.

Faigh tuilleadh eolais faoi na cúrsaí:
Foghlaim meaisín. Bunchúrsa
Foghlaim meaisín. Ardchúrsa

Leigh Nios mo:

Foinse: will.com

Add a comment