Skip to content

מי שולט במשקולות? מדריך למפתחים ל־LLM מקומיים ולהגדרת AI בקוד פתוח

ברוכים הבאים למדריך למפתחים על מודלי שפה מקומיים ועל המשמעות של בינה מלאכותית בקוד פתוח.

מאחורי הוויכוח על פתיחות ב־AI עומדת שאלה מעשית: מי מגדיר את ההרשאות ואת המידע שמפתחים מקבלים?

במבט ראשון זה נשמע כמו ויכוח פילוסופי ברמה גבוהה שמיועד לקובעי מדיניות בבריסל או בוושינגטון. אבל עבור מהנדסי תוכנה, אדריכלי ענן ומנהלי מערכות, הוויכוח הזה מתרחש ממש בחלונות המסוף. בכל פעם שאנחנו מריצים ollama run llama3, מורידים מודל מ־Hugging Face או משלבים LLM בתהליכי CI/CD, אנחנו משתתפים באופן פעיל במערכת הזאת.

OSI פרסמה את Open Source AI Definition‏ (OSAID) 1.0 ב־28 באוקטובר 2024; זו אינה טיוטה שטרם הושלמה. זוהי מסגרת להערכת פתיחות, ולא תחליף לרישיון של כל מודל. בדקו את הזכויות ואת התוצרים של הגרסה המסוימת שבה אתם מתכוונים להשתמש. הודעת הפרסום של OSI.

במאמר הזה נבחן מדוע ההגדרה חשובה למפתחים, ננתח את הרכיבים הטכניים של מודל ״פתוח״ באמת, ונכתוב קוד Python מעשי להפעלה ולבדיקה של LLM מקומי באמצעות כלי קוד פתוח.

המשבר הטכני: מהו בכלל מודל ״פתוח״?

בתוכנה רגילה, רישיונות קוד פתוח מעניקים זכויות להשתמש בקוד המקור, לבדוק אותו, לשנותו ולהפיצו מחדש, בכפוף לתנאיהם. MIT,‏ Apache 2.0 ו־GPL שונים בחובות שהם מטילים; ״פתוח״ אינו אומר שדרישות ייחוס או תנאי רישיון אחרים נעלמים.

במודל שפה יש להבחין לפחות בין הארכיטקטורה, הפרמטרים שנלמדו וקוד ההסקה. גם תוצרי האימון ועיבוד הנתונים חשובים. שני רכיבים מרכזיים הם:

  • ארכיטקטורה: מבנה המודל, ובכלל זה שכבות, מנגנוני קשב וצורות טנזורים.
  • משקולות: פרמטרים שנלמדו, המיוצגים בדיוק מספרי נבחר; היקף נתוני האימון שלהם משתנה בין מודלים.

אם חברה מפרסמת את משקולות המודל ברישיון מתירני, אך מסתירה את נתוני האימון, את אלגוריתמי סינון הנתונים ואת קוד האימון, האם המודל הזה באמת ״בקוד פתוח״?

אפשרות להוריד משקולות לבדה אינה מוכיחה עמידה ב־OSAID. ההגדרה דורשת חופש להשתמש, ללמוד, לשנות ולשתף, וכן צורה מועדפת לביצוע שינויים, הכוללת מידע על נתונים, קוד ופרמטרים. שם של משפחת מודלים אינו מספיק כדי לקבוע את הזכויות של גרסה מסוימת. דרישות OSAID 1.0.

הארכיטקטורה של מערך AI פתוח

יכולת חיזוי, אפשרות לביקורת ופרטיות חשובות הן בהסקה מתארחת והן בהסקה מקומית. ב־API מתארח, בדקו טיפול בנתונים, תמחור, אפשרויות לבקרת גרסאות ומדיניות שינויים. הסקה מקומית מעניקה יותר שליטה בפריסה, אך מעבירה למפעיל את האחריות לתלויות, להרשאות גישה, ליומנים, לעדכונים ולחומרה. אף אחת מהאפשרויות אינה מבטיחה אבטחה או פלט יציב.

מערך מקומי יכול להפריד בין היישום, תוכנת ההסקה, קובצי המודל והחומרה. התרשים הבא סכמטי ואינו מטריצת תאימות: GGUF ו־Safetensors הם פורמטים, ואילו AWQ ו־GPTQ מתארים גישות לכימות; לא כל מנוע תומך בכל שילוב.

+-------------------------------------------------------------+
|                     Application Layer                       |
|           (LangChain, LlamaIndex, Custom Python)            |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
|                     Inference Engine                        |
|            (Ollama, llama.cpp, vLLM, Hugging Face)          |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
|                     Model & Quantization                    |
|             (GGUF, Safetensors, AWQ, GPTQ files)            |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
|                     Hardware Acceleration                   |
|                  (Metal on Mac, CUDA on NVIDIA)             |
+-------------------------------------------------------------+

אם שקיפות האימון חשובה לכם, בחנו גרסאות מסוימות כגון OLMo 2 של Ai2, שמפתחיה מפרסמים נתוני אימון, קוד, מתכוני אימון, הערכות ונקודות ביקורת. הזמינות מאפשרת בדיקה; היא אינה מבטיחה שלקורא יהיו המשאבים לשחזר את האימון או שהמודל נקי מפגמים. תוצרי OLMo 2 של Ai2.

תרגול מעשי: הפעלה ובדיקה של LLM מקומי

הדוגמה הבאה ממחישה טעינה מקומית, בדיקת מטא־נתונים ויצירת טקסט באמצעות Python ו־Transformers. היא לא נבדקה בהרצה לצורך המאמר. אין כאן הבטחה להפעלה מאובטחת ולא מקוונת: הגדרות המצב הלא מקוון של Hub אינן תחליף לבידוד רשת ברמת מערכת ההפעלה, לבדיקת תלויות או לאימות הפלט.

שלב 1: הגדרת סביבת העבודה

צרו סביבה וירטואלית. התקינו גרסאות שנבדקו של PyTorch,‏ Transformers ו־Safetensors לפי ההוראות הרשמיות, ותעדו גרסאות מדויקות בקובץ נעילת תלויות. התקנת תלויות והורדת מודל הן שלבי הכנה מקוונים נפרדים. השיגו מראש עותק מלא שנבדק של המודל ב־commit מתועד, ובכלל זה קובצי tokenizer והגדרות ומשקולות Safetensors. אין לבסס טענת שחזור על הפניה לגרסה משתנה. התקנת Transformers והכנה לעבודה לא מקוונת; Safetensors.

mkdir local-ai-explorer
cd local-ai-explorer
python3 -m venv venv
# POSIX shell; use your platform's activation command on Windows.
source venv/bin/activate

שלב 2: כתיבת סקריפט ההסקה

הדוגמה מיועדת ל־Qwen/Qwen2.5-1.5B-Instruct, שכרטיס המודל שלו מציין 1.54 מיליארד פרמטרים. אין בכך הוכחה לתאימות לכל מחשב נייד. משקולות float32 ב־CPU לבדן תופסות כ־6 GB ביחידות עשרוניות; תקורת זמן ריצה ומטמוני קשב דורשים זיכרון נוסף. לתצורות GPU או כימות יש דרישות שונות. כרטיס המודל הרשמי של Qwen.

שמרו את סקריפט ההדגמה הבא בשם app.py. הוא דורש תיקיית מודל מקומית קיימת ומהימנה, מסרב לקוד מותאם מרחוק ודורש משקולות Safetensors. הבקרות האלה מפחיתות סיכוני טעינה מסוימים; הן אינן ארגז חול מלא. אמצעי זהירות בטעינת מודלים.

import os
# Set Hub controls before importing the Hugging Face libraries.
os.environ["HF_HUB_OFFLINE"] = "1"
os.environ["HF_HUB_DISABLE_TELEMETRY"] = "1"

import argparse
from pathlib import Path
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("model_dir", help="Reviewed local Qwen2.5-1.5B-Instruct snapshot")
    args = parser.parse_args()
    model_dir = Path(args.model_dir).expanduser().resolve(strict=True)
    if not model_dir.is_dir():
        raise ValueError("model_dir must be a directory")

    tokenizer = AutoTokenizer.from_pretrained(
        str(model_dir), local_files_only=True, trust_remote_code=False
    )
    # Explicit CPU example; float32 weights need roughly 6 GB before overhead.
    model = AutoModelForCausalLM.from_pretrained(
        str(model_dir), local_files_only=True, trust_remote_code=False,
        use_safetensors=True, torch_dtype=torch.float32
    ).to("cpu")
    model.eval()
    print(f"Device: {model.device}")
    print(f"Parameters: {sum(p.numel() for p in model.parameters()):,}")
    print(f"Dtype: {model.dtype}")
    print(f"Model storage estimate: {model.get_memory_footprint() / 1024**2:.2f} MiB")

    messages = [
        {"role": "system", "content": "You are a software engineering assistant."},
        {"role": "user", "content": "Explain how Python's ipaddress module validates IPv4 addresses."},
    ]
    text = tokenizer.apply_chat_template(
        messages, tokenize=False, add_generation_prompt=True
    )
    inputs = tokenizer(text, return_tensors="pt").to("cpu")
    with torch.inference_mode():
        output = model.generate(**inputs, max_new_tokens=128, do_sample=False)
    answer = output[0, inputs.input_ids.shape[1]:]
    print(tokenizer.decode(answer, skip_special_tokens=True))


if __name__ == "__main__":
    main()

שלב 3: הפעלת הסקריפט

לאחר בדיקת הקוד והכנת עותק המודל המקומי, החליפו את נתיב הדוגמה בתיקייה בפועל. קבצים מקומיים חסרים אמורים לגרום לשגיאה ולא להורדה מ־Hub.

python app.py /path/to/reviewed-qwen-snapshot

הסקריפט משתמש במפורש ב־CPU; הוא אינו מבטיח האצת CUDA או MPS אוטומטית. האצה תלויה בתוכנה, בחומרה ובפעולות מודל תואמות. נתון הזיכרון המודפס מתאר את אחסון המודל, ולא את שיא צריכת ה־RAM של התהליך או את כלל זיכרון ההסקה. HF_HUB_DISABLE_TELEMETRY משבית טלמטריה נתמכת, ולא הורדות; HF_HUB_OFFLINE ו־local_files_only=True שולטים בטעינה מ־Hub ומקבצים מקומיים. לדרישה אמיתית של היעדר רשת, אכפו ואמתו בידוד רשת מחוץ ל־Python. בחירת התקן; בקרות סביבת Hub.

מדוע משקולות פתוחות לבדן אינן מספיקות

היכולת להריץ מודל ולספור את הפרמטרים שלו אינה חושפת כיצד נאספו נתוני האימון או כיצד נוצר כל פלט. הרצה מקומית ושקיפות הן תכונות שונות.

כשאתם מריצים Qwen2.5,‏ Llama3 או Mistral, אתם מבצעים פעולות מתמטיות על משקולות המודל שנלמדו. אבל כיצד חושבו המשקולות האלה?

תיעוד האימון יכול לסייע בבירור שאלות כגון:

  • רישוי ומקור הנתונים: אילו רישיונות ומקורות חלים על הגרסה הזאת ועל נתוניה? משקולות זמינות או תשובה שנוצרה אינן מכריעות אם שימוש מסוים חוקי.
  • הטיה ואבטחה: אילו סינונים, הערכות ובדיקות מקור בוצעו? נתונים פתוחים מסייעים לחקירה, אך אינם מבטיחים היעדר הרעלה או הטיה.
  • יכולת הסבר: מה אפשר ללמוד מהערכות ומכלי פרשנות על הפלט? אפילו הקורפוס המדויק אינו מסביר אוטומטית כל בחירה בטוקן.

OSAID 1.0 דורשת מידע על נתונים שמספיק לאדם מיומן לבנות מערכת שקולה במידה מהותית באמצעות נתונים זהים או דומים, לצד הקוד והפרמטרים הנדרשים. היא אינה דורשת פרסום של כל דוגמת אימון מקורית ואינה מבטיחה שחזור זהה בכל סיבית. ההגדרה; שאלות ותשובות של OSI.

הדרך קדימה למפתחים

כמפתחים, יש לנו כוח רב בוויכוח הזה. אנחנו הצרכנים, הבונים ומקבלי ההחלטות בחברות שלנו. כך תוכלו לפעול ולשמור על עמידות בפני ״תלות בספק AI״:

  1. בחנו גרסאות מסוימות: תעדו גרסת מודל, רישיון, תוצרי אימון זמינים, תוצאות הערכה ומגבלות פריסה. אל תסווגו משפחה שלמה כאחידה מבחינה משפטית או טכנית.
  2. הפרידו בין היישום להסקה: גבול API יכול להקל על החלפת שירות, אך עדיין צריך לבדוק תאימות, הנחיות, קריאות לכלים ואיכות פלט. Ollama מתעדת תאימות לחלקים מ־OpenAI API, ולא תחליף גורף שאפשר לחבר ללא התאמות. תאימות Ollama.
  3. תמכו בתקנים פתוחים: עקבו אחר OSI ואחר פרויקטי AI פתוחים רלוונטיים. בקשו מספקים תוצרים והרשאות מוגדרים שמאחורי טענות הפתיחות שלהם.

אילו תוצרים דרושים לכם לפני פריסת מודל: משקולות להורדה, קוד אימון, מידע על נתונים או מתכון אימון שניתן לשחזר? התשובה צריכה להיגזר ממטרות הפרויקט ומדרישות הבדיקה שלו.

שתפו את הניסיון שלכם בתגובות.

המקורות הטכניים נבדקו ב־28 באוקטובר 2026; תאריך הפרסום המקורי של המאמר באנגלית נשמר.

Post a Comment

Previous Post Next Post