Llama.cpp

**llama.cpp** یک نرم‌افزار متن‌باز و یک کتابخانه نرم‌افزاری است که استنتاج را بر روی انواع مختلف مدل‌های زبانی بزرگ مانند لاما انجام می‌دهد. این پروژه به‌صورت مشترک و هم‌زمان با پروژه GGML، که یک کتابخانه تنسور همه‌منظوره است، توسعه داده می‌شود.

ابزارهای خط فرمان همراه با این کتابخانه ارائه شده‌اند، و همچنین یک سرور وب با یک رابط کاربری وب ساده نیز در اختیار قرار می‌گیرد.

## پیشینه
در اواخر سپتامبر ۲۰۲۲، گئورگی گِرگانوف کار بر روی کتابخانه GGML را آغاز کرد. این کتابخانه، به زبان C نوشته شده بود و جبر تنسوری را پیاده‌سازی می‌کند. گِرگانوف این کتابخانه را با هدف مدیریت سخت‌گیرانه حافظه و پشتیبانی از چندریسمانی توسعه داد. ایجاد GGML از کارهای فابریس بلارد بر روی LibNC الهام گرفته بود.

پیش از llama.cpp، گِرگانوف بر روی کتابخانه‌ای مشابه با نام whisper.cpp کار می‌کرد که ویسپر، یعنی یک مدل تبدیل گفتار به متن ساخته اوپن‌ای‌آی را پیاده‌سازی می‌کرد.

## توسعه
توسعه llama.cpp در مارس ۲۰۲۳ ابتدا توسط گئورگی گِرگانوف به عنوان پیاده‌سازی کد استنتاج لاما در زبان C/C++ خالص و بدون وابستگی آغاز شد. این رویکرد عملکرد اسنتنتاج را در رایانه‌هایی که فاقد جی‌پی‌یو یا سخت‌افزارهای تخصصی دیگر بودند، بهبود داد. این رویکرد هدف اصلی پروژه بود. llama.cpp در میان کاربرانی که سخت‌افزار تخصصی نداشتند، از جمله بر روی دستگاه‌های اندرویدی محبوبیت یافت، زیرا می‌توانست تنها بر روی سی‌پی‌یو اجرا شود. . در حالی که این پروژه در ابتدا برای سی‌پی‌یو طراحی شده بود، پشتیبانی از استنتاج بر روی جی‌پی‌یو نیز بعدها افزوده شد. تا اوت ۲۰۲۵، این مخزن در گیت‌هاب بیش از ۸۵٬۰۰۰ ستاره دریافت کرده است.

در ۱۰ آوریل ۲۰۲۵، کتابخانه libmtmd معرفی شد که پشتیبانی از مدل‌های چندوجهی را که پیش‌تر در وضعیت ایستایی قرار داشت، دوباره فعال و تقویت کرد.

## معماری
llama.cpp از سخت‌افزارهای مختلف پشتیبانی می‌کند، از جمله x86، ARM، Metal، BLAS، BLIS، SYCL، MUSA، CUDA، HIP، CANN، OpenCL، RPC و Vulkan (نسخه ۱٫۲ یا بالاتر). این پشتیبانی‌ها در سخت‌افزارها (بک‌اند) ستون اصلی اجرای کتابخانه تنسور GGML را تشکیل می‌دهند که توسط کدهای فرانت‌اند و مدل‌محور llama.cpp به کار گرفته می‌شود. llama.cpp برای بهینه‌سازی از چندین افزونه پردازنده مرکزی استفاده می‌کند: AVX، AVX2 و AVX-512 برای X86-64، و نئون روی آرم. اپل سیلیکون یکی از اهداف مهم این پروژه به شمار می‌آید زیرا در معماری جدید پردازنده‌هایش از آرم استفاده می‌کند.

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

* کوانتش مدل پیش از اجرا و کوانتش لحظه‌ای
* رمزگشایی حدسی****
* تخلیه جزئی لایه‌های مدل به رم سیستم، که امکان بارگذاری مدل‌هایی را فراهم می‌کند که برای جای‌گیری کامل در جی‌پی‌یو و وی‌رم بیش از حد بزرگ هستند.

افزون بر این، llama.cpp از مجموعه‌ای از قابلیت‌ها و API‌ها برای برقراری ارتباط در بخش فرانت‌اند پشتیبانی می‌کند، از جمله:

* نقطه‌های پایانی سازگار با قالب‌بندی اوپن‌ای‌آی (مانند `v1/chat/completions`).
* قالب‌بندی خروجی مبتنی بر گرامر در قالب جی‌سان.

## قالب پرونده GGUF

قالب پرونده GGUF (مخفف GGML Universal File) یک قالب دودویی است که هم تنسورها و هم فراداده‌ها را در یک پرونده ذخیره می‌کند و برای ذخیره‌سازی و بارگذاری سریع داده‌های مدل طراحی شده است. این قالب در اوت ۲۰۲۳ توسط پروژه llama.cpp معرفی شد تا با افزودن پشتیبانی از معماری‌های مدل دیگر، سازگاری با نسخه‌های پیشین بهتر حفظ شود.

GGUF جایگزین قالب‌های پیشین مانند GGML شد که قبلاً توسط پروژه به کار می‌رفتند.

پرونده‌های GGUF معمولاً با تبدیل مدل‌هایی ایجاد می‌شوند که با کتابخانه‌های یادگیری ماشین دیگری مانند پای‌تورچ توسعه یافته‌اند.

### طراحی
GGUF بر کوانتش تمرکز دارد؛ فرایندی که در آن دقت وزن‌های مدل کاهش می‌یابد. این کار می‌تواند موجب کاهش مصرف حافظه و افزایش سرعت شود، هرچند که به بهای کاهش دقت مدل تمام می‌شود.

GGUF از انواع داده صحیح کوانتیده‌شده ۲ تا ۸ بیتی پشتیبانی می‌کند، و همچنین از قالب‌های متداول داده ممیز شناور مانند float32، float16 و bfloat16 پشتیبانی می‌کند؛ علاوه بر این، کوانتش ۱٫۵۸ بیتی نیز در آن وجود دارد. 

GGUF شامل اطلاعاتی است که برای اجرای یک مدل زبانی مشابه GPT ضروری است؛ مانند واژگان توکنایزر، طول زمینه (context length)، اطلاعات تنسورها و دیگر ویژگی‌ها. 

### ساختار سطح بایت (اندیانِ کوچک)

#### بلوک فراداده

```php
// example metadata
general.architecture:  'llama',
general.name:          'LLaMA v2',
llama.context_length:  4096,
... ,
general.file_type:     10, // (typically indicates quantization level, here "MOSTLY_Q2_K")
tokenizer.ggml.model: 'llama',
tokenizer.ggml.tokens: [
   '<unk>', '
', '
', '<0x00>', '<0x01>', '<0x02>',
   '<0x03>', '<0x04>', '<0x05>', '<0x06>', '<0x07>', '<0x08>',
   ...
],
...
```


#### بلوک اطلاعات تنسورها

```c
// n-th tensor
name:         GGUF string, // ex: "blk.0.ffn_gate.weight"
n_dimensions: UINT32,      // ex: 2
dimensions:   UINT64[],    // ex: [ 4096, 32000 ]
type:         UINT32,      // ex: 10 (typically indicates quantization level, here "GGML_TYPE_Q2_K")
offset:       UINT64       // starting position within the tensor_data block, relative to the start of the block
// (n+1)-th tensor
...
```

## یادداشت‌ها


## مراجع

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