ስፓርክን በMLflow ማራዘም

ጤና ይስጥልኝ የካብሮቭስክ ነዋሪዎች። ቀደም ብለን እንደጻፍነው፣ በዚህ ወር OTUS በአንድ ጊዜ ሁለት የማሽን መማሪያ ኮርሶችን እየጀመረ ነው። መሠረት и የላቀ. በዚህ ረገድ, ጠቃሚ ቁሳቁሶችን ማካፈላችንን እንቀጥላለን.

የዚህ ጽሑፍ ዓላማ ስለ መጀመሪያው አጠቃቀማችን መነጋገር ነው MLflow.

ግምገማውን እንጀምራለን MLflow ከክትትል አገልጋዩ እና ሁሉንም የጥናት ድግግሞሾችን ይመዝግቡ። ከዚያ UDFን በመጠቀም ስፓርክን ከMLflow ጋር የማገናኘት ልምዳችንን እናካፍላለን።

ዐውደ-ጽሑፍ

ውስጥ ነን አልፋ ጤና ሰዎች ጤናቸውን እና ደህንነታቸውን እንዲቆጣጠሩ ለማስቻል የማሽን መማር እና አርቴፊሻል ኢንተለጀንስ እንጠቀማለን። ለዛም ነው የማሽን መማሪያ ሞዴሎች እኛ የምናዘጋጃቸው የውሂብ ሳይንስ ምርቶች እምብርት የሆኑት እና ለዚህም ነው ወደ MLflow የተሳበነው፣ ሁሉንም የማሽን የመማር የህይወት ኡደት ገጽታዎችን ወደ ሚሸፍነው ክፍት ምንጭ መድረክ።

MLflow

የMLflow ዋና ግብ የውሂብ ሳይንቲስቶች ከማንኛውም የማሽን መማሪያ ቤተ-መጽሐፍት ጋር እንዲሰሩ የሚያስችል በማሽን መማሪያ ላይ ተጨማሪ ሽፋን መስጠት ነው።ሸ 2o, keras, ማዘንበል, ፒቶርች, sklearn и ቲሸርቶፍ), ሥራዋን ወደ ከፍተኛ ደረጃ በማድረስ.

MLflow ሶስት አካላትን ይሰጣል

  • ትራኪንግ - ለሙከራዎች መቅዳት እና ጥያቄዎች-ኮድ ፣ ውሂብ ፣ ውቅር እና ውጤቶች። ሞዴል የመፍጠር ሂደትን መከታተል በጣም አስፈላጊ ነው.
  • ፕሮጀክቶች - በማንኛውም መድረክ ላይ ለማሄድ የማሸጊያ ቅርጸት (ለምሳሌ፦ SageMaker)
  • ሞዴሎች - ሞዴሎችን ለተለያዩ ማሰማሪያ መሳሪያዎች ለማቅረብ የተለመደ ቅርጸት።

MLflow (በሚጻፉበት ጊዜ በአልፋ) የማሽን መማሪያ የህይወት ኡደትን፣ ሙከራን፣ እንደገና መጠቀምን እና ማሰማራትን ጨምሮ ለማስተዳደር የሚያስችልዎ ክፍት ምንጭ መድረክ ነው።

MLflow በማቀናበር ላይ

MLflow ለመጠቀም መጀመሪያ መላውን የፓይዘን አካባቢ ማዋቀር ያስፈልግዎታል፣ ለዚህም እንጠቀማለን። ፒኤንቭ (ፓይዘንን በ Mac ላይ ለመጫን ፣ ይመልከቱ እዚህ). በዚህ መንገድ እሱን ለማስኬድ አስፈላጊ የሆኑትን ሁሉንም ቤተ-መጻሕፍት የምንጭንበት ምናባዊ አካባቢ መፍጠር እንችላለን።

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

ማስታወሻ፡ እንደ UDF ያሉ ሞዴሎችን ለማስኬድ ፒያሮውን እንጠቀማለን። የኋለኛው ስሪቶች እርስ በርሳቸው ስለሚጋጩ የ PyArrow እና Numpy ስሪቶች መጠገን ነበረባቸው።

የክትትል UI አስጀምር

MLflow ትራኪንግ Python እና በመጠቀም ሙከራዎችን እንድንመዘግብ እና እንድንጠይቅ ያስችለናል። ማረት ኤፒአይ በተጨማሪም ፣ የሞዴል ቅርሶችን የት እንደሚከማቹ መወሰን ይችላሉ (localhost ፣ Amazon S3, Azure Blob ማከማቻ, የ Google ደመና ማከማቻ ወይም የ 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 አገልጋይን መጠቀም ከፈለግን በፋይል ማከማቻ ውስጥ መገኘት እንዳለባቸው ያስታውሱ። ነገር ግን፣ ያለዚህም ቢሆን ወደ አምሳያው የሚወስደውን መንገድ ብቻ ስለምንፈልግ በዩዲኤፍ ውስጥ ልንጠቀምባቸው እንችላለን።

ማስታወሻ፡ የክትትል 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 የሞዴል መለኪያዎችን፣ መለኪያዎችን እና ቅርሶችን በድግግሞሾች ላይ እንዴት እንደሚሻሻሉ ለመከታተል ይፈቅድልዎታል። ይህ ባህሪ እጅግ በጣም ጠቃሚ ነው ምክንያቱም በዚህ መንገድ የክትትል አገልጋዩን በማነጋገር ወይም የጊት ሃሽ ሎግ ሎግስ ኦፍ ሚስቶችን በመጠቀም የትኛው ኮድ አስፈላጊውን ድግግሞሽ እንዳከናወነ በመረዳት ምርጡን ሞዴል ማባዛት እንችላለን።

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 መከታተያ ኤፒአይ የማስጀመሪያ መረጃን ለመፍጠር/ ለመቀበል በዚህ አድራሻ የክትትል አገልጋዩን በቀጥታ ያገኛል።

ምንጭ: ሰነዶች// የመከታተያ አገልጋይ በማሄድ ላይ

ሞዴሉን ከአገልጋይ ጋር ለማቅረብ፣ የሩጫ መከታተያ አገልጋይ (የማስጀመሪያ በይነገጽን ይመልከቱ) እና የአምሳያው የሩጫ መታወቂያ እንፈልጋለን።

ስፓርክን በ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

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

ሞዴሎችን ከ Spark

ምንም እንኳን የክትትል አገልጋዩ ሞዴሎችን በእውነተኛ ጊዜ ለማገልገል ፣ ለማሰልጠን እና የአገልጋዩን ተግባር ለመጠቀም የሚያስችል ኃይለኛ ቢሆንም (ምንጭ: mlflow // ሰነዶች // ሞዴሎች # አካባቢያዊ), ስፓርክ (ባች ወይም ዥረት) መጠቀም በስርጭት ምክንያት የበለጠ ኃይለኛ መፍትሄ ነው.

በቀላሉ ስልጠናውን ከመስመር ውጭ እንደሰሩ እና ከዚያ የውጤት ሞዴሉን በሁሉም ውሂብዎ ላይ እንደተገበሩ ያስቡ። ይህ ስፓርክ እና MLflow የሚያበሩበት ነው።

PySpark + Jupyter + Spark ን ይጫኑ

ምንጭ: PySpark ይጀምሩ - ጁፒተር

የMLflow ሞዴሎችን ወደ Spark dataframes እንዴት እንደምንተገብር ለማሳየት ከPySpark ጋር አብሮ ለመስራት የጁፒተር ማስታወሻ ደብተሮችን ማዘጋጀት አለብን።

የቅርብ ጊዜውን የተረጋጋ ስሪት በመጫን ይጀምሩ የ Apache Spark:

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, ማስታወሻ ደብተራችንን በተፈለገው አቃፊ ውስጥ ማከማቸት እንችላለን.

ጁፒተርን ከፒስፓርክ በማስጀመር ላይ

ጁፒተርን እንደ ፒስፓርክ ሾፌር ማዋቀር ስለቻልን አሁን የጁፒተር ማስታወሻ ደብተርን በፒስፓርክ አውድ ውስጥ ማስኬድ እንችላለን።

(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 - የወይን ጥራት ትንበያዎችን ማውጣት

እስከዚህ ነጥብ ድረስ፣ በአጠቃላይ የወይን ዳታ ስብስብ ላይ የወይን ጥራት ትንበያዎችን በማስኬድ PySparkን ከMLflow ጋር እንዴት እንደምንጠቀም ተነጋግረናል። ግን የ Python MLflow ሞጁሎችን ከ Scala Spark መጠቀም ከፈለጉስ?

ይህንንም የ Spark አውድ በ Scala እና Python መካከል በመከፋፈል ሞከርነው። ማለትም፣ MLflow UDF በ Python ተመዝግበን፣ እና ከ Scala ተጠቀምንበት (አዎ፣ ምናልባት ምርጡ መፍትሄ ላይሆን ይችላል፣ ግን ያለን)።

Scala ስፓርክ + 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 በ 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 አሰሳ በኋላ፣ ወደ ፊት እንደምንሄድ እና ለስፓርክ የቧንቧ መስመር እና የአማካሪ ስርዓታችን እንደምንጠቀም እርግጠኞች ነን።

ከፋይል ስርዓቱ ይልቅ የፋይል ማከማቻውን ከመረጃ ቋቱ ጋር ማመሳሰል ጥሩ ነው። ይህ ተመሳሳዩን የፋይል ማከማቻ መጠቀም የሚችሉ በርካታ የመጨረሻ ነጥቦችን ሊሰጠን ይገባል። ለምሳሌ, በርካታ አጋጣሚዎችን ይጠቀሙ Presto и አቴና ከተመሳሳይ ሙጫ ሜታስቶር ጋር.

ለማጠቃለል ያህል የMLFlow ማህበረሰብን ከመረጃ ጋር ያለንን ስራ የበለጠ ሳቢ ስላደረጉልን አመሰግናለሁ ማለት እፈልጋለሁ።

ከMLflow ጋር እየተጫወቱ ከሆነ፣ እኛን ለመጻፍ አያመንቱ እና እንዴት እንደሚጠቀሙበት ይንገሩን፣ እና እንዲያውም በምርት ውስጥ ከተጠቀሙበት።

ስለ ኮርሶቹ የበለጠ ይወቁ፡
የማሽን ትምህርት. መሰረታዊ ኮርስ
የማሽን ትምህርት. የላቀ ኮርስ

ተጨማሪ ያንብቡ፡

ምንጭ: hab.com

አስተያየት ያክሉ