חלופות ליצירת הפצה של קוד מקור
במדריך הזה נסביר איך ליצור ידנית הפצה של מקור ולהעלות אותה ל-Cloud Storage. לפני שממשיכים לפי המדריך, כדאי לבדוק את תהליכי העבודה החלופיים הבאים, שיכולים להיות נוחים יותר במקרים מסוימים:
אם אתם רוצים להשתמש בקוד כדי לאמן את המודל במחשב המקומי שלכם ולצמצם ככל האפשר את כמות העבודה הידנית שנדרשת לאריזה, מומלץ להשתמש בתכונת האריזה האוטומטית של Google Cloud CLI. התכונה הזו מאפשרת ליצור קובץ אימג' של קונטיינר Docker, להעלות אותו ל-Artifact Registry וליצור משאב
CustomJobעל סמך קובץ האימג' של הקונטיינר, והכול באמצעות פקודה אחת. מידע נוסף זמין במדריך ליצירתCustomJob.כדי להשתמש באריזה אוטומטית, צריך להתקין את Docker במחשב המקומי. האפשרות הזו מאפשרת ליצור רק
CustomJob, ולא משאבTrainingPipelineאוHyperparameterTuningJob. (מידע נוסף על ההבדלים בין משאבי אימון ללא שרת)כדי להתאים אישית את קובץ אימג' של קונטיינר ולהריץ את הקוד בקונטיינר באופן מקומי לפני שמריצים אותו ב-Agent Platform, אפשר להשתמש בפקודה
local-runשל ה-CLI של gcloud כדי להשתמש בקונטיינר לקוד ולהריץ אותו באופן מקומי. לאחר מכן אפשר להעביר את קובץ אימג' של קונטיינר בדחיפה ל-Artifact Registry באופן ידני.כדי להשתמש בפקודה
local-run, צריך להתקין את Docker במחשב המקומי.אם אתם יכולים לכתוב את קוד האימון בסקריפט Python יחיד, אתם יכולים להשתמש ב-Agent Platform SDK for Python, במחלקה
CustomJobכדי ליצור משימה בהתאמה אישית, או במחלקהCustomTrainingJobכדי ליצורTrainingPipelineבהתאמה אישית. קוד האימון שלכם נארז אוטומטית כהפצת מקור ומועלה ל-Cloud Storage.כדי לקבל את הגמישות המרבית, אתם יכולים ליצור ידנית תמונה של מאגר תגים בהתאמה אישית ולהעלות אותה ל-Artifact Registry.
אם אף אחת מהאפשרויות הקודמות לא מתאימה לתרחיש לדוגמה שלכם, או אם אתם מעדיפים לארוז ידנית את אפליקציית האימון שלכם כהפצה של מקור, אתם יכולים לפעול לפי שאר ההוראות במדריך הזה.
לפני שמתחילים
לפני שמכינים את אפליקציית האימון להרצה בענן, צריך לבצע את השלבים הבאים:
מפתחים את אפליקציית האימון באמצעות מסגרת של למידת מכונה (ML) שזמינה באחד מהקונטיינרים המוכנים מראש לאימון של Agent Platform. מוודאים שאפליקציית האימון עומדת בדרישות של קוד האימון.
אם אתם כותבים את אפליקציית האימון מאפס, מומלץ לארגן את הקוד לפי מבנה האפליקציה שמתואר בקטע הבא של המסמך הזה.
יוצרים קטגוריה של Cloud Storage באותו פרויקט Google Cloud שבו מתכננים להשתמש ב-Agent Platform. תאחסנו את אפליקציית האימון בדלי הזה. (אפשר להשתמש בקטגוריה בGoogle Cloud קטגוריה אחרת, אבל זה דורש הגדרה נוספת שלא נכללת בהיקף המדריך הזה).
כדי להשיג את הביצועים הטובים ביותר, צריך לוודא שקטגוריה של Cloud Storage נמצאת במיקום שבו אתם מתכננים להשתמש ב-Agent Platform.
צריך לדעת את כל ספריות Python שהאפליקציה להדרכה תלויה בהן, בין אם מדובר בתלויות מותאמות אישית או בתלויות שזמינות בחינם דרך PyPI.
מבנה האפליקציה
כשמבצעים אימון ללא שרת באמצעות קונטיינר מוכן מראש, צריך לציין את קוד האימון לפי הדרישות הבאות:
צריך לספק את הקוד כהפצות מקוריות של 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מוגדר לשם של הפצת המקור.
versionset to the version number of this build of your source distribution.
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 סוגים של תלויות שאולי תצטרכו להוסיף:
- תלויות Standard, שהן חבילות הפצה נפוצות שזמינות ב-PyPI
- תלויות בהתאמה אישית, כמו חבילות שפיתחתם בעצמכם או חבילות פנימיות לארגון.
בקטעים הבאים מוסבר איך עושים זאת לכל סוג.
יחסי תלות רגילים (PyPI)
אפשר לציין את יחסי התלות הרגילים של האפליקציה כחלק מהסקריפט setup.py שלה. Agent Platform משתמשת ב-pip כדי להתקין את אפליקציית האימון על הרפליקות שהיא מקצה לעבודה שלכם. הפקודה pip install מחפשת יחסי תלות שהוגדרו ומתקינה אותם.
בדוגמה הבאה מוצג setup.py דומה לזה שמופיע בקטע הקודם. עם זאת, setup.py הזה אומר ל-Agent Platform להתקין את 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 Platform משתמשת ב-pip install כדי להתקין יחסי תלות מותאמים אישית, ולכן יכולים להיות להם יחסי תלות סטנדרטיים משלהם בסקריפטים של setup.py.
כל URI שאתם כוללים הוא הנתיב להפצת מקור, בפורמט של קובץ tar (.tar.gz) או wheel (.whl). Agent Platform מתקינה כל תלות באמצעות pip install בכל רפליקה שהיא מקצה למשימת האימון.
אם אתם משתמשים ב-Agent Platform API כדי להתחיל אימון בלי שרת (serverless), צריך לציין את כתובות ה-URI של 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.
המאמרים הבאים
- מידע נוסף על הדרישות של קוד האימון באימון ללא שרתים
- איך יוצרים משימת אימון בלי שרת (serverless) או פייפליין אימון בלי שרת (serverless) שמשתמש באפליקציית האימון שלכם