Quantization چیست؟ چطور مدل‌های غول‌پیکر را روی لپ‌تاپ خانگی اجرا کنیم

منتشر شده در 1405/06/05 | بازدید : 3 بار | زمان مطالعه : 15 دقیقه

در نگاه اول، مدل‌های زبانی بزرگ مانند غول‌های مهارناپذیر دنیای نرم‌افزار به نظر می‌رسند. آن‌ها می‌توانند کد بنویسند، اسناد طولانی را تحلیل کنند و مکالماتی کاملاً طبیعی داشته باشند. اما وقتی نوبت به اجرای محلی این غول‌ها می‌رسد، با دیواری بلند از جنس سخت‌افزار مواجه می‌شویم. به عنوان مثال، بارگذاری یک مدل ۷۰ میلیارد پارامتری با دقت کامل ۱۶ بیتی (FP16)، به بیش از ۱۴۰ گیگابایت حافظه ویدیویی (VRAM) نیاز دارد. این یعنی شما برای اجرای ساده آن، به سرورهایی گران‌قیمت با چندین کارت گرافیک صنعتی نیازمندید که فراتر از توان مالی برنامه‌نویسان، دانشجویان و حتی استارتاپ‌های کوچک است. علاوه بر این، ترنسفورمرها در زمان استنتاج (Inference) به شدت با پهنای باند حافظه (Memory Bandwidth) محدود می‌شوند، یعنی جابه‌جایی مقادیر پارامترها از حافظه به پردازنده بسیار زمان‌برتر از خود محاسبات ریاضی است.

اما چه می‌شد اگر می‌توانستیم این غول‌های سخت‌افزاری را بدون کاهش چشمگیر در قدرت استدلالشان، آن‌قدر کوچک کنیم که درون حافظه یک لپ‌تاپ معمولی جا شوند؟ این دقیقاً همان جایی است که کوانتیزاسیون (Quantization) وارد میدان می‌شود؛ تکنیکی هوشمندانه و ریاضیاتی که کیمیاگری دیجیتال دنیای هوش مصنوعی به شمار می‌آید. در این جستار تخصصی و عمیق، با زبانی شیوا و غیرتکراری به بررسی چگونگی فشرده‌سازی پارامترها و نحوه احضار این مدل‌ها روی سیستم‌های خانگی می‌پردازیم. اگر به مباحث پایه‌ای و مقایسه‌ای هوش مصنوعی علاقه‌مند هستید، پیشنهاد می‌کنیم مقالات قبلی وبلاگ ما شامل مقایسه مدل‌ها در مدل‌های Open-Source در برابر Closed-Source: کدام برای پروژه‌ی شما مناسب‌تر است؟ و مفاهیم پایه‌ای در پارامتر، توکن و پنجره‌ی زمینه (Context Window) را مطالعه فرمایید.

کیمیاگری دیجیتال: چطور وزن‌های مدل زبانی را فشرده کنیم؟

برای درک کوانتیزاسیون، ابتدا باید با مفهوم دقت عددی در کامپیوتر آشنا شویم. پارامترهای یک مدل زبانی (که در واقع همان وزن‌ها و بایاس‌های شبکه عصبی هستند و ارتباطات بین نورون‌ها را شکل می‌دهند) به طور سنتی به صورت اعداد اعشاری ۱۶ بیتی (FP16) یا ۳۲ بیتی (FP32) ذخیره می‌شوند. هر یک از این اعداد اعشاری دارای ساختار حافظه پیچیده‌ای شامل علامت، نما (Exponent) و مانتیس (Mantissa) است تا بتواند طیف بسیار وسیع و دقیقی از مقادیر اعشاری کوچک و بزرگ را نشان دهد. اما واقعیت عملی این است که برای پیش‌بینی کلمه بعدی در یک مکالمه روزمره، مدل نیازی به چنین دقت مینیاتوری و محاسبات شناور سنگینی در تک‌تک وزن‌های خود ندارد.

کوانتیزاسیون فرآیند نگاشت این اعداد اعشاری دقیق و ۱۶ بیتی به یک مجموعه محدود و گسسته از مقادیر صحیح با دقت پایین‌تر است؛ معمولاً اعداد صحیح ۸ بیتی (INT8) یا حتی ۴ بیتی (INT4) و ۲ بیتی (INT2). یک تشبیه ساده، فشرده‌سازی رنگ‌ها در یک تصویر دیجیتال است. فرض کنید تصویری با ۱۶ میلیون رنگ مختلف دارید؛ اگر پالت رنگی آن را به ۲۵۶ رنگ یا حتی ۱۶ رنگ منتخب کاهش دهید، حجم فایل به شدت افت می‌کند، اما تصویر همچنان برای چشم انسان کاملاً قابل تشخیص و واضح باقی می‌ماند. کوانتیزاسیون نیز همین کار را با وزن‌های شبکه عصبی انجام می‌دهد؛ حجم مدل را تا ۷۵ درصد کاهش می‌دهد در حالی که افت استدلال آن معمولاً کمتر از چند درصد خواهد بود.

فشرده‌سازی مدل نه تنها فضای ذخیره‌سازی هارد دیسک را آزاد می‌کند، بلکه از همه مهم‌تر، حجم رم و پهنای باند مورد نیاز کارت گرافیک را کاهش می‌دهد که نتیجه آن افزایش سرعت تولید کلمات است. علاوه بر مزایای سخت‌افزاری، کوانتیزاسیون با کاهش حجم محاسبات سنگین ریاضی و خنک نگه‌داشتن دیتاسنترها، نقش بسیار مهمی در کاهش مصرف برق و حرکت به سمت هوش مصنوعی سبز (Green AI) بازی می‌کند که گام ارزشمندی در جهت حفظ محیط زیست و صرفه‌جویی در انرژی است.

از اعشارهای میلیمتری تا اعداد صحیح و رند: نگاهی به پشت صحنه ریاضی

ریاضیات پشت کوانتیزاسیون بر پایه فرمول‌های مقیاس‌دهی (Scaling) و انتقال نقطه صفر (Zero-point) بنا شده است. برای انتقال یک متغیر پیوسته مانند وزن‌های FP16 (بین یک مقدار مینیمم و ماکسیمم مشخص) به کادرهای محدود مقادیر INT4 (بین ۸- تا ۷)، ما از فرمول زیر استفاده می‌کنیم:

Q = round(V / S) + Z

که در آن V مقدار اعشاری اصلی, S فاکتور مقیاس (Scale) و Z مقدار جابه‌جایی یا نقطه صفر (Zero-point) است. این فرآیند نگاشت می‌تواند به دو صورت پیاده‌سازی شود:

  • کوانتیزاسیون متقارن (Symmetric Quantization): در این حالت، نقطه صفر ریاضی (Z) همیشه روی صفر تنظیم می‌شود. این کار محاسبات ضرب ماتریسی در زمان اجرا را بسیار سریع‌تر می‌کند، اما اگر وزن‌ها توزیع نامتوازنی داشته باشند (مثلا اکثر مقادیر مثبت باشند)، کارایی مدل افت خواهد کرد.
  • کوانتیزاسیون نامتقارن (Asymmetric Quantization): در این متد، نقطه صفر (Z) به صورت پویا جابه‌جا می‌شود تا محدوده وزن‌ها را دقیقاً پوشش دهد. این روش کیفیت خروجی را بهتر حفظ می‌کند اما سرعت محاسبات آن کمی پایین‌تر است.

فرآیند کوانتیزاسیون را می‌توان به دو روش کلی در چرخه توسعه مدل پیاده‌سازی کرد:

  • کوانتیزاسیون پس از آموزش (Post-Training Quantization - PTQ): در این متد، مدل ابتدا به طور کامل با دقت ۱۶ بیتی آموزش می‌بیند و پس از اتمام کار، وزن‌های آن به دقت پایین‌تر (مثلا ۴ بیت) تبدیل می‌شوند. این روش بسیار سریع است و نیازی به پردازش مجدد ندارد، اما برای مدل‌های کوچک‌تر از ۷ میلیارد پارامتر ممکن است با افت کیفیت استدلال همراه باشد.
  • آموزش آگاه از کوانتیزاسیون (Quantization-Aware Training - QAT): در این متد، فشرده‌سازی در حین خود فرآیند آموزش شبیه‌سازی می‌شود. یعنی مدل در حین یادگیری تلاش می‌کند با خطاهای ناشی از کمبود دقت عددی سازگار شود. خروجی این روش فوق‌العاده باکیفیت است، اما نیازمند منابع پردازشی بسیار سنگین برای بازآموزی است.

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

شاخ‌به‌شاخ فرمت‌ها: دنیای پرجنب‌وجوش GGUF، GPTQ و AWQ

با رشد جامعه منبع‌باز، فرمت‌های متفاوتی برای کوانتیزاسیون مدل‌ها ابداع شدند که هرکدام برای سخت‌افزار خاصی بهینه‌سازی شده‌اند:

  • فرمت GGUF (توسعه یافته توسط llama.cpp): انقلابی بزرگ برای کاربران لپ‌تاپ! این فرمت به طور خاص برای اجرای مدل روی CPU و با استفاده از زبان C/C++ طراحی شده است. GGUF به طرز معجزه‌آسایی روی پردازنده‌های Apple Silicon (مک‌بوک‌های سری M) و پردازنده‌های استاندارد اینتل و AMD کار می‌کند. یکی از ویژگی‌های حیاتی GGUF قابلیت GPU Offloading است؛ یعنی اگر لپ‌تاپ شما مثلاً ۶ گیگابایت VRAM دارد و مدل نیاز به ۱۰ گیگابایت دارد، GGUF بخشی از مدل را روی کارت گرافیک و مابقی را روی رم سیستم و CPU اجرا می‌کند.
  • فرمت GPTQ: این فرمت بهینه‌ترین گزینه برای اجرای مدل‌ها روی کارت‌های گرافیک انویدیا (Nvidia GPU) است. GPTQ با تحلیل ریاضی ساختار لایه‌ها، وزن‌ها را به صورت ۴ بیتی فشرده می‌کند و سرعت پردازش را روی GPU به شدت افزایش می‌دهد.
  • فرمت AWQ (Activation-aware Weight Quantization): یک گام رو به جلو در حفظ کیفیت مدل. ایده AWQ این است که همه پارامترهای مدل ارزش یکسانی ندارند. حدود ۱ درصد از وزن‌ها بسیار حیاتی هستند و در صورت فشرده شدن، کل سیستم خراب می‌شود. AWQ این وزن‌های کلیدی را شناسایی کرده و آن‌ها را دست‌نخورده یا با دقت بالا نگه می‌دارد، در حالی که ۹۹ درصد وزن‌های باقی‌مانده را بدون دغدغه فشرده می‌کند. این کار بالاترین سطح از دقت استدلال را در فشرده‌سازی ۴ بیتی ارائه می‌دهد.

همچنین با ظهور فناوری‌های تحت وب جدید مانند WebGPU و استفاده از موتورهای استنتاجی مانند ONNX Runtime، فرمت‌های کوانتیزه‌شده مخصوص مرورگر نیز وارد میدان شده‌اند. این تحول بزرگ به توسعه‌دهندگان اجازه می‌دهد تا مدل‌های فشرده‌شده ۲ یا ۴ بیتی را مستقیماً روی مرورگر کاربر و بدون نیاز به سرور مرکزی اجرا کنند که تحولی عظیم در حریم خصوصی به شمار می‌آید.

کارگاه عملی: احضار لاما روی سخت‌افزار خانگی شما

امروز به لطف ابزارهایی مانند Ollama، اجرای مدل‌های کوانتیزه‌شده دیگر نیازی به نوشتن خط فرمان‌های پیچیده لینوکسی ندارد. شما می‌توانید با چند دستور ساده، یک مدل پیشرفته را به صورت کاملاً آفلاین و ایمن روی لپ‌تاپ خود داشته باشید:

  1. ابتدا نرم‌افزار Ollama را متناسب با سیستم‌عامل خود (ویندوز، مک یا لینوکس) دانلود و نصب کنید.
  2. ترمینال یا خط فرمان خود را باز کنید و دستور زیر را تایپ کنید:
    ollama run llama3:8b-instruct-q4_K_M
    این دستور نسخه کوانتیزه شده ۴ بیتی مدل لاما ۳ را دانلود کرده و مستقیما در ترمینال در اختیار شما می‌گذارد. پسوند q4_K_M نشان‌دهنده استفاده از متد کوانتیزاسیون ۴ بیتی با کیفیت متوسط رو به بالا است که برای اکثر سیستم‌های با ۸ یا ۱۶ گیگابایت رم عالی کار می‌کند.

یک فرمول ساده برای محاسبه رم مورد نیاز جهت اجرای مدل‌های کوانتیزه شده به صورت زیر است:

حجم رم تقریبی = (تعداد پارامترها به میلیارد) * (تعداد بیت کوانتیزاسیون / ۸) + ۲ گیگابایت بافر

به عنوان مثال، برای اجرای یک مدل ۸ میلیارد پارامتری به صورت ۴ بیتی: (۸ * ۴ / ۸) + ۲ = ۶ گیگابایت رم مورد نیاز است که به سادگی روی لپ‌تاپ‌های معمولی قابل دسترس است.

کدام فرمت، کجای پروژه به کار می‌آید؟

بسته به نیازهای پروژه‌تان، باید فرمت درستی انتخاب کنید تا از اتلاف منابع جلوگیری شود:

  • اگر سخت‌افزار هدف شما مک‌بوک یا کامپیوتر بدون گرافیک مجزا است و یا می‌خواهید مدل را روی پردازنده‌های معمولی سرور بالا بیاورید: بدون شک از GGUF استفاده کنید.
  • اگر سروری مجهز به کارت‌های گرافیک Geforce (مانند RTX 4090) دارید و به دنبال بیشترین سرعت تولید توکن در ثانیه برای چت‌بات‌های عمومی هستید: GPTQ گزینه فوق‌العاده‌ای است.
  • اگر دقت استدلال و کیفیت خروجی در مسائل سخت ریاضی، برنامه‌نویسی یا تحلیل‌های حقوقی برای شما اولویت دارد و به کارت‌های گرافیک انویدیا دسترسی دارید: حتماً به سراغ AWQ بروید.

یک اسکریپت ساده پایتون برای ارتباط با دستیار محلی

پس از اجرای مدل روی Ollama، شما می‌توانید از طریق کد زیر به صورت محلی و با زبان پایتون با دستیار هوشمند خود گفتگو کنید. توجه داشته باشید که این اسکریپت از کتابخانه داخلی پایتون بهره می‌برد و نیاز به هیچ ابزار خارجی ندارد، که امنیت و خلوص کد شما را در فرآیندهای استقرار محلی حفظ می‌کند:

import urllib.request
import json

def chat_with_local_llm(prompt):
    url = "http://localhost:11434/api/generate"
    payload = {
        "model": "llama3:8b-instruct-q4_K_M",
        "prompt": prompt,
        "stream": False
    }
    
    headers = {"Content-Type": "application/json"}
    req = urllib.request.Request(
        url, 
        data=json.dumps(payload).encode('utf-8'), 
        headers=headers,
        method="POST"
    )
    
    try:
        with urllib.request.urlopen(req) as response:
            res_data = json.loads(response.read().decode('utf-8'))
            return res_data.get("response")
    except Exception as e:
        return f"خطا در ارتباط با مدل محلی: {e}"

# نمونه استفاده از تابع برای دریافت پاسخ
# response = chat_with_local_llm("کوانتیزاسیون را در دو جمله تعریف کن.")

فردایِ دموکراتیک هوش مصنوعی

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

آیا تا به حال مدلی را به صورت محلی روی کامپیوتر خود اجرا کرده‌اید؟ تجربیات، نرخ فریم خروجی و چالش‌های سخت‌افزاری خود را در بخش نظرات با ما به اشتراک بگذارید تا بحث‌های فنی بیشتری پیرامون این تکنولوژی جذاب داشته باشیم.

دوره‌های آنلاین برنامه‌نویسی لیست دوره‌ها