۳ روش برای طراحی مدل‌های یادگیری ماشینی در تولید

گسترش مدل‌های یادگیری ماشینی برای تولید-عکس از کیندل مدیا از پکسل
گسترش مدل‌های یادگیری ماشینی برای تولید-عکس از کیندل مدیا از پکسل
منتشر شده در towardsdatascience به تاریخ ۹ نوامبر ۲۰۲۱
لینک منبع 3 Ways to Deploy Machine Learning Models in Production

کار کردن با داده‌ها یک چیز است، اما استقرار یک مدل یادگیری ماشینی برای تولید می‌تواند چیز دیگری باشد.

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

خوب، حالا می‌توانید هر دو را داشته باشید!

بیایید نگاهی به روند استقرار نیروها بیندازیم و ببینیم چگونه می‌توانیم این کار را با موفقیت انجام دهیم!

چگونه یک مدل یادگیری ماشینی را در تولید گسترش دهیم؟

اکثر پروژه‌های علم داده مدل‌های یادگیری ماشینی را به عنوان یک سرویس پیش‌بینی تقاضا یا در حالت پیش‌بینی دسته‌ای گسترش می‌دهند. برخی از برنامه‌های کاربردی مدرن، مدل‌های تعبیه‌شده را در دستگاه‌های لبه و موبایل گسترش می‌دهند.

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

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

از سوی دیگر، سرویس‌های وب می‌توانند پیش‌بینی‌های ارزان‌تر و تقریبا درلحظه ارائه دهند. اگر مدل بر روی یک کلاستر یا سرویس ابری اجرا شود، در دسترس بودن قدرت CPU مشکل کمتری دارد. این مدل می‌تواند به راحتی در دسترس برنامه‌های کاربردی دیگر از طریق تماس‌های API و غیره قرار گیرد.

یکی از مزایای اصلی یادگیری ماشینی تعبیه‌شده این است که ما می‌توانیم آن را با الزامات یک دستگاه خاص شخصی‌سازی کنیم.

ما به راحتی می‌توانیم مدل را در یک دستگاه پیاده کنیم، و محیط زمان اجرای آن نمی‌تواند توسط یک طرف خارجی دستکاری شود. یک اشکال واضح این است که دستگاه باید توان محاسباتی و فضای ذخیره‌سازی کافی داشته باشد.

گسترش مدل‌های یادگیری ماشینی به عنوان خدمات وب

ساده‌ترین راه برای استقرار یک مدل یادگیری ماشینی ایجاد یک سرویس وب برای پیش‌بینی است. در این مثال، ما از چارچوب وب Flask برای بسته‌بندی یک طبقه‌بندی کننده جنگل تصادفی ساده که با scikit-learn ساخته شده است استفاده می‌کنیم.

برای ایجاد یک سرویس وب یادگیری ماشینی، شما حداقل به سه مرحله نیاز دارید.

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

import pandas as pd

from sklearn.ensemble import RandomForestClassifier

df = pd.read_csv('titanic.csv')

