گسترش Spark با MLflow

سلام، ساکنین خابروفسک. همانطور که قبلاً نوشتیم، این ماه OTUS دو دوره یادگیری ماشینی را به طور همزمان راه اندازی می کند پایه и پیشرفته. در این راستا، ما همچنان مطالب مفیدی را به اشتراک می گذاریم.

هدف از این مقاله صحبت در مورد اولین تجربه ما در استفاده است MLflow.

ما بررسی را شروع می کنیم MLflow از سرور ردیابی خود و ثبت تمام تکرارهای مطالعه. سپس تجربه خود را از اتصال Spark با MLflow با استفاده از UDF به اشتراک خواهیم گذاشت.

متن نوشته

ما در آلفا سلامت ما از یادگیری ماشینی و هوش مصنوعی برای توانمندسازی افراد برای مراقبت از سلامت و رفاه خود استفاده می کنیم. به همین دلیل است که مدل‌های یادگیری ماشینی در قلب محصولات علم داده‌ای هستند که توسعه می‌دهیم، و به همین دلیل است که ما به سمت MLflow، یک پلت‌فرم منبع باز که تمام جنبه‌های چرخه زندگی یادگیری ماشین را پوشش می‌دهد، جذب شدیم.

MLflow

هدف اصلی MLflow ارائه یک لایه اضافی در بالای یادگیری ماشین است که به دانشمندان داده اجازه می دهد تقریباً با هر کتابخانه یادگیری ماشینی کار کنند.h2o, کراس, کوتاهی, مارماهی, اسکلره کردن и جریان تنسور، کار او را به سطح بعدی می برد.

MLflow سه جزء را ارائه می دهد:

  • پیگردی - ضبط و درخواست آزمایش: کد، داده، پیکربندی و نتایج. نظارت بر فرآیند ایجاد یک مدل بسیار مهم است.
  • پروژه ها - قالب بسته بندی برای اجرا بر روی هر پلتفرمی (به عنوان مثال SageMaker)
  • مدل - یک قالب رایج برای ارسال مدل ها به ابزارهای مختلف استقرار.

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 باید اصلاح می‌شدند زیرا نسخه‌های اخیر با یکدیگر تضاد داشتند.

رابط کاربری ردیابی را راه اندازی کنید

ردیابی MLflow به ما اجازه می دهد تا آزمایشات را با استفاده از پایتون و پرس و جو کنیم REST API. علاوه بر این، شما می توانید تعیین کنید که در آن مصنوعات مدل (localhost، آمازون S3, ذخیره لکه لاجوردی, ذخیره سازی ابر گوگل یا سرور SFTP). از آنجایی که ما در Alpha Health از 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 استفاده کنیم، زیرا ما فقط به مسیر مدل نیاز داریم.

توجه: به خاطر داشته باشید که Tracking UI و کلاینت مدل باید به مکان مصنوع دسترسی داشته باشند. یعنی، صرف نظر از این واقعیت که رابط کاربری Tracking در یک نمونه EC2 قرار دارد، هنگام اجرای MLflow به صورت محلی، دستگاه باید دسترسی مستقیم به S3 برای نوشتن مدل‌های مصنوع داشته باشد.

گسترش Spark با MLflow
Tracking UI مصنوعات را در یک سطل S3 ذخیره می کند

مدل های در حال اجرا

به محض اجرای سرور Tracking می توانید آموزش مدل ها را شروع کنید.

به عنوان مثال، ما از اصلاح شراب از مثال 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 به شما امکان می دهد پارامترهای مدل، معیارها و مصنوعات را ثبت کنید تا بتوانید نحوه تکامل آنها را در طول تکرارها پیگیری کنید. این ویژگی بسیار مفید است زیرا از این طریق می‌توانیم بهترین مدل را با تماس با سرور Tracking یا درک اینکه کدام کد با استفاده از گزارش‌های هش git commits تکرار مورد نیاز را انجام داده است، بازتولید کنیم.

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")

گسترش Spark با MLflow
تکرارهای شراب

بخش سرور برای مدل

سرور ردیابی MLflow که با استفاده از دستور "mlflow server" راه اندازی شده است، دارای یک API REST برای ردیابی اجراها و نوشتن داده ها در سیستم فایل محلی است. می‌توانید آدرس سرور ردیابی را با استفاده از متغیر محیطی «MLFLOW_TRACKING_URI» مشخص کنید و API ردیابی MLflow به‌طور خودکار با سرور ردیابی در این آدرس تماس می‌گیرد تا اطلاعات راه‌اندازی، معیارهای گزارش و غیره را ایجاد/دریافت کند.

منبع: Docs// اجرای سرور ردیابی

برای ارائه مدل به سرور، به یک سرور ردیابی در حال اجرا (به رابط راه اندازی مراجعه کنید) و Run ID مدل نیاز داریم.

گسترش Spark با 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، ما نیاز به دسترسی به Tracking UI داریم تا اطلاعات مربوط به مدل را به سادگی با مشخص کردن دریافت کنیم. --run_id.

هنگامی که مدل با سرور Tracking تماس می گیرد، می توانیم یک نقطه پایانی مدل جدید دریافت کنیم.

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

مدل های در حال اجرا از اسپارک

علیرغم این واقعیت که سرور Tracking به اندازه کافی قدرتمند است تا مدل ها را در زمان واقعی ارائه دهد، آنها را آموزش دهد و از عملکرد سرور استفاده کند (منبع: mlflow // docs // models # local، استفاده از Spark (بچکی یا استریم) به دلیل توزیع، راه حل قدرتمندتری است.

تصور کنید که به سادگی آموزش را به صورت آفلاین انجام داده اید و سپس مدل خروجی را روی تمام داده های خود اعمال کرده اید. اینجاست که Spark و MLflow می درخشند.

PySpark + Jupyter + Spark را نصب کنید

منبع: PySpark - Jupyter را شروع کنید

برای نشان دادن اینکه چگونه مدل‌های MLflow را برای فریم‌های داده Spark اعمال می‌کنیم، باید نوت‌بوک‌های Jupyter را برای کار با 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، می توانیم نوت بوک های خود را در پوشه مورد نظر ذخیره کنیم.

پرتاب Jupyter از PySpark

از آنجایی که ما توانستیم مشتری را به عنوان یک درایور 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

گسترش Spark با 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)

گسترش Spark با MLflow
PySpark - ارائه پیش بینی های کیفیت شراب

تا این مرحله، ما در مورد نحوه استفاده از PySpark با MLflow صحبت کرده‌ایم که پیش‌بینی‌های کیفیت شراب را در کل مجموعه داده شراب اجرا می‌کند. اما اگر نیاز به استفاده از ماژول های Python MLflow از Scala Spark داشته باشید، چه؟

ما این را نیز با تقسیم زمینه Spark بین Scala و 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 مشترک است. امیدواریم این بخش برای کسانی که اسکالا را دوست دارند و می‌خواهند مدل‌های یادگیری ماشینی را در تولید پیاده‌سازی کنند مفید باشد.

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

اضافه کردن نظر