AI Infrastructure

HA با حالت: همگام‌سازی کش KV بین گره‌ها برای انتقال بی‌درنگ جلسات LLM

در چشم‌انداز در حال تکامل سریع استقرار مدل‌های زبانی بزرگ (LLM)، دسترس‌پذیری بالا (HA) دیگر فقط درباره زمان آپ‌تایم نیست؛ بلکه درباره پیوستگی بافت (Context) است. با گفتاری‌تر و بلندتر شدن بافت برنامه‌ها، کش کلید-ارزش (KV) به یک مؤلفه حیاتی با حالت تبدیل می‌شود. برخلاف خدمات وب سنتی بدون حالت که در آن‌ها یک درخواست ناموفق می‌تواند روی هر گره‌ای تکرار شود، یک درخواست استنتاج LLM به شدت به بافت تاریخی ذخیره‌شده در کش KV وابسته است. اگر یک گره در میانه مکالمه از کار بیفتد، از دست رفتن آن کش به معنای از دست رفتن بافت توسط کاربر و منجر به یک تجربه شکسته می‌شود.

چالش استنتاج با حالت

چارچوب‌های استاندارد سرویس‌دهی LLM، مانند vLLM یا TensorRT-LLM، برای بهینه‌سازی نرخ عبور (Throughput) کش KV را در حافظه GPU نگه می‌دارند. این طراحی کارآمد اما شکننده است. حافظه GPU ناپایدار است و مقیاس‌بندی افقی دشوار است وقتی که هر نمونه دارای حالت منحصربه‌فرد و غیرمشترک باشد. برای دستیابی به دسترس‌پذیری بالا واقعی، باید کش KV را به عنوان یک منبع پایدار و مشترک در نظر بگیریم که می‌تواند در یک خوشه از گره‌ها همگام‌سازی شود.

چالش اصلی در تعادل بین تأخیر (Latency) و یکپارچگی (Consistency) نهفته است. همگام‌سازی تانسورهای چند گیگابایتی از طریق شبکه در هر تولید توکن عملی نیست. به جای آن، به استراتژی‌ای نیاز داریم که امکان تکثیر غیرهمزمان یا بازیابی بر اساس نیاز را فراهم کند.

معماری برای همگام‌سازی کش KV

یک معماری محکم برای HA با حالت معمولاً شامل سه لایه است:

  1. گره اصلی: استنتاج فعال را مدیریت کرده و کش KV محلی را به‌روزرسانی می‌کند.
  2. لایه تکثیر: بخش‌های به‌روزرسانی‌شده کش KV را به‌صورت غیرهمزمان به گره‌های ثانویه یا یک انبار شیء توزیع‌شده ارسال می‌کند.
  3. همراه‌ساز (Orchestrator): وابستگی جلسه (Session Affinity) و سلامت گره‌ها را ردیابی کرده و در صورت نیاز، انتقال (Failover) را فعال می‌کند.

برای انتقال با تأخیر کم، همگام‌سازی همتا به همتا با استفاده از اتصالات پرسرعت (مانند NVLink یا InfiniBand) برای گره‌های هم‌مکان ایده‌آل است. برای راه‌اندازی‌های توزیع‌شده جغرافیایی، ذخیره نقاط چک (Checkpoints) در یک سیستم ذخیره‌سازی توزیع‌شده (مانند S3 یا Ceph) دوام را با هزینه تأخیر بازیابی بالاتر فراهم می‌کند.

استراتژی پیاده‌سازی

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

import threading
import time

class KVCacheSyncManager:
    def __init__(self, primary_gpu_id, peer_ip):
        self.primary_gpu_id = primary_gpu_id
        self.peer_ip = peer_ip
        self.sync_lock = threading.Lock()
        self.last_synced_token = -1

    def generate_and_sync(self, input_ids, current_token_index):
        # 1. تولید توکن روی GPU اصلی
        output_token = self.llm_engine.generate(input_ids)
        
        # 2. تعیین اینکه آیا کش KV تغییر کرده است یا خیر
        if current_token_index > self.last_synced_token:
            with self.sync_lock:
                self._trigger_async_sync(current_token_index)
                self.last_synced_token = current_token_index
                
        return output_token

    def _trigger_async_sync(self, token_index):
        # در یک سیستم تولیدی، این کار از طریق یک رشته پس‌زمینه انجام می‌شود
        # تا بخش مربوطه از کش KV سریال‌سازی شده
        # و از طریق gRPC یا RDMA به گره همتا ارسال شود.
        print(f"Syncing KV cache state up to token {token_index} to {self.peer_ip}")
        # simulated_network_call(self.get_kv_state(token_index), self.peer_ip)

بهینه‌سازی کلیدی: همگام‌سازی دلتا

به جای ارسال کل کش KV، فقط کلیدها و ارزش‌های جدید تولیدشده در گام فعلی را ارسال کنید. از آنجا که LLMها خودبازگشتی (Autoregressive) هستند، کش قبلی همچنان معتبر است؛ فقط پروجکشن‌های لایه آخر نیاز به به‌روزرسانی دارند.

مکانیزم انتقال (Failover)

وقتی یک بررسی سلامت از خرابی گره آگاه شود، همراه‌ساز باید:

  1. گره پشتیبان (Standby) را که دارای آخرین حالت همگام‌شده کش KV است، شناسایی کند.
  2. شناسه جلسه فعال را به گره جدید نگاشت کند.
  3. تولید را از آخرین توکن سالم شناخته‌شده از سر بگیرد.

برای به حداقل رساندن درک کاربر از تأخیر در حین انتقال، گرم کردن از پیش (Pre-warming) گره پشتیبان حیاتی است. با نگه داشتن وزن‌های مدل و بخش‌های اخیر کش KV در حافظه GPU گره پشتیبان به صورت داغ، جریمه شروع سرد (Cold-start) مرتبط با بارگذاری مدل و دریافت کش از دیسک حذف می‌شود.

موازنه‌ها و ملاحظات

  • پهنای باند شبکه: همگام‌سازی با فرکانس بالا می‌تواند رابط‌های شبکه را اشباع کند. اگر پهنای باند محدود است، همگام‌سازی‌ها را طوری تنظیم کنید که هر N توکن رخ دهند، نه هر توکن.
  • هزینه حافظه GPU: ذخیره کش مازاد روی گره‌های پشتیبان VRAM ارزشمندی را مصرف می‌کند. سیاست‌های اخراج کش (Eviction) برای جلسات قدیمی را پیاده‌سازی کنید.
  • تضمین‌های یکپارچگی: در سناریوی مغز دوگانه (Split-brain)، اطمینان حاصل کنید که فقط یک گره به کش می‌نویسد تا از فساد حالت جلوگیری شود.

نتیجه‌گیری

پیاده‌سازی HA با حالت برای LLMها پیچیده اما برای هوش مصنوعی گفتاری درجه تولید ضروری است. با در نظر گرفتن کش KV به عنوان یک شهروند درجه یک در استراتژی HA خود، می‌توانید انتقال بی‌درنگ را بدون قربانی کردن بافت کاربر به دست آورید. با همگام‌سازی دلتای غیرهمزمان و گره‌های پشتیبان گرم‌شده از پیش شروع کنید تا زیرساختی مقاوم بسازید که با رشد مدل و پایگاه کاربری شما مقیاس‌بندی شود. نتیجه یک سیستم است که نه تنها در دسترس است، بلکه منسجم نیز هست و تضمین می‌کند که دستیار هوش مصنوعی شما هرگز «فراموش» نمی‌کند که با چه کسی صحبت می‌کند.

Share: