Modelplane: ناوگان GPU بدون نوشتن حتی یک کنترلر
خلاصهٔ کاملتر
نویسنده که نزدیک هشت ساله از نسخهٔ v0.1 روی Crossplane کار میکنه، تو بلاگ Crossplane نوشته که چند ماه اخیر مشغول بوده یه نوع سختِ زیرساخت رو پشت API ببره: ناوگانی از GPUها که اینفرنس مدل اجرا میکنن. اسم پروژه Modelplane ـه؛ تیم پلتفرم باهاش یه مشت شتابدهنده رو (تو ابرها، نئوکلادها و on-prem) به یه ناوگان واحد تبدیل میکنه و تیمهای ML بدون اینکه درگیر بشن مدل کجا اجرا میشه، یه اندپوینت پایدار و سازگار با OpenAI تحویل میگیرن.
مدلهای open-weight اینفرنس رو از آزمایشگاهها و هایپراسکیلرها بیرون کشیدن و آوردن دست بقیه. استک اپنسورسِ سرو مدل روی یک کلاستر پختهست (vLLM، SGLang، KEDA، Gateway API و DRA)، ولی اینفرنس معمولاً تو یک کلاستر نمیمونه. ظرفیت بین سختافزارها، ارائهدهندهها و ریجنها پخشه و مسئلههای سخت بالای کلاسترن: جاگذاری مدل روی ظرفیت موجود، تأمین ظرفیت بیشتر، روتینگ بر اساس هزینه و نزدیکی، و جابهجایی وزنها. چنین سیستمهایی قبلاً ساخته شدن، ولی خصوصی موندن.
حرف اصلی این پست برای جامعهٔ Crossplane اینه: Modelplane از بالا تا پایین یه کانفیگ Crossplane ـه — نه کنترلر دستساز، نه اپراتور سفارشی؛ فقط Composition و Composition Function، یعنی همون بدنهای که باهاش یه RDS رو کامپوز میکنی، منتها خیلی بیشتر تحت فشار. پروایدرها دسترسی به کلادها رو دادن (ساخت کلاستر EKS یا GKE با GPU درست) و فانکشنها اجازه دادن تیم فقط روی جاگذاری و زمانبندی تمرکز کنه، نه watch و requeue و finalizer. Crossplane v2 هم دو پرسونای پروژه رو به مرز اسکوپ نگاشت میکنه.
ولی چیزی که واقعاً پروژه رو شدنی کرد، تجربهٔ توسعه بود: CLI جدید crossplane پروژه رو اسکفولد میکنه، از روی یه نمونهمنبع XRD میسازه و برای APIها اسکیمای تایپدار تولید میکنه. فانکشنها با پایتون نوشته شدن (زبون مشترک دنیای ML) و حالا بهجای دیکشنریهای بیتایپ با آبجکت تایپدار کار میکنن، پس تایپ اشتباه یا غلط املایی همون موقعِ نوشتن لو میره. جالب اینکه همین تایپهای تولیدشده کار ایجنتهای کدنویس رو هم سریعتر کردن، چون شکل دقیق داده رو از قبل میدونستن.
سختترین بخش پروژه طراحی API بود؛ توصیهش اینه قبل از انتشار روش فکر کنی، زودتر سراغ آرایه و enum بری و جا برای رشد بذاری. خودش engines رو اول اشتباه طراحی کرد: یه بلوک spec.topology که توش tensor: 8 مینوشتی و Modelplane فلگ --tensor-parallel-size رو تزریق میکرد؛ این کار پروژه رو به موتورها گره میزد و parallelism دیتا و expert رو بیان نمیکرد. دو هفته مونده به v0.1 عوضش کرد: حالا هر موتور آرایهای از Standalone، Leader یا Worker ـه و parallelism تو فلگهای خود کاربر میشینه.
اسکجولر ناوگان نشون میده یه composition function تا کجا کش میاد. هر کلاستر یه InferenceCluster ـه و هر node pool به یه InferenceClass اشاره میکنه که سختافزار اون pool رو اعلام میکنه؛ وقتی تیم ML یه ModelDeployment میسازه، اسکجولر هر رپلیکا رو روی ظرفیت اعلامشده جا میده، حتی قبل از اینکه نودی وجود داشته باشه. Modelplane واژگان DRA رو قرض میگیره و میبره لایهٔ ناوگان: همون مدل ویژگی تایپدار و همون زبان CEL.
selectors:
- cel: device.capacity["gpu.nvidia.com"].memory.compareTo(quantity("20Gi")) >= 0ظرافت کار اینجاست که همین یه عبارت دو بار ارزیابی میشه: یک بار اسکجولر ناوگان روی ویژگیهای اعلامشدهٔ InferenceClass و یک بار DRA موقع بایند شدن پاد روی GPU واقعی. یه فانکشن هم ذاتاً تابع خالصِ ورودیهاشه، پس اجراش تو هر reconcile امنه؛ ولی اسکجولر نمیتونه فقط با نگاه به یه دیپلویمنت تصمیم بگیره و باید کل ناوگان رو ببینه — همهٔ InferenceClusterها و همهٔ ModelReplicaها، حتی اونایی که مال دیپلویمنتهای دیگهان و ظرفیت مصرف کردن. اینجا require_resources به کمک میاد:
response.require_resources(
rsp, name="all-replicas",
api_version="modelplane.ai/v1alpha1", kind="ModelReplica",
)همین درخواستِ «همهٔ منابع از یه نوع، بدون فیلتر» باید بالادست درست میشد: Crossplane سلکتور خالی رو رد میکرد و حالا match-all حسابش میکنه. بقیهٔ وصلهها هم کم نبودن: پشتیبانی از ایمیجهای از پیش ساختهشده تو CLI، رفع باگهای تولید و سریالایز مدل پایتون برای فیلدهایی به اسم int و bool و string (که کلیدواژهٔ پایتونن)، و یه موتور رندر که خودِ reconciler واقعی رو اجرا میکنه. جمعبندی نویسنده: میشه چیزی به این سختی رو کامل روی Crossplane ساخت، بدون نوشتن حتی یه کنترلر دستی.
نکات کلیدی:
- Modelplane شتابدهندههای چند ابر و on-prem رو یه ناوگان اینفرنس میکنه و اندپوینت سازگار با OpenAI میده
- کل پروژه کامپوزیشن و کامپوزیشنفانکشنه؛ هیچ کنترلر یا اپراتور اختصاصی نداره
- اسکجولر ناوگان واژگان DRA و زبان CEL رو به بالای کلاستر میبره؛ یه عبارت، دو بار ارزیابی میشه
- درس طراحی API: عجله نکن، مثال کارشده بنویس و API رو به جزئیات موتورها گره نزن
- چند کمبود Crossplane (سلکتور خالی، تولید اسکیمای پایتون، موتور render) بالادست وصله شد




