1. סקירה כללית
במעבדה הזו מוסבר בפירוט איך לפרוס שרת אפליקציות LIT ב-Google Cloud Platform (GCP) כדי ליצור אינטראקציה עם מודלים בסיסיים של Vertex AI Gemini ועם מודלים גדולים של שפה (LLM) של צד שלישי שמתארחים באופן עצמאי. בנוסף, הוא כולל הנחיות לשימוש בממשק המשתמש של LIT לניפוי באגים מהיר ולפרשנות של מודלים.
בעזרת שיעור ה-Lab הזה, המשתמשים ילמדו איך:
- הגדרת שרת LIT ב-GCP.
- קישור שרת ה-LIT למודלים של Vertex AI Gemini או ל-LLMs אחרים שמתארחים בעצמם.
- אתם יכולים להשתמש בממשק המשתמש של LIT כדי לנתח, לנפות באגים ולפרש הנחיות, וכך לשפר את הביצועים והתובנות של המודל.
מהו LIT?
LIT הוא כלי אינטראקטיבי חזותי להבנת מודלים, שתומך בנתוני טקסט, תמונות וטבלאות. אפשר להריץ אותו כשרת עצמאי או בסביבות של notebooks כמו Google Colab, Jupyter ו-Google Cloud Vertex AI. אפשר למצוא את LIT ב-PyPI וב-GitHub.
הכלי נוצר במקור כדי להבין מודלים של סיווג ורגרסיה, אבל בעדכונים האחרונים נוספו כלים לניפוי באגים בהנחיות של LLM, שמאפשרים לכם לבדוק איך תוכן של משתמשים, מודלים ומערכות משפיע על התנהגות היצירה.
מהם Vertex AI ו-Model Garden?
Vertex AI היא פלטפורמה ללמידת מכונה (ML) שמאפשרת לאמן ולפרוס מודלים של למידת מכונה ואפליקציות של AI, ולהתאים אישית מודלים של LLM לשימוש באפליקציות מבוססות-AI. Vertex AI משלבת תהליכי עבודה של מהנדסי נתונים, מדעני נתונים ומהנדסי למידת מכונה, ומאפשרת לצוותים שלכם לשתף פעולה באמצעות ערכת כלים משותפת ולהרחיב את האפליקציות שלכם באמצעות היתרונות של Google Cloud.
Vertex Model Garden היא ספרייה של מודלים של למידת מכונה שבעזרתה אפשר לגלות, לבדוק, להתאים אישית ולפרוס נכסים ומודלים קנייניים של Google ומודלים נבחרים של צד שלישי.
מה עליכם לעשות
נשתמש ב-Cloud Shell וב-Cloud Run כדי לפרוס קונטיינר של Docker מקובץ אימג' שנוצר מראש של LIT.
Cloud Run היא פלטפורמת מחשוב מנוהלת שמאפשרת להריץ קונטיינרים ישירות מעל התשתית הניתנת להתאמה של Google, כולל על מעבדי GPU.
מערך נתונים
כברירת מחדל, הדגמה משתמשת במערך הנתונים לדוגמה של תכונת ניפוי הבאגים של ה-LIT prompt. אפשר גם לטעון מערך נתונים משלכם דרך ממשק המשתמש.
לפני שמתחילים
במדריך העזר הזה תצטרכו פרויקט ב-Google Cloud. אפשר ליצור פרויקט חדש או לבחור פרויקט שכבר יצרתם.
2. הפעלת מסוף Google Cloud ו-Cloud Shell
בשלב הזה תפעילו את מסוף Google Cloud ותשתמשו ב-Google Cloud Shell.
2-א: פותחים את מסוף Google Cloud
פותחים דפדפן ונכנסים למסוף Google Cloud.
מסוף Google Cloud הוא ממשק ניהול מאובטח וחזק באינטרנט, שמאפשר לנהל במהירות את המשאבים ב-Google Cloud. זהו כלי DevOps לניהול בדרכים.
2-ב: הפעלת Google Cloud Shell
Cloud Shell היא סביבת פיתוח ותפעול אונליין שאפשר לגשת אליה מכל מקום באמצעות הדפדפן. אתם יכולים לנהל את המשאבים שלכם באמצעות מסוף אונליין טעון מראש בכלים כמו כלי שורת הפקודה של gcloud, kubectl ועוד. אפשר גם לפתח, ליצור, לנפות באגים ולפרוס אפליקציות מבוססות-ענן באמצעות Cloud Shell Editor אונליין. Cloud Shell הוא סביבה אונליין מוכנה למפתחים, עם קבוצת כלים מועדפים מותקנת מראש ו-5GB של נפח אחסון מתמיד. בשלבים הבאים תשתמשו בשורת הפקודה.
פותחים את Google Cloud Shell באמצעות הסמל בפינה השמאלית העליונה של סרגל התפריטים, שמוקף בכחול בצילום המסך הבא.
בתחתית הדף אמור להופיע מסוף עם מעטפת Bash.
2-ג: הגדרת פרויקט ב-Google Cloud
צריך להגדיר את מזהה הפרויקט ואת אזור הפרויקט באמצעות הפקודה gcloud
.
# Set your GCP Project ID.
gcloud config set project your-project-id
# Set your GCP Project Region.
gcloud config set run/region your-project-region
3. פריסה של קובץ האימג' של שרת האפליקציות של LIT ב-Docker באמצעות Cloud Run
3-א: פריסת אפליקציית LIT ב-Cloud Run
קודם צריך להגדיר את הגרסה האחרונה של LIT-App כגרסה לפריסה.
# Set latest version as your LIT_SERVICE_TAG.
export LIT_SERVICE_TAG=latest
# List all the public LIT GCP App server docker images.
gcloud container images list-tags us-east4-docker.pkg.dev/lit-demos/lit-app/gcp-lit-app
אחרי שמגדירים את תג הגרסה, צריך לתת שם לשירות.
# Set your lit service name. While 'lit-app-service' is provided as a placeholder, you can customize the service name based on your preferences.
export LIT_SERVICE_NAME=lit-app-service
לאחר מכן, אפשר להריץ את הפקודה הבאה כדי לפרוס את הקונטיינר ב-Cloud Run.
# Use below cmd to deploy the LIT App to Cloud Run.
gcloud run deploy $LIT_SERVICE_NAME \
--image us-east4-docker.pkg.dev/lit-demos/lit-app/gcp-lit-app:$LIT_SERVICE_TAG \
--port 5432 \
--cpu 8 \
--memory 32Gi \
--no-cpu-throttling \
--no-allow-unauthenticated
אפשר גם להוסיף את מערך הנתונים ב-LIT כשמפעילים את השרת. כדי לעשות זאת, מגדירים את המשתנה DATASETS
כך שיכלול את הנתונים שרוצים לטעון, באמצעות הפורמט name:path
. לדוגמה, data_foo:/bar/data_2024.jsonl
. הפורמט של מערך הנתונים צריך להיות .jsonl, כאשר כל רשומה מכילה את השדה prompt
ואת השדות האופציונליים target
ו-source
. כדי לטעון כמה מערכי נתונים, מפרידים ביניהם באמצעות פסיק. אם לא תגדירו את הפרמטר, יוטען מערך הנתונים לדוגמה לניפוי באגים של ה-LIT prompt.
# Set the dataset.
export DATASETS=[DATASETS]
הגדרת MAX_EXAMPLES מאפשרת לכם להגדיר את המספר המקסימלי של דוגמאות לטעינה מכל קבוצת הערכה.
# Set the max examples.
export MAX_EXAMPLES=[MAX_EXAMPLES]
לאחר מכן, אפשר להוסיף את הפרמטר הזה לפקודת הפריסה:
--set-env-vars "DATASETS=$DATASETS" \
--set-env-vars "MAX_EXAMPLES=$MAX_EXAMPLES" \
3-ב: הצגת שירות LIT App
אחרי שיוצרים את שרת האפליקציה של LIT, אפשר למצוא את השירות בקטע Cloud Run במסוף Cloud.
בוחרים את השירות LIT App שיצרתם זה עתה. מוודאים ששם השירות זהה לשם LIT_SERVICE_NAME
.
כדי למצוא את כתובת ה-URL של השירות, לוחצים על השירות שפרסמתם.
לאחר מכן אמור להופיע ממשק המשתמש של LIT. אם נתקלתם בשגיאה, תוכלו לעיין בקטע 'פתרון בעיות'.
בקטע LOGS אפשר לעקוב אחרי הפעילות, לראות הודעות שגיאה ולעקוב אחרי ההתקדמות של הפריסה.
בקטע METRICS (מדדים) אפשר לראות את המדדים של השירות.
3-ג: טעינת מערכי נתונים
לוחצים על האפשרות Configure
בממשק המשתמש של LIT ובוחרים באפשרות Dataset
. כדי לטעון את מערך הנתונים, מציינים שם ומספקים את כתובת ה-URL של מערך הנתונים. הפורמט של מערך הנתונים צריך להיות .jsonl, כאשר כל רשומה מכילה את השדה prompt
ואת השדות האופציונליים target
ו-source
.
4. הכנת מודלים של Gemini ב-Vertex AI Model Garden
מודלים בסיסיים של Gemini מבית Google זמינים דרך Vertex AI API. ב-LIT יש את מעטפת המודל VertexAIModelGarden
, שמאפשרת להשתמש במודלים האלה ליצירה. פשוט מציינים את הגרסה הרצויה (למשל, 'gemini-1.5-pro-001') באמצעות הפרמטר של שם המודל. יתרון מרכזי של השימוש במודלים האלה הוא שהם לא דורשים מאמץ נוסף לפריסה. כברירת מחדל, יש לכם גישה מיידית למודלים כמו Gemini 1.0 Pro ו-Gemini 1.5 Pro ב-GCP, כך שאין צורך לבצע שלבי הגדרה נוספים.
4-א: מתן הרשאות ל-Vertex AI
כדי לשלוח שאילתות ל-Gemini ב-GCP, צריך להעניק ל-Vertex AI הרשאות לחשבון השירות. מוודאים ששם חשבון השירות הוא Default compute service account
. מעתיקים את כתובת האימייל של חשבון השירות של החשבון.
מוסיפים את כתובת האימייל של חשבון השירות כחשבון משתמש עם התפקיד Vertex AI User
ברשימת ההיתרים של IAM.
4-ב: טעינת מודלים של Gemini
עליכם לטעון מודלים של Gemini ולהתאים את הפרמטרים שלהם לפי השלבים הבאים.
- לוחצים על האפשרות
Configure
בממשק המשתמש של LIT.
- לוחצים על האפשרות
- בוחרים באפשרות
gemini
בקטעSelect a base model
.
- בוחרים באפשרות
- צריך לתת שם לדגם בשדה
new_name
.
- צריך לתת שם לדגם בשדה
- מזינים את מודלי Gemini שנבחרו כ-
model_name
.
- מזינים את מודלי Gemini שנבחרו כ-
- לוחצים על
Load Model
.
- לוחצים על
- לוחצים על
Submit
.
- לוחצים על
5. פריסה של שרת מודלים של LLMs באירוח עצמי ב-GCP
אירוח עצמאי של מודלים של LLM באמצעות קובץ האימג' של שרת המודל ב-Docker של LIT מאפשר לכם להשתמש בפונקציות של LIT לזיהוי סמלים ולזיהוי סמלים משמעותיים כדי לקבל תובנות מעמיקות יותר לגבי התנהגות המודל. קובץ האימג' של שרת המודל פועל עם מודלים של KerasNLP או Hugging Face Transformers, כולל משקלים שסופקו על ידי ספרייה ומשקלים באירוח עצמי, למשל ב-Google Cloud Storage.
5-א: הגדרת מודלים
כל מאגר טוען מודל אחד, שמוגדר באמצעות משתני סביבה.
כדי לציין את המודלים לטעינה, צריך להגדיר את MODEL_CONFIG. הפורמט צריך להיות name:path
, למשל model_foo:model_foo_path
. הנתיב יכול להיות כתובת URL, נתיב קובץ מקומי או שם של הגדרה מוגדרת מראש של מסגרת ה-Deep Learning שהוגדרה (מידע נוסף זמין בטבלה הבאה). השרת הזה נבדק עם Gemma, GPT2, Llama ו-Mistral בכל הערכים הנתמכים של DL_FRAMEWORK
. מודלים אחרים אמורים לפעול, אבל יכול להיות שיידרשו התאמות.
# Set models you want to load. While 'gemma2b is given as a placeholder, you can load your preferred model by following the instructions above.
export MODEL_CONFIG=gemma2b:gemma_2b_en
בנוסף, שרת המודל של LIT מאפשר להגדיר משתני סביבה שונים באמצעות הפקודה הבאה. הפרטים מופיעים בטבלה. חשוב לזכור שצריך להגדיר כל משתנה בנפרד.
# Customize the variable value as needed.
export [VARIABLE]=[VALUE]
משתנה | ערכים | תיאור |
DL_FRAMEWORK |
| ספריית המודלים שמשמש לטעינת משקלי המודל בסביבת זמן הריצה שצוינה. ברירת המחדל היא |
DL_RUNTIME |
| מסגרת הקצה העורפי של הלמידה העמוקה שבה פועל המודל. כל המודלים שנטענים על ידי השרת הזה ישתמשו באותו קצה עורפי, ואי-תאימות תוביל לשגיאות. ברירת המחדל היא |
PRECISION |
| רמת הדיוק של נקודה צפה (floating-point) במודלים של LLM. ברירת המחדל היא |
BATCH_SIZE | מספרים שלמים חיוביים | מספר הדוגמאות לעיבוד בכל קבוצה. ברירת המחדל היא |
SEQUENCE_LENGTH | מספרים שלמים חיוביים | אורך הרצף המקסימלי של הנחיית הקלט בתוספת הטקסט שנוצר. ברירת המחדל היא |
5-ב: פריסת שרת המודלים ב-Cloud Run
קודם צריך להגדיר את הגרסה האחרונה של Model Server כגרסה לפריסה.
# Set latest as MODEL_VERSION_TAG.
export MODEL_VERSION_TAG=latest
# List all the public LIT GCP model server docker images.
gcloud container images list-tags us-east4-docker.pkg.dev/lit-demos/lit-app/gcp-model-server
אחרי שמגדירים את תג הגרסה, צריך לתת שם לשרת המודלים.
# Set your Service name.
export MODEL_SERVICE_NAME='gemma2b-model-server'
לאחר מכן, אפשר להריץ את הפקודה הבאה כדי לפרוס את הקונטיינר ב-Cloud Run. אם לא תגדירו את משתני הסביבה, יוחלו ערכי ברירת מחדל. מאחר שרוב ה-LLMs דורשים משאבי מחשוב יקרים, מומלץ מאוד להשתמש ב-GPU. אם אתם מעדיפים להריץ את הקוד רק ב-CPU (האפשרות הזו מתאימה למודלים קטנים כמו GPT2), תוכלו להסיר את הארגומנטים הרלוונטיים --gpu 1 --gpu-type nvidia-l4 --max-instances 7
.
# Deploy the model service container.
gcloud beta run deploy $MODEL_SERVICE_NAME \
--image us-east4-docker.pkg.dev/lit-demos/lit-app/gcp-model-server:$MODEL_VERSION_TAG \
--port 5432 \
--cpu 8 \
--memory 32Gi \
--no-cpu-throttling \
--gpu 1 \
--gpu-type nvidia-l4 \
--max-instances 7 \
--set-env-vars "MODEL_CONFIG=$MODEL_CONFIG" \
--no-allow-unauthenticated
בנוסף, אפשר להתאים אישית את משתני הסביבה על ידי הוספת הפקודות הבאות. מומלץ לכלול רק את משתני הסביבה הנחוצים לצרכים הספציפיים שלכם.
--set-env-vars "DL_FRAMEWORK=$DL_FRAMEWORK" \
--set-env-vars "DL_RUNTIME=$DL_RUNTIME" \
--set-env-vars "PRECISION=$PRECISION" \
--set-env-vars "BATCH_SIZE=$BATCH_SIZE" \
--set-env-vars "SEQUENCE_LENGTH=$SEQUENCE_LENGTH" \
יכול להיות שתצטרכו להגדיר משתני סביבה נוספים כדי לגשת למודלים מסוימים. בהתאם לצורך, אפשר לעיין בהוראות ב-Kaggle Hub (למודלים של KerasNLP) וב-Hugging Face Hub.
5-ג: גישה לשרת המודלים
אחרי שיוצרים את שרת המודל, השירות שהופעל יופיע בקטע Cloud Run בפרויקט ב-GCP.
בוחרים את שרת המודל שיצרתם זה עתה. מוודאים ששם השירות זהה לשם MODEL_SERVICE_NAME
.
כדי למצוא את כתובת ה-URL של השירות, לוחצים על שירות המודל שפרסמתם.
בקטע LOGS אפשר לעקוב אחרי הפעילות, לראות הודעות שגיאה ולעקוב אחרי ההתקדמות של הפריסה.
בקטע METRICS (מדדים) אפשר לראות את המדדים של השירות.
5-ד: טעינת מודלים מתארחים
אם משתמשים בשרת proxy של LIT בשלב 3 (ראו הקטע 'פתרון בעיות'), צריך להריץ את הפקודה הבאה כדי לקבל את אסימון הזהות של GCP.
# Find your GCP identity token.
gcloud auth print-identity-token
תלמדו איך לטעון מודלים שמתארחים בעצמכם ולהתאים את הפרמטרים שלהם לפי השלבים הבאים.
- לוחצים על האפשרות
Configure
בממשק המשתמש של LIT. - בוחרים באפשרות
LLM (self hosted)
בקטעSelect a base model
. - צריך לתת שם לדגם בשדה
new_name
. - מזינים את כתובת ה-URL של שרת המודל כ-
base_url
. - מזינים את טוקן הזהות שהתקבל ב-
identity_token
אם משתמשים בשרת proxy של אפליקציית LIT (ראו שלב 3 ושלב 7). אחרת, משאירים אותו ריק. - לוחצים על
Load Model
. - לוחצים על
Submit
.
6. אינטראקציה עם LIT ב-GCP
ב-LIT יש מגוון רחב של תכונות שיעזרו לכם לנפות באגים ולהבין את התנהגות המודלים. אפשר לבצע פעולות פשוטות כמו שליחת שאילתה למודל, על ידי הקלדה של טקסט בתיבה והצגת התחזיות של המודל. אפשר גם לבדוק את המודלים לעומק באמצעות חבילת התכונות החזקות של LIT, כולל:
6-א: שליחת שאילתה למודל באמצעות LIT
מערכת LIT שולחת שאילתות באופן אוטומטי למערך הנתונים אחרי טעינת המודל ומערך הנתונים. כדי להציג את התשובה של כל מודל, בוחרים את התשובה בעמודות.
6-ב: שימוש בשיטה של הדגשת רצף
בשלב זה, הטכניקה Sequence Salience ב-LIT תומכת רק במודלים מתארחים.
Sequence Salience הוא כלי חזותי שעוזר לנפות באגים בהנחיות של LLM על ידי הדגשת החלקים החשובים ביותר בהנחיה לתוצאה נתונה. מידע נוסף על 'הדגשת רצף' זמין במדריך המלא.
כדי לגשת לתוצאות של המודגשים, לוחצים על קלט או פלט כלשהו בהנחיה או בתגובה, ותוצאות המודגשים יוצגו.
6-ג: עריכה ידנית של ההנחיה והיעד
בעזרת LIT אפשר לערוך באופן ידני את כל הערכים של prompt
ו-target
בנקודת נתונים קיימת. לחיצה על Add
תוסיף את הקלט החדש למערך הנתונים.
6-ד: השוואה של הנחיות זה לצד זה
בעזרת LIT אפשר להשוות בין הנחיות זה לצד זה, באמצעות דוגמאות מקוריות וערוכות. אתם יכולים לערוך דוגמה באופן ידני ולראות את תוצאת התחזית ואת ניתוח הבולטוּת של הרצף גם לגרסה המקורית וגם לגרסה הערוכה בו-זמנית. אפשר לשנות את ההנחיה לכל נקודה בתרשים, ו-LIT יפיק את התשובה המתאימה על ידי שליחת שאילתה למודל.
6-ה: השוואה בין כמה מודלים זה לצד זה
בעזרת LIT אפשר להשוות בין מודלים זה לצד זה באמצעות דוגמאות נפרדות ליצירת טקסט ולניקוד, וגם באמצעות דוגמאות מצטברות של מדדים ספציפיים. שאילתות למודלים שונים שהועלו מאפשרות להשוות בקלות את ההבדלים בתשובות שלהם.
6-f: גנרטורים אוטומטיים של תרחישים נגדיים
אתם יכולים להשתמש בגנרטורים אוטומטיים של תרחישים נגדיים כדי ליצור נתוני קלט חלופיים ולראות מיד איך ההתנהגות של המודל משתנה בהתאם.
6-ג: הערכת ביצועי המודל
אפשר להעריך את ביצועי המודל באמצעות מדדים (כרגע יש תמיכה בציונים של BLEU ו-ROUGE ליצירת טקסט) בכל מערך הנתונים, או בכל קבוצות משנה של דוגמאות מסוננות או נבחרות.
7. פתרון בעיות
7-א: בעיות גישה פוטנציאליות ופתרונות
מכיוון ש---no-allow-unauthenticated
מוחל בזמן הפריסה ב-Cloud Run, יכול להיות שתראו שגיאות אסורות כפי שמוצג בהמשך.
יש שתי דרכים לגשת לשירות LIT App.
1. שרת proxy לשירות מקומי
אפשר להעביר את השירות לשרתי proxy למארח המקומי באמצעות הפקודה הבאה.
# Proxy the service to local host.
gcloud run services proxy $LIT_SERVICE_NAME
לאחר מכן, אמורה להיות לך גישה לשרת LIT בלחיצה על הקישור לשירות שעבר דרך שרת proxy.
2. אימות משתמשים באופן ישיר
אפשר ללחוץ על הקישור הזה כדי לאמת משתמשים ולאפשר להם גישה ישירה לשירות של אפליקציית LIT. הגישה הזו מאפשרת גם לקבוצת משתמשים לגשת לשירות. זו אפשרות יעילה יותר לפיתוח שכרוך בשיתוף פעולה עם כמה אנשים.
7-ב: בדיקות כדי לוודא ששרת המודלים הופעל בהצלחה
כדי לוודא ששרת המודל הופעל בהצלחה, אפשר לשלוח שאילתות ישירות לשרת המודל. שרת המודל מספק שלוש נקודות קצה: predict
, tokenize
ו-salience
. חשוב לציין בבקשה גם את השדה prompt
וגם את השדה target
.
# Query the model server predict endpoint.
curl -X POST http://YOUR_MODEL_SERVER_URL/predict -H "Content-Type: application/json" -d '{"inputs":[{"prompt":"[YOUR PROMPT]", "target":[YOUR TARGET]}]}'
# Query the model server tokenize endpoint.
curl -X POST http://YOUR_MODEL_SERVER_URL/tokenize -H "Content-Type: application/json" -d '{"inputs":[{"prompt":"[YOUR PROMPT]", "target":[YOUR TARGET]}]}'
# Query the model server salience endpoint.
curl -X POST http://YOUR_MODEL_SERVER_URL/salience -H "Content-Type: application/json" -d '{"inputs":[{"prompt":"[YOUR PROMPT]", "target":[YOUR TARGET]}]}'
אם נתקלתם בבעיה בגישה, תוכלו לעיין בקטע 7-א' שלמעלה.
8. מזל טוב
כל הכבוד על השלמת ה-Codelab! הגיע הזמן להירגע!
הסרת המשאבים
כדי לנקות את הסדנה, מוחקים את כל שירותי Google Cloud שנוצרו עבור הסדנה. מריצים את הפקודות הבאות באמצעות Google Cloud Shell.
אם החיבור ל-Google Cloud התנתק בגלל חוסר פעילות, צריך לאפס את המשתנים לפי השלבים הקודמים.
# Delete the LIT App Service.
gcloud run services delete $LIT_SERVICE_NAME
אם הפעלתם את שרת המודלים, תצטרכו למחוק גם אותו.
# Delete the Model Service.
gcloud run services delete $MODEL_SERVICE_NAME
מקורות מידע נוספים
תוכלו להמשיך ללמוד על התכונות של הכלי LIT באמצעות המקורות הבאים:
- Gemma: קישור
- בסיס הקוד של LIT בקוד פתוח: מאגר Git
- מאמר בנושא LIT: ArXiv
- מאמר בנושא ניפוי באגים בהנחיות LIT: ArXiv
- הדגמה של התכונה LIT בסרטון: YouTube
- הדגמה של ניפוי באגים באמצעות הנחיה של LIT: YouTube
- ערכת הכלים ל-GenAI אחראי: קישור
יצירת קשר
אם יש לכם שאלות או בעיות בנושא הקוד, אתם יכולים לפנות אלינו ב-GitHub.
רישיון
העבודה הזו בשימוש במסגרת רישיון Creative Commons Attribution 4.0 גנרי.