חלופות ליצירת הפצת מקור
במדריך הזה נסביר איך ליצור ידנית הפצת מקור ולהעלות אותה ל-Cloud Storage. לפני שמתחילים, כדאי לבדוק את תהליכי העבודה החלופיים הבאים, שיכולים להיות נוחים יותר במקרים מסוימים:
אם אתם רוצים לאמן באמצעות קוד במחשב המקומי ולצמצם ככל האפשר את כמות עבודת האריזה הידנית, מומלץ להשתמש בתכונה autopackaging של Google Cloud CLI. התכונה הזו מאפשרת ליצור קובץ אימג' של קונטיינר Docker, להעביר אותו בדחיפה ל-Artifact Registry וליצור משאב
CustomJobשמבוסס על קובץ האימג' של הקונטיינר, והכול באמצעות פקודה אחת. מידע נוסף זמין במדריך ליצירתCustomJob.כדי להשתמש באריזה אוטומטית, צריך להתקין את Docker במחשב המקומי. האפשרות הזו מאפשרת ליצור רק משאב מסוג
CustomJob, ולא משאב מסוגTrainingPipelineאוHyperparameterTuningJob. ההבדלים בין משאבי אימון ללא שרתכדי להתאים אישית את קובץ האימג' של הקונטיינר ולהריץ את הקוד בקונטיינר באופן מקומי לפני שמריצים אותו ב-Agent Platform, אתם יכולים להשתמש בפקודה
local-runשל ה-CLI של gcloud כדי להכניס את הקוד לקונטיינר ולהריץ אותו באופן מקומי. אחר כך תוכלו להעביר את קובץ האימג' באופן ידני ל-Artifact Registry.כדי להשתמש בפקודה
local-run, צריך להתקין את Docker במחשב המקומי.אם אתם יכולים לכתוב את קוד האימון בסקריפט Python אחד, אתם יכולים להשתמש במחלקה
CustomJobשל Agent Platform SDK ל-Python כדי ליצור משימה ייעודית, או במחלקהCustomTrainingJobכדי ליצורTrainingPipelineבהתאמה אישית. קוד האימון נארז באופן אוטומטי כהפצת מקור ומועלה ל-Cloud Storage.כדי ליהנות מגמישות מרבית, אתם יכולים ליצור באופן ידני קובץ אימג' של קונטיינר בהתאמה אישית ולהעביר אותו ל-Artifact Registry.
אם אף אחת מהאפשרויות הקודמות לא מתאימה לתרחיש לדוגמה שלכם, או אם אתם מעדיפים לארוז ידנית את אפליקציית האימון כהפצת מקור, פעלו לפי שאר השלבים במדריך הזה.
לפני שמתחילים
לפני שמכינים את אפליקציית האימון להרצה בענן, צריך לבצע את השלבים הבאים:
מפתחים את אפליקציית האימון באמצעות מסגרת למידת מכונה (ML) שזמינה באחד מהקונטיינרים המוגדרים מראש לאימון ב-Agent Platform. מוודאים שאפליקציית האימון עומדת בדרישות של קוד האימון.
אם אתם כותבים את אפליקציית האימון מאפס, מומלץ לארגן את הקוד לפי מבנה האפליקציה שמתואר בקטע הבא במסמך הזה.
יוצרים קטגוריה של Cloud Storage באותו פרויקט ב- Google Cloud שבו אתם מתכננים להשתמש ב-Agent Platform. בקטגוריה הזו תאחסנו את אפליקציית האימון. (אפשר להשתמש בקטגוריה ב-Google Cloud bucket אחר, אבל זה דורש הגדרה נוספת שלא נכללת במדריך הזה).
כדי להשיג את הביצועים הטובים ביותר, ודאו שהקטגוריה של Cloud Storage נמצאת במיקום שבו אתם מתכננים להשתמש ב-Agent Platform.
אתם צריכים להכיר את כל ספריות Python שבהן תלויה אפליקציית האימון, בין אם מדובר ביחסי תלות בהתאמה אישית ובין אם מדובר ביחסי תלות שזמינים בחינם דרך PyPI.
מבנה האפליקציה
כשמבצעים אימון בלי שרת (serverless) באמצעות קונטיינר מובנה, צריך לציין את קוד האימון בהתאם לדרישות הבאות:
צריך לספק את הקוד כהפצה אחת או יותר של קוד מקור ב-Python.
אם אתם משתמשים ב-Agent Platform API כדי להתחיל אימון בלי שרת (serverless), ציינו את הפרטים האלה בשדה
packageUris.יוצרים מודול באחת מההפצות של קוד המקור, שמשמש כנקודת הכניסה לאימון.
אם אתם משתמשים ב-Agent Platform API כדי להתחיל אימון בהתאמה אישית, ציינו את זה בשדה
pythonModule.
כל עוד אתם עומדים בדרישות האלה, אתם יכולים לבנות את אפליקציית האימון בכל דרך שתרצו. עם זאת, מומלץ ליצור הפצה אחת של קוד מקור ב-Python על ידי ארגון הקוד במבנה הבא (שמשמש לעיתים קרובות בדוגמאות של Agent Platform):
משתמשים בספריית הפרויקט הראשית, שמכילה את הקובץ
setup.py. בקטע הבא מוסבר מה צריך להיות בקובץ הזה.בספריית הפרויקט הראשית, יוצרים ספריית משנה בשם
trainer/שתשמש כחבילה הראשית של קוד האימון.בתוך
trainer/, יוצרים מודול בשםtask.pyשמשמש כנקודת הכניסה לקוד האימון.כדי לתמוך ב-
trainer/task.py, יוצרים מודולים נוספים של Python שרוצים בחבילהtrainer/, ויוצרים תיקיות משנה נוספות עם הקוד הנוסף שרוצים בתיקיית הפרויקט הראשית.יוצרים קובץ
__init__.pyבכל ספריית משנה כדי להפוך אותה לחבילה.
ההנחה בשאר המדריך היא שהקוד שלכם מאורגן לפי המבנה הזה.
יצירת הפצה של מקורות
יצירת הפצות של קוד מקור ב-Python היא נושא רחב, שרובו לא נכלל במסמך הזה. כדי להקל עליכם, בחלק הזה מוסבר איך להשתמש ב-Setuptools כדי ליצור הפצת מקור לשימוש עם Agent Platform. יש ספריות אחרות שאפשר להשתמש בהן כדי לעשות את אותו הדבר.
יוצרים קובץ
setup.pyשמנחה את Setuptools איך ליצור את הפצת המקור.setup.pyבסיסי כולל:הצהרות ייבוא של
setuptools.find_packagesו-setuptools.setup.קריאה ל-
setuptools.setupעם הפרמטרים הבאים (לפחות):
nameמוגדר לשם של הפצת המקור.versionמוגדר למספר הגרסה של ה-build הזה של הפצת המקור.install_requiresמוגדר לרשימה של יחסי תלות שנדרשים לאפליקציה, עם דרישות גרסה, כמו'docutils>=0.3'.packagesהוגדרה לערךfind_packages(). הפקודה הזו מורה ל-Setuptools לכלול את כל תיקיות המשנה של תיקיית האם שמכילות קובץ__init__.pyבתור חבילות.include_package_dataהוגדרה לערךTrue.
הדוגמה הבאה מציגה קובץ
setup.pyבסיסי לאפליקציית אימון:from setuptools import find_packages from setuptools import setup setup( name='trainer', version='0.1', packages=find_packages(), include_package_data=True, description='My training application.' )מריצים את הפקודה הבאה כדי ליצור הפצת מקור,
dist/trainer-0.1.tar.gz:python setup.py sdist --formats=gztar
יחסי תלות של אפליקציות ב-Python
יחסי תלות הם חבילות שאתם import בקוד שלכם. יכול להיות שהאפליקציה שלכם תלויה בהרבה דברים כדי לפעול.
לכל רפליקה במשימת האימון ללא שרת, הקוד פועל בקונטיינר שבו כבר מותקנים יחסי תלות נפוצים רבים של Python. בודקים את יחסי התלות שכלולים במאגר המובנה שבו אתם מתכננים להשתמש לאימון, ומציינים את יחסי התלות שעדיין לא מותקנים. צריך לבצע את השלבים הבאים רק בשביל יחסי תלות שלא מותקנים כבר בקונטיינר שנוצר מראש.
יש 2 סוגים של יחסי תלות שאולי תצטרכו להוסיף:
- יחסי תלות רגילים, שהם חבילות הפצה נפוצות שזמינות ב-PyPI
- תלויות בהתאמה אישית, כמו חבילות שפיתחתם בעצמכם או חבילות פנימיות בארגון.
בקטעים הבאים מתואר התהליך לכל סוג.
יחסי תלות רגילים (PyPI)
אפשר לציין את יחסי התלות הרגילים של האפליקציה כחלק מהסקריפט setup.py שלה. פלטפורמת הסוכן משתמשת ב-pip כדי להתקין את אפליקציית האימון ברפליקות שהיא מקצה למשימה. הפקודה pip install מחפשת את יחסי התלות שהוגדרו ומתקינה אותם.
בדוגמה הבאה מוצג setup.py שדומה לזה שבקטע הקודם. עם זאת, ה-setup.py הזה מורה לפלטפורמת הסוכנים להתקין את some_PyPI_package כשהיא מתקינה את אפליקציית האימון:
from setuptools import find_packages
from setuptools import setup
REQUIRED_PACKAGES = ['some_PyPI_package>=1.0']
setup(
name='trainer',
version='0.1',
install_requires=REQUIRED_PACKAGES,
packages=find_packages(),
include_package_data=True,
description='My training application.'
)
יחסי תלות בהתאמה אישית
כדי לציין את יחסי התלות המותאמים אישית של האפליקציה, אתם יכולים להעביר את הנתיבים שלהם כחלק מהגדרת המשימה. אתם צריכים את ה-URI של הפצת המקור של כל תלות. יחסי התלות בהתאמה אישית צריכים להיות במיקום ב-Cloud Storage. פלטפורמת Agent משתמשת ב-pip install כדי להתקין יחסי תלות בהתאמה אישית, כך שיכולים להיות להם יחסי תלות סטנדרטיים משלהם בסקריפטים של setup.py.
כל URI שאתם כוללים הוא הנתיב להפצת מקור, בפורמט של קובץ tar (.tar.gz) או wheel (.whl). פלטפורמת הסוכנים מתקינה כל תלות באמצעות pip install בכל רפליקה שהיא מקצה למשימת האימון.
אם אתם משתמשים ב-Agent Platform API כדי להתחיל אימון ללא שרת (serverless), ציינו את ה-URIs של Cloud Storage ליחסי התלות האלה, יחד עם אפליקציית האימון, בשדה packageUris.
מודולים של Python
האפליקציה יכולה להכיל כמה מודולים (קובצי Python). אתם צריכים לזהות את המודול שמכיל את נקודת הכניסה של האפליקציה. שירות האימון מריץ את המודול הזה על ידי הפעלת Python, בדיוק כמו שהייתם מריצים אותו באופן מקומי.
לדוגמה, אם פעלתם לפי המבנה המומלץ בקטע הקודם, המודול הראשי הוא task.py. מכיוון שהוא נמצא בתוך חבילת ייבוא (ספרייה עם קובץ __init__.py) בשם trainer, השם המלא של המודול הזה הוא trainer.task. לכן, אם אתם משתמשים ב-Agent Platform API כדי להתחיל אימון בהתאמה אישית, הגדירו את השדה moduleName לערך trainer.task.
מידע נוסף על מודולים זמין במדריך של Python לחבילות.
העלאת הפצת המקור ל-Cloud Storage
אתם יכולים להשתמש ב-ה-CLI של gcloud כדי להעלות את הפצת המקור וכל יחסי תלות מותאמים אישית לקטגוריה של Cloud Storage. לדוגמה:
gcloud storage cp dist/trainer-0.1.tar.gz CLOUD_STORAGE_DIRECTORY
מחליפים את CLOUD_STORAGE_DIRECTORY ב-URI (שמתחיל ב-gs:// ומסתיים ב-/) של ספריית Cloud Storage בקטגוריה שלפרויקטGoogle Cloud יש גישה אליה.
כדי ללמוד על דרכים אחרות להעלות את הפצת המקור ל-Cloud Storage, קראו את המאמר העלאת אובייקטים במסמכי התיעוד של Cloud Storage.
מעבר מ-python_package_spec ל-container_spec
ההגדרה PythonPackageSpec (executorImageUri) מקבלת רק קונטיינרים לאימון שנבנו מראש ונתמכים באופן רשמי. אם המסגרת או סביבת זמן הריצה הגיעו לסוף הזמינות (EOA), כמו scikit-learn או XGBoost, או אם אתם צריכים גרסאות חדשות יותר של Python (כמו Python 3.11 ואילך) וספריות מערכת חיצוניות, העבירו את עומס העבודה של האימון לשימוש ב-ContainerSpec.
בניגוד ל-python_package_spec, ב-ContainerSpec אין שדות של package_uris או python_module.
כדי להעביר את עומס העבודה ל-container_spec, בוחרים באחת מהגישות הבאות:
שמירת החבילות ב-Cloud Storage: מעבירים את ה-URI של החבילה דרך
argsאוenvלסקריפט של נקודת כניסה בקונטיינר שמוריד את החבילה, מתקין אותה באמצעותpipומריץ אתpython -m <module>.לדוגמה, בסקריפט של נקודת הכניסה של הקונטיינר:
#!/usr/bin/env bash set -e PACKAGE_URI="$1" MODULE_NAME="$2" shift 2 gcloud storage cp "${PACKAGE_URI}" ./package.tar.gz pip install --no-cache-dir ./package.tar.gz python -m "${MODULE_NAME}" "$@"הטמעת הקוד בקובץ האימג': לחלופין, אתם יכולים להעתיק את קובצי אפליקציית האימון ואת יחסי התלות ישירות לקובץ האימג' של Docker בזמן היצירה (לדוגמה, באמצעות
COPYו-pip installב-Dockerfile) ולהגדיר את נקודת הכניסה ישירות בקובץ האימג'.
המאמרים הבאים
- מידע נוסף על דרישות קוד האימון לאימון ללא שרת
- איך יוצרים משימת אימון בלי שרת (serverless) או פייפליין לאימון בלי שרת (serverless) שמשתמש באפליקציית האימון.