مقیاسبندی خوشهها بهصورت فعال با استفاده از پیشبینی FBProphet
در پروژه اخیرم، موفق شدم اندازه خوشه cluster را بر اساس پیشبینی بار بهصورت فعال مدیریت کنم. در این نوشتار، پروژه مذکور را توضیح میدهیم، قابلیتهای داخلی موجود در AWS را بهصورت دقیق مورد بررسی قرار میدهیم، دلایل استفاده از FBProhphet را مرور میکنیم و نحوه پیادهسازی این راهکار را با هم میبینیم.
در این متن، منظور از کلمه خوشه، مجموعهنمونههای Amazon EC2 است.
قابلیتهای داخلی AWS
AWS دو قابلیت داخلی دارد که در کاهش و افزایش اندازه خوشه کاربرد دارند؛ این دو قابلیت، عبارتاند از: مقیاسبندی پویا Dynamic و مقیاسبندی پیشبیی کننده Predictive .
مقیاسبندی پویا: این قابلیت AWS اندازه خوشه را متناسب با تغییرات آنی و لحظهای که در استفاده از منبع رخ میدهد، مدیریت میکند؛ بدین صورت که میتوان مقادیر آستانه جداگانهای برای نمونهگیری کاهشی و افزایشی خوشهها تنظیم کرد و با رد شدن از این مقادیر آستانهای، مقیاسبندی پویا نمونهگیری کاهشی یا افزایشی را انجام خواهد داد.
با این حال، واکنشی بودن این رویکرد و زمانبر بودن تغییر اندازه خوشه، بر روی زمان لازم برای انجام کار و تجربه مشتریان تأثیر منفی میگذارد.
مقیاسبندی پیشبینی کننده: این قابلیت که از طریق AWS ارائه میشود، میتواند بر اساس دادههایی که طی دو هفته گذشته در منبع استفاده شده است، دو روز بعدی را پیشبینی کند. سپس، در شرایطی که انتظار بار بیشتری داریم، میتوان از این پیشبینیها برای تغییر اندازه خوشهها بهصورت فعالانه استفاده کرد. بدین ترتیب، مشکلی که در روش مقیاسبندی پویا وجود داشت، تا حدی حل میشود.
اما به نظر میرسد پیشبینیهایی که از این طریق در آمازون به دست میآیند، دقت بالایی ندارند؛ این امر منجر به لزوم استفاده از کتابخانههای دیگر برای پیشبینی میشود.
پیشبینی با استفاده از Facebook Prophet
Prophet یک کتابخانه پیشبینی است که توسط فیسبوک معرفی شده است. این کتابخانه برای ارائه پیشبینیهایی به کار میرود که میتوان از آنها در مقیاسبندی خوشهها استفاده کرد. انتخاب معیار درست، نقشی تعیینکننده در عملکرد مناسب این پیشبینیها دارد.
AWS از طریق رابط برنامهنویسی کاربردی CloudWatch چندین معیار پیشنهاد میکند: میانگین مصرف CPU، ماکزیمم مصرف CPU، تعداد گرهها Node count ، حافظه اشغالشده در فواصل زمانی مشخص. بعد از ارزیابی مسئلهای که در دست داریم، تصمیم گرفتیم از معیارهای مصرف CPU و تعداد گرهها استفاده کنیم.
استفاده از Facebook Prophet
Prophet کتابخانهای متنباز با کاربرد آسان است که برای پیشبینی سریهای زمانی کاربرد دارد و از طریق فیسبوک معرفی شده است. توضیح نحوه کار Prophet از حوصله این متن خارج است.
در استفاده از رابط برنامهنویسی کاربردی Prophet باید به چندین نکته توجه داشت. Prophet دو مدل رشد Growth model اصلی ارائه میدهد: مدل رشد خطی مدل رشد خطی Linear growth model و مدل رشد لوجیستیک Logistic growth model (جزئیات هر کدام از این مدلها در مقاله آورده شده است).
علاوه بر این مدلها، قابلیتهای دیگری هم در Prophet وجود دارد که امکان ارائه الگوهای روزانه، هفتگی و سالانه را فراهم میکند؛ دورههای زمانی و ترتیب آنها از سوی متخصص حوزه تعیین میشود. به همین دلیل، تحلیلگرانی که در این حوزه تخصص دارند، قادر هستند Prophet را بهسادگی در آموزش مدلها به کار ببرند.
یکی از نکات منحصربهفرد مدل Prophet پیادهسازی آن در زبان برنامهنویسی Python است؛ در این زبان، ساختار دادههای آموزشی باید به شکل pandas و دارای دو ستون ‘ds’ و ‘y’ باشد (‘ds’ مربوط به برچسبهای زمانی timestamps و ‘y’ نشاندهنده مقدار معیاری که قرار است پیشبینی شود).
قسمتی از کد زیر در تولید پیشبینی کاربرد دارد:
from fbprophet import Prophet# Define parameters of modelprophet = ( Prophet(growth = ‘logistic’) .add_seasonality(name=’daily’, period= 1, fourier_order= specified_fourier_order_daily) .add_seasonality(name=’weekly’, period=7, fourier_order=specified_fourier_order_daily) )# Fit prophet model on training data prophet.fit(df)# Prepare future Dataframe for the time period to forecast, to store the forecasted values future_df = prophet.make_future_dataframe(freq='min', periods = time_period_to_forecast)# Forecast the values for the specified time frame forecast_df = prophet.predict(future_df)
باید به این نکته توجه داشت که تابع forecast_df علاوه بر مقادیر برازشیافته دادههای آموزشی، مقادیر پیشبینیشده را نیز در بر میگیرد و مقادیر پیشبینیشده باید بعداً بهصورت مجزا استخراج شوند.
بعد از آموزش، با استفاده از دستور plot_component در Prophet، میتوان نموداری رسم کرد، تا رویهها و الگوهای زمانی مدل مشخص شود.
fig2 = prophet.plot_components(forecast_df) display(fig2)
این تابع، نموداری مشابه تصویر پایین رسم میکند. نمودار اصلی بسته به رفتار زیربنایی دادهها متفاوت خواهد بود.
همچنین، با رسم نمودار برای چارچوب دادههای پیشبینیشده میتوان به کیفیت برازش مدل Prophet پی برد.
# Code to plot prophet forecast prophet.plot(forecasted_df)
این تابع نیز نموداری شبیه به شکل پایین رسم میکند:
همانطور که مشاهده میکنید، نقاط سیاه که مقادیر اصلی را نشان میدهند، فقط تا سال 2016 وجود دارند و بعد از آن، مقادیر پیشبینیشده مشاهده میشوند. ناحیه آبیرنگ نشاندهنده مقادیر پیشبینیشده است و نواحی بالا و پایین آن که آبی کمرنگ است نیز حد بالا و حد پایین را بهصورت تقریبی نشان میدهد.
مقیاسبندی فعال اندازه خوشه در AWS
بعد از به دست آوردن مقادیر پیشبینیشده، تنظیم زیرساختار برای مقیاسبندی دشوار نخواهد بود. یکی از کارهایی که میتوان انجام داد، پیشبینی معیار لازم برای یک روز و ذخیره آن در محل s3 است؛ این کار را میتوان با استفاده از نرمافزار cron یا هر برنامه زمانبندی Scheduler دیگری انجام داد.
میتوان بر روی یک نمونه EC2 دیگر یا با استفاده از تابع Lambda، یک اسکریپت script دیگر را تنظیم کرد که میتواند بهصورت لحظهای معیارهای خوشه را دریافت کند. AWS یک رابط برنامهنویسی کاربردی معرفی میکند که در جمعآوری معیارهای گوناگون (همچون گنجایش موردنظر (نمونهها)، گنجایش کنونی (نمونهها) و غیره) کاربرد دارد.
با بررسی منطقی این موارد به همراه معیارهای پیشبینیشده میتوان اندازه خوشه را بهصورت فعالانه تغییر داد و تجربهای بهتر برای مشتریان رقم زد.