بارهای کاری AI/ML در Kubernetes: A Headlamp Plugin برای Kubeflow 🚀

Kubernetes به آرامی تبدیل به پلتفرم پیش‌فرض برای بارهای کاری هوش مصنوعی و یادگیری ماشین شده است. از اجرای نوت‌بوک‌های Jupyter تا برنامه‌ریزی آموزش‌های توزیع‌شده، تنظیم هایپرپارامترها و هماهنگی خطوط لوله ML — همه‌چیز بیشتر روی خوشه‌های Kubernetes قرار می‌گیرد. Kubeflow یکی از راه‌های محبوب برای ساختن این پشته است و از مدل بومی Kubernetes استفاده می‌کند: هر قابلیت به‌عنوان یک Custom Resource Definition (CRD) نمایان می‌شود.

این مدل برای اپراتورهای خوشه نعمت است، چون به آن‌ها اجازه می‌دهد بارهای کاری ML را مثل هر منبع دیگری در خوشه رصد و مدیریت کنند. اما در عمل، داشبوردهای تخصصی ML که برای دانشمندان داده طراحی شده‌اند لایه Kubernetes را پنهان می‌کنند و وقتی یک نوت‌بوک گیر می‌کند یا یک آموزش شکست می‌خورد، اپراتورها اغلب به سمت kubectl سوق داده می‌شوند تا بفهمند در سطح Pod چه اتفاقی افتاده است. 😕

اینجا افزونه Kubeflow برای Headlamp وارد بازی می‌شود: این افزونه منابع سفارشی Kubeflow را مستقیماً داخل رابط عمومی و همه‌منظوره Headlamp نمایش می‌دهد تا شکاف بین داشبوردهای ML و حقیقت سطح خوشه را پر کند. الگوی کلی ساده است: با اپراتورهایی که در حال حاضر کار می‌کنند ملاقات کنید و «حقیقت سطح خوشه» را به آن‌ها نشان بدهید.

یک توضیح کوتاه درباره Headlamp: Headlamp یک وب UI قابل توسعه برای Kubernetes است که تحت نگهداری Kubernetes SIG توسعه می‌یابد و با مجوز Apache 2.0 منتشر شده. این برنامه می‌تواند به‌صورت دسکتاپ یا درون‌خوشه اجرا شود و سیستم پلاگین آن اجازه می‌دهد نماهای درجه‌یک برای منابع سفارشی اضافه شوند.

چرا اپراتورها به نمای متفاوت نیاز دارند؟ 🤔 داشبوردهای ML معمولاً برای دانشمندان داده طراحی شده‌اند تا آزمایش‌ها و خطوط لوله را اجرا کنند، اما اپراتورهای خوشه و SREها سوالات متفاوتی دارند: چرا یک نوت‌بوک گیر کرده؟ آیا خطا ImagePullBackOff است، OOMKilled یا Pod در انتظار PersistentVolumeClaim مانده؟ کدام Runها اخیراً در یک namespace شکست خورده‌اند؟ Katib چه مقدار پارامتر را به‌عنوان بهترین گزارش می‌دهد؟ آیا TrainJobها به TrainingRuntime مناسب ارجاع می‌دهند؟ این‌ها سوالاتی هستند که بهترین پاسخشان خواندن مستقیم از API server است — بدون لایه میانی سرویس ML یا پایگاه داده.

چه چیزهایی این افزونه پوشش می‌دهد؟ افزونه Kubeflow گروه‌های API نصب‌شده در خوشه را کشف می‌کند و فقط آن بخش‌هایی که نصب شده‌اند را نمایش می‌دهد، یعنی با نصب ماژولار Kubeflow یا حتی فقط CRDها کار می‌کند. خانواده‌های مؤلفه و منابعی که پشتیبانی می‌شوند شامل Notebooks، Pipelines (Pipeline, PipelineVersion, Run, RecurringRun, Experiment)، Katib (Experiment, Trial, Suggestion)، TrainingRuns (مثل PyTorch/ TensorFlow RunJob)، ClusterTrainingRuntime، و Spark (SparkApplication, ScheduledSparkApplication) هستند.

این افزونه چه اطلاعاتی را نشان می‌دهد و چه کاری انجام می‌دهد؟ 👀

Inspect notebook Pods — نمای جزئیات Notebook وضعیت‌های Pod را نشان می‌دهد، دلیل خطاها و پیام‌های مرتبط را به‌صورت واضح می‌آورد. همچنین درخواست‌ها و محدودیت‌های CPU/Memory/GPU، ولوم‌ها و انواع پشتیبان آن‌ها (مثل PersistentVolumeClaim، ConfigMap، Secret یا emptyDir)، متغیرهای محیطی که به Secret/ConfigMap ارجاع می‌دهند، کانتینرهای جانبی و tolerations را نشان می‌دهد. این نما اطلاعاتی را که در حالت عادی با چند دستور kubectl جدا باید جمع کنید، یک‌جا ارائه می‌کند. 🔧

بررسی تنظیم هایپرپارامترها با Katib — نماهای Katib الگوریتم تنظیم، فضای جستجو، وضعیت زنده هر Trial و بهترین Trial فعلی را با متریک‌ها و مقادیر پارامترها نمایش می‌دهند. اطلاعاتی مثل پیکربندی early stopping و تعداد Trialهای متوقف‌شده زودهنگام هم در دسترس است تا بتوانید جستجو را از داخل UI خوشه دنبال کنید بدون نیاز به خروج از محیط مدیریت.

وضعیت Pipelines بدون پایگاه داده پشتیبان — نماهای Pipelines مستقیماً از منابع API Kubernetes می‌خوانند و نیازی به کوئری کردن سرویس Kubeflow Pipelines یا پایگاه داده پشت‌پرده ندارند. می‌توانید مشخصات Pipeline ذخیره‌شده را حتی وقتی آن سرویس در دسترس نیست بررسی کنید. نمای جزئیات Pipeline امکان مقایسه آخرین و نسخه‌های قبلی PipelineVersion را با یک diff در قالب YAML کنار هم فراهم می‌کند. نماهای Run وضعیت، مدت زمان و logs را نشان می‌دهند و RecurringRunها زمان‌بندی‌های خوانا دارند.

نقشه‌برداری منابع ML — افزونه یک resource map در Headlamp ثبت می‌کند که انواع منابع مانند Notebook، Profile، PodDefault، Experiment، Pipeline، SparkApplication و غیره را رندر می‌کند و بر اساس .metadata.ownerReferences لبه‌هایی بین منابع می‌کشد تا وابستگی‌ها و ارتباط‌ها را ببینید. خلاصه‌های درون‌خطی (inline) وقتی ماوس را روی منابع می‌برید هم نمایش داده می‌شوند تا تشخیص سریع وضعیت راحت‌تر باشد. 🗺️

آمادگی برای اجرا و آزمایش: README افزونه Kubeflow راه‌اندازی یک کلاستر محلی را توضیح می‌دهد، از جمله مسیر سبک‌وزن فقط CRD برای ارزیابی. چون افزونه گروه‌های API نصب‌شده را کشف می‌کند، می‌توانید آن را با یک نصب ماژولار Kubeflow یا حتی با خوشه‌ای که فقط CRDها و منابع نمونه دارد امتحان کنید.

الگو را به پلتفرم‌های دیگر تعمیم دهید — Kubeflow نمونه‌ای از یک الگوی کلی است: پلتفرم‌های سنگین CRD اغلب گردش‌کارهای حوزه-خاص را با منابع سفارشی مدل می‌کنند و داشبوردهای آن‌ها روی آن گردش‌ها متمرکز‌اند. اپراتورها اما به وضعیت منابع API و Podهای زیربنایی نیاز دارند. یک افزونه مبتنی بر CRD در یک UI عمومی Kubernetes می‌تواند این وضعیت را بدون مجبور کردن اپراتورها به جابه‌جایی بین ابزارهای نامرتبط فراهم کند — الگویی که می‌توان در پلتفرم‌های دیگر هم پیاده کرد. ⚙️

افزونه تحت مجوز Apache 2.0 توسعه می‌یابد و بخشی از اکوسیستم Kubernetes SIG است. اگر می‌خواهید مشکلی را گزارش کنید یا به بهبود افزونه کمک کنید، از issues یا pull requests در مخزن افزونه‌های Headlamp استفاده کنید — مشارکت خوش‌آمد است. 🙌