ጤና ይስጥልኝ የካብሮቭስክ ነዋሪዎች። ቀደም ብለን እንደጻፍነው፣ በዚህ ወር OTUS በአንድ ጊዜ ሁለት የማሽን መማሪያ ኮርሶችን እየጀመረ ነው።
የዚህ ጽሑፍ ዓላማ ስለ መጀመሪያው አጠቃቀማችን መነጋገር ነው
ግምገማውን እንጀምራለን
ዐውደ-ጽሑፍ
ውስጥ ነን
MLflow
የMLflow ዋና ግብ የውሂብ ሳይንቲስቶች ከማንኛውም የማሽን መማሪያ ቤተ-መጽሐፍት ጋር እንዲሰሩ የሚያስችል በማሽን መማሪያ ላይ ተጨማሪ ሽፋን መስጠት ነው።
MLflow ሶስት አካላትን ይሰጣል
- ትራኪንግ - ለሙከራዎች መቅዳት እና ጥያቄዎች-ኮድ ፣ ውሂብ ፣ ውቅር እና ውጤቶች። ሞዴል የመፍጠር ሂደትን መከታተል በጣም አስፈላጊ ነው.
- ፕሮጀክቶች - በማንኛውም መድረክ ላይ ለማሄድ የማሸጊያ ቅርጸት (ለምሳሌ፦
SageMaker ) - ሞዴሎች - ሞዴሎችን ለተለያዩ ማሰማሪያ መሳሪያዎች ለማቅረብ የተለመደ ቅርጸት።
MLflow (በሚጻፉበት ጊዜ በአልፋ) የማሽን መማሪያ የህይወት ኡደትን፣ ሙከራን፣ እንደገና መጠቀምን እና ማሰማራትን ጨምሮ ለማስተዳደር የሚያስችልዎ ክፍት ምንጭ መድረክ ነው።
MLflow በማቀናበር ላይ
MLflow ለመጠቀም መጀመሪያ መላውን የፓይዘን አካባቢ ማዋቀር ያስፈልግዎታል፣ ለዚህም እንጠቀማለን።
```
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 እና በመጠቀም ሙከራዎችን እንድንመዘግብ እና እንድንጠይቅ ያስችለናል።
# 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 ቀጥተኛ መዳረሻ ሊኖረው ይገባል።
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 አገልጋይ" ትዕዛዙን በመጠቀም የተጀመረው፣ ለአካባቢው የፋይል ስርዓት መረጃን ለመከታተል እና ለመፃፍ REST API አለው። የአካባቢ ተለዋዋጭ "MLFLOW_TRACKING_URI" በመጠቀም የመከታተያ አገልጋይ አድራሻን መግለጽ ትችላላችሁ እና የ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 የሚያበሩበት ነው።
PySpark + Jupyter + Spark ን ይጫኑ
ምንጭ:
PySpark ይጀምሩ - ጁፒተር
የMLflow ሞዴሎችን ወደ Spark dataframes እንዴት እንደምንተገብር ለማሳየት ከPySpark ጋር አብሮ ለመስራት የጁፒተር ማስታወሻ ደብተሮችን ማዘጋጀት አለብን።
የቅርብ ጊዜውን የተረጋጋ ስሪት በመጫን ይጀምሩ
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 በ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)
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 አሰሳ በኋላ፣ ወደ ፊት እንደምንሄድ እና ለስፓርክ የቧንቧ መስመር እና የአማካሪ ስርዓታችን እንደምንጠቀም እርግጠኞች ነን።
ከፋይል ስርዓቱ ይልቅ የፋይል ማከማቻውን ከመረጃ ቋቱ ጋር ማመሳሰል ጥሩ ነው። ይህ ተመሳሳዩን የፋይል ማከማቻ መጠቀም የሚችሉ በርካታ የመጨረሻ ነጥቦችን ሊሰጠን ይገባል። ለምሳሌ, በርካታ አጋጣሚዎችን ይጠቀሙ
ለማጠቃለል ያህል የMLFlow ማህበረሰብን ከመረጃ ጋር ያለንን ስራ የበለጠ ሳቢ ስላደረጉልን አመሰግናለሁ ማለት እፈልጋለሁ።
ከMLflow ጋር እየተጫወቱ ከሆነ፣ እኛን ለመጻፍ አያመንቱ እና እንዴት እንደሚጠቀሙበት ይንገሩን፣ እና እንዲያውም በምርት ውስጥ ከተጠቀሙበት።
ስለ ኮርሶቹ የበለጠ ይወቁ፡
ተጨማሪ ያንብቡ፡
ክትትል ለሚደረግባቸው የመማር ችግሮች የዋና አካል ትንታኔን የመተግበር ስጋቶች እና ማስጠንቀቂያዎች የማሽን መማሪያ ሞዴልን ከዶከር ጋር መዘርጋት – ክፍል 1 የማሽን መማሪያ ሞዴልን ከዶከር ጋር መዘርጋት – ክፍል 2
ምንጭ: hab.com