במדריך הזה נסביר איך להריץ מודל שפה גדול (LLM) בצינור עיבוד נתונים של Dataflow באמצעות Apache Beam RunInference API.
מידע נוסף על RunInference API זמין במאמר About Beam ML במסמכי העזרה של Apache Beam.
קוד הדוגמה זמין ב-GitHub.
מטרות
- יצירת נושאים ומינויים ב-Pub/Sub עבור הקלט והתגובות של המודל.
- טוענים את המודל ל-Cloud Storage באמצעות משימה בהתאמה אישית ב-Gemini Enterprise Agent Platform.
- מריצים את הפייפליין.
- לשאול את המודל שאלה ולקבל תשובה.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
כדי להתקין את התלות, צריך להריץ את המדריך הזה במחשב עם לפחות 5GB של מקום פנוי בכונן.
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Dataflow, Compute Engine, Cloud Storage, Pub/Sub ו-Agent Platform, אם חלק מהם עדיין לא מופעלים:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
יוצרים פרטי כניסה לאימות מקומי עבור חשבון המשתמש:
gcloud auth application-default login
אם מוחזרת שגיאת אימות, צריך לוודא ש נכנסתם ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם.
-
מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/iam.serviceAccountUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש חשבון. דוגמאות מופיעות במאמר ייצוג המשתמשים במאגרי כוח עבודה בכללי מדיניות IAM. -
ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
-
-
מקצים תפקידים לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/dataflow.adminroles/dataflow.workerroles/storage.adminroles/pubsub.editorroles/aiplatform.user
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@" --role=SERVICE_ACCOUNT_ROLE
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
PROJECT_NUMBER: מספר הפרויקט. כדי למצוא את מספר הפרויקט, משתמשים בפקודהgcloud projects describe. -
SERVICE_ACCOUNT_ROLE: כל תפקיד בנפרד.
- מעתיקים את Google Cloud מזהה הפרויקט. תצטרכו את הערך הזה בהמשך המדריך.
יצירת Google Cloud המשאבים
בקטע הזה מוסבר איך ליצור את המשאבים הבאים:
- קטגוריה של Cloud Storage לשימוש כמיקום אחסון זמני
- נושא Pub/Sub לפרומפטים של המודל
- נושא ומינוי ב-Pub/Sub לתשובות של המודל
יצירת קטגוריה של Cloud Storage
יוצרים קטגוריה של Cloud Storage באמצעות ה-CLI של gcloud. הקטגוריה הזו משמשת כמיקום אחסון זמני בצינור Dataflow.
כדי ליצור את הקטגוריה, משתמשים בפקודה gcloud storage buckets create:
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
מחליפים את מה שכתוב בשדות הבאים:
- BUCKET_NAME: שם לקטגוריה של Cloud Storage שעומד בדרישות למתן שמות לקטגוריות. שמות של קטגוריות של Cloud Storage חייבים להיות ייחודיים באופן גלובלי.
- LOCATION: המיקום של הקטגוריה.
מעתיקים את שם הקטגוריה. תצטרכו את הערך הזה בהמשך המדריך.
יצירה של נושאים ומינויים ב-Pub/Sub
יוצרים שני נושאים ב-Pub/Sub ומינוי אחד. נושא אחד הוא פרומפטים לקלט ששולחים למודל. הנושא השני והמינוי שמצורף אליו הם לתשובות של המודל.
כדי ליצור את הנושאים, מריצים את הפקודה
gcloud pubsub topics createפעמיים, פעם אחת לכל נושא:gcloud pubsub topics create PROMPTS_TOPIC_ID gcloud pubsub topics create RESPONSES_TOPIC_IDמחליפים את מה שכתוב בשדות הבאים:
- PROMPTS_TOPIC_ID: מזהה הנושא של ההנחיות לקלט שנשלחות למודל, כמו
prompts - RESPONSES_TOPIC_ID: מזהה הנושא של התשובות של המודל, כמו
responses
- PROMPTS_TOPIC_ID: מזהה הנושא של ההנחיות לקלט שנשלחות למודל, כמו
כדי ליצור את המינוי ולצרף אותו לנושא התגובות, משתמשים בפקודה
gcloud pubsub subscriptions create:gcloud pubsub subscriptions create RESPONSES_SUBSCRIPTION_ID --topic=RESPONSES_TOPIC_IDמחליפים את RESPONSES_SUBSCRIPTION_ID במזהה המינוי של התשובות של המודל, כמו
responses-subscription.
מעתיקים את מזהי הנושא ואת מזהה המינוי. תצטרכו את הערכים האלה בהמשך המדריך הזה.
הכנת הסביבה
מורידים את דוגמאות הקוד ומגדירים את הסביבה להרצת ההדרכה.
דוגמאות הקוד במאגר python-docs-samples ב-GitHub מספקות את הקוד שנדרש להרצת צינור הנתונים הזה. כשמוכנים ליצור צינור עיבוד נתונים משלכם, אפשר להשתמש בקוד לדוגמה הזה כתבנית.
כדי להריץ את פרויקט צינור עיבוד הנתונים, יוצרים סביבה וירטואלית מבודדת של Python באמצעות venv. סביבה וירטואלית מאפשרת לבודד את התלות של פרויקט אחד מהתלות של פרויקטים אחרים. מידע נוסף על התקנת Python ויצירת סביבה וירטואלית זמין במאמר הגדרת סביבת פיתוח ב-Python.
משתמשים בפקודה
git cloneכדי לשכפל את מאגר GitHub:git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitמנווטים לספרייה
run-inference:cd python-docs-samples/dataflow/run-inferenceאם אתם משתמשים בשורת פקודה, צריך לוודא ש-Python 3 ו-
pipפועלים במערכת:python --version python -m pip --versionאם צריך, מתקינים את Python 3.
אם אתם משתמשים ב-Cloud Shell, אתם יכולים לדלג על השלב הזה כי Python כבר מותקן ב-Cloud Shell.
יוצרים סביבה וירטואלית של Python:
python -m venv /tmp/env source /tmp/env/bin/activateמתקינים את יחסי התלות:
pip install -r requirements.txt --no-cache-dir
דוגמת קוד לטעינת מודל
קוד טעינת המודל במדריך הזה מפעיל משימה מותאמת אישית של Agent Platform שמעלה את אובייקט state_dict של המודל ל-Cloud Storage.
קובץ ה-Starter נראה כך:
דוגמת קוד של פייפליין
קוד צינור העיבוד במדריך הזה פורס צינור Dataflow שמבצע את הפעולות הבאות:
- קורא הנחיה מ-Pub/Sub ומקודד את הטקסט לטנסורים של טוקנים.
- הפעלת הטרנספורמציה
RunInference. - מפענח את טנסורי טוקני הפלט לטקסט וכותב את התשובה ל-Pub/Sub.
קובץ ה-Starter נראה כך:
טעינת המודל
מודלים גדולים של שפה יכולים להיות מודלים גדולים מאוד. בדרך כלל, מודלים גדולים יותר שאומנו עם יותר פרמטרים מניבים תוצאות טובות יותר. עם זאת, כדי להפעיל מודלים גדולים יותר נדרש מחשב גדול יותר וזיכרון רב יותר. מודלים גדולים יותר יכולים גם לפעול לאט יותר במעבדי CPU.
לפני שמריצים מודל PyTorch ב-Dataflow, צריך לטעון את אובייקט state_dict המודל. אובייקט state_dict של מודל מאחסן את המשקלים של המודל.
בצינור עיבוד נתונים של Dataflow שמשתמש בטרנספורמציה RunInference של Apache Beam, צריך לטעון את אובייקט state_dict של המודל ל-Cloud Storage. למכונה שבה אתם משתמשים כדי לטעון את אובייקט state_dict ל-Cloud Storage צריך להיות מספיק זיכרון כדי לטעון את המודל. בנוסף, המכונה צריכה חיבור מהיר לאינטרנט כדי להוריד את המשקלים ולהעלות אותם ל-Cloud Storage.
בטבלה הבאה מוצג מספר הפרמטרים של כל מודל וזיכרון המינימום שנדרש לטעינת כל מודל.
| דגם | פרמטרים | הזיכרון הנדרש |
|---|---|---|
google/flan-t5-small |
80 מיליון | יותר מ-320MB |
google/flan-t5-base |
250 מיליון | יותר מ-1GB |
google/flan-t5-large |
780 מיליון | יותר מ-3.2GB |
google/flan-t5-xl |
3 מיליארד | יותר מ-12GB |
google/flan-t5-xxl |
11 מיליארד | > 44GB |
google/flan-ul2 |
20 מיליארד | יותר מ-80GB |
אפשר לטעון מודל קטן יותר באופן מקומי, אבל במדריך הזה נסביר איך להפעיל משימה בהתאמה אישית ב-Agent Platform שטוענת את המודל באמצעות מכונה וירטואלית בגודל מתאים.
מכיוון שמודלים גדולים של שפה יכולים להיות גדולים מאוד, בדוגמה שבמדריך הזה האובייקט state_dict נשמר בפורמט float16 במקום בפורמט ברירת המחדל float32.
בשיטה הזו, כל פרמטר משתמש ב-16 ביט במקום ב-32 ביט, כך שהאובייקט state_dict קטן פי שניים. גודל קטן יותר מקצר את הזמן שנדרש לטעינת המודל. עם זאת, המרת הפורמט מחייבת שהמכונה הוירטואלית תתאים גם למודל וגם לאובייקט state_dict בזיכרון.
בטבלה הבאה מוצגות הדרישות המינימליות לטעינת מודל אחרי שמירת האובייקט state_dict בפורמט float16. בטבלה מוצגים גם סוגי המכונות המומלצים לטעינת מודל באמצעות Agent Platform. גודל הדיסק המינימלי (וגודל ברירת המחדל) ל-Agent Platform הוא 100GB, אבל יכול להיות שחלק מהמודלים ידרשו דיסק גדול יותר.
| שם הדגם | הזיכרון הנדרש | סוג המכונה | זיכרון ה-VM | דיסק של מכונה וירטואלית |
|---|---|---|---|---|
google/flan-t5-small |
יותר מ-480 MB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-base |
יותר מ-1.5GB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-large |
יותר מ-4.8GB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-xl |
יותר מ-18 GB | e2-highmem-4 |
32 GB | 100 GB |
google/flan-t5-xxl |
יותר מ-66GB | e2-highmem-16 |
128 GB | 100 GB |
google/flan-ul2 |
יותר מ-120GB | e2-highmem-16 |
128 GB | 150 GB |
טוענים את אובייקט state_dict של המודל ל-Cloud Storage באמצעות משימה בהתאמה אישית ב-Agent Platform:
python download_model.py vertex \
--model-name="MODEL_NAME" \
--state-dict-path="gs://BUCKET_NAME/run-inference/MODEL_NAME.pt" \
--job-name="Load MODEL_NAME" \
--project="PROJECT_ID" \
--bucket="BUCKET_NAME" \
--location="LOCATION" \
--machine-type="AGENT_PLATFORM_MACHINE_TYPE" \
--disk-size-gb="DISK_SIZE_GB"
מחליפים את מה שכתוב בשדות הבאים:
- MODEL_NAME: שם המודל, למשל
google/flan-t5-xl. - AGENT_PLATFORM_MACHINE_TYPE: סוג המכונה שעליה רוצים להריץ את המשימה המותאמת אישית של Agent Platform, לדוגמה
e2-highmem-4. - DISK_SIZE_GB: גודל הדיסק של המכונה הווירטואלית, בגיגה-בייט. הגודל המינימלי הוא 100 GB.
יכול להיות שיעברו כמה דקות עד שהמודל ייטען, בהתאם לגודל שלו. כדי לראות את הסטטוס, עוברים לדף משימות בהתאמה אישית ב-Agent Platform.
הרצת צינור עיבוד הנתונים
אחרי שטוענים את המודל, מריצים את צינור הנתונים של Dataflow. כדי להריץ את צינור העיבוד, גם המודל וגם הזיכרון שבו משתמש כל עובד צריכים להיכנס לזיכרון.
בטבלה הבאה מוצגים סוגי המכונות המומלצים להרצת צינור (pipeline) של הסקת מסקנות.
| שם הדגם | סוג המכונה | זיכרון ה-VM |
|---|---|---|
google/flan-t5-small |
n2-highmem-2 |
16 GB |
google/flan-t5-base |
n2-highmem-2 |
16 GB |
google/flan-t5-large |
n2-highmem-4 |
32 GB |
google/flan-t5-xl |
n2-highmem-4 |
32 GB |
google/flan-t5-xxl |
n2-highmem-8 |
64 GB |
google/flan-ul2 |
n2-highmem-16 |
128 GB |
מריצים את הפייפליין:
python main.py \
--messages-topic="projects/PROJECT_ID/topics/PROMPTS_TOPIC_ID" \
--responses-topic="projects/PROJECT_ID/topics/RESPONSES_TOPIC_ID" \
--model-name="MODEL_NAME" \
--state-dict-path="gs://BUCKET_NAME/run-inference/MODEL_NAME.pt" \
--runner="DataflowRunner" \
--project="PROJECT_ID" \
--temp_location="gs://BUCKET_NAME/temp" \
--region="REGION" \
--machine_type="DATAFLOW_MACHINE_TYPE" \
--requirements_file="requirements.txt" \
--requirements_cache="skip" \
--experiments="use_sibling_sdk_workers" \
--experiments="no_use_multiple_sdk_containers"
מחליפים את מה שכתוב בשדות הבאים:
- PROJECT_ID: מזהה הפרויקט
- PROMPTS_TOPIC_ID: מזהה הנושא של ההנחיות לקלט שיישלחו למודל
- RESPONSES_TOPIC_ID: מזהה הנושא של התגובות של המודל
- MODEL_NAME: שם המודל, למשל
google/flan-t5-xl - BUCKET_NAME: שם הקטגוריה
- REGION: האזור שבו רוצים לפרוס את העבודה, למשל
us-central1 - DATAFLOW_MACHINE_TYPE: המכונה הווירטואלית להרצת צינור העיבוד, למשל
n2-highmem-4
כדי לוודא שהמודל נטען רק פעם אחת לכל עובד ולא נגמר לו הזיכרון, מגדירים את העובדים להשתמש בתהליך יחיד על ידי הגדרת האפשרות --experiments=no_use_multiple_sdk_containers של צינור עיבוד הנתונים. אין צורך להגביל את מספר השרשורים כי טרנספורמציית RunInference חולקת את אותו מודל עם כמה שרשורים.
הצינור בדוגמה הזו פועל עם מעבדים. ככל שהמודל גדול יותר, נדרש יותר זמן לעיבוד כל בקשה. אם אתם צריכים תשובות מהירות יותר, אתם יכולים להפעיל מעבדי GPU.
כדי לראות את הסטטוס של צינור הנתונים, עוברים לדף משימות ב-Dataflow.
לשאול את המודל שאלה
אחרי שהצינור מתחיל לפעול, אתם מספקים הנחיה למודל ומקבלים תשובה.
שולחים את הפרומפט על ידי פרסום הודעה ב-Pub/Sub. משתמשים בפקודה
gcloud pubsub topics publish:gcloud pubsub topics publish PROMPTS_TOPIC_ID \ --message="PROMPT_TEXT"מחליפים את
PROMPT_TEXTבמחרוזת שמכילה את ההנחיה שרוצים לספק. מקיפים את ההנחיה במירכאות.אתם יכולים להשתמש בפרומפט משלכם או לנסות אחת מהדוגמאות הבאות:
Translate to Spanish: My name is LukaComplete this sentence: Once upon a time, there was aSummarize the following text: Dataflow is a Google Cloud service that provides unified stream and batch data processing at scale. Use Dataflow to create data pipelines that read from one or more sources, transform the data, and write the data to a destination.
כדי לקבל את התשובה, משתמשים בפקודה
gcloud pubsub subscriptions pull.בהתאם לגודל המודל, יכול להיות שיעברו כמה דקות עד שהמודל יפיק תשובה. לוקח יותר זמן לפרוס מודלים גדולים יותר וליצור תשובה.
gcloud pubsub subscriptions pull RESPONSES_SUBSCRIPTION_ID --auto-ackמחליפים את
RESPONSES_SUBSCRIPTION_IDבמזהה המינוי של תשובות המודל.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת משאבים בודדים
-
יוצאים מהסביבה הווירטואלית של Python:
deactivate
-
עוצרים את הפייפליין:
-
מציגים את רשימת מזהי המשימות של משימות Dataflow שפועלות, ורושמים את מזהה המשימה של המדריך:
gcloud dataflow jobs list --region=REGION --status=active
-
כדי לבטל את המשימה:
gcloud dataflow jobs cancel JOB_ID --region=REGION
-
-
מחיקת הקטגוריה וכל מה שבתוכה:
gcloud storage rm gs://BUCKET_NAME --recursive
-
מוחקים את הנושאים ואת המינוי:
gcloud pubsub topics delete PROMPTS_TOPIC_ID gcloud pubsub topics delete RESPONSES_TOPIC_ID gcloud pubsub subscriptions delete RESPONSES_SUBSCRIPTION_ID
-
מבטלים את התפקידים שהקציתם לחשבון השירות של Compute Engine שמוגדר כברירת מחדל. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/dataflow.adminroles/dataflow.workerroles/storage.adminroles/pubsub.editorroles/aiplatform.user
gcloud projects remove-iam-policy-binding PROJECT_ID --member=serviceAccount:PROJECT_NUMBER-compute@ --role=SERVICE_ACCOUNT_ROLE
אופציונלי: מבטלים את התפקידים בחשבון Google.
gcloud projects remove-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=roles/iam.serviceAccountUser
-
אם תרצו, תוכלו לבטל את פרטי הכניסה שיצרתם ולמחוק את הקובץ המקומי של פרטי הכניסה.
gcloud auth application-default revoke
-
אם רוצים, מבטלים את פרטי הכניסה של ה-CLI של gcloud.
gcloud auth revoke
המאמרים הבאים
- מידע נוסף על Dataflow ML
- מידע נוסף על RunInference API
- במאמרים בנושא צינורות עיבוד נתונים של AI/ML ב-Apache Beam יש מידע מפורט על שימוש בלמידת מכונה עם Apache Beam.
- עובדים עם מחברת שימוש ב-RunInference ל-AI גנרטיבי.
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.