MLflow के साथ स्पार्क का विस्तार

नमस्कार, खाबरोवस्क निवासियों। जैसा कि हमने पहले ही लिखा है, इस महीने OTUS एक साथ दो मशीन लर्निंग पाठ्यक्रम लॉन्च कर रहा है आधार и उन्नत. इस संबंध में, हम उपयोगी सामग्री साझा करना जारी रखते हैं।

इस लेख का उद्देश्य हमारे पहले अनुभव के बारे में बात करना है एमएलफ्लो.

हम समीक्षा शुरू करेंगे एमएलफ्लो इसके ट्रैकिंग सर्वर से और अध्ययन के सभी पुनरावृत्तियों को लॉग करें। फिर हम यूडीएफ का उपयोग करके स्पार्क को एमएलफ्लो से जोड़ने का अपना अनुभव साझा करेंगे।

प्रसंग

हम अंदर हैं अल्फ़ा स्वास्थ्य हम लोगों को उनके स्वास्थ्य और कल्याण की जिम्मेदारी लेने के लिए सशक्त बनाने के लिए मशीन लर्निंग और कृत्रिम बुद्धिमत्ता का उपयोग करते हैं। यही कारण है कि मशीन लर्निंग मॉडल हमारे द्वारा विकसित डेटा विज्ञान उत्पादों के केंद्र में हैं, और यही कारण है कि हम एमएलफ्लो की ओर आकर्षित हुए, एक ओपन सोर्स प्लेटफॉर्म जो मशीन लर्निंग जीवनचक्र के सभी पहलुओं को कवर करता है।

एमएलफ्लो

एमएलफ़्लो का मुख्य लक्ष्य मशीन लर्निंग के शीर्ष पर एक अतिरिक्त परत प्रदान करना है जो डेटा वैज्ञानिकों को लगभग किसी भी मशीन लर्निंग लाइब्रेरी के साथ काम करने की अनुमति देगा (h2o, keras, mleap, pytorch, कपटी и tensorflow), अपने काम को अगले स्तर पर ले जाना।

एमएलफ़्लो तीन घटक प्रदान करता है:

  • ट्रैकिंग - प्रयोगों के लिए रिकॉर्डिंग और अनुरोध: कोड, डेटा, कॉन्फ़िगरेशन और परिणाम। मॉडल बनाने की प्रक्रिया की निगरानी करना बहुत महत्वपूर्ण है।
  • परियोजनाओं - किसी भी प्लेटफ़ॉर्म पर चलाने के लिए पैकेजिंग प्रारूप (उदा. SageMaker)
  • मॉडल - विभिन्न परिनियोजन टूल में मॉडल सबमिट करने के लिए एक सामान्य प्रारूप।

एमएलफ़्लो (लेखन के समय अल्फा में) एक खुला स्रोत प्लेटफ़ॉर्म है जो आपको प्रयोग, पुन: उपयोग और तैनाती सहित मशीन लर्निंग जीवनचक्र को प्रबंधित करने की अनुमति देता है।

एमएलफ्लो की स्थापना

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 का उपयोग करते हैं। PyArrow और Numpy के संस्करणों को ठीक करने की आवश्यकता थी क्योंकि बाद वाले संस्करण एक-दूसरे के साथ विरोधाभासी थे।

ट्रैकिंग यूआई लॉन्च करें

एमएलफ़्लो ट्रैकिंग हमें पायथन और का उपयोग करके प्रयोगों को लॉग करने और क्वेरी करने की अनुमति देती है बाकी एपीआई. इसके अलावा, आप यह निर्धारित कर सकते हैं कि मॉडल कलाकृतियों को कहाँ संग्रहीत किया जाए (लोकलहोस्ट, अमेज़न S3, Azure ब्लॉब संग्रहण, गूगल क्लाउड स्टोरेज या एसएफटीपी सर्वर). चूँकि हम अल्फा हेल्थ में 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.

याद रखें कि यदि हम पुराने प्रयोगों को चलाने के लिए mlflow सर्वर का उपयोग करना चाहते हैं, तो उन्हें फ़ाइल संग्रहण में मौजूद होना चाहिए। हालाँकि, इसके बिना भी हम उन्हें यूडीएफ में उपयोग कर सकते हैं, क्योंकि हमें केवल मॉडल के लिए पथ की आवश्यकता है।

नोट: ध्यान रखें कि ट्रैकिंग यूआई और मॉडल क्लाइंट के पास आर्टिफैक्ट स्थान तक पहुंच होनी चाहिए। अर्थात्, इस तथ्य की परवाह किए बिना कि ट्रैकिंग यूआई EC2 उदाहरण में रहता है, स्थानीय रूप से MLflow चलाते समय, मशीन के पास आर्टिफैक्ट मॉडल लिखने के लिए S3 तक सीधी पहुंच होनी चाहिए।

MLflow के साथ स्पार्क का विस्तार
ट्रैकिंग यूआई कलाकृतियों को S3 बकेट में संग्रहीत करता है

चल रहे मॉडल

जैसे ही ट्रैकिंग सर्वर चालू हो, आप मॉडलों का प्रशिक्षण शुरू कर सकते हैं।

उदाहरण के तौर पर, हम एमएलफ्लो उदाहरण से वाइन संशोधन का उपयोग करेंगे स्केलेर्न.

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

जैसा कि हम पहले ही चर्चा कर चुके हैं, एमएलफ़्लो आपको मॉडल पैरामीटर, मेट्रिक्स और कलाकृतियों को लॉग करने की अनुमति देता है ताकि आप ट्रैक कर सकें कि वे पुनरावृत्तियों पर कैसे विकसित होते हैं। यह सुविधा बेहद उपयोगी है क्योंकि इस तरह हम ट्रैकिंग सर्वर से संपर्क करके या कमिट के गिट हैश लॉग का उपयोग करके यह समझकर कि किस कोड ने आवश्यक पुनरावृत्ति की है, सर्वोत्तम मॉडल को पुन: पेश कर सकते हैं।

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 ट्रैकिंग एपीआई लॉन्च जानकारी, लॉग मेट्रिक्स आदि बनाने/प्राप्त करने के लिए स्वचालित रूप से इस पते पर ट्रैकिंग सर्वर से संपर्क करेगा।

स्रोत: दस्तावेज़// ट्रैकिंग सर्वर चलाना

मॉडल को सर्वर प्रदान करने के लिए, हमें एक रनिंग ट्रैकिंग सर्वर (लॉन्च इंटरफ़ेस देखें) और मॉडल की रन आईडी की आवश्यकता है।

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

एमएलफ़्लो सर्व कार्यक्षमता का उपयोग करके मॉडलों की सेवा करने के लिए, हमें केवल निर्दिष्ट करके मॉडल के बारे में जानकारी प्राप्त करने के लिए ट्रैकिंग यूआई तक पहुंच की आवश्यकता होगी --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]}

स्पार्क से चल रहे मॉडल

