در 17 اکتبر 2024، مایکروسافت BitNet.cpp را معرفی کرد، یک چارچوب استنتاج طراحی شده برای اجرای مدل های زبان بزرگ کوانتیزه شده 1 بیتی (LLM). BitNet.cpp پیشرفت قابل توجهی در Gen AI است که امکان استقرار LLM های 1 بیتی را به طور موثر بر روی CPU های استاندارد بدون نیاز به GPU های گران قیمت فراهم می کند. این توسعه دسترسی به LLM ها را دموکراتیک می کند، آنها را در طیف گسترده ای از دستگاه ها در دسترس قرار می دهد و امکانات جدیدی را در برنامه های هوش مصنوعی روی دستگاه می دهد.
درک مدل های زبان بزرگ 1 بیتی
مدلهای زبان بزرگ (LLM) به دلیل استفاده از اعداد ممیز شناور با دقت بالا (معمولاً FP16 یا BF16) برای وزنهای مدل، به طور سنتی به منابع محاسباتی قابل توجهی نیاز دارند. این ضرورت استقرار LLM ها را پرهزینه و پر انرژی کرده است.
در هسته خود، LLM های 1 بیتی از تکنیک های کوانتیزاسیون شدید برای نشان دادن وزن مدل تنها با استفاده از سه مقدار ممکن استفاده می کنند: -1، 0، و 1، از این رو اصطلاح “1.58 بیت” (زیرا برای رمزگذاری سه بیت به کمی بیشتر از یک بیت نیاز دارد. ایالت ها).
سیستم وزن سه تایی
مفهوم
کوانتیزاسیون 1 بیتی در BitNet.cpp یک سیستم وزنی سه تایی است. بیت نت تنها با سه مقدار ممکن برای هر پارامتر عمل می کند:
- -1 (منفی)
- 0 (خنثی)
- 1 (مثبت)
این منجر به نیاز به ذخیره سازی در حدود 1.58 بیت در هر پارامتر می شود، از این رو نام آن است بیت نت b1.58. این کاهش شدید در عرض بیت پارامتر منجر به کاهش چشمگیر استفاده از حافظه و پیچیدگی محاسباتی می شود، زیرا اکثر ضرب های ممیز شناور با جمع و تفریق ساده جایگزین می شوند.
پایه ریاضی
کوانتیزاسیون 1 بیتی شامل تبدیل وزن ها و فعال سازی ها به نمایش سه گانه آنها از طریق مراحل زیر است:
1. باینریزه کردن وزن
دوتایی کردن وزن ها شامل متمرکز کردن آنها در حول میانگین (α
) منجر به نمایش سه تایی می شود. تبدیل به صورت ریاضی به صورت زیر بیان می شود:
دبلیوfرا=امضا کنید(دبلیو–α)
کجا:
- دبلیو ماتریس وزن اصلی است.
- α میانگین اوزان است.
- علامت (x) برمی گرداند +1 اگر x > 0 و -1 در غیر این صورت.
2. کوانتیزاسیون فعال سازی
فعالسازیهای کوانتیزاسیون تضمین میکند که ورودیها به یک عرض بیت مشخص محدود میشوند:
کجا:
- Qb = 2(b-1)2^{(b-1)} حداکثر سطح کوانتیزاسیون برای است ب-عرض بیت
- γ حداکثر مقدار مطلق است x (مشخص می شود ∣∣x∣∣∞).
- ε یک عدد کوچک برای جلوگیری از سرریز در طول محاسبات است.
3. عملیات BitLinear
لایه BitLinear ضرب ماتریس های سنتی را با یک عملیات ساده شده جایگزین می کند:
y=دبلیوfرا×x^هرا×(سبراβγرا)
کجا:
- β یک عامل مقیاس بندی است که برای به حداقل رساندن خطاهای تقریبی استفاده می شود.
- γ فعال سازی ها را مقیاس می کند.
- Q_b عامل کوانتیزاسیون است.
این تبدیل محاسبات کارآمد را در عین حفظ عملکرد مدل ممکن می کند.
مفاهیم عملکرد
کارایی حافظه
سیستم وزن سه تایی به میزان قابل توجهی نیاز به حافظه را کاهش می دهد:
- LLM های سنتی: 16 بیت در هر وزن
- BitNet.cpp: 1.58 بیت در هر وزن
این کاهش تقریباً به صرفه جویی در حافظه تبدیل می شود 90% در مقایسه با مدلهای 16 بیتی سنتی، به مدلهای بزرگتر اجازه میدهد تا در همان محدودیتهای سختافزاری قرار بگیرند.
1. سرعت استنتاج: در هر دو CPU سریعتر
سرعت استنتاج به عنوان تعداد توکن های پردازش شده در ثانیه نشان داده می شود. در اینجا خلاصه ای از مشاهدات آمده است:
- در Apple M2 Ultra: BitNet.cpp تا 5.07x افزایش سرعت برای مدل های بزرگتر (30B) در مقایسه با Llama.cpp، با حداکثر سرعت 593.43 توکن در ثانیه برای مدل 125M که یک 1.37x افزایش سرعت برای مدلهای بزرگتر مانند 3.8B و 7B، BitNet.cpp سرعتی بیش از 84.77 توکن در ثانیه دارد که کارایی آن را در مقیاسهای مختلف نشان میدهد.
- در Intel i7-13700H: BitNet.cpp به بهبود سرعت حتی چشمگیرتری دست می یابد. در اندازه مدل 7B، BitNet.cpp ارائه می دهد سرعت باورنکردنی 5.68 برابر در مقایسه با Llama.cpp. برای مدل های کوچکتر مانند 125M، پردازش می کند 389.08 توکن در ثانیه، که است 2.37x سریعتر از Llama.cpp.
2. بهره وری انرژی: تغییر دهنده بازی برای دستگاه های لبه
نمودارهای ارائه شده نیز شامل مقایسه هزینه انرژی، که کاهش قابل توجهی در مصرف انرژی به ازای هر توکن پردازش شده نشان می دهد:
- در Apple M2 Ultra: صرفه جویی در انرژی BitNet.cpp قابل توجه است. برای مدل 700M مصرف می کند 55.4 درصد انرژی کمتر در هر توکن در مقایسه با Llama.cpp، کاهش از 0.314 تا 0.140. این روند برای مدلهای بزرگتر ادامه مییابد و مدل 70B a را نشان میدهد کاهش 70.0 درصدی مصرف انرژی.
- در Intel i7-13700H: BitNet.cpp ارائه می دهد 71.9 درصد صرفه جویی در مصرف انرژی برای مدل 700M با کاهش مصرف 1.367 به 0.384. اگرچه داده های انرژی برای مدل 70B در Llama.cpp در دسترس نیست، BitNet.cpp کارآمد باقی می ماند، با مصرف انرژی در 17.33 برای مدل 70B
3. عبور از معیار سرعت خواندن انسان
یکی از جالب ترین بینش ها از این نمودارها ارجاع به آن است سرعت خواندن انسان، مشخص شده در 5-7 توکن در ثانیه. این خط قرمز نشان می دهد که هر دو پیاده سازی، به ویژه BitNet.cpp، می توانند به راحتی از سرعت خواندن انسان حتی برای بزرگترین مدل ها پیشی بگیرند:
- روشن Apple M2 Ultra، BitNet.cpp از سرعت خواندن انسان برای همه اندازههای مدل، با کمترین سرعت، پیشی میگیرد 8.67 توکن در ثانیه برای مدل 70B
- روشن Intel i7-13700H، مدل 100B همچنان به آن دست می یابد 1.70 توکن در ثانیه، تقریباً محدوده پایین تر سرعت خواندن انسان را لمس می کند ، در حالی که همه مدل های کوچکتر از این معیار فراتر می روند.
ملاحظات آموزشی
برآوردگر مستقیم (STE)
از آنجایی که کوانتیزاسیون 1 بیتی توابع غیر قابل تمایز را معرفی می کند، آموزش شامل یک تکنیک تخصصی به نام برآوردگر مستقیم (STE). در این رویکرد، گرادیان ها بدون تغییر در نقاط غیر قابل تمایز جریان می یابند. در اینجا یک پیاده سازی ساده در پایتون آمده است:
class StraightThroughEstimator(Function): @staticmethod def forward(ctx, input): return input.sign() @staticmethod def backward(ctx, grad_output): return grad_output
آموزش دقیق ترکیبی
برای حفظ ثبات در طول تمرین، دقت مخلوط شاغل است:
- وزن ها و فعال سازی ها: کوانتیزه به دقت 1 بیت.
- گرادیان ها و حالت های بهینه ساز: با دقت بالاتر ذخیره می شود.
- اوزان نهفته: برای تسهیل به روز رسانی دقیق در طول آموزش با دقت بالا نگهداری می شود.
استراتژی نرخ یادگیری بالا
یک چالش منحصر به فرد با مدلهای 1 بیتی این است که بهروزرسانیهای کوچک ممکن است بر وزنهای باینریزه شده تأثیری نگذارند. برای کاهش این امر، نرخ یادگیری افزایش مییابد و در مقایسه با رویکردهای سنتی، همگرایی سریعتر و بهینهسازی بهتر را تضمین میکند.
کمی سازی و عادی سازی گروهی
BitNet.cpp معرفی می کند کمی سازی و عادی سازی گروهی برای افزایش موازی سازی مدل بیت نت به جای محاسبه پارامترهای کل ماتریس وزن، وزن ها و فعال سازی ها را به چند گروه تقسیم می کند.G
).را
این گروهبندی امکان پردازش موازی کارآمد را بدون ارتباطات بین گروهی اضافی فراهم میکند و امکان آموزش و استنتاج مدل در مقیاس بزرگ را فراهم میکند.
یادداشت های پیاده سازی و بهینه سازی ها
بهینه سازی CPU
BitNet.cpp از چندین بهینه سازی سطح پایین برای دستیابی به حداکثر عملکرد CPU استفاده می کند:
- عملیات بردار شده: از دستورالعمل های SIMD برای انجام کارآمد دستکاری بیت ها استفاده می کند.
- دسترسی به حافظه مناسب برای کش: داده ها را برای به حداقل رساندن از دست دادن حافظه پنهان می سازد.
- پردازش موازی: بار کاری را بین چندین هسته CPU به طور موثر توزیع می کند.
در اینجا مثالی از یک تابع کلیدی است که کوانتیزاسیون و استنتاج را در BitNet پیاده سازی می کند:
مدل های پشتیبانی شده
نسخه فعلی BitNet.cpp موارد زیر را پشتیبانی می کند LLM های 1 بیتی در Hugging Face موجود است:
- bitnet_b1_58-large (0.7B پارامترها)
- bitnet_b1_58-3B (پارامترهای 3.3B)
- توکن های Llama3-8B-1.58-100B (پارامترهای 8.0B)
این مدل ها برای نشان دادن قابلیت های استنتاج چارچوب به صورت عمومی در دسترس هستند. اگرچه به طور رسمی توسط مایکروسافت آموزش یا منتشر نشده اند، اما تطبیق پذیری چارچوب را نشان می دهند.
راهنمای نصب
برای شروع کار با BitNet.cpp، مراحل زیر را دنبال کنید:
پیش نیازها
- پایتون >= 3.9
- CMake >= 3.22
- زنگ زدن >= 18
- کوندا (به شدت توصیه می شود)
برای ویندوز کاربران، ویژوال استودیو باید با فعال بودن اجزای زیر نصب شود:
- توسعه دسکتاپ با C++
- C++-CMake Tools برای ویندوز
- Git برای ویندوز
- کامپایلر C++-Clang برای ویندوز
- پشتیبانی MS-Build برای مجموعه ابزار LLVM (Clang)
برای دبیان/اوبونتو کاربران، یک اسکریپت نصب خودکار در دسترس است:
نصب گام به گام
- Repository را شبیه سازی کنید:
- Dependencies را نصب کنید:
- پروژه را بسازید و آماده کنید: می توانید یک مدل را مستقیماً از Hugging Face دانلود کرده و آن را به فرمت کوانتیزه تبدیل کنید:
یا به صورت دستی مدل را دانلود و تبدیل کنید:
اجرای استنتاج با BitNet.cpp
برای اجرای استنتاج با استفاده از چارچوب، از دستور زیر استفاده کنید:
توضیح:
-m
مسیر فایل مدل را مشخص می کند.-p
متن درخواستی را تعریف می کند.-n
تعداد نشانه هایی را برای پیش بینی تنظیم می کند.-temp
تصادفی بودن نمونه برداری (دما) را در طول استنتاج تنظیم می کند.
نمونه خروجی
جزئیات فنی BitNet.cpp
لایه BitLinear
BitNet.cpp یک معماری ترانسفورماتور اصلاح شده را پیاده سازی می کند و ضرب ماتریس استاندارد را با آن جایگزین می کند BitLinear
عملیات این رویکرد وزنها را قبل از کوانتیزه کردن روی صفر متمرکز میکند و آنها را برای کاهش خطاهای تقریبی مقیاس میدهد. تابع تبدیل کلید به شکل زیر است:
# Binarization function for 1-bit weights def binarize_weights(W): alpha = W.mean() W_binarized = np.sign(W - alpha) return W_binarized
ترکیب وزنهای متمرکز و مقیاسبندی تضمین میکند که خطای کوانتیزاسیون حداقل باقی میماند و در نتیجه عملکرد را حفظ میکند.
تاثیر صنعت
BitNet.cpp می تواند پیامدهای گسترده ای برای استقرار LLM ها داشته باشد:
- قابلیت دسترسی: به LLM ها اجازه می دهد روی دستگاه های استاندارد اجرا شوند و دسترسی به هوش مصنوعی قدرتمند را دموکراتیک می کند.
- کارایی هزینه: نیاز به GPU های گران قیمت را کاهش می دهد و مانع پذیرش را کاهش می دهد.
- بهره وری انرژی: با استفاده از استنتاج استاندارد مبتنی بر CPU در مصرف انرژی صرفه جویی می کند.
- نوآوری: امکانات جدیدی را برای هوش مصنوعی روی دستگاه باز می کند، مانند ترجمه بلادرنگ زبان، دستیارهای صوتی، و برنامه های کاربردی متمرکز بر حریم خصوصی بدون وابستگی به ابر.
چالش ها و جهت گیری های آینده
در حالی که LLM های 1 بیتی وعده داده اند، چندین چالش باقی مانده است. اینها شامل توسعه مدلهای 1 بیتی قوی برای کارهای متنوع، بهینهسازی سختافزار برای محاسبات 1 بیتی، و تشویق توسعهدهندگان به اتخاذ این الگوی جدید است. علاوه بر این، کاوش کوانتیزاسیون 1 بیتی برای کارهای بینایی کامپیوتری یا صوتی، یک مسیر هیجان انگیز آینده را نشان می دهد.
نتیجه گیری
راه اندازی BitNet.cpp توسط مایکروسافت یک پیشرفت قابل توجه است. BitNet.cpp با فعال کردن استنتاج 1 بیتی کارآمد در CPUهای استاندارد، دسترسی و پایداری هوش مصنوعی را ایجاد می کند. این چارچوب زمینه را برای LLM های قابل حمل و مقرون به صرفه تر فراهم می کند و آنچه را که با هوش مصنوعی روی دستگاه امکان پذیر است، پیش می برد.