MLflow سان اسپارڪ کي وڌايو

هيلو، Khabrovsk جي رهاڪن. جيئن ته اسان اڳ ۾ ئي لکيو آهي، هن مهيني OTUS شروع ڪري رهيو آهي ٻه مشين سکيا ڪورس هڪ ڀيرو، يعني بنياد и ترقي يافته. ان سلسلي ۾، اسان مفيد مواد حصيداري ڪرڻ جاري رکون ٿا.

هن آرٽيڪل جو مقصد اسان جي استعمال جي پهرين تجربي بابت ڳالهائڻ آهي ايم ايل فلو.

اسان جائزو شروع ڪنداسين ايم ايل فلو ان جي ٽريڪنگ سرور کان ۽ مطالعي جي سڀني ورهاڱي کي لاگ ان ڪريو. پوءِ اسان UDF استعمال ڪندي Spark کي MLflow سان ڳنڍڻ جو تجربو شيئر ڪنداسين.

مقالو

اسان اندر آهيون الفا صحت اسان مشين سکيا ۽ مصنوعي ذهانت استعمال ڪندا آهيون ماڻهن کي بااختيار بڻائڻ لاءِ انهن جي صحت ۽ خوشحالي جي چارج وٺڻ لاءِ. اهو ئي سبب آهي ته مشين لرننگ ماڊلز اسان جي ترقي ڪيل ڊيٽا سائنس جي پروڊڪٽس جي دل تي آهن، ۽ اهو ئي سبب آهي ته اسان کي MLflow ڏانهن راغب ڪيو ويو، هڪ کليل ذريعو پليٽ فارم جيڪو مشين جي سکيا واري زندگي جي سڀني حصن کي ڍڪيندو آهي.

ايم ايل فلو

MLflow جو بنيادي مقصد مشين لرننگ جي مٿي تي هڪ اضافي پرت مهيا ڪرڻ آهي جيڪا ڊيٽا سائنسدانن کي تقريبن ڪنهن به مشين لرننگ لائبريري سان ڪم ڪرڻ جي اجازت ڏئي ٿي (ايڇ 2و, keras, ميلاپ, پيتورچ, sklearn и ٽينسر)، هن جي ڪم کي ايندڙ سطح تي وٺي.

MLflow ٽن حصن کي مهيا ڪري ٿو:

  • ٽريڪنگ - رڪارڊنگ ۽ تجربن لاءِ درخواستون: ڪوڊ، ڊيٽا، ترتيب ۽ نتيجا. ماڊل ٺاهڻ جي عمل جي نگراني تمام ضروري آهي.
  • پروجيڪٽ - ڪنهن به پليٽ فارم تي هلائڻ لاءِ پيڪنگ فارميٽ (مثال طور سيج منڪر)
  • ماڊلس - ماڊل جمع ڪرائڻ لاءِ هڪ عام فارميٽ مختلف ڊيپلائيمينٽ ٽولز تي.

MLflow (لکڻ جي وقت ۾ الفا ۾) هڪ اوپن سورس پليٽ فارم آهي جيڪو توهان کي مشين لرننگ لائف سائيڪل کي منظم ڪرڻ جي اجازت ڏئي ٿو، بشمول تجربو، ٻيهر استعمال، ۽ مقرري.

MLflow ترتيب ڏيڻ

MLflow استعمال ڪرڻ لاءِ توھان کي پھريائين پنھنجي پوري پٿون ماحول کي سيٽ ڪرڻ جي ضرورت آھي، ان لاءِ اسين استعمال ڪنداسين PyEnv (ميڪ تي پٿون انسٽال ڪرڻ لاءِ، چيڪ ڪريو هتي). هن طريقي سان اسان هڪ مجازي ماحول ٺاهي سگهون ٿا جتي اسان ان کي هلائڻ لاء ضروري سڀني لائبريرين کي نصب ڪنداسين.

```
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 ۽ استعمال ڪندي تجربن کي لاگ ان ڪرڻ ۽ سوال ڪرڻ جي اجازت ڏئي ٿي REST API. اضافي طور تي، توهان اهو طئي ڪري سگهو ٿا ته ماڊل نموني کي ڪٿي ذخيرو ڪرڻ لاء (localhost، ايم ڊي ايسڪسيمڪس, Azure Blob اسٽوريج, Google Cloud Storage يا 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 مثال مان شراب جي ترميم کي استعمال ڪنداسين اسڪلرن.

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

جيئن ته اسان اڳ ۾ ئي بحث ڪيو آهي، MLflow توهان کي ماڊل پيرا ميٽرز، ميٽرڪس، ۽ نمونن کي لاگ ان ڪرڻ جي اجازت ڏئي ٿو ته جيئن توهان ٽريڪ ڪري سگهو ٿا ته اهي ڪيئن ارتقاء تي ترقي ڪن ٿا. هي خصوصيت انتهائي ڪارائتو آهي ڇاڪاڻ ته هن طريقي سان اسان ٽريڪنگ سرور سان رابطو ڪري بهترين ماڊل ٻيهر پيدا ڪري سگهون ٿا يا سمجهي سگهون ٿا ته ڪهڙن ڪوڊ استعمال ڪري گهربل ورجائي انجام ڏنو گٽ هيش لاگز آف ڪمٽس.

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 service functionality استعمال ڪندي ماڊلز جي خدمت ڪرڻ لاءِ، اسان کي ٽريڪنگ 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 // ماڊل # مقامياسپارڪ (بيچ يا اسٽريمنگ) استعمال ڪرڻ ان جي ورڇ جي ڪري اڃا به وڌيڪ طاقتور حل آهي.

تصور ڪريو ته توهان صرف ٽريننگ آف لائن ڪيو ۽ پوءِ توهان جي سڀني ڊيٽا تي آئوٽ پٽ ماڊل لاڳو ڪيو. هي آهي جتي اسپارڪ ۽ ايم ايل فلو چمڪندو آهي.

انسٽال ڪريو PySpark + Jupyter + Spark

جو ذريعو: شروع ڪريو PySpark - Jupyter

اهو ڏيکارڻ لاءِ ته اسان اسپارڪ ڊيٽا فريم تي MLflow ماڊل ڪيئن لاڳو ڪريون ٿا، اسان کي PySpark سان گڏجي ڪم ڪرڻ لاءِ Jupyter نوٽ بڪ قائم ڪرڻ گهرجن.

تازه ترين مستحڪم ورزن انسٽال ڪندي شروع ڪريو Apache Apache:

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 لانچ ڪرڻ

جيئن ته اسان Jupiter کي PySpark ڊرائيور جي طور تي ترتيب ڏيڻ جي قابل ٿي چڪا آهيون، اسان هاڻي هلائي سگهون ٿا Jupyter نوٽ بڪ 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

MLflow سان اسپارڪ کي وڌايو

جيئن مٿي ذڪر ڪيو ويو آهي، MLflow S3 ۾ ماڊل نموني جي لاگنگ لاء هڪ خاصيت مهيا ڪري ٿو. جيئن ئي اسان وٽ چونڊيل ماڊل اسان جي هٿن ۾ آهي، اسان وٽ اهو موقعو آهي ته ان کي ماڊل استعمال ڪندي يو ڊي ايف جي طور تي درآمد ڪريو. 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 - آئوٽ پائڻ شراب جي معيار جي اڳڪٿيون

هن نقطي تائين، اسان بابت ڳالهايو آهي PySpark ڪيئن استعمال ڪجي MLflow سان، هلندڙ شراب جي معيار جي اڳڪٿيون پوري شراب جي ڊيٽا سيٽ تي. پر ڇا جيڪڏهن توهان کي اسڪالا اسپارڪ مان پٿون ايم ايل فلو ماڊل استعمال ڪرڻ جي ضرورت آهي؟

اسان اهو پڻ آزمايو اسپارڪ جي حوالي سان اسڪالا ۽ پٿون جي وچ ۾ ورهائڻ سان. اهو آهي، اسان Python ۾ MLflow UDF رجسٽرڊ ڪيو، ۽ ان کي اسڪالا مان استعمال ڪيو (ها، شايد بهترين حل ناهي، پر اسان وٽ ڇا آهي).

اسڪالا اسپارڪ + ايم ايل فلو

هن مثال لاء اسين شامل ڪنداسين توري ڪرنل موجوده جپان ۾.

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

جئين توهان منسلڪ نوٽ بڪ مان ڏسي سگهو ٿا، UDF Spark ۽ 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

تبصرو شامل ڪريو