इस तथ्य के बावजूद कि ट्रैकिंग सर्वर वास्तविक समय में मॉडलों की सेवा करने, उन्हें प्रशिक्षित करने और सर्वर कार्यक्षमता का उपयोग करने के लिए पर्याप्त शक्तिशाली है (स्रोत: एमएलफ़्लो // दस्तावेज़ // मॉडल # स्थानीय), वितरण के कारण स्पार्क (बैच या स्ट्रीमिंग) का उपयोग और भी अधिक शक्तिशाली समाधान है।

कल्पना करें कि आपने अभी-अभी प्रशिक्षण ऑफ़लाइन किया और फिर आउटपुट मॉडल को अपने सभी डेटा पर लागू किया। यहीं पर स्पार्क और एमएलफ्लो चमकते हैं।

पाइस्पार्क + ज्यूपिटर + स्पार्क स्थापित करें

स्रोत: आरंभ करें पाइस्पार्क - ज्यूपिटर

यह दिखाने के लिए कि हम स्पार्क डेटाफ्रेम पर एमएलफ़्लो मॉडल कैसे लागू करते हैं, हमें पाइस्पार्क के साथ मिलकर काम करने के लिए ज्यूपिटर नोटबुक सेट करने की आवश्यकता है।

नवीनतम स्थिर संस्करण स्थापित करके प्रारंभ करें अपाचे स्पार्क:

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 में मॉडल कलाकृतियों को लॉग करने के लिए एक सुविधा प्रदान करता है। जैसे ही चयनित मॉडल हमारे हाथ में आता है, हमारे पास मॉड्यूल का उपयोग करके इसे यूडीएफ के रूप में आयात करने का अवसर होता है 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 UDF को Python में पंजीकृत किया, और इसे Scala से उपयोग किया (हाँ, शायद सबसे अच्छा समाधान नहीं, लेकिन हमारे पास क्या है)।

स्काला स्पार्क + एमएलफ्लो

इस उदाहरण के लिए हम जोड़ देंगे टोरी कर्नेल मौजूदा बृहस्पति में.

स्पार्क + टोरी + ज्यूपिटर स्थापित करें

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

जैसा कि आप संलग्न नोटबुक से देख सकते हैं, यूडीएफ स्पार्क और पायस्पार्क के बीच साझा किया जाता है। हमें उम्मीद है कि यह हिस्सा उन लोगों के लिए उपयोगी होगा जो स्काला को पसंद करते हैं और उत्पादन में मशीन लर्निंग मॉडल तैनात करना चाहते हैं।

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

अगले चरण

हालाँकि लेखन के समय एमएलफ्लो अल्फा संस्करण में है, फिर भी यह काफी आशाजनक लगता है। कई मशीन लर्निंग फ्रेमवर्क को चलाने और उन्हें एक ही एंडपॉइंट से उपभोग करने की क्षमता ही अनुशंसा प्रणाली को अगले स्तर तक ले जाती है।

इसके अलावा, एमएलफ़्लो डेटा इंजीनियरों और डेटा साइंस विशेषज्ञों को एक साथ लाता है, उनके बीच एक सामान्य परत बिछाता है।

एमएलफ़्लो की इस खोज के बाद, हमें विश्वास है कि हम आगे बढ़ेंगे और इसे अपनी स्पार्क पाइपलाइनों और अनुशंसा प्रणालियों के लिए उपयोग करेंगे।

फ़ाइल सिस्टम के बजाय फ़ाइल संग्रहण को डेटाबेस के साथ सिंक्रनाइज़ करना अच्छा होगा। इससे हमें कई समापन बिंदु मिलने चाहिए जो समान फ़ाइल संग्रहण का उपयोग कर सकें। उदाहरण के लिए, अनेक उदाहरणों का उपयोग करें हाथ की सफ़ाई и एथेना उसी ग्लू मेटास्टोर के साथ।

संक्षेप में, मैं डेटा के साथ हमारे काम को और अधिक रोचक बनाने के लिए एमएलफ्लो समुदाय को धन्यवाद देना चाहूंगा।

यदि आप एमएलफ़्लो के साथ खेल रहे हैं, तो हमें लिखने में संकोच न करें और हमें बताएं कि आप इसका उपयोग कैसे करते हैं, और इससे भी अधिक यदि आप इसे उत्पादन में उपयोग करते हैं।

पाठ्यक्रमों के बारे में और जानें:
यंत्र अधिगम। बुनियादी पाठ्यक्रम
यंत्र अधिगम। उच्च पाठ्यक्रम

अधिक पढ़ें:

स्रोत: www.habr.com

एक टिप्पणी जोड़ें