کتابخانه‌ی استاندارد · هوش مصنوعی

جی‌جی‌یو‌اف ai.gguf

خواندن پرونده‌های مدل GGUF، قالب llama.cpp.

واردسازی هوش مصنوعی.جی‌جی‌یو‌اف

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

GGUF قالب پرونده‌ی llama.cpp برای مدل‌های زبانی بزرگ است. یک پرونده هم فراداده را نگه می‌دارد (معماری، اندازه‌ها، واژگان توکنایزر و قالب گفتگو) و هم همه‌ی وزن‌ها را که معمولا به ۸ یا ۴ بیت کوانتیزه شده‌اند. این بسته چنین پرونده‌ای را می‌خواند: بارگذاری جی‌جی‌یو‌اف سرآیند و فهرست تانسورها را تجزیه می‌کند، فراداده صحیح و فراداده رشته فراداده را می‌خوانند و بارگذاری تانسور اعشاری هر وقت لازم شد یک وزن را به تانسور اعشاری ۳۲ بیتی تبدیل می‌کند.

این بسته خواننده‌ی پرونده است، نه موتور استنتاج. برای تولید متن با یک مدل از llm استفاده کنید که روی همین بسته ساخته شده است. مدل‌هایی که از PyTorch به ONNX صادر شده‌اند از راه onnx اجرا می‌شوند.

محدودیت‌هایی که پیش از دانلود مدل باید بدانید

  • بارگذاری جی‌جی‌یو‌اف اول کل پرونده را در حافظه می‌خواند و هر بافر حداکثر ۲ گیگابایت جا دارد. پرونده‌های کوچک‌تر از ۲ گیگابایت انتخاب کنید: TinyLlama 1.1B، Qwen 0.5B یا 1.5B و دیگر مدل‌های کوچک.
  • فقط پنج گونه‌ی وزن خوانده می‌شود: F32، F16، Q8_0، Q4_0 و Q4_1. کوانتیزه‌های K که بیشتر دانلودها از آن‌ها استفاده می‌کنند، مثل Q4_K_M یا Q5_K_S، و BF16 پشتیبانی نمی‌شوند: بایت‌های تانسور برایشان -1 برمی‌گرداند و بارگذاری تانسور اعشاری خطای gguf.tensor_type می‌دهد. پرونده‌ی Q8_0 یا Q4_0 مدل را دانلود کنید.
  • ابعاد به ترتیب llama.cpp ذخیره می‌شوند، سریع‌ترین بعد اول. بارگذاری تانسور اعشاری ترتیب را وارونه می‌کند، پس وزنی که با ابعاد 4096 x 32000 فهرست شده، تانسوری با ۳۲۰۰۰ سطر ۴۰۹۶تایی می‌شود.
  • تجزیه جی‌جی‌یو‌اف مالک بافری می‌شود که به آن می‌دهید و آزادسازی مدل آن را آزاد می‌کند. اگر خطا بدهد، بافر همچنان مال شماست.

نمونه‌ها پرونده‌های کوچکی در حافظه می‌سازند تا بی دانلود اجرا شوند.

درون یک فایل مدل چیست

هر چه llama.cpp باید درباره‌ی یک مدل بداند در فراداده است، زیر کلیدهایی که با نام معماری شروع می‌شوند: llama.block_count شمار لایه‌هاست و llama.context_length بلندترین ورودی‌ای که مدل برایش آموزش دیده. اول general.architecture را بخوانید و کلیدهای دیگر را از روی آن بسازید تا همین ابزار برای فایل‌های Qwen و Gemma و Phi هم کار کند. فراداده صحیح و فراداده رشته برای کلیدی که نیست مقدار پیش‌فرض یا رشته‌ی خالی برمی‌گردانند، پس کلیدی که فایلی ندارد هیچ‌وقت برنامه را متوقف نمی‌کند.

یک مدل کوچک کوانتیزه دانلود کنید، مثلا فایل Q4_0 یا Q8_0 از TinyLlama یا Qwen در Hugging Face، و اجرا کنید:

salam build gguf-guide-inspect.salam
./gguf-guide-inspect tinyllama-1.1b-chat.Q8_0.gguf
gguf-guide-inspect.salam
واردسازی هوش مصنوعی.جی‌جی‌یو‌اف
واردسازی سیستم عامل
واردسازی رشته

تابع ریشه:
    آرگ ها := سیستم عامل.آرگومان ها()
    اگر آرگ ها.طول() < ۲:
        سرچاپ "روش کاربرد: gguf-guide-inspect model.gguf"
        برگشت ۱
    پایان
    ناپایا مدل := جی‌جی‌یو‌اف.جی‌جی‌یو‌اف {}
    تلاش:
        مدل = جی‌جی‌یو‌اف.بارگذاری جی‌جی‌یو‌اف(آرگ ها.بگیر(۱))
    گرفتن خطا خ:
        سرچاپ "مدل GGUF نیست:"، خ.به رشته()
        برگشت ۱
    پایان
    معماری := مدل.فراداده رشته("general.architecture")
    سرچاپ "نام"، مدل.فراداده رشته("general.name")
    سرچاپ "معماری"، معماری
    سرچاپ "لایه‌ها"، مدل.فراداده صحیح(معماری + ".block_count"، ۰)
    سرچاپ "بافت"، مدل.فراداده صحیح(معماری + ".context_length"، ۰)
    سرچاپ "جاسازی"، مدل.فراداده صحیح(معماری + ".embedding_length"، ۰)
    واژگان := مدل.نمایه فراداده("tokenizer.ggml.tokens")
    اگر واژگان >= ۰:
        سرچاپ "واژگان"، مدل.مقدارها.بگیر(واژگان).آرایه رشته.طول()
    پایان
    ناپایا وزن ها := ۰ برگردان صحیح۶۴
    ناپایا بایت ها := ۰ برگردان صحیح۶۴
    ناپایا نوع ها := نگاشت {} برگردان نگاشت<صحیح، صحیح>
    تکرار مدل.تانسورها.طول() در ی:
        اطلاعات := مدل.تانسورها.بگیر(ی)
        وزن ها += اطلاعات.شمار() برگردان صحیح۶۴
        بایت ها += جی‌جی‌یو‌اف.بایت‌های تانسور(مدل، ی) برگردان صحیح۶۴
        اگر نوع ها.دارد(اطلاعات.نوع وزن):
            نوع ها.درج(اطلاعات.نوع وزن، نوع ها.بگیر(اطلاعات.نوع وزن) + ۱)
        وگرنه:
            نوع ها.درج(اطلاعات.نوع وزن، ۱)
        پایان
    پایان
    سرچاپ مدل.تانسورها.طول()، "تانسور،"، وزن ها / ۱۰۰۰۰۰۰، "میلیون وزن،"، بایت ها / ۱۰۴۸۵۷۶، "مبی‌بایت"
    سرچاپ "تانسورهای Q8_0:"، نوع ها.دارد(جی‌جی‌یو‌اف.نوع کوانتیزه هشت صفر)، "Q4_0:"، نوع ها.دارد(جی‌جی‌یو‌اف.نوع کوانتیزه چهار صفر)، "F16:"، نوع ها.دارد(جی‌جی‌یو‌اف.نوع اعشاری شانزده)
    سرچاپ "قالب گفتگو دارد:"، رشته.شامل است(مدل.فراداده رشته("tokenizer.chat_template")، "{%")
    مدل.آزادسازی()
پایان

این‌جا هیچ وزنی تبدیل نمی‌شود، ولی بارگذاری جی‌جی‌یو‌اف باز هم کل پرونده را در حافظه می‌خواند، پس فقط باز کردن یک مدل ۱ گیگابایتی ۱ گیگابایت حافظه می‌گیرد. واژگان آرایه‌ای از رشته‌ها در tokenizer.ggml.tokens است و tokenizer.chat_template قالب Jinja را نگه می‌دارد که گفتگو را به قالب ورودی مدل تبدیل می‌کند.

هر وزن چقدر جا می‌گیرد

کوانتیزه‌سازی وزن‌ها را با بیت‌های کمتری نگه می‌دارد. Q8_0 بلوک‌های ۳۲ وزنی را به شکل عدد صحیح ۸ بیتی و یک مقیاس ۱۶ بیتی نگه می‌دارد، یعنی ۳۴ بایت برای هر بلوک یا ۸.۵ بیت برای هر وزن؛ Q4_0 همان بلوک را در ۱۸ بایت جا می‌دهد، ۴.۵ بیت برای هر وزن. بایت‌های تانسور اندازه‌ی ذخیره شده‌ی هر تانسور را می‌دهد. برنامه‌ی زیر پرونده‌ای با یک تانسور ۶۴ وزنی از هر گونه‌ی خواندنی می‌نویسد، جز Q4_1 که کنار مقیاس یک کمینه هم نگه می‌دارد و برای هر بلوک ۲۰ بایت می‌گیرد.

gguf-guide-sizes.salam
واردسازی هوش مصنوعی.جی‌جی‌یو‌اف
واردسازی فشرده سازی
واردسازی کدگذاری.دودویی
واردسازی تبدیل

تابع نام(ب &: فشرده سازی.بافر بایت، متن: رشته):
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، متن.طول() برگردان صحیح۶۴)
    فشرده سازی.افزودن بایت‌ها(ب، متن برگردان تهی*، متن.طول())
پایان

تابع سرآیند تانسور(ب &: فشرده سازی.بافر بایت، برچسب: رشته، نوع: صحیح، جابجایی: صحیح):
    نام(ب، برچسب)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۱)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۶۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، نوع)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، جابجایی برگردان صحیح۶۴)
پایان

تابع ریشه خطادار:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    فشرده سازی.افزودن بایت‌ها(ب، "GGUF" برگردان تهی*، ۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۳)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۴)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۰)
    سرآیند تانسور(ب، "full"، جی‌جی‌یو‌اف.نوع اعشاری سی‌ودو، ۰)
    سرآیند تانسور(ب، "half"، جی‌جی‌یو‌اف.نوع اعشاری شانزده، ۲۵۶)
    سرآیند تانسور(ب، "q8"، جی‌جی‌یو‌اف.نوع کوانتیزه هشت صفر، ۳۸۴)
    سرآیند تانسور(ب، "q4"، جی‌جی‌یو‌اف.نوع کوانتیزه چهار صفر، ۴۸۰)
    تا فشرده سازی.طول بافر(ب) % ۳۲ != ۰:
        دودویی.نوشتن طبیعی۸(ب، ۰)
    پایان
    تکرار ۵۴۴:
        دودویی.نوشتن طبیعی۸(ب، ۰)
    پایان
    ناپایا مدل := تلاش جی‌جی‌یو‌اف.تجزیه جی‌جی‌یو‌اف(ب)
    سرچاپ "خوانده شد:"، مدل.تانسورها.طول()، "تانسور"
    تکرار مدل.تانسورها.طول() در ی:
        اطلاعات := مدل.تانسورها.بگیر(ی)
        بایت ها := جی‌جی‌یو‌اف.بایت‌های تانسور(مدل، ی)
        بیت ها := (بایت ها * ۸) برگردان اعشار۶۴ / (اطلاعات.شمار() برگردان اعشار۶۴)
        سرچاپ اطلاعات.نام، اطلاعات.شمار()، "وزن در"، بایت ها، "بایت،"، تبدیل.قالب اعشار با دقت(بیت ها، ۱)، "بیت برای هر وزن"
    پایان
    مدل.آزادسازی()
پایان
خروجیخوانده شد: 4 تانسور full 64 وزن در 256 بایت، 32.0 بیت برای هر وزن half 64 وزن در 128 بایت، 16.0 بیت برای هر وزن q8 64 وزن در 68 بایت، 8.5 بیت برای هر وزن q4 64 وزن در 36 بایت، 4.5 بیت برای هر وزن

همین عددها حافظه‌ی لازم یک مدل را پیش‌بینی می‌کنند: مدلی با هفت میلیارد وزن در F32 حدود ۲۸ گیگابایت، در F16 حدود ۱۴، در Q8_0 حدود ۷.۴ و در Q4_0 حدود ۳.۹ گیگابایت جا می‌گیرد، جدا از حافظه‌ای که بافت لازم دارد. بارگذاری تانسور اعشاری هر کدام از این نوع‌ها را وقتی به مقدارها نیاز دارید دوباره به اعشاری ۳۲ بیتی باز می‌کند. این اندازه‌ها مربوط به پرونده‌اند؛ این بسته کل پرونده را در حافظه لازم دارد و برای هر تانسوری که بار می‌کنید چهار بایت به ازای هر وزن هم روی آن.

خواندن یک وزن

نمایه تانسور تانسوری را با نامش پیدا می‌کند و بارگذاری تانسور اعشاری بازش می‌کند. برنامه یک جدول جاسازی نشانه با گونه‌ی Q8_0 برای دو نشانه، هر کدام ۳۲ مقدار، می‌نویسد: هر بلوک یک مقیاس ۱۶ بیتی (این‌جا حدود ۰٫۱) و پس از آن ۳۲ بایت علامت‌دار است و هر وزن برابر مقیاس ضرب در بایت خودش است. سطر ۱ جدول، جاسازی نشانه‌ی ۱ است.

gguf-guide-weights.salam
واردسازی هوش مصنوعی.جی‌جی‌یو‌اف
واردسازی فشرده سازی
واردسازی کدگذاری.دودویی
واردسازی تبدیل

تابع نوشتن نام(ب &: فشرده سازی.بافر بایت، متن: رشته):
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، متن.طول() برگردان صحیح۶۴)
    فشرده سازی.افزودن بایت‌ها(ب، متن برگردان تهی*، متن.طول())
پایان

تابع ریشه خطادار:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    فشرده سازی.افزودن بایت‌ها(ب، "GGUF" برگردان تهی*، ۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۳)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۱)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۰)
    نوشتن نام(ب، "token_embd.weight")
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۲)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۳۲)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۲)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، جی‌جی‌یو‌اف.نوع کوانتیزه هشت صفر)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۰)
    تا فشرده سازی.طول بافر(ب) % ۳۲ != ۰:
        دودویی.نوشتن طبیعی۸(ب، ۰)
    پایان
    تکرار ۲ در سطر:
        دودویی.نوشتن طبیعی۱۶ کوچک‌انتها(ب، 0x2E66)
        تکرار ۳۲ در ستون:
            عدد := (سطر * ۳۲ + ستون) * ۳ - ۶۰
            دودویی.نوشتن طبیعی۸(ب، عدد & ۲۵۵)
        پایان
    پایان
    ناپایا مدل := تلاش جی‌جی‌یو‌اف.تجزیه جی‌جی‌یو‌اف(ب)
    نمایه := مدل.نمایه تانسور("token_embd.weight")
    اطلاعات := مدل.تانسورها.بگیر(نمایه)
    سرچاپ اطلاعات.نام، "ابعاد"، اطلاعات.ابعاد.بگیر(۰)، "x"، اطلاعات.ابعاد.بگیر(۱)، "در"، جی‌جی‌یو‌اف.بایت‌های تانسور(مدل، نمایه)، "بایت"
    ناپایا وزن‌ها := تلاش جی‌جی‌یو‌اف.بارگذاری تانسور اعشاری(مدل، نمایه)
    سرچاپ "بار شد: شکل"، وزن‌ها.شکل.بگیر(۰)، "x"، وزن‌ها.شکل.بگیر(۱)
    ناپایا آغاز := ""
    تکرار ۴ در ستون:
        آغاز = آغاز + " " + تبدیل.قالب اعشار با دقت(وزن‌ها.در دو(۱، ستون)، ۳)
    پایان
    سرچاپ "جاسازی نشانه‌ی ۱ با این‌ها شروع می‌شود:" + آغاز
    وزن‌ها.آزادسازی()
    مدل.آزادسازی()
پایان
خروجیtoken_embd.weight ابعاد 32 x 2 در 68 بایت بار شد: شکل 2 x 32 جاسازی نشانه‌ی ۱ با این‌ها شروع می‌شود: 3.599 3.899 4.199 4.499

پرونده ابعاد را 32 x 2 فهرست می‌کند، سریع‌ترین اول، و تانسور بارشده شکل 2 x 32 دارد، یک سطر برای هر نشانه، پس در دو(نشانه، ستون) یک مقدار را می‌خواند. مقدارها به جای ۳٫۶ به شکل ۳٫۵۹۹ درمی‌آیند، چون خود مقیاس هم اعشاری ۱۶ بیتی ذخیره شده است: خطای کوانتیزه‌سازی بخشی از این قالب است. جدول یک مدل واقعی برای هر واژه‌ی واژگان یک سطر دارد؛ متن نشانه را در آرایه‌ی tokenizer.ggml.tokens پیدا کنید تا سطرش را بیابید.

فایل خراب و کلیدهای ناموجود

تجزیه جی‌جی‌یو‌اف، بارگذاری جی‌جی‌یو‌اف و بارگذاری تانسور اعشاری خطاداراند. پرونده‌ای که GGUF نیست gguf.bad_magic است، پرونده‌ای که در سرآیند بریده شده اتمام ناگهانی با جایگاه بایت (و اگر درون یک کلید فراداده یا تانسور بوده، نام آن در مسیر)، و داده‌ی تانسوری که از پایان پرونده بگذرد gguf.truncated. مدلی که هیچ چیزی ندارد هم معتبر است؛ جستجوی کلید یا تانسوری که ندارد رشته‌ی خالی، پیش‌فرض شما یا برای نمایه -1 برمی‌گرداند. پیش از به کار بردن نمایه با values یا tensors آن را بسنجید.

gguf-guide-errors.salam
واردسازی هوش مصنوعی.جی‌جی‌یو‌اف
واردسازی فشرده سازی
واردسازی کدگذاری.دودویی

تابع ریشه خطادار:
    ناپایا آشغال := فشرده سازی.بافر بایت جدید()
    متن := "PK this is a zip archive, not a model file"
    فشرده سازی.افزودن بایت‌ها(آشغال، متن برگردان تهی*، متن.طول())
    تلاش:
        جی‌جی‌یو‌اف.تجزیه جی‌جی‌یو‌اف(آشغال)
    گرفتن خطا خ:
        سرچاپ "فایل zip:"، خ.نام نوع()، "|"، خ.به رشته()، "|"، خ.کد
    پایان
    فشرده سازی.آزادسازی بافر(آشغال)

    ناپایا بریده := فشرده سازی.بافر بایت جدید()
    فشرده سازی.افزودن بایت‌ها(بریده، "GGUF" برگردان تهی*، ۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(بریده، ۳)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(بریده، ۱)
    تلاش:
        جی‌جی‌یو‌اف.تجزیه جی‌جی‌یو‌اف(بریده)
    گرفتن خطا خ:
        سرچاپ "بریده:"، خ.به رشته()
    پایان
    فشرده سازی.آزادسازی بافر(بریده)

    ناپایا خالی := فشرده سازی.بافر بایت جدید()
    فشرده سازی.افزودن بایت‌ها(خالی، "GGUF" برگردان تهی*، ۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(خالی، ۳)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(خالی، ۰)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(خالی، ۰)
    ناپایا مدل := تلاش جی‌جی‌یو‌اف.تجزیه جی‌جی‌یو‌اف(خالی)
    سرچاپ "مدل خالی:"، مدل.نسخه، مدل.کلیدها.طول()، مدل.تانسورها.طول()
    سرچاپ "معماری: [" + مدل.فراداده رشته("general.architecture") + "]"
    سرچاپ "طول بافت:"، مدل.فراداده صحیح("llama.context_length"، ۲۰۴۸)
    سرچاپ "نمایه تانسور:"، مدل.نمایه تانسور("token_embd.weight")، "نمایه فراداده:"، مدل.نمایه فراداده("tokenizer.tokens")
    مدل.آزادسازی()
پایان
خروجیفایل zip: syntax error | gguf: not a GGUF file (bad magic bytes) (offset 0) | gguf.bad_magic بریده: gguf: unexpected end of data: needed 8 bytes, 0 left (offset 16) مدل خالی: 3 0 0 معماری: [] طول بافت: 2048 نمایه تانسور: -1 نمایه فراداده: -1

تجزیه جی‌جی‌یو‌اف مالک بافری می‌شود که به آن می‌دهید و آزادسازی مدل آن را آزاد می‌کند. آزادسازی بافر را هم رویش صدا نزنید: آزاد کردن دوباره برنامه را از کار می‌اندازد. وقتی تجزیه جی‌جی‌یو‌اف خطا می‌دهد، آزاد کردن بافر با خود شماست، همان کاری که برنامه با آشغال می‌کند.

گونه‌ها

مقدار فراداده MetaValue

ساختار مقدار فراداده
یک مقدار فراداده.
نامانگلیسیگونهتوضیح
گونهkindصحیح = 0گونه.
نوع عنصرelem_kindصحیح = 0گونه‌ی عنصرها، برای آرایه.
مقدار صحیحiصحیح۶۴ = 0مقدار صحیح.
مقدار اعشاریfاعشار۶۴ = 0مقدار اعشاری.
مقدار رشتهsرشته = ""رشته.
آرایه صحیحintsوکتور<صحیح۶۴>آرایه‌ی صحیح.
آرایه اعشاریfloatsوکتور<اعشار۶۴>آرایه‌ی اعشاری.
آرایه رشتهstrsوکتور<رشته>آرایه‌ی رشته، مثل واژگان توکنایزر.
ai-gguf-Read.salam
واردسازی هوش مصنوعی.جی‌جی‌یو‌اف
واردسازی فشرده سازی
واردسازی کدگذاری.دودویی
واردسازی بایگانی
واردسازی سیستم عامل

تابع رشته(ب &: فشرده سازی.بافر بایت، متن: رشته):
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، متن.طول() برگردان صحیح۶۴)
    فشرده سازی.افزودن بایت‌ها(ب، متن برگردان تهی*، متن.طول())
پایان

تابع ساختن(ب &: فشرده سازی.بافر بایت):
    فشرده سازی.افزودن بایت‌ها(ب، "GGUF" برگردان تهی*، ۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۳)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۱)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۳)
    رشته(ب، "general.architecture")
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، جی‌جی‌یو‌اف.فراداده رشته)
    رشته(ب، "llama")
    رشته(ب، "llama.context_length")
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۴)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۲۰۴۸)
    رشته(ب، "tokenizer.tokens")
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، جی‌جی‌یو‌اف.فراداده آرایه)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، جی‌جی‌یو‌اف.فراداده رشته)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۲)
    رشته(ب، "<s>")
    رشته(ب، "سلام")
    رشته(ب، "w")
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، ۲)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۳)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۲)
    دودویی.نوشتن طبیعی۳۲ کوچک‌انتها(ب، جی‌جی‌یو‌اف.نوع اعشاری سی‌ودو)
    دودویی.نوشتن طبیعی۶۴ کوچک‌انتها(ب، ۰)
    تا فشرده سازی.طول بافر(ب) % ۳۲ != ۰:
        دودویی.نوشتن طبیعی۸(ب، ۰)
    پایان
    تکرار ۶ در ک:
        دودویی.نوشتن اعشار۳۲(ب، (ک برگردان اعشار۶۴) * ۰.۵، نادرست)
    پایان
پایان

تابع ریشه خطادار:
    ناپایا بافر := فشرده سازی.بافر بایت جدید()
    ساختن(بافر)
    مسیر := سیستم عامل.پوشه موقت() + "/salam_tiny.gguf"
    _ := بایگانی.نوشتن پرونده دودویی از بافر(مسیر، بافر)
    ناپایا حافظه‌ای := تلاش جی‌جی‌یو‌اف.تجزیه جی‌جی‌یو‌اف(بافر)
    سرچاپ حافظه‌ای.تانسورها.طول()
    حافظه‌ای.آزادسازی()

    ناپایا گ := تلاش جی‌جی‌یو‌اف.بارگذاری جی‌جی‌یو‌اف(مسیر)
    سرچاپ گ.نسخه، گ.کلیدها.طول()، گ.تانسورها.طول()، گ.هم‌ترازی، گ.آغاز داده
    سرچاپ گ.فراداده رشته("general.architecture")، گ.فراداده صحیح("llama.context_length"، ۰)، گ.فراداده صحیح("llama.block_count"، ۳۲)
    توکن‌ها := گ.مقدارها.دریافت(گ.نمایه فراداده("tokenizer.tokens"))
    سرچاپ توکن‌ها.گونه == جی‌جی‌یو‌اف.فراداده آرایه، توکن‌ها.نوع عنصر == جی‌جی‌یو‌اف.فراداده رشته، توکن‌ها.آرایه رشته.دریافت(۱)
    ش := گ.نمایه تانسور("w")
    اطلاعات := گ.تانسورها.دریافت(ش)
    سرچاپ اطلاعات.نام، اطلاعات.ابعاد.طول()، اطلاعات.شمار()، اطلاعات.نوع وزن، اطلاعات.جابجایی، جی‌جی‌یو‌اف.بایت‌های تانسور(گ، ش)
    ناپایا ت := تلاش جی‌جی‌یو‌اف.بارگذاری تانسور اعشاری(گ، ش)
    سرچاپ ت.عنصر(۰)، ت.عنصر(۵)
    تلاش:
        جی‌جی‌یو‌اف.بارگذاری تانسور اعشاری(گ، ۷)
    گرفتن خطا خ:
        سرچاپ خ.کد
    پایان
    ت.آزادسازی()
    سرچاپ جی‌جی‌یو‌اف.نوع اعشاری شانزده، جی‌جی‌یو‌اف.نوع کوانتیزه چهار صفر، جی‌جی‌یو‌اف.نوع کوانتیزه چهار یک، جی‌جی‌یو‌اف.نوع کوانتیزه هشت صفر
    گ.آزادسازی()
پایان
خروجی1 3 3 1 32 224 llama 2048 32 true true سلام w 2 6 0 0 24 0 2.5 gguf.index 1 2 3 8

آزادسازی free

تابع آزادسازی()
مقدار را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

اطلاعات تانسور TensorInfo

ساختار اطلاعات تانسور
اطلاعات یک تانسور در پرونده.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام، مثل blk.0.attn_q.weight.
ابعادdimsوکتور<صحیح>ابعاد.
نوع وزنggml_typeصحیح = 0گونه‌ی وزن، یکی از ثابت‌های بالا.
جابجاییoffsetصحیح۶۴ = 0جای داده نسبت به آغاز بخش داده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

شمار count

تابع شمار(): صحیح
شمار عنصرها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

آزادسازی free

تابع آزادسازی()
آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

جی‌جی‌یو‌اف Gguf

ساختار جی‌جی‌یو‌اف
پرونده‌ی GGUF خوانده‌شده.
نامانگلیسیگونهتوضیح
نسخهversionصحیح = 0نسخه‌ی قالب.
کلیدهاkeysوکتور<رشته>کلیدهای فراداده.
مقدارهاvaluesوکتور<مقدار فراداده>مقدارها، هم‌ترتیب کلیدها.
تانسورهاtensorsوکتور<اطلاعات تانسور>تانسورها.
هم‌ترازیalignmentصحیح = 32هم‌ترازی داده.
آغاز دادهdata_offsetصحیح = 0آغاز بخش داده در پرونده.
بایت‌های خامrawفشرده سازی.بافر بایتبایت‌های کل پرونده که در حافظه نگه داشته می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

نمایه فراداده meta_index

تابع نمایه فراداده(key: رشته): صحیح
شماره‌ی کلید فراداده؛ اگر نباشد، ۱-.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

فراداده صحیح meta_int

تابع فراداده صحیح(key: رشته، dflt: صحیح۶۴): صحیح۶۴
فراداده‌ی صحیح، یا مقدار پیش‌فرض.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

فراداده رشته meta_str

تابع فراداده رشته(key: رشته): رشته
فراداده‌ی رشته.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

نمایه تانسور tensor_index

تابع نمایه تانسور(name: رشته): صحیح
شماره‌ی تانسور با نام.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

آزادسازی free

تابع آزادسازی()
همه را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

پایاها و متغیرها

نوع اعشاری سی‌ودو GGML_F32

پایا نوع اعشاری سی‌ودو: صحیح۳۲ = 0
گونه‌ی وزن: اعشاری ۳۲ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

نوع اعشاری شانزده GGML_F16

پایا نوع اعشاری شانزده: صحیح۳۲ = 1
گونه‌ی وزن: اعشاری ۱۶ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

نوع کوانتیزه چهار صفر GGML_Q4_0

پایا نوع کوانتیزه چهار صفر: صحیح۳۲ = 2
گونه‌ی وزن: کوانتیزه‌ی ۴ بیتی با مقیاس.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

نوع کوانتیزه چهار یک GGML_Q4_1

پایا نوع کوانتیزه چهار یک: صحیح۳۲ = 3
گونه‌ی وزن: کوانتیزه‌ی ۴ بیتی با مقیاس و کمینه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

نوع کوانتیزه هشت صفر GGML_Q8_0

پایا نوع کوانتیزه هشت صفر: صحیح۳۲ = 8
گونه‌ی وزن: کوانتیزه‌ی ۸ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

فراداده رشته META_STRING

پایا فراداده رشته: صحیح۳۲ = 8
گونه‌ی فراداده: رشته.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

فراداده آرایه META_ARRAY

پایا فراداده آرایه: صحیح۳۲ = 9
گونه‌ی فراداده: آرایه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

تابع‌ها

بایت‌های تانسور TensorBytes

تابع بایت‌های تانسور(g &: جی‌جی‌یو‌اف، index: صحیح): صحیح
اندازه‌ی داده‌ی تانسور بر حسب بایت؛ برای گونه‌ای از وزن که این بسته نمی‌خواند، مثل کوانتیزه‌های K، مقدار -1.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

بارگذاری تانسور اعشاری LoadTensorF32

تابع بارگذاری تانسور اعشاری(g &: جی‌جی‌یو‌اف، index: صحیح): Throws<تانسور.تانسور>
تانسور را به اعشاری ۳۲ بیتی تبدیل می‌کند و F16، Q8_0، Q4_0 و Q4_1 را باز می‌کند؛ ابعاد وارونه می‌شوند تا آخرین بعد ذخیره‌شده اولی شود. برای نمایه‌ی نادرست خارج از بازه، برای هر گونه‌ی دیگر پشتیبانی نشده و برای داده‌ای که از پایان پرونده بگذرد اتمام ناگهانی می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

تجزیه جی‌جی‌یو‌اف ParseGguf

تابع تجزیه جی‌جی‌یو‌اف(buf: فشرده سازی.بافر بایت): Throws<جی‌جی‌یو‌اف>
پرونده را از بافر می‌خواند؛ بافر از آن پس متعلق به نتیجه است. برای پرونده‌ای که GGUF نیست، نسخه‌ی پشتیبانی‌نشده یا سرآیند بریده خطا می‌دهد؛ آن‌گاه بافر مال صدازننده می‌ماند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam

بارگذاری جی‌جی‌یو‌اف LoadGguf

تابع بارگذاری جی‌جی‌یو‌اف(path: رشته): Throws<جی‌جی‌یو‌اف>
پرونده‌ی .gguf را می‌خواند. کل پرونده در حافظه بار می‌شود، پس باید کوچک‌تر از ۲ گیگابایت باشد. اگر باز نشود یافت نشد و در غیر این صورت خطاهای تجزیه جی‌جی‌یو‌اف را می‌دهد، با نام پرونده در مسیر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-gguf-Read.salam