x = df[df.columns.difference(['Survived'])

y = df['Survived']

classifier = RandomForestClassifier()

classifier.fit(x, y)

در گام بعدی، ما باید بر مدل پافشاری کنیم. محیطی که ما نرم‌افزار را در آن مستقر می‌کنیم اغلب متفاوت از جایی است که ما آن‌ها را آموزش می‌دهیم. آموزش معمولا به مجموعه‌ای از منابع مختلف نیاز دارد. بنابراین این جداسازی به سازمان‌ها کمک می‌کند تا بودجه و تلاش‌های خود را بهینه کنند. Scikit-learn سریال‌سازی خاص پایتون را ارائه می‌کند که ماندگاری و بازیابی مدل را بدون دردسر می‌کند. در زیر مثالی از نحوه ذخیره مدل آموزش‌دیده در یک فایل پیکل آورده شده‌است.

from sklearn.externals import joblib

joblib.dump(classifier, 'classifier.pkl')

در نهایت، می‌توانیم با استفاده از یک چارچوب وب به مدل پایدار خدمت کنیم. کد زیر با استفاده از Flask یک REST API ایجاد می‌کند. این فایل در یک محیط متفاوت و اغلب در یک سرور ابری میزبانی می‌شود.

from flask import Flask

app = Flask(__name__)

@app.route('/predict', methods=['POST'])

def predict():

json_ = request.json

query_df = pd.DataFrame(json_)

query = pd.get_dummies(query_df)

classifier = joblib.load('classifier.pkl')

prediction = classifier.predict(query)

return jsonify({'prediction': list(prediction)})

if __name__ == '__main__':

app.run(port=8080)

کد بالا در یک درخواست POST از طریق https://localhost:8080/predict ورودی دریافت می‌کند و پیش‌بینی را در یک پاسخ JSON برمی‌گرداند.

گسترش مدل‌های یادگیری ماشینی برای پیش‌بینی دسته‌ای.

در حالی که مدل‌های آنلاین می‌توانند پیش‌بینی را ارائه دهند، پیش‌بینی‌های دسته تحت تقاضا گاهی اوقات ترجیح داده می‌شوند.

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

پیش‌بینی دسته‌ای می‌تواند به سادگی فراخوانی تابع پیش‌بینی با یک مجموعه داده از متغیرهای ورودی باشد. فرمان زیر این کار را انجام می‌دهد.

prediction = classifier.predict(UNSEEN_DATASET)

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

import requests

from datetime import timedelta, datetime

import pandas as pd

from prefect import task, Flow

from prefect.schedules import IntervalSchedule

@task(max_retries=3, retry_delay=timedelta(5))

def predict(input_data_path:str):

"""

This task load the saved model, input data and returns prediction.

If failed this task will retry 3 times at 5 min interval and fail permenantly.

"""

classifier = joblib.load('classifier.pkl')

df = pd.read_csv(input_data_path)

prediction = classifier.predict(df)

return jsonify({'prediction': list(prediction)})

@task(max_retries=3, retry_delay=timedelta(5))

def save_prediction(data, output_data_path:str):

"""

This task will save the prediction to an output file.

If failed, this task will retry for 3 times and fail permenantly.

"""

with open(output_data_path, 'w') as f:

f.write(data)

# Create a schedule object.

# This object starts 5 seconds from the time of script execution and repeat once a week.

schedule = IntervalSchedule(

start_date=datetime.utcnow() + timedelta(seconds=5),

interval=timedelta(weeks=1),

)

# Attach the schedule object and orchastrate the workflow.

with Flow("predictions", schedule=schedule) as flow:

prediction = predict("./input_data.csv")

save_prediction(prediction. "./output_data.csv")

خط بالا پیش‌بینی را به صورت هفتگی برنامه‌ریزی می‌کند که از ۵ ثانیه پس از اجرای سند شروع می‌شود. Prefect در صورت شکست، 3 بار کارها را دوباره امتحان می‌کند.

با این حال، ساخت مدل ممکن است نیاز به چندین مرحله در چارچوب پردازش دسته‌ای داشته باشد. شما باید تصمیم بگیرید که چه ویژگی‌هایی مورد نیاز هستند و چگونه باید مدل را برای هر مرحله بسازید.

مدل را بر روی یک سیستم محاسباتی با عملکرد بالا با یک چارچوب پردازش دسته‌ای مناسب آموزش دهید.

معمولا، شما داده‌های آموزشی را به بخش‌هایی تقسیم می‌کنید که پی‌درپی پردازش می‌شوند، یکی پس از دیگری. شما می‌توانید این کار را با تقسیم مجموعه داده با استفاده از یک طرح نمونه‌گیری (به عنوان مثال، نمونه‌گیری متعادل، نمونه‌گیری طبقه‌بندی‌شده) یا از طریق برخی الگوریتم های آنلاین (به عنوان مثال، کاهش نقشه) انجام دهید.

پارتیشن‌ها را می‌توان در چندین ماشین توزیع کرد، اما همه آنها باید مجموعه‌ای از ویژگی‌ها را بارگیری کنند. مقیاس‌بندی ویژگی توصیه می‌شود. اگر از پیش‌آموزش بدون نظارت (مثلاً رمزگذارهای خودکار) برای یادگیری انتقال استفاده کرده‌اید، باید هر پارتیشن را لغو کنید.

بعد از اینکه تمام مراحل اجرا شدند، شما می‌توانید داده‌های نادیدنی را با مدل حاصل با تکرار پی‌درپی روی پارتیشن‌ها پیش‌بینی کنید.

گسترش مدل‌های یادگیری ماشینی بر روی دستگاه‌های لبه به عنوان مدل‌های تعبیه‌شده.

محاسبه بر روی دستگاه‌های لبه مانند موبایل و IoT در سال‌های اخیر بسیار محبوب شده‌است. مزایای استقرار یک مدل یادگیری ماشینی بر روی دستگاه‌های لبه شامل موارد زیر است، اما به موارد زیر محدود نمی‌شود:

· تاخیر کاهش‌یافته به این دلیل که دستگاه به احتمال زیاد به کاربر نزدیک است تا به یک سرور در فاصله دور.

· کاهش مصرف پهنای باند داده‌ها هنگامی که ما نتایج پردازش را به جای داده‌های خام که به اندازه بزرگ و در نهایت پهنای باند بیشتری نیاز دارند، به ابر برمی‌گردانیم.

دستگاه‌های لبه مانند دستگاه‌های موبایل و اینترنت اشیا به دلیل ماهیت سخت‌افزارشان قدرت محاسباتی و ظرفیت ذخیره‌سازی محدودی دارند. ما نمی‌توانیم به سادگی مدل‌های یادگیری ماشینی را به طور مستقیم به این دستگاه‌ها گسترش دهیم، به خصوص اگر مدل ما بزرگ باشد یا نیاز به محاسبات گسترده برای اجرای استنتاج بر روی آن‌ها داشته باشد.

در عوض، ما باید مدل را با استفاده از تکنیک‌هایی مانند کوانتیزه سازی و تجمع ساده کنیم در حالی که دقت را حفظ کنیم. این مدل‌های ساده شده را می توان به طور موثر بر روی دستگاه‌های لبه با محاسبات، حافظه و ذخیره‌سازی محدود گسترش داد.

ما می‌توانیم از کتابخانه tensorFlow Lite در اندروید برای ساده‌سازی مدل tensorFlow خود استفاده کنیم. TsorFlow Lite یک کتابخانه نرم‌افزاری متن باز برای دستگاه‌های موبایل و تعبیه‌شده است که تلاش می‌کند آنچه را که نام آن می‌گوید انجام دهد: اجرای مدل‌های TtensorFlow در پلتفرم‌های موبایل و تعبیه‌شده.

مثال زیر یک مدل Keras tensorFlow را تبدیل می‌کند.

import tensorflow as tf

# create and train a keras neural network

classifier = tf.keras.models.Sequential([

tf.keras.layers.Dense(units=1, input_shape=[1]),

tf.keras.layers.Dense(units=28, activation='relu'),

tf.keras.layers.Dense(units=1)

])

classifier.compile(optimizer='sgd', loss='mean_squared_error')

classifier.fit(x=[-1, 0, 1], y=[-3, -1, 1], epochs=5)

# Convert the model to a Tensorflow Lite object

converter = tf.lite.TFLiteConverter.from_keras_model(classifier)

tfl_classifier = converter.convert()

# Save the model as a .tflite file

with open('classifier.tflite', 'wb') as f:

f.write(tfl_classifier)

شما می‌توانید فایل tflite. به تازگی ایجاد شده را روی هر پلتفرم دل‌خواه خود بخوانید. تنسورفلو لایت از اندروید، iOS و لینوکس (شامل Raspberry Pi) پشتیبانی می‌کند.

برای مثال‌ها و آموزش‌های استقرار در پلتفرم‌های جداگانه، لطفا اسناد و مدارک tensorFlow Lite را بررسی کنید.

افکار نهایی

آموزش یک مدل یادگیری ماشینی تنها یک جنبه از پروژه دانش داده است. دانشمندان داده تلاش‌های زیادی برای استقرار آن‌ها در یک محیط تولید انجام داده‌اند.

در این مقاله سه روش مختلف برای استفاده از مدل‌های یادگیری ماشینی و مزایای آن‌ها مورد بحث قرار گرفته‌است. بسته به درخواست شما، ممکن است مجبور شوید یکی از گزینه‌های موجود را انتخاب کنید.

البته، این پست تنها بخش بسیار کوچکی از یک موضوع بسیار بزرگ است. اما من مطمئنم که این به شما نقطه شروعی برای کاوش بیشتر را می‌دهد.

این متن با استفاده از ربات ترجمه مقالات علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.