فاز 17 · درس 10

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

نوع
مفهومی
زمان
حدود 60 دقیقه
زبان‌ها
Python (stdlib, toy cold-start path simulator)
پیش‌نیاز
فاز 17 · 02 (اقتصاد پلتفرم استنتاج)، فاز 17 · 03 (مقیاس‌پذیری خودکار GPU)
یک تراشه پردازنده گرافیکی در حال انتقال داده‌های متراکم با لایه‌های نوری سریع از حافظه به هسته پردازش
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. لایه‌ی 1 — ایمیج‌های ازپیش‌آماده‌ی نود (Bottlerocket)
  5. لایه‌ی 2 — استریمینگ مدل (Run:ai Model Streamer)
  6. لایه‌ی 3 — اسنپ‌شات‌های حافظه‌ی GPU (پلتفرم Modal)
  7. لایه‌ی 4 — وارم‌پول‌ها (min_workers=1)
  8. لایه‌ی 5 — بارگذاری لایه‌ای (ServerlessLLM)
  9. لایه‌ی 6 — مهاجرت زنده (الگوی امتیازی)
  10. محاسبات اقتصادی وارم‌پول
  11. اول بسنجید، بعد بهینه‌سازی کنید
  12. اعدادی که باید به خاطر بسپارید
  13. استفاده در عمل
  14. تحویل پروژه
  15. تمرین‌ها
  16. اصطلاحات کلیدی
  17. برای مطالعه‌ی بیشتر

وقتی سرویس استنتاج مدل‌های زبانی را به‌صورت بدون سرور (Serverless) پیاده‌سازی می‌کنید، قابلیت اسکیل به صفر هزینه‌ها را در زمان‌های بی‌باری به‌شدت کاهش می‌دهد. اما چالش اصلی درست در زمان بازگشت ترافیک رخ می‌دهد: راه‌اندازی یک نود خام، دانلود ده‌ها گیگابایت وزن مدل و بارگذاری آن‌ها در حافظه می‌تواند 3 تا 8 دقیقه طول بکشد که عملاً برای کاربر نهایی به معنای قطعی سرویس است.

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

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

راه‌اندازی یک مدل بزرگ از حالت سرد تا پاسخ‌دهی چند دقیقه طول می‌کشد: یک مدل 70B روی نودی تازه، تقریباً 3 تا 8 دقیقه زمان می‌برد تا اولین توکن را تولید کند. در دنیای واقعیِ بدون سرور (Serverless)، این زمان یک «گرم‌کردن اولیه» نیست، بلکه یک «قطعی کامل سرویس» است. راهکارهای کاهش این زمان در پنج لایه عمل می‌کنند: ایمیج‌های ازپیش‌آماده‌ی نود (Bottlerocket در AWS با معماری دو جلدی)، استریمینگ مدل (NVIDIA Run:ai Model Streamer که به‌صورت توکار در vLLM وجود دارد)، اسنپ‌شات‌های حافظه‌ی GPU (چک‌پوینت‌های Modal با راه‌اندازی مجدد تا 10 برابر سریع‌تر)، وارم‌پول‌ها (min_workers=1)، بارگذاری لایه‌ای (پایپ‌لاین NVMe→DRAM→HBM در ServerlessLLM با کاهش 10 تا 200 برابری تاخیر)، به‌همراه الگوی ششم امتیازی: مهاجرت زنده که به‌جای کش کلید-مقدار (چند گیگابایت)، توکن‌های ورودی (چند کیلوبایت) را جابه‌جا می‌کند. Modal حداقل زمان راه‌اندازی سرد را 2 تا 4 ثانیه اعلام کرده است؛ Baseten این زمان را به‌طور پیش‌فرض 5 تا 10 ثانیه و با پیش‌گرم‌کردن زیر یک ثانیه ارائه می‌دهد. در این درس یاد می‌گیرید این پنج لایه را بسنجید، برای هزینه‌شان برنامه‌ریزی کنید و آن‌ها را روی هم سوار کنید.

اهداف یادگیری

  • پنج لایه‌ی کاهش زمان راه‌اندازی سرد را نام ببرید و برای هر لایه یک ابزار یا الگو مثال بزنید.
  • مجموع زمان راه‌اندازی سرد را از حاصل‌جمع (تخصیص نود) + (دانلود وزن‌ها) + (بارگذاری وزن‌ها در HBM) + (راه‌اندازی موتور پردازشی) برای یک مدل 70B محاسبه کنید.
  • توضیح دهید چرا در مهاجرت زنده به‌جای کش کلید-مقدار (چند گیگابایت)، توکن‌های ورودی (چند کیلوبایت) منتقل می‌شوند و جریمه‌ی این کار (محاسبه‌ی دوباره) چیست.
  • موازنه‌ی موجود در وارم‌پول (پرداخت هزینه برای GPU بیکار در برابر پذیرش تاخیر انتهای طیفِ راه‌اندازی سرد) و آستانه‌ی SLA را که در آن مقدار min_workers > 0 اجباری می‌شود، مشخص کنید.

صورت مسئله

اندپوینت بدون سرور مدل زبانی شما شب‌ها به صفر اسکیل می‌کند (Scale-to-zero). ساعت 8 صبح ترافیک ناگهان اوج می‌گیرد. اولین درخواست در صف انتظار می‌ماند تا این مراحل طی شوند:

  1. ابزار Karpenter یک نود GPU اختصاص می‌دهد: 45 تا 60 ثانیه.
  2. کانتینر ایمیجی 30 گیگابایتی حاوی وزن‌ها را پول می‌کند: 120 تا 300 ثانیه.
  3. موتور پردازشی وزن‌ها را روی HBM بارگذاری می‌کند: بسته به اندازه‌ی مدل و سرعت فضای ذخیره‌سازی، 45 تا 120 ثانیه.
  4. ابزار vLLM یا TRT-LLM بخش‌هایی مثل گراف‌های CUDA، استخر کش کلید-مقدار و توکنایزر را راه‌اندازی اولیه می‌کند: 10 تا 30 ثانیه.

در مجموع: 220 تا 510 ثانیه (تقریباً 3 تا 8 دقیقه) زمان می‌برد تا حتی یک توکن برگردد، در حالی که SLA شما 2 ثانیه است. یک وارم‌پول با min_workers=1 بالا می‌آورید و مشکل به‌ظاهر محو می‌شود؛ اما حالا باید هزینه‌ی یک GPU بیکار را به‌صورت 24/7 بپردازید. اگر سرویس شما 5 محصول مختلف داشته باشد و برای هر کدام یک نمونه‌ی گرم نگه دارید، یعنی در ماه 3,600 = 30 × 24 × 5 ساعت هزینه برای GPU می‌دهید، چه حتی یک کاربر درخواست داده باشد و چه نداده باشد.

کاهش زمان راه‌اندازی سرد یعنی حفظ صرفه‌ی اقتصادی معماری بدون سرور، هم‌زمان با نزدیک‌شدن به تاخیر سیستم‌های همیشه‌روشن.

مفاهیم پایه

لایه‌ی 1 — ایمیج‌های ازپیش‌آماده‌ی نود (Bottlerocket)

روی AWS، معماری دو جلدی (Dual-volume) در Bottlerocket سیستم‌عامل را از داده‌ها جدا می‌کند. از دیسک داده که ایمیج کانتینر از قبل روی آن پول شده یک اسنپ‌شات بگیرید؛ سپس شناسه اسنپ‌شات را در EC2NodeClass ثبت کنید. نودهای جدید طوری بوت می‌شوند که وزن‌ها از قبل روی NVMe محلی قرار دارند؛ با این کار مرحله‌ی 2 و بخشی از مرحله‌ی 3 حذف می‌شوند. این روش به‌خوبی و به‌شکل توکار با Karpenter کار می‌کند. دستاورد معمول آن: 2 تا 4 دقیقه صرفه‌جویی در هر راه‌اندازی سرد برای مدل‌های بزرگ.

معادل این کار در GCP: ساخت ایمیج‌های سفارشی VM با لایه‌های کانتینری ازپیش‌پخته‌شده (Pre-baked). در Azure: استفاده از اسنپ‌شات‌های دیسک مدیریت‌شده (Managed disk) با همین الگو.

لایه‌ی 2 — استریمینگ مدل (Run:ai Model Streamer)

به‌جای اینکه پیش از پاسخ به اولین درخواست صبر کنید تا تمام فایل بارگذاری شود، وزن‌ها را لایه‌به‌لایه در حافظه‌ی GPU استریم کنید و پردازش را به‌محض مستقر شدن اولین بلوک ترنسفورمر شروع کنید. ابزار NVIDIA Run:ai Model Streamer به‌صورت توکار در نسخه‌ی 2026 فریم‌ورک vLLM ارائه می‌شود. این ابزار با S3، GCS و NVMe محلی کار می‌کند و با هم‌پوشانی ورودی/خروجی و آماده‌سازی محاسباتی، زمان بارگذاری وزن‌ها را برای مدل‌های بزرگ تقریباً نصف می‌کند.

لایه‌ی 3 — اسنپ‌شات‌های حافظه‌ی GPU (پلتفرم Modal)

Modal بعد از اولین بارگذاری، یک چک‌پوینت از وضعیت GPU (وزن‌ها، گراف‌های CUDA و ناحیه‌ی کش کلید-مقدار) تهیه می‌کند. ری‌استارت‌های بعدی داده‌ها را مستقیماً در HBM دی‌سریالایز (Deserialize) می‌کنند که 10 برابر سریع‌تر از راه‌اندازی اولیه است. این روش نزدیک‌ترین تجربه به «بوت‌کردن یک GPU آماده در 2 ثانیه» است. نکته‌ی موازنه: اسنپ‌شات‌ها وابسته به توپولوژی هر GPU هستند؛ یعنی اگر Karpenter شما را به مدل متفاوتی از سخت‌افزار (SKU) منتقل کند، باید دوباره چک‌پوینت بسازید.

لایه‌ی 4 — وارم‌پول‌ها (min_workers=1)

ساده‌ترین راهکار: همیشه یک نمونه آماده نگه دارید. هزینه‌ی آن برابر با نرخ ساعتی یک GPU در طول 24/7 است. حساب‌وکتاب این روش برای مدل‌های کوچک بی‌رحمانه است (ساعتی 0.85 تا 1.50 دلار می‌پردازید تا جلوی یک راه‌اندازی سرد 30 ثانیه‌ای را بگیرید)، اما برای مدل‌های بزرگ به‌صرفه است (پرداخت 4 دلار در ساعت برای جلوگیری از راه‌اندازی سرد 5 دقیقه‌ای). آستانه‌ی SLA که در آن داشتن وارم‌پول اجباری می‌شود، معمولاً رسیدن به TTFT P99 زیر 60 ثانیه روی یک مدل 70B یا بزرگ‌تر است.

لایه‌ی 5 — بارگذاری لایه‌ای (ServerlessLLM)

پروژه‌ی ServerlessLLM با حافظه مثل یک ساختار سلسله‌مراتبی برخورد می‌کند: NVMe (سریع اما حجیم)، DRAM (متوسط اما طبقه‌بندی‌شده)، HBM (بسیار کم‌حجم اما آنی). وزن‌ها ابتدا در DRAM بارگذاری می‌شوند؛ سپس بر اساس نیاز به HBM انتقال می‌یابند. مقاله‌ی این پروژه گزارش داده است که در بارگذاری‌های سرد، این روش تاخیر را در مقایسه با روش ساده‌ی دیسک به HBM، بین 10 تا 200 برابر کاهش می‌دهد. استفاده از این روش در محیط عملیاتی (پروداکشن) هنوز در مراحل اولیه است، اما هماهنگی‌هایی برای آن با vLLM وجود دارد.

لایه‌ی 6 — مهاجرت زنده (الگوی امتیازی)

وقتی نودی از دسترس خارج می‌شود (به دلیل لغو نمونه‌های اسپات یا تخلیه‌ی نود)، رویکرد سنتی این است که نمونه‌ی دیگری به‌صورت سرد راه‌اندازی شده و صف درخواست‌ها خالی شود. در مهاجرت زنده، توکن‌های ورودی (چند کیلوبایت) به مقصدی که مدل را آماده در حافظه دارد منتقل می‌شوند و کش کلید-مقدار روی مقصد دوباره محاسبه می‌شود. محاسبه‌ی دوباره بسیار ارزان‌تر از انتقال چند گیگابایت کش کلید-مقدار از طریق شبکه است. این روش برای معماری‌های استقرار مجزا (Disaggregated deployments) کاربرد دارد.

محاسبات اقتصادی وارم‌پول

برای سرویسی با SLA تاخیر P99 TTFT برابر با 2 ثانیه، سوال این نیست که «وارم‌پول داشته باشیم یا نه»، بلکه این است که «چند نمونه‌ی آماده نگه داریم و به کدام مسیرها اختصاص دهیم».

  • مسیرهای تعاملی باارزش (چت زنده، ایجنت صوتی): min_workers=1-2.
  • مسیرهای پردازش دسته‌ای پس‌زمینه (دسته‌بندی شبانه): اسکیل به صفر پذیرفته می‌شود و راه‌اندازی سرد 5 تا 10 دقیقه‌ای قابل‌تحمل است.
  • پلن‌های ویژه: تعیین min_workers اختصاصی برای هر مشتری سازمانی با ظرفیت رزروشده.

اول بسنجید، بعد بهینه‌سازی کنید

کالبدشکافی راه‌اندازی سرد برای یک مدل 70B روی نودی تازه (نمونه‌ی تقریبی):

مرحله زمان راهکار کاهش زمان
تخصیص نود 50 ثانیه Bottlerocket به‌همراه ایمیج ازپیش‌آماده، وارم‌پول
پول‌کردن ایمیج 180 ثانیه دیسک داده‌ی ازپیش‌آماده (حذف کامل)
انتقال وزن‌ها به HBM 75 ثانیه استریمر مدل (نصف‌کردن زمان)؛ اسنپ‌شات GPU (حذف کامل)
راه‌اندازی موتور پردازشی 20 ثانیه کش دائمی گراف‌های CUDA
اولین عبور رفت (Forward) 3 ثانیه حداقل تاخیر ذاتی پردازش
کل زمان سرد 328 ثانیه
کل زمان با اعمال راهکارها حدود 15 ثانیه 22 برابر کاهش

اعدادی که باید به خاطر بسپارید

  • راه‌اندازی سرد در Modal: بین 2 تا 4 ثانیه (با اسنپ‌شات‌های GPU).
  • راه‌اندازی سرد پیش‌فرض در Baseten: بین 5 تا 10 ثانیه؛ با پیش‌گرم‌کردن زیر یک ثانیه.
  • راه‌اندازی سرد مدل 70B در حالت خام: 3 تا 8 دقیقه.
  • ابزار Run:ai Model Streamer: حدود 2 برابر سرعت بیشتر در بارگذاری وزن‌ها.
  • بارگذاری لایه‌ای در ServerlessLLM: کاهش 10 تا 200 برابری تاخیر (بر اساس ارقام مقاله).
پایپ‌لاین استارت سرد (COLD-START)استریم وزن‌ها در لایه‌های حافظه تا آماده‌به‌کار شدن رپلیکا
COLD-START PIPELINEA scaled-to-zero replica cannot answer until its weights are resident in HBM. The cold-start budget is the sum of node provision, weights download, load into HBM, and engine init — minutes for a 70B model against a two-second SLA. Tiered loading streams weights NVMe→DRAM→HBM and warm pools keep min_workers>0, trading idle GPU cost for a vanished cold-start tail.NVMeوزن‌ها در دیسکDRAMآماده‌سازیHBMروی GPUسردپاسخ‌دهیبارگذاری لایه‌ای: NVMe ← DRAM ← HBM، سپس رپلیکا سرویس می‌دهد
رپلیکایی که به صفر اسکیل شده تا زمانی که وزن‌هایش در HBM مستقر نشوند نمی‌تواند پاسخ دهد. بودجه زمان استارت سرد مجموع تخصیص نود، دانلود وزن‌ها، بارگذاری در HBM و راه‌اندازی موتور است — چند دقیقه برای یک مدل 70B در مقایسه با SLA دو ثانیه‌ای. بارگذاری لایه‌ای وزن‌ها را به‌صورت NVMe→DRAM→HBM استریم می‌کند و استخرهای گرم با حفظ min_workers>0، هزینه بیکاری GPU را با حذف کامل تاخیر طولانی استارت سرد مبادله می‌کنند.

استفاده در عمل

فایل code/main.py مسیر راه‌اندازی سرد را در دو حالتِ بدون راهکارها و همراه با هر یک از آن‌ها مدل‌سازی می‌کند. این اسکریپت مجموع زمان راه‌اندازی سرد، هزینه‌ی وارم‌پول، و نرخ درخواستی را گزارش می‌دهد که در آن، هزینه‌ی وارم‌پول با صرفه‌جویی حاصل سر‌به‌سر می‌شود.

تحویل پروژه

در این درس فایل outputs/skill-cold-start-planner.md ساخته می‌شود. این ابزار بر اساس SLA، اندازه‌ی مدل و الگوی ترافیک، مشخص می‌کند کدام راهکارها باید با هم ترکیب شوند.

تمرین‌ها

  1. اسکریپت code/main.py را اجرا کنید. نرخ درخواستی را محاسبه کنید که بالاتر از آن، داشتن یک نمونه‌ی آماده ارزان‌تر از پرداخت هزینه‌ی تاوان راه‌اندازی سرد از طریق ریزش درخواست‌ها فراتر از SLO تمام شود.
  2. می‌خواهید مدلی 13B را با SLA تاخیر P99 TTFT برابر با 3 ثانیه مستقر کنید. ساده‌ترین پشته‌ی راهکارها (با کمترین لایه‌های ممکن) را برای رسیدن به این هدف انتخاب کنید.
  3. استفاده از ایمیج ازپیش‌آماده در Bottlerocket مرحله‌ی پول‌کردن ایمیج را حذف می‌کند، اما وزن‌ها همچنان باید از اسنپ‌شات روی HBM بارگذاری شوند. اگر دیسک NVMe متصل به اسنپ‌شات با سرعت 7 گیگابایت بر ثانیه بخواند، زمان واقعی بارگذاری را برای یک مدل 70B حساب کنید.
  4. ارائه‌دهنده‌ی بدون سرور شما اسنپ‌شات‌های GPU (مشابه Modal) ارائه می‌دهد و تیم شما مخالفت می‌کند چون «اسنپ‌شات‌ها باعث نشت داده‌های حساس کاربران (PII) می‌شوند». از هر دو دیدگاه دفاع کنید؛ خطر واقعی چیست و چه راهکاری (اسنپ‌شات‌های کوتاه‌مدت، رمزنگاری، ایزولاسیون با Namespace) برای آن وجود دارد؟
  5. یک خط‌مشی سلسله‌مراتبی برای وارم‌پول طراحی کنید: برای کاربران پولی، کاربران نسخه‌ی آزمایشی و تسک‌های دسته‌ای به چه تعداد نمونه‌ی آماده نیاز است؟ محاسبات خود را نشان دهید.

اصطلاحات کلیدی

اصطلاح چیزی که در مکالمات می‌گویند معنای دقیق فنی
راه‌اندازی سرد (Cold start) «مکث بزرگ اولیه» زمان از رسیدن درخواست تا اولین توکن روی نمونه‌ای تازه
وارم‌پول (Warm pool) «حداقل همیشه روشن» تنظیم min_workers >= 1 برای آماده نگه‌داشتن حداقل یک نمونه
ایمیج ازپیش‌آماده (Pre-seeded image) «امی پخته‌شده (Baked AMI)» ایمیج نود که وزن‌های کانتینر از قبل در آن قرار دارد
باتل‌راکت (Bottlerocket) «سیستم‌عامل نودهای AWS» سیستم‌عامل بهینه‌شده‌ی کانتینری AWS با پشتیبانی از اسنپ‌شات دیسک دو جلدی
استریمر مدل (Model streamer) «بارگذاری استریمینگ» هم‌پوشانی ورودی/خروجی وزن‌ها با راه‌اندازی محاسبات
اسنپ‌شات GPU (GPU snapshot) «چک‌پوینت روی HBM» سریالایز وضعیت GPU پس از بارگذاری؛ دی‌سریالایز مستقیم هنگام ری‌استارت
بارگذاری لایه‌ای (Tiered loading) «استفاده از NVMe + DRAM + HBM» سلسله‌مراتب لایه‌های ذخیره‌سازی؛ بارگذاری بر حسب تقاضا
مهاجرت زنده (Live migration) «انتقال توکن‌ها» انتقال ورودی (چند کیلوبایت)، محاسبه‌ی دوباره‌ی کش کلید-مقدار در مقصد
min_workers «نمونه‌های آماده» حداقل تعداد نمونه‌های زنده در معماری بدون سرور
اسکیل به صفر (Scale-to-zero) «معماری کاملاً بدون سرور» بدون هزینه در زمان بیکاری؛ پذیرش کامل تاوان راه‌اندازی سرد

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درساستارت سرد برای یک مدل 70B روی نود جدید بدون اقدامات بهینه‌سازی معمولاً چقدر طول می‌کشد؟
  2. حین درسدرس کدام ویژگی سمت AWS را برای بارگذاری اولیه ایمیج‌های کانتینر پیشنهاد می‌کند تا مرحله دوم (image pull) حذف شود؟
  3. حین درسکدام ویژگی Modal نزدیک‌ترین تجربه به «بوت گرم GPU در چند ثانیه» را با دی‌سریالایز کردن وضعیت پس از لود مستقیماً درون HBM فراهم می‌کند؟
  4. حین درسچرا مهاجرت زنده به جای کش کلید-مقدار، توکن‌های ورودی را بین نودها انتقال می‌دهد؟
  5. پس از درسکدام لایه سرورلس با زنده نگه داشتن حداقل یک رپلیکا، هزینه مستقیم GPU را با آمادگی قابل‌پیش‌بینی مبادله می‌کند؟
  6. پس از درسچرا درس تأکید می‌کند که کاهش استارت سرد باید در چندین لایه ترکیب شود نه اینکه صرفاً یک ابزار انتخاب شود؟

سؤالات متداول

راه‌اندازی سرد خام یک مدل 70B معمولاً چقدر طول می‌کشد؟

روی یک نود تازه بدون بهینه‌سازی، مجموع تخصیص نود، دانلود ایمیج، بارگذاری وزن‌ها در HBM و مقداردهی اولیه موتور محاسباتی بین 3 تا 8 دقیقه زمان می‌برد.

چرا در الگوی مهاجرت زنده، توکن‌های ورودی جابه‌جا می‌شوند نه کش KV؟

چون حجم توکن‌های ورودی تنها چند کیلوبایت است، در حالی که کش کلید-مقدار (KV cache) چندین گیگابایت پهنای باند نیاز دارد؛ انتقال چند کیلوبایت و محاسبه‌ی مجدد در مقصد از نظر تاخیر بسیار ارزان‌تر تمام می‌شود.

استفاده از اسنپ‌شات حافظه GPU چه موازنه‌ای دارد؟

اسنپ‌شات حافظه زمان راه‌اندازی مجدد را تا 10 برابر سریع‌تر و نزدیک 2 تا 4 ثانیه می‌کند، اما چون وابسته به سخت‌افزار است، با تغییر مدل فیزیکی GPU (تغییر SKU) باید دوباره چک‌پوینت جدید ساخته شود.

ما رو توی گوگل بیشتر ببین

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