Local AI

تسلط بر کوانتیزاسیون سفارشی: ساخت پایپ‌لاین GGUF با llama.cpp برای مدل‌های زبانی بزرگ (LLM) حوزه‌محور

مدل‌های زبانی بزرگ (LLM) توسعه نرم‌افزار را متحول کرده‌اند، اما استقرار آن‌ها به صورت محلی اغلب با محدودیت‌های حافظه مواجه می‌شود. در حالی که مدل‌هایی مانند Llama 3 یا Mistral قابلیت‌های چشمگیری ارائه می‌دهند، نمایش‌های استاندارد ۱۶-بیتی (FP16) آن‌ها اغلب برای سخت‌افزارهای مصرفی سنگین هستند. اینجاست که کوانتیزاسیون اهمیت حیاتی پیدا می‌کند. با کاهش دقت، می‌توانیم مدل‌های بزرگ‌تر و قدرتمندتر را روی کارت‌های گرافیک NVIDIA RTX 3090 یا حتی مک‌بوک‌ها جا دهیم. با این حال، کوانتیزاسیون عمومی اغلب ظرافت‌های حوزه‌محور را قربانی می‌کند. در این راهنما، ما یک پایپ‌لاین خودکار و مستحکم برای تبدیل مدل‌های Hugging Face به فایل‌های GGUF بهینه‌شده‌ای که برای داده‌های خاص سفارشی‌سازی شده‌اند، با استفاده از llama.cpp می‌سازیم.

چرا کوانتیزاسیون عمومی کافی نیست

بیشتر توسعه‌دهندگان به سادگی یک اسکریپت تبدیل از پیش ساخته شده را اجرا می‌کنند و امیدوارند که همه چیز درست پیش برود. اما هنگام آموزش یا تنظیم دقیق (Fine-tuning) روی حوزه‌های خاص—مانند قراردادهای حقوقی، تشخیص‌های پزشکی، یا وظایف برنامه‌نویسی تخصصی—توانایی مدل در حفظ زمینه‌های ظریف بسیار مهم است. طرح‌های کوانتیزاسیون استاندارد، مانند Q4_K_M، تعادل خوبی بین سرعت و کیفیت ارائه می‌دهند، اما کاهش دقت یکنواختی را در تمام وزن‌ها اعمال می‌کنند. برای کاربردهای حوزه‌محور، ما اغلب نیاز داریم که حفظ انواع خاصی از لایه‌ها را در اولویت قرار دهیم یا ضرایب مقیاس‌دهی سفارشی را پیاده‌سازی کنیم که ابزارهای عمومی ممکن است نادیده بگیرند. ساخت یک پایپ‌لاین سفارشی به ما اجازه می‌دهد تا توزیع وزن‌ها را بررسی کنیم و استراتژی‌های کوانتیزاسیون هدفمند را اعمال کنیم.

راه‌اندازی محیط تبدیل

قبل از نوشتن کد، به ابزارهای مناسب نیاز داریم. کارآمدترین روش برای تبدیل مدل‌ها به فرمت GGUF استفاده از اسکریپت‌های تبدیل رسمی ارائه شده توسط مخزن llama.cpp است. ابتدا مطمئن شوید که Python 3.8+ نصب شده است. مخزن را کلون کرده و وابستگی‌های مورد نیاز را نصب کنید.

# Clone the llama.cpp repository
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

# Install the conversion script requirements
pip install -r requirements.txt

# Ensure you have PyTorch and Transformers installed for loading the source model
pip install torch transformers accelerate

استفاده از کتابخانه transformers از Hugging Face برای بارگذاری مدل حوزه‌محور خود بسیار مهم است. اگر مدلی را روی یک مجموعه داده خاص تنظیم دقیق کرده‌اید، احتمالاً در Hugging Face Hub یا دایرکتوری محلی شما قرار دارد.

اسکریپت تبدیل

هسته اصلی پایپ‌لاین ما اسکریپت convert-hf-to-gguf.py است. با این حال، برای تبدیل این فرآیند به یک پایپ‌لاین "سفارشی"، ما این اسکریپت را در یک اسکریپت پایتون مستحکم‌تر که مدیریت لاگ‌ها، بررسی خطاها و پیکربندی‌های خاص مدل را انجام می‌دهد، می‌پیچیم. در زیر یک مثال عملی از نحوه فراخوانی تبدیل برای یک مدل Mistral-7B که روی متن پزشکی تنظیم دقیق شده است، آورده شده است.

import subprocess
import os

def convert_to_gguf(model_path, output_path, architecture="mistral", quantization="Q4_K_M"):
    """
    Converts a Hugging Face model to GGUF format using llama.cpp.
    
    Args:
        model_path (str): Path to the Hugging Face model directory or HF Hub ID.
        output_path (str): Destination file for the .gguf file.
        architecture (str): The architecture type (e.g., 'llama', 'mistral').
        quantization (str): Quantization scheme (e.g., 'Q4_K_M', 'Q5_K_M').
    """
    # Define the conversion script path
    script_dir = os.path.dirname(os.path.abspath(__file__))
    convert_script = os.path.join(script_dir, 'gguf-py', 'convert-hf-to-gguf.py')
    
    # Construct the command
    cmd = [
        "python", 
        convert_script, 
        model_path,
        "--outfile", output_path,
        "--outtype", quantization,  # Note: newer versions may use 'ftype' instead
        "--architecture", architecture
    ]
    
    print(f"Starting conversion for {model_path}...")
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print("Conversion successful!")
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print(f"Conversion failed: {e.stderr}")

# Example usage for a domain-specific medical model
model_id = "domain-ai/medical-mistral-7b-finetuned"
output_file = "./models/medical_mistral_q4_k_m.gguf"

convert_to_gguf(model_id, output_file, architecture="mistral", quantization="Q4_K_M")

پیشرفته: بهینه‌سازی پس از تبدیل

پس از تبدیل مدل، همیشه آماده استفاده در محیط عملیاتی نیست. برای مجموعه‌های داده حوزه‌محور، ما اغلب نیاز داریم توکنایزرهای سفارشی را ادغام کنیم یا طول زمینه (Context Length) را تنظیم کنیم. می‌توانید از ابزار quantize در llama.cpp برای کوانتیزه مجدد یک فایل GGUF موجود به فرمتی دیگر بدون از دست دادن متاداده‌های اصلی استفاده کنید.

# Re-quantize to a higher precision if accuracy is suffering
./llama-quantize ./models/medical_mistral_q4_k_m.gguf ./models/medical_mistral_q5_k_m.gguf q5_k_m

نتیجه‌گیری

ساخت یک پایپ‌لاین کوانتیزاسیون سفارشی با llama.cpp تنها صرفه‌جویی در فضای دیسک نیست؛ بلکه اطمینان از این است که هوش مصنوعی حوزه‌محور شما ظرافت‌های مورد نیاز برای کاربردهای حساس را حفظ می‌کند. با خودکارسازی فرآیند تبدیل و بهره‌گیری از انعطاف‌پذیری طرح‌های کوانتیزاسیون llama.cpp، توسعه‌دهندگان می‌توانند LLMهای قدرتمند و اولویت‌دهی شده به سمت محلی را مستقر کنند که محدودیت‌های حافظه را رعایت می‌کنند بدون اینکه دانش تخصصی نهفته در داده‌هایشان را قربانی کنند. با رویکردی متعادل از Q4_K_M شروع کنید و اگر حوزه شما به وفاداری (Fidelity) بالاتری نیاز دارد، به Q5 یا Q6 ارتقا دهید.

Share: