با توابع Pulsar، میتوانید توابع پایتون را روی پیامهای pub/sub در Apache Pulsar اعمال کنید تا پیشبینیهای یادگیری ماشین را در زمان واقعی انجام دهید. در اینجا نحوه
نیاز به هوش مصنوعی و یادگیری ماشین در تصمیم گیری در طیف وسیعی از صنایع هیچ رازی نیست. اما علیرغم قدرت محاسباتی باورنکردنی موجود، و جریان ثابت دادههای رویدادهای بیدرنگ، زیرکلاس «هوش مصنوعی بیدرنگ» تا حدودی کمتر مورد توجه قرار گرفته است، بهویژه که مربوط به بازآموزی و ارزیابی مدل زنده است.
Pulsar Functions، یک چارچوب محاسباتی بدون سرور که در بالای پلتفرم پیام رسانی و پخش جریانی Apache Pulsar، راه حلی راحت و قدرتمند ارائه می دهد که محدودیت های یادگیری ماشین سنتی را برطرف می کند. جریان کار. Pulsar Functions از ماهیت pub/sub ذاتی پلتفرم Apache Pulsar برای ارائه چارچوبی برای هوش مصنوعی واقعی بهره می برد.
البته، دامنه توابع Pulsar بسیار فراتر از این دامنه است، اما هدف ما نشان دادن انعطافپذیری توابع Pulsar و اینکه چگونه میتواند به عنوان راهحلی برای خطوط لوله یادگیری ماشینی باشد که به پیشبینیها و نتایج فوری و بلادرنگ نیاز دارند، ارائه شود.
نمای کلی
هدف ما ساختن یک موتور استنتاج بلادرنگ است که توسط توابع Pulsar ارائه میشود و میتواند پیشبینیهای با تأخیر پایین را هم به صورت یکبار و هم به صورت انبوه بازیابی کند. برای انجام این کار، ما دو هدف توسعه اولیه داریم:
- نصب، پیکربندی و راه اندازی Apache Pulsar.
- توابع پایتون را که زیربنای موتور استنتاج هستند را تعریف کنید.
بقیه این مقاله از طریق آن مراحل با تمرکز ویژه بر روی توسعه پایتون و همچنین رابط فراخوانی برای ثبت و راهاندازی توابع Pulsar میپردازد.
راه اندازی یک نمونه Apache Pulsar مستقل
بیایید با راهاندازی یک نمونه Apache Pulsar مستقل شروع کنیم. فوراً باید توجه داشته باشیم که در استقرار معمولی این نوع سیستم، Pulsar در یک خوشه مستقر میشود، البته نه یک نمونه مستقل در یک ماشین محلی. اما یک نمونه مستقل به ما این امکان را می دهد که قبل از استقرار با کیفیت تولید بیشتر، قدرت هوش مصنوعی بلادرنگ را ببینیم.
نمونه را با دنبال کردن دستورالعملهای اینجا راهاندازی کنید.
نمونه مستقل Pulsar با دستور:
شروع میشود
bin/pulsar standalone
اطلاعات گل زنبق
با اجرای نمونه، اکنون توجه خود را به تعریف تابع Pulsar معطوف می کنیم که مثال یادگیری ماشین ما را ارائه می دهد. ما از مجموعه داده گل زنبق کلاسیک استفاده خواهیم کرد. گردآوری شده توسط ادگار اندرسون و استفاده عمومی توسط < a href="https://www.britannica.com/biography/Ronald-Aylmer-Fisher" rel="nofollow">رونالد فیشر، این مجموعه داده شامل اندازهگیریهایی روی ۵۰ گل است که شامل سه گونه گل مختلف است. متغیرهای موجود به شرح زیر است:
- کاسبرگ گل: طول اندازهگیری شده کاسبرگ گل
- عرض کاسبرگ: پهنای اندازه گیری شده کاسبرگ گل
- طول گلبرگ: طول اندازه گیری شده گلبرگ گل
- عرض گلبرگ: پهنای اندازه گیری شده گلبرگ گل
- طبقه: گونه گل (Setosa، Versicolor، یا Virginica)
پیشنمایش کوچکی از این دادهها در زیر ارائه شده است.
طول کوتاه |
sepalwidth |
طول گلبرگ |
عرض گلبرگ |
کلاس |
۵.۱ |
۳.۵ |
۱.۴ |
۰.۲ |
Iris-setosa |
۴.۹ |
۳.۰ |
۱.۴ |
۰.۲ |
Iris-setosa |
۴.۷ |
۳.۲ |
۱.۳ |
۰.۲ |
Iris-setosa |
طول کوتاه
sepalwidth
طول گلبرگ
عرض گلبرگ
کلاس
۵.۱
۳.۵
۱.۴
۰.۲
Iris-setosa
۴.۹
۳.۰
۱.۴
۰.۲
Iris-setosa
۴.۷
۳.۲
۱.۳
۰.۲
Iris-setosa
هدف ما پیشبینی دقیق کلاس با توجه به ویژگیهای ورودی خواهد بود. ما دو جزء اصلی خط لوله مدل را اجرا خواهیم کرد: آموزش و پیش بینی. مرحله آموزش یک مرحله آفلاین خواهد بود (در ادامه در این مورد بیشتر توضیح خواهیم داد) در حالی که مرحله پیش بینی، روال اصلی عملکرد Pulsar ما خواهد بود. بیایید شروع کنیم!
ساخت تابع پالسار ما
اکنون، ما آماده ساخت و استقرار تابع Pulsar خود هستیم.
توابع Pulsar را می توان در یک اسکریپت پایتون مستقل ایجاد کرد که حاوی توابعی است که مستقر خواهند شد. همانطور که گفته شد، قرار است روال پیشبینی مدل تابع اصلی پالسار ما باشد. یک بخش قدرتمند از این چارچوب این است که خود توابع عمدتاً توابع استاندارد پایتون هستند و دارای حداقل داربست مخصوص Pulsar هستند. این امر زمان استقرار کدهای موجود یا زمان ایجاد را برای توسعه دهندگان ماهر Python به حداقل می رساند.
بیایید با یک چارچوب اساسی برای کشیدن دادههای Iris، آموزش یک مدل و نوشتن آن در موضوع Pulsar شروع کنیم.
import os import pickle import pandas as pd from pulsar import Function from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier def train_iris_model(): # If we already have an existing model file, we can load it right away if os.path.exists("model.pkl"): print("We are loading a pre-existing model") return pickle.load(open("model.pkl", 'rb')) # Read in the iris data, split into a 20% test component iris = pd.read_csv("https://datahub.io/machine-learning/iris/r/iris.csv") train, test = train_test_split(iris, test_size=0.2, stratify=iris['class']) # Get the training data X_train = train[['sepalwidth', 'sepallength', 'petalwidth', 'petallength']] y_train = train['class'] # Get the test data X_test = test[['sepalwidth', 'sepallength', 'petalwidth', 'petallength']] y_test = test['class'] # Train the model model = DecisionTreeClassifier(max_depth=3, random_state=1) model.fit(X_train, y_train) # Dump the model object to a file pickle.dump(model, open("model.pkl", 'wb')) return model
در این بلوک کد، ما یک طبقهبندی درخت تصمیم را آموزش میدهیم تا گونههای گل را بر اساس عرض و طول کاسبرگها و گلبرگها پیشبینی کنیم. طبقهبندیکننده درخت تصمیم را میتوان بهطور شهودی بهعنوان مجموعهای از تصمیمگیریها بر اساس مقادیر ویژگیها نشان داد که زمانی که به یک گره برگ درخت رسید، به پیشبینی ختم میشود. یک درخت نمونه مشتق شده از این مدل در زیر آورده شده است.
یک نکته قابل توجه است: ما از ماژول pickle
برای سریال سازی مدل در هنگام آموزش استفاده می کنیم. با این کار مدل به فایلی در دایرکتوری کاری ریخته می شود. فراخوانهای بعدی تابع، اگر مدل ترشی موجود باشد، بهجای گذراندن مراحل (گاهی گرانقیمت) بازآموزی، به سادگی مدل را میخواند. این یک نکته کلیدی خواهد بود در حالی که ما به بیان مثال ادامه می دهیم، زیرا به یک روال جداگانه اجازه می دهد که مسئول ارزیابی مستمر، تقویت و آموزش مجدد مدل با جمع آوری داده های جدید است.
با این حال، در یک محیط تولید، مانند هنگام استفاده از زمان اجرا Kubernetes برای Apache Pulsar، دایرکتوری کاری ممکن است زودگذر باشد، که در عوض راه حل دیگری را می طلبد. چند احتمال عبارتند از:
- خود مدل را می توان در یک موضوع Pulsar ذخیره کرد. قالب سریالی pickle را می توان به عنوان یک رشته کدگذاری شده با پایه ۶۴ نوشت و به جای خواندن یک فایل از روی دیسک، بر حسب تقاضا خوانده شد.
- اگر فایل مدل فیزیکی مورد نظر است، خود فایل ترشی را می توان در برخی از حافظه های راه دور مانند سطل آمازون S3 ذخیره کرد. در زمان اجرای تابع، فایل را می توان دانلود کرد و خواند.
تا کنون، کدی را نوشته ایم که مدل طبقه بندی درخت تصمیم را آموزش می دهد. وقت آن رسیده است که روتینی بسازیم که عملکرد پالسار ما را نشان دهد. ما یک زیر کلاس IrisPredictionFunction
از کلاس Function
در Pulsar ایجاد می کنیم که دو روش را پیاده سازی می کند: یک متد __init__()
که هیچ کاری انجام نمی دهد و یک روش __process__()
، که با توجه به یک ورودی و زمینه کاربر، یک پیشبینی را از مدل برمیگرداند.
class IrisPredictionFunction(Function): # No initialization code needed def __init__(self): pass def process(self, input, context): # Convert the input ratio to a float, if it isn't already flower_parameters = [float(x) for x in input.split(",")] # Get the prediction model = train_iris_model() return model.predict([flower_parameters])[0]
این تابع به زمینه کاربر بستگی ندارد. در صورت تمایل میتوان از پارامترها و گزینههای پیکربندی ویژه کاربر تماسگیرنده برای تغییر رفتار استفاده کرد. اما برای این تابع، ما به سادگی به ورودی تکیه می کنیم. از آنجایی که مدل بر روی چهار ویژگی گل عرض گلبرگ، عرض گلبرگ، طول گلبرگ و پهنای گلبرگ آموزش داده شده است، باید ارائه دهیم. هر کدام و به ترتیبی که مدل آموزش داده شد. برای سهولت و سادگی، فرض می کنیم که اینها به صورت رشته ای با کاما از هم جدا شده اند. برای مثال، رشته زیر را در نظر بگیرید:
۱.۸,۲.۱,۴.۰,۱.۴
این یک گل را با اندازههای زیر نشان میدهد:
- طول کوتاه: ۱.۸
- sepalwidth: ۲.۱
- طول گلبرگ: ۴.۰
- عرض گلبرگ: ۱.۴
تابع Pulsar ما این رشته را می گیرد، روی کاما تقسیم می کند، مقادیر را به شناور تبدیل می کند و سپس آنها را به روال پیش بینی مدل منتقل می کند.
استقرار تابع Pulsar ما
اکنون برای بخش آسان: استقرار! هنگامی که کلاینت مستقل Pulsar در حال اجرا است، فقط باید عملکرد خود را ایجاد و راه اندازی کنیم. ابتدا آن را ایجاد می کنیم، مانند:
bin/pulsar-admin functions create \ --tenant public \ --namespace default \ --name iris_prediction_1 \ --py iris_prediction.py \ --timeout-ms 10000 \ --classname iris_prediction.IrisPredictionFunction \ --inputs persistent://public/default/in \ --output persistent://public/default/out
به چند پارامتر توجه کنید:
- –name نامی را در اختیار ما قرار می دهد تا به تابع اشاره کنیم تا در آینده آن را فعال کنیم. این می تواند راحت ترین باشد، اما باید منحصر به فرد باشد.
- –py نام اسکریپت پایتون است که حاوی کدی است که ما نوشته ایم. در اینجا، من کد خود را به عنوان یک اسکریپت به نام iris_prediction.py ذخیره کرده ام.
- –classname نام کلاس در اسکریپت پایتون است که کاملاً واجد شرایط است، همانطور که در بالا نشان داده شده است.
در نهایت، ما می توانیم عملکرد خود را فعال کنیم! بیایید پارامترهایی را که به عنوان مثال در بالا استفاده کردیم، پاس کنیم:
bin/pulsar-admin functions trigger \ --tenant public \ --namespace default \ --name iris_prediction_1 \ --trigger-value 1.8,2.1,4.0,1.4
پاداش: پیش بینی انبوه
این تابع برای گونههای پیشبینیشده یک گل زنبق عالی عمل میکند. اما در دنیای واقعی، ممکن است بخواهیم پیشبینیهایی را برای تعداد زیادی مشاهدات بهطور همزمان به دست آوریم. خوشبختانه، این یک تغییر بیاهمیت در تابع فوق است و میتواند در کنار تابع پیشبینی تک گل گنجانده شود. بیایید کلاس زیر را اضافه کنیم، که از آن برای ایجاد یک تابع Pulsar جدید استفاده خواهیم کرد:
class IrisPredictionFunctionBulk(Function): # No initialization code needed def __init__(self): pass def process(self, input, context): # Convert the input parameters to floats, if they aren't already flower_parameters_str = input.split(":") flower_parameters_split = [x.split(",") for x in flower_parameters_str] flower_parameters_float = [[float(x) for x in y] for y in flower_parameters_split] # Get the prediction model = train_iris_model() return ", ".join(model.predict(flower_parameters_float))
این نسخه انبوه تابع مشابه است، اما از سه جهت متفاوت است:
- نام کلاس جدیدی را تعریف میکند تا به ما اجازه دهد هنگام ثبت تابع، آن را تشخیص دهیم.
- فرض میکند که ممکن است بیش از یک مجموعه اندازهگیری گل داشته باشیم که با یک کاراکتر
:
تقسیم شدهاند. - پیشبینیهای مدل حاصل را بهجای آرایهای به رشتهای از پیشبینیهای جدا شده با کاما میپیوندد.
مانند قبل، تابع را ثبت میکنیم، مطمئن میشویم که یک نام جدید تعریف میکنیم و به نام کلاس درستی که ایجاد کردهایم مراجعه میکنیم:
bin/pulsar-admin functions create \ --tenant public \ --namespace default \ --name iris_prediction_bulk_1 \ --py iris_prediction.py \ --timeout-ms 10000 \ --classname iris_prediction.IrisPredictionFunctionBulk \ --inputs persistent://public/default/in \ --output persistent://public/default/out
و در نهایت، تابع را راه اندازی می کنیم. بیایید سه مجموعه اندازه گیری گل را همزمان انجام دهیم، مانند:
bin/pulsar-admin functions trigger \ --tenant public \ --namespace default \ --name iris_prediction_bulk_1 \ --trigger-value 1.8,2.1,4.0,1.4:0.1,0.1,0.1,0.1:1.8,2.5,0.5,5.0
و ما آن را داریم! پیشبینیهای بیدرنگ گونههای گل زنبق بر اساس اندازهگیریها، با استفاده از توابع پالسار در پایتون.
در حالی که این مثال فقط سطح آنچه را که با توابع Pulsar ممکن است خراش می دهد، من معتقدم که طرحی برای اجرای خط لوله هوش مصنوعی در زمان واقعی با استفاده از Apache Pulsar ارائه می دهد. با قدرت Pulsar که زیربنای چارچوب اصلی قرار دارد، میتوان سیستمهای میخانه/فرعی پیچیده با مقادیر زیادی از دادههای همزمان را بهطور یکپارچه پردازش کرد و خروجی حاصل از مدل استنتاج مستقیماً مصرف شود یا حتی در یک کار پاییندستی استفاده شود.
درباره هوش مصنوعی بیدرنگ اینجا بیشتر بیاموزید .
اریک هیر یک مهندس نرم افزار در DataStax است، جایی که در پایگاه داده منبع باز، پخش جریانی کار می کند. و فناوری های هوش مصنوعی. اریک قبل از DataStax نقش دانشمند ارشد داده در Daisi Technology را بر عهده داشت. او دکتری دارد. از دانشگاه ایالتی آیووا در آمار و علوم کامپیوتر و بیش از ۱۰ سال تجربه کار با داده ها و تجزیه و تحلیل.
—
New Tech Forum مکانی برای کاوش و بحث در مورد فناوری سازمانی نوظهور در عمق و وسعت بی سابقه ای فراهم می کند. انتخاب ذهنی است، بر اساس انتخاب ما از فناوری هایی که معتقدیم مهم هستند و برای خوانندگان InfoWorld بیشترین علاقه را دارند. InfoWorld وثیقه بازاریابی را برای انتشار نمی پذیرد و حق ویرایش تمام محتوای ارائه شده را برای خود محفوظ می دارد. همه سوالات را به newtechforum@infoworld.com ارسال کنید.
پست های مرتبط
با توابع Pulsar یک خط لوله هوش مصنوعی در زمان واقعی بسازید
با توابع Pulsar یک خط لوله هوش مصنوعی در زمان واقعی بسازید
با توابع Pulsar یک خط لوله هوش مصنوعی در زمان واقعی بسازید