Apple Silicon چشمانداز استنتاج محلی مدلهای زبانی بزرگ (LLM) را بهطور بنیادین تغییر داده است. با بهرهگیری از معماری حافظه یکپارچه در چیپهای M1، M2 و M3، توسعهدهندگان میتوانند مدلهای بزرگ را بهصورت محلی اجرا کنند بدون اینکه با تأخیرهای (latency) معمول ناشی از انتقال داده بین CPU و GPU مواجه شوند. با این حال، دستیابی به عملکرد اوج نیازمند چیزی فراتر از کامپایل کد است؛ این کار به یک رویکرد راهبردی در انتخاب بکاند و مدیریت حافظه نیاز دارد. در این راهنما، بررسی خواهیم کرد که چگونه میتوان llama.cpp را بهینه کرد تا از سختافزار مک خود بیشترین بهره را برد.
درک بکاند Metal
بهطور پیشفرض، llama.cpp با فعالسازی پشتیبانی از Metal روی macOS کامپایل میشود. این موضوع حیاتی است زیرا Metal Performance Shaders (MPS) هستههای (kernels) بهینهشدهای برای ضرب ماتریسها ارائه میدهند که ستون فقرات محاسباتی مدلهای Transformer هستند. برخلاف CUDA روی GPUهای NVIDIA که دارای اکوسیستمی بالغ از کتابخانهها است، بکاند Metal در llama.cpp طوری طراحی شده که سربار (overhead) راهاندازی هستهها را به حداقل برساند. هنگام اجرای استنتاج، تانسورها مستقیماً در حافظه GPU ذخیره میشوند که امکان دسترسی سریع را فراهم میکند. کلید عملکرد در اینجا اطمینان از آن است که بیلد شما واقعاً از بکاند Metal استفاده میکند و به اجرای فقط با CPU برنمیگردد، زیرا این کار میتواند پهنای باند را بهشدت محدود کند.
بهرهگیری از معماری حافظه یکپارچه
سیستم حافظه یکپارچه در Apple Silicon به هر دو واحد CPU و GPU اجازه میدهد بدون نیاز به کپی صریح، به یک استخر حافظه مشترک دسترسی پیدا کنند. برای LLMها، این یک تغییر بازیساز (game-changer) است. راهاندازیهای GPU مجزا (discrete) نیازمند انتقال وزنهای مدل از RAM سیستم به VRAM هستند، فرآیندی که برای مدلهای بزرگ میتواند چند ثانیه یا حتی چند دقیقه طول بکشد. در Apple Silicon، وزنهای مدل در حافظه یکپارچه قرار دارند و از طریق اتصالات پهنای باند بالا توسط GPU قابل دسترسی هستند. این امر مرحله «انتقال» (offload) را بهطور کامل حذف میکند. با این حال، باید اطمینان حاصل کنید که مدل شما به درستی در حافظه GPU بارگذاری شده است. در llama.cpp، این کار توسط پارامتر -ngl (تعداد لایههای GPU) کنترل میشود.
پیکربندی عملی برای حداکثر پهنای باند
برای دستیابی به پهنای باند بالا، باید تعادلی بین تعداد لایههای منتقلشده به GPU و پهنای باند حافظه در دسترس خود برقرار کنید. در اینجا یک مثال عملی از نحوه اجرای یک مدل LLaMA 2 کوانتیزهشده با پرچمهای بهینه برای چیپ M2 Max آورده شده است:
# بارگذاری مدل با تمام لایهها روی GPU
# -ngl 99 اطمینان میدهد که تمام لایههای ممکن به GPU منتقل شوند
# -c 4096 اندازه پنجره زمینه (context window) را تنظیم میکند
# -b 512 اندازه دسته (batch size) را تنظیم میکند (دستههای بزرگتر اغلب پهنای باند بهتری را به همراه دارند)
./llama-cli -m ./llama-2-13b-q4_K_M.gguf -ngl 99 -c 4096 -b 512
به استفاده از -b 512 توجه کنید. اگرچه اندازه دسته بزرگتر حافظه بیشتری مصرف میکند، اما به GPU اجازه میدهد چندین توکن را بهصورت موازی پردازش کند که برای دستیابی به نرخهای بالای توکن در ثانیه (TPS) حیاتی است. اگر محدودیت حافظه دارید، میتوانید این مقدار را کاهش دهید، اما با مقدار بالا شروع کنید و بهتدریج کم کنید تا زمانی که افت عملکرد را مشاهده کنید.
نکات پیشرفته: کوانتیزاسیون و زمینه
کوانتیزاسیون اهرم اصلی دوم برای عملکرد است. استفاده از یک طرح کوانتیزاسیون ۴ بیتی (مانند Q4_K_M یا Q4_0) ردپای حافظه را بهطور قابلتوجهی کاهش میدهد و فضای بیشتری برای پنجره زمینه و اندازه دسته باقی میگذارد. در Apple Silicon، اغلب پهنای باند عامل محدودکننده است نه توان محاسباتی خام. با کاهش مقدار دادهای که باید بین واحدهای حافظه جابهجا شود، کوانتیزاسیون مستقیماً بر سرعت استنتاج تأثیر میگذارد. علاوه بر این، پنجره زمینه خود را تا حد عملی ممکن کوچک نگه دارید. یک زمینه ۴۰۹۶ توکنی معمولاً برای اکثر برنامههای چت کافی است و تولید توکن سریعتری نسبت به زمینه ۱۶k ارائه میدهد.
پایش عملکرد
برای اطمینان از اینکه بهینهسازیهای شما کار میکنند، استفاده از GPU را با استفاده از Activity Monitor در macOS پایش کنید. به تب "GPU" نگاه کنید و اطمینان حاصل کنید که فرآیند شما بهطور فعال از هستههای GPU استفاده میکند. اگر با وجود استفاده بالا از CPU، استفاده کم از GPU را مشاهده کردید، ممکن است لایههای کافی را به GPU منتقل نکرده باشید. افزایش پارامتر -ngl باید بار کاری را به بکاند Metal منتقل کند.
نتیجهگیری
بهینهسازی llama.cpp برای Apple Silicon ترکیبی از درک معماری سختافزار و تنظیم پارامترهای نرمافزاری است. با بهرهگیری از بکاند Metal و سیستم حافظه یکپارچه، میتوانید سرعتهای استنتاج محلی را به دست آورید که برای بسیاری از موارد استفاده با APIهای ابری رقابت میکنند. با یک مدل کوانتیزهشده ۴ بیتی شروع کنید، تمام لایهها را به GPU منتقل کنید و اندازه دسته خود را تنظیم کنید تا نقطه بهینه برای پیکربندی سختافزاری خاص خود را پیدا کنید. با این استراتژیها، مک شما به یک ابزار قدرتمند برای توسعه هوش مصنوعی خصوصی و با پهنای باند بالا تبدیل میشود.