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 и . 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 .
Tòisichidh sinn an lèirmheas 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 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 (, , , , и ), 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. )
- 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 (gus Python a stà ladh air Mac, thoir sÚil air ). 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 API. A bharrachd air an sin, faodaidh tu faighinn a-mach cĂ ite an stòraich stuthan modail (localhost, , , no ). 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.

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 .
MLFLOW_TRACKING_URI=http://localhost:5000 python wine_quality.py
--alpha 0.9
--l1_ration 0.5
--wine_file ./data/winequality-red.csvMar 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") 
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:
Gus frithealaiche a thoirt don mhodail, feumaidh sinn frithealaiche tracadh ruith (faic an eadar-aghaidh cur air bhog) agus ID Run aâ mhodail.

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: ), 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:
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 :
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 jupyterStè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 
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) 
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 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 и 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:
Leugh tuilleadh:
Source: www.habr.com
