بناء مساعد برمجة ذكي وخفيف الوزن باستخدام نموذج Mistral Devstral
يُقدم هذا البرنامج التعليمي الشامل والسهل الاستخدام، والمناسب تمامًا لبيئة Google Colab، طريقة فعّالة لبناء مساعد برمجة ذكي قائم على نموذج اللغة الكبير Mistral Devstral، مع التركيز بشكل خاص على المستخدمين الذين يعانون من قيود مساحة القرص. سنتعلم كيفية نشر نموذج devstral-small
القوي مع تقليل حجمه بشكل كبير باستخدام تقنيات متقدمة.
1. تثبيت الحزم الضرورية وإدارة ذاكرة التخزين المؤقت:
نقوم أولاً بتثبيت الحزم الضرورية مع تجنب تخزين ذاكرة التخزين المؤقت لتقليل استخدام مساحة القرص:
pip install -q kagglehub mistral-common bitsandbytes transformers --no-cache-dir
pip install -q accelerate torch --no-cache-dir
ثم نقوم بتنظيف أي ذاكرة تخزين مؤقت أو مجلدات مؤقتة موجودة مسبقًا باستخدام مكتبات Python shutil
, os
, و gc
:
import shutil
import os
import gc
def cleanup_cache():
"""تنظيف الملفات غير الضرورية لتوفير مساحة القرص."""
cache_dirs = ['/root/.cache', '/tmp/kagglehub']
for cache_dir in cache_dirs:
if os.path.exists(cache_dir):
shutil.rmtree(cache_dir, ignore_errors=True)
gc.collect()
cleanup_cache()
print("تم تحسين مساحة القرص!")
هذه الوظيفة cleanup_cache()
تُنفذ قبل وبعد العمليات الرئيسية لمسح ذاكرة التخزين المؤقت وإدارة استخدام المساحة بكفاءة.
2. استيراد المكتبات وقمع رسائل التحذير:
نقوم باستيراد المكتبات الأساسية للتفاعل مع النموذج، بما في ذلك torch
لحسابات المُوتر، و kagglehub
لتحميل النموذج، و transformers
لتحميل نموذج LLM المُكمّن. كما نقوم باستيراد فئات Mistral المحددة لإدارة التعريب وتنسيق الطلبات:
import warnings
warnings.filterwarnings("ignore")
import torch
import kagglehub
from mistral_common.protocol.instruct.messages import UserMessage
from mistral_common.protocol.instruct.request import ChatCompletionRequest
from mistral_common.tokens.tokenizers.mistral import MistralTokenizer
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
نقوم بقمع رسائل التحذير لمنع أي تشتيت أثناء التنفيذ.
3. تحميل النموذج وتكوينه:
نُعرّف فئة LightweightDevstral
التي تُعامل تحميل النموذج وتوليد النص بطريقة فعّالة من حيث الموارد:
class LightweightDevstral:
def __init__(self):
print("جاري تحميل النموذج (الوضع المتدفق)...")
self.model_path = kagglehub.model_download('mistral-ai/devstral-small-2505/Transformers/devstral-small-2505/1', force_download=False)
quantization_config = BitsAndBytesConfig(
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_storage=torch.uint8,
load_in_4bit=True
)
print("جاري تحميل النموذج المضغوط للغاية...")
self.model = AutoModelForCausalLM.from_pretrained(
self.model_path,
torch_dtype=torch.float16,
device_map="auto",
quantization_config=quantization_config,
low_cpu_mem_usage=True,
trust_remote_code=True
)
self.tokenizer = MistralTokenizer.from_file(f'{self.model_path}/tekken.json')
cleanup_cache()
print("تم تجهيز المساعد الخفيف! (حجم ~2GB تقريبًا)")
def generate(self, prompt, max_tokens=400):
# ... (باقي تعريف دالة generate) ...
يتم تحميل نموذج devstral-small-2505
باستخدام kagglehub
، مع استخدام الكميّة الدقيقة 4-bit عبر BitsAndBytesConfig
لتقليل استخدام الذاكرة والقرص. كما يتم تهيئة مُعالج التعريب من ملف JSON محلي، ويتم مسح ذاكرة التخزين المؤقت بعد ذلك مباشرةً. تستخدم دالة generate
تقنيات آمنة للذاكرة مثل torch.inference_mode()
و empty_cache()
لتوليد الردود بكفاءة.
def generate(self, prompt, max_tokens=400):
"""توليد نص بكفاءة من حيث الذاكرة"""
tokenized = self.tokenizer.encode_chat_completion(ChatCompletionRequest(messages=[UserMessage(content=prompt)]))
input_ids = torch.tensor([tokenized.tokens])
if torch.cuda.is_available():
input_ids = input_ids.to(self.model.device)
with torch.inference_mode():
output = self.model.generate(
input_ids=input_ids,
max_new_tokens=max_tokens,
temperature=0.6,
top_p=0.85,
do_sample=True,
pad_token_id=self.tokenizer.eos_token_id,
use_cache=True
)[0]
del input_ids
if torch.cuda.is_available():
torch.cuda.empty_cache()
return self.tokenizer.decode(output[len(tokenized.tokens):])
print("جاري تهيئة مساعد الذكاء الاصطناعي الخفيف...")
assistant = LightweightDevstral()
4. أمثلة عملية:
نُظهر قدرات النموذج في البرمجة من خلال مجموعة من الأمثلة باستخدام دالة run_demo()
:
def run_demo(title, prompt, emoji=""):
"""تشغيل عرض توضيحي واحد مع التنظيف"""
print(f"n{emoji} {title}")
print("-" * 50)
result = assistant.generate(prompt, max_tokens=350)
print(result)
gc.collect()
if torch.cuda.is_available():
torch.cuda.empty_cache()
run_demo("البحث السريع عن الأعداد الأولية", "اكتب دالة سريعة للتحقق من الأعداد الأولية `is_prime(n)` مع شرح وحالات اختبار.", "")
run_demo("تصحيح هذا الكود", """صحح هذه الدالة الخاطئة واشرح المشاكل: ```python def avg_positive(numbers): total = sum([n for n in numbers if n > 0]) return total / len([n for n in numbers if n > 0]) ```""", "")
run_demo("إنشاء أداة نصية", "أنشئ فئة بسيطة `TextAnalyzer` مع طرق لعد الكلمات، وعدد الأحرف، والتحقق من القراءة العكسية.", "")
تتضمن الأمثلة كتابة دالة فعّالة للتحقق من الأعداد الأولية، و تصحيح جزء من كود Python به أخطاء منطقية، وإنشاء فئة TextAnalyzer
صغيرة.
5. وضع البرمجة السريعة:
نقدم وضع البرمجة السريعة، وهو واجهة تفاعلية خفيفة الوزن تسمح للمستخدمين بإرسال طلبات برمجة قصيرة مباشرةً إلى مساعد Devstral:
# ... (تعريف دالة quick_coding) ...
يُحد هذا الوضع عدد الجلسات التفاعلية لضمان الاستجابة المستمرة في بيئات ذات موارد محدودة.
6. مراقبة استخدام القرص:
نقدم روتينًا للتنظيف ومراقبة استخدام القرص:
def check_disk_usage():
"""مراقبة استخدام القرص"""
import subprocess
try:
result = subprocess.run(['df', '-h', '/'], capture_output=True, text=True)
lines = result.stdout.split('n')
if len(lines) > 1:
usage_line = lines[1].split()
used = usage_line[2]
available = usage_line[3]
print(f"القرص: {used} مستخدم، {available} متوفر")
except:
print("لا يتوفر التحقق من استخدام القرص")
print("nالبرنامج التعليمي مكتمل!")
cleanup_cache()
check_disk_usage()
print("nنصائح لتوفير المساحة:")
print("• يستخدم النموذج ~2GB مقابل ~7GB+ الأصلي")
print("• التنظيف التلقائي ل ذاكرة التخزين المؤقت بعد كل استخدام")
print("• توليد رمز محدود لتوفير الذاكرة")
print("• استخدم 'del assistant' عند الانتهاء لتحرير ~2GB")
print("• أعد تشغيل وقت التشغيل إذا استمرت مشاكل الذاكرة")
يستخدم هذا الجزء الأمر df -h
لعرض مساحة القرص المستخدمة والمتاحة. بعد إعادة تنفيذ cleanup_cache()
، ينتهي البرنامج التعليمي بمجموعة من النصائح العملية لتوفير المساحة.
اترك تعليقاً