MLflow کے ساتھ اسپارک کو بڑھانا

ہیلو، Khabrovsk کے رہائشیوں. جیسا کہ ہم پہلے ہی لکھ چکے ہیں، اس مہینے OTUS ایک ساتھ دو مشین لرننگ کورسز شروع کر رہا ہے، یعنی بنیاد и اعلی درجے کی. اس سلسلے میں ہم مفید مواد شیئر کرتے رہتے ہیں۔

اس مضمون کا مقصد ہمارے پہلے تجربے کے بارے میں بات کرنا ہے۔ ایم ایل فلو.

ہم جائزہ شروع کریں گے۔ ایم ایل فلو اس کے ٹریکنگ سرور سے اور مطالعہ کے تمام تکرار کو لاگ ان کریں۔ پھر ہم UDF کا استعمال کرتے ہوئے Spark کو MLflow کے ساتھ جوڑنے کے اپنے تجربے کا اشتراک کریں گے۔

سیاق و سباق

ہم میں ہیں الفا ہیلتھ ہم مشین لرننگ اور مصنوعی ذہانت کا استعمال کرتے ہیں تاکہ لوگوں کو ان کی صحت اور تندرستی کا چارج سنبھالنے کا اختیار حاصل ہو۔ یہی وجہ ہے کہ مشین لرننگ ماڈلز ہمارے تیار کردہ ڈیٹا سائنس پروڈکٹس کے مرکز میں ہیں، اور اسی وجہ سے ہم MLflow، ایک اوپن سورس پلیٹ فارم کی طرف راغب ہوئے جو مشین لرننگ لائف سائیکل کے تمام پہلوؤں کا احاطہ کرتا ہے۔

ایم ایل فلو

ایم ایل فلو کا بنیادی مقصد مشین لرننگ کے اوپر ایک اضافی پرت فراہم کرنا ہے جو ڈیٹا سائنسدانوں کو تقریباً کسی بھی مشین لرننگ لائبریری کے ساتھ کام کرنے کی اجازت دے گی۔h2o۔, کیرا, mleap, pytorch, sklearn и ٹیسسرور)، اس کے کام کو اگلے درجے پر لے جا رہے ہیں۔

MLflow تین اجزاء فراہم کرتا ہے:

  • ٹریکنگ - ریکارڈنگ اور تجربات کے لیے درخواستیں: کوڈ، ڈیٹا، کنفیگریشن اور نتائج۔ ماڈل بنانے کے عمل کی نگرانی بہت ضروری ہے۔
  • منصوبوں کی تفصیل - کسی بھی پلیٹ فارم پر چلنے کے لیے پیکیجنگ فارمیٹ (جیسے سیج میکر۔)
  • ماڈل - مختلف تعیناتی ٹولز میں ماڈلز جمع کرانے کا ایک عام فارمیٹ۔

MLflow (تحریر کے وقت الفا میں) ایک اوپن سورس پلیٹ فارم ہے جو آپ کو مشین لرننگ لائف سائیکل کو منظم کرنے کی اجازت دیتا ہے، بشمول تجربہ، دوبارہ استعمال اور تعیناتی۔

MLflow ترتیب دینا

MLflow استعمال کرنے کے لیے آپ کو پہلے اپنا پورا Python ماحول ترتیب دینا ہوگا، اس کے لیے ہم استعمال کریں گے۔ 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 اور کا استعمال کرتے ہوئے تجربات کو لاگ اور استفسار کرنے کی اجازت دیتی ہے۔ باقی API اس کے علاوہ، آپ اس بات کا تعین کر سکتے ہیں کہ ماڈل کے نمونے کہاں محفوظ کیے جائیں (لوکل ہوسٹ، ایمیزون S3, Azure Blob اسٹوریج, گوگل بادل ذخیرہ یا 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

ایم ایل فلو مستقل فائل اسٹوریج استعمال کرنے کی تجویز کرتا ہے۔ فائل اسٹوریج وہ جگہ ہے جہاں سرور رن اور تجرباتی میٹا ڈیٹا کو اسٹور کرے گا۔ سرور شروع کرتے وقت، یقینی بنائیں کہ یہ مستقل فائل اسٹور کی طرف اشارہ کرتا ہے۔ یہاں تجربے کے لیے ہم صرف استعمال کریں گے۔ /tmp.

یاد رکھیں کہ اگر ہم پرانے تجربات کو چلانے کے لیے ایم ایل فلو سرور استعمال کرنا چاہتے ہیں، تو ان کا فائل اسٹوریج میں موجود ہونا ضروری ہے۔ تاہم، اس کے بغیر بھی ہم انہیں 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 کے ساتھ اسپارک کو بڑھانا
شراب کی تکرار

ماڈل کے لیے سرور کا حصہ

ایم ایل فلو ٹریکنگ سرور، جو "ایم ایل فلو سرور" کمانڈ کا استعمال کرتے ہوئے شروع کیا گیا ہے، مقامی فائل سسٹم میں رنز کو ٹریک کرنے اور ڈیٹا لکھنے کے لیے ایک REST API رکھتا ہے۔ آپ ماحولیاتی متغیر "MLFLOW_TRACKING_URI" کا استعمال کرتے ہوئے ٹریکنگ سرور ایڈریس کی وضاحت کر سکتے ہیں اور MLflow ٹریکنگ API لانچ کی معلومات، لاگ میٹرکس وغیرہ بنانے/ وصول کرنے کے لیے خود بخود اس ایڈریس پر ٹریکنگ سرور سے رابطہ کرے گا۔

ماخذ: Docs// ٹریکنگ سرور چلانا

ماڈل کو سرور فراہم کرنے کے لیے، ہمیں چلتے ہوئے ٹریکنگ سرور (لانچ انٹرفیس دیکھیں) اور ماڈل کی رن آئی ڈی کی ضرورت ہے۔

MLflow کے ساتھ اسپارک کو بڑھانا
آئی ڈی چلائیں۔

# 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

ایم ایل فلو سرو فنکشنلٹی کا استعمال کرتے ہوئے ماڈلز پیش کرنے کے لیے، ہمیں ماڈل کے بارے میں معلومات حاصل کرنے کے لیے ٹریکنگ 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 // models # local)، تقسیم کی وجہ سے اسپارک (بیچ یا اسٹریمنگ) کا استعمال اور بھی زیادہ طاقتور حل ہے۔

تصور کریں کہ آپ نے صرف آف لائن ٹریننگ کی اور پھر آؤٹ پٹ ماڈل کو اپنے تمام ڈیٹا پر لاگو کیا۔ یہ وہ جگہ ہے جہاں چنگاری اور ایم ایل فلو چمکتے ہیں۔

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 کے ساتھ اسپارک کو بڑھانا
پی اسپارک - شراب کے معیار کی پیش گوئیاں آؤٹ پٹ کرنا

اس وقت تک، ہم نے MLflow کے ساتھ PySpark کا استعمال کرنے کے بارے میں بات کی ہے، پورے وائن ڈیٹاسیٹ پر شراب کے معیار کی پیشین گوئیاں چل رہی ہیں۔ لیکن اگر آپ کو Scala Spark سے Python MLflow ماڈیول استعمال کرنے کی ضرورت ہو تو کیا ہوگا؟

ہم نے اسکالا اور ازگر کے درمیان اسپارک سیاق و سباق کو تقسیم کرکے بھی اس کا تجربہ کیا۔ یعنی، ہم نے Python میں MLflow UDF رجسٹر کیا، اور اسے Scala سے استعمال کیا (ہاں، شاید بہترین حل نہیں، لیکن ہمارے پاس کیا ہے)۔

Scala Spark + MLflow

اس مثال کے لیے ہم شامل کریں گے۔ توری دانا موجودہ مشتری میں۔

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 کے درمیان مشترک ہے۔ ہم امید کرتے ہیں کہ یہ حصہ ان لوگوں کے لیے کارآمد ثابت ہوگا جو Scala سے محبت کرتے ہیں اور پروڈکشن میں مشین لرننگ ماڈلز کو تعینات کرنا چاہتے ہیں۔

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 کے ساتھ کھیل رہے ہیں تو ہمیں لکھنے میں ہچکچاہٹ نہ کریں اور ہمیں بتائیں کہ آپ اسے کیسے استعمال کرتے ہیں، اور اس سے بھی زیادہ اگر آپ اسے پروڈکشن میں استعمال کرتے ہیں۔

کورسز کے بارے میں مزید معلومات حاصل کریں:
مشین لرننگ۔ بنیادی کورس
مشین لرننگ۔ ایڈوانس کورس

مزید پڑھ:

ماخذ: www.habr.com

نیا تبصرہ شامل کریں