د MLflow سره د سپارک پراخول

سلام، د Khabrovsk اوسیدونکو. لکه څنګه چې موږ دمخه لیکلي ، پدې میاشت کې OTUS په یوځل کې د ماشین زده کړې دوه کورسونه پیل کوي ، یعنی اډه и پرمختللی. په دې اړه، موږ د ګټورو موادو شریکولو ته دوام ورکوو.

د دې مقالې هدف دا دی چې زموږ د لومړۍ تجربې کارولو په اړه وغږیږو MLflow.

موږ به بیاکتنه پیل کړو MLflow د دې تعقیب سرور څخه او د مطالعې ټول تکرارونه لاګ کړئ. بیا به موږ د UDF په کارولو سره د MLflow سره د سپارک وصل کولو تجربه شریک کړو.

مقاله

موږ دننه یو د الفا روغتیا موږ د ماشین زده کړې او مصنوعي استخباراتو څخه کار اخلو ترڅو خلک ځواکمن کړي چې د دوی روغتیا او هوساینې مسولیت په غاړه واخلي. له همدې امله د ماشین زده کړې ماډلونه د ډیټا ساینس محصولاتو په زړه کې دي چې موږ یې وده کوو ، او له همدې امله موږ MLflow ته متوجه شو ، د خلاصې سرچینې پلیټ فارم چې د ماشین زده کړې ژوند دورې ټول اړخونه پوښي.

MLflow

د MLflow اصلي هدف د ماشین زده کړې په سر کې اضافي پرت چمتو کول دي چې د ډیټا ساینس پوهانو ته اجازه ورکوي چې نږدې د ماشین زده کړې کتابتون سره کار وکړي (H2O, کیرا, ملپ, پینټرچ, sklearn и لمسول)، د هغې کار بلې کچې ته لیږدول.

MLflow درې برخې وړاندې کوي:

  • د څرک - د تجربو ثبت کول او غوښتنې: کوډ، ډاټا، ترتیب او پایلې. د ماډل جوړولو پروسې څارنه خورا مهمه ده.
  • د پروژو - په هر پلیټ فارم کې د چلولو لپاره د بسته بندۍ بڼه (د بیلګې په توګه SageMaker)
  • موډلونو - مختلف ګمارنې وسیلو ته د ماډلونو سپارلو لپاره یو عام شکل.

MLflow (د لیکلو په وخت کې په الفا کې) د خلاصې سرچینې پلیټ فارم دی چې تاسو ته اجازه درکوي د ماشین زده کړې ژوند دوره اداره کړئ ، پشمول تجربه ، بیا کارول ، او ځای په ځای کول.

د MLflow تنظیم کول

د MLflow کارولو لپاره تاسو اړتیا لرئ لومړی خپل ټول Python چاپیریال تنظیم کړئ ، د دې لپاره به موږ وکاروو PyEnv (په ماک کې د Python نصبولو لپاره، وګورئ دلته). پدې توګه موږ کولی شو یو مجازی چاپیریال رامینځته کړو چیرې چې موږ به د دې چلولو لپاره اړین ټول کتابتونونه نصب کړو.

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

راځئ چې اړین کتابتونونه نصب کړو.

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

یادونه: موږ PyArrow د ماډلونو چلولو لپاره کاروو لکه UDF. د PyArrow او Numpy نسخې باید تنظیم شي ځکه چې وروستي نسخې یو له بل سره ټکر لري.

د تعقیب UI لانچ کړئ

د MLflow تعقیب موږ ته اجازه راکوي چې د Python او په کارولو سره تجربې لاګ او پوښتنې وکړو پاتې API برسېره پردې، تاسو کولی شئ معلومه کړئ چې د ماډل اثار چیرته ذخیره کړئ (localhost، ترلاسه کړئ Amazon S3, د Azure بلاب ذخیره, د ګوګل کلاز ذخیره او یا د SFTP سرور). څرنګه چې موږ په الفا روغتیا کې AWS کاروو، زموږ د هنري اثارو ذخیره به S3 وي.

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

MLflow د دوامداره فایل ذخیره کارولو وړاندیز کوي. د فایل ذخیره هغه ځای دی چیرې چې سرور به د چلولو او تجربې میټاډاټا ذخیره کړي. کله چې سرور پیل کړئ، ډاډ ترلاسه کړئ چې دا د دوامداره فایل ذخیره ته اشاره کوي. دلته د تجربې لپاره موږ به په ساده ډول وکاروو /tmp.

په یاد ولرئ که موږ غواړو د زړو تجربو چلولو لپاره د mlflow سرور وکاروو، دوی باید د فایل ذخیره کې شتون ولري. په هرصورت، حتی د دې پرته موږ کولی شو دا په UDF کې وکاروو، ځکه چې موږ یوازې ماډل ته اړتیا لرو.

یادونه: په یاد ولرئ چې د تعقیب UI او د ماډل پیرودونکي باید د هنري موقعیت ته لاسرسی ولري. دا د دې حقیقت په پام کې نیولو پرته چې د تعقیب UI په EC2 مثال کې ژوند کوي، کله چې په محلي توګه MLflow چلوي، ماشین باید د هنري ماډلونو لیکلو لپاره S3 ته مستقیم لاسرسی ولري.

د MLflow سره د سپارک پراخول
د UI تعقیب کول په S3 بالټ کې اثار ذخیره کوي

د چلولو موډلونه

هرڅومره ژر چې د تعقیب سرور چلیږي ، تاسو کولی شئ د ماډلونو روزنه پیل کړئ.

د مثال په توګه، موږ به د MLflow مثال څخه د شراب تعدیل وکاروو Sklearn.

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

لکه څنګه چې موږ دمخه بحث کړی ، MLflow تاسو ته اجازه درکوي د ماډل پیرامیټرې ، میټریکونه ، او هنري آثار ثبت کړئ نو تاسو کولی شئ تعقیب کړئ چې دوی څنګه په تکرارونو کې وده کوي. دا ب featureه خورا ګټوره ده ځکه چې پدې توګه موږ کولی شو د تعقیب سرور سره اړیکه نیولو سره غوره ماډل بیا تولید کړو یا پوه شو چې کوم کوډ د کمیټ ګیټ هش لاګونو په کارولو سره اړین تکرار ترسره کړی.

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

د MLflow سره د سپارک پراخول
د شرابو تکرار

د ماډل لپاره د سرور برخه

د MLflow تعقیب سرور ، د "mlflow سرور" کمانډ په کارولو سره پیل شوی ، د ځایی فایل سیسټم ته د منډو تعقیب او ډیټا لیکلو لپاره REST API لري. تاسو کولی شئ د چاپیریال متغیر "MLFLOW_TRACKING_URI" په کارولو سره د تعقیب سرور پته مشخص کړئ او د MLflow تعقیب API به په اوتومات ډول پدې پته کې د تعقیب سرور سره اړیکه ونیسي ترڅو د لانچ معلومات ، لاګ میټریکونه او نور رامینځته / ترلاسه کړي.

سرچینه: Docs// د تعقیب سرور چلول

د سرور سره ماډل چمتو کولو لپاره ، موږ د چلولو تعقیب سرور ته اړتیا لرو (د لانچ انٹرفیس وګورئ) او د ماډل چلولو ID.

د MLflow سره د سپارک پراخول
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

د MLflow خدمت فعالیت په کارولو سره ماډلونو ته خدمت کولو لپاره ، موږ به د تعقیب UI ته لاسرسي ته اړتیا ولرو ترڅو د ماډل په اړه معلومات ترلاسه کړو په ساده ډول مشخص کولو سره --run_id.

یوځل چې ماډل د تعقیب سرور سره اړیکه ونیسي، موږ کولی شو د نوي ماډل پای ټکی ترلاسه کړو.

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

د سپارک څخه موډل چلول

د دې حقیقت سره سره چې د تعقیب سرور دومره ځواکمن دی چې په ریښتیني وخت کې ماډلونو ته خدمت وکړي ، دوی وروزي او د سرور فعالیت وکاروئ (سرچینه: mlflow // docs // ماډل # محلي)، د سپارک کارول (بیچ یا سټینګ) د توزیع له امله حتی خورا پیاوړی حل دی.

تصور وکړئ چې تاسو په ساده ډول ټریننګ آفلاین کړی او بیا یې ستاسو ټولو معلوماتو ته د محصول ماډل پلي کړی. دا هغه ځای دی چې سپارک او MLflow روښانه کوي.

PySpark + Jupyter + Spark نصب کړئ

سرچینه: پیل کړئ PySpark - Jupyter

د دې لپاره چې وښیو چې څنګه موږ د Spark ډیټا فریمونو کې د MLflow ماډلونه پلي کوو ، موږ اړتیا لرو د PySpark سره یوځای کار کولو لپاره د Jupyter نوټ بوکونه تنظیم کړو.

د وروستي باثباته نسخه نصبولو سره پیل کړئ اپاپي سپارک:

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̀

په مجازی چاپیریال کې PySpark او Jupyter نصب کړئ:

pip install pyspark jupyter

د چاپیریال تغیرات تنظیم کړئ:

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"

په عزم سره notebook-dir، موږ کولی شو خپل نوټ بوکونه په مطلوب فولډر کې ذخیره کړو.

د PySpark څخه Jupyter په لاره اچول

څرنګه چې موږ د PySpark ډرایور په توګه جوپېټر تنظیم کولو توان درلود، موږ اوس کولی شو د PySpark په شرایطو کې د Jupyter نوټ بوک چلوو.

(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

د MLflow سره د سپارک پراخول

لکه څنګه چې پورته یادونه وشوه، MLflow په S3 کې د موډل آثارو د ننوتلو لپاره یو ځانګړتیا وړاندې کوي. هرڅومره ژر چې موږ غوره شوی ماډل زموږ په لاس کې لرو ، موږ فرصت لرو چې دا د ماډل په کارولو سره د UDF په توګه وارد کړو 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)

د MLflow سره د سپارک پراخول
PySpark - د شراب کیفیت وړاندوینې تولیدوي

تر دې وخته، موږ د MLflow سره د PySpark کارولو څرنګوالي په اړه خبرې وکړې، د شرابو کیفیت وړاندوینې په ټول شراب ډیټاسیټ کې پرمخ وړل. مګر څه که تاسو د سکالا سپارک څخه د Python MLflow ماډلونو کارولو ته اړتیا لرئ؟

موږ دا هم د سکالا او پایتون تر مینځ د سپارک شرایطو په ویشلو سره ازموینه وکړه. دا دی، موږ په Python کې د MLflow UDF ثبت کړی، او دا یې د سکالا څخه کارولی (هو، شاید غوره حل نه وي، مګر هغه څه چې موږ یې لرو).

سکالا سپارک + MLflow

د دې مثال لپاره موږ به اضافه کړو توری کرنل موجوده مشتري ته.

سپارک + توری + جوپیټر نصب کړئ

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

لکه څنګه چې تاسو د ضمیمه نوټ بوک څخه لیدلی شئ، UDF د سپارک او PySpark ترمنځ شریک شوی. موږ امید لرو چې دا برخه به د هغو کسانو لپاره ګټوره وي څوک چې سکالا سره مینه لري او غواړي په تولید کې د ماشین زده کړې ماډلونه ځای په ځای کړي.

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

راتلونکی ګامونه

که څه هم MLflow د لیکلو په وخت کې په الفا نسخه کې دی، دا خورا ژمن ښکاري. یوازې د ډیری ماشین زده کړې چوکاټونو چلولو وړتیا او د یوې پای ټکی څخه یې مصرف کول د وړاندیز کونکي سیسټمونه بلې کچې ته لیږي.

سربیره پردې ، MLflow د ډیټا انجینرانو او ډیټا ساینس متخصصین سره نږدې راوړي ، د دوی ترمینځ یو عام پرت ایښودل.

د MLflow د دې سپړنې وروسته، موږ ډاډه یو چې موږ به پرمخ ولاړ شو او دا به زموږ د سپارک پایپ لاینونو او وړاندیز کونکي سیسټمونو لپاره وکاروو.

دا به ښه وي چې د فایل سیسټم پرځای د فایل ذخیره د ډیټابیس سره همغږي کړئ. دا باید موږ ته ډیری پای ټکي راکړي چې کولی شي ورته فایل ذخیره وکاروي. د مثال په توګه، ډیری مثالونه وکاروئ پریزو и ایتینا د ورته ګلو میټاسټور سره.

د لنډیز کولو لپاره، زه غواړم ووایم چې د MLFlow ټولنې څخه مننه کوم چې زموږ کار د ډیټا سره ډیر په زړه پورې کوي.

که تاسو د MLflow سره لوبې کوئ، موږ ته د لیکلو څخه ډډه مه کوئ او موږ ته ووایاست چې تاسو یې څنګه کاروئ، او حتی که تاسو دا په تولید کې کاروئ.

د کورسونو په اړه نور معلومات ترلاسه کړئ:
د ماشین زده کړه. بنسټیز کورس
د ماشین زده کړه. پرمختللی کورس

نور یی ولوله:

سرچینه: www.habr.com

Add a comment