יצירת משימת כוונון של היפר-פרמטרים

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

מידע נוסף על כוונון היפרפרמטרים ב-Gemini Enterprise Agent Platform לדוגמה מפורטת, אפשר לעיין ב-Agent Platform: Hyperparameter Tuning codelab.

בדף הזה נסביר איך:

הכנת בקשת ההדרכה

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

בקטעים הבאים מוסבר על:

  • איך Agent Platform מעבירה היפר-פרמטרים לאפליקציית האימון.
  • אפשרויות להעברת מדדים מאפליקציית האימון ל-Agent Platform.

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

טיפול בארגומנטים של שורת הפקודה עבור ההיפר-פרמטרים שרוצים לכוונן

Agent Platform מגדירה ארגומנטים של שורת פקודה כשהיא קוראת לאפליקציית ההדרכה. משתמשים בארגומנטים של שורת הפקודה בקוד:

  1. מגדירים שם לכל ארגומנט של היפר-פרמטר ומנתחים אותו באמצעות מנתח הארגומנטים המועדף, כמו argparse. משתמשים באותם שמות של ארגומנטים כשמגדירים את משימת האימון של ההיפר-פרמטרים.

    לדוגמה, אם אפליקציית האימון היא מודול Python בשם my_trainer ואתם מכווננים היפר-פרמטר בשם learning_rate, Agent Platform מתחילה כל ניסיון בפקודה כמו הבאה:

    python3 -m my_trainer --learning_rate learning-rate-in-this-trial
    

    ‫Agent Platform קובע את learning-rate-in-this-trial ומעביר אותו באמצעות הארגומנט learning_rate.

  2. מקצים את הערכים מהארגומנטים של שורת הפקודה להיפרפרמטרים בקוד האימון.

מידע נוסף על הדרישות לניתוח ארגומנטים בשורת הפקודה

דיווח על המדדים ל-Agent Platform

כדי לדווח על המדדים שלכם ל-Agent Platform, צריך להשתמש בcloudml-hypertuneחבילת Python. הספרייה הזו מספקת פונקציות עזר לדיווח על מדדים ל-Agent Platform.

מידע נוסף על דיווח על מדדי היפרפרמטרים

יצירת משימת כוונון של היפר-פרמטרים

בהתאם לכלי שבו רוצים להשתמש כדי ליצור HyperparameterTuningJob, בוחרים באחת מהכרטיסיות הבאות:

המסוף

במסוף Google Cloud , אי אפשר ליצור משאב HyperparameterTuningJob ישירות. עם זאת, אפשר ליצור משאב TrainingPipeline שיוצר HyperparameterTuningJob.

בהוראות הבאות מוסבר איך ליצור TrainingPipeline שיוצר HyperparameterTuningJob ולא עושה שום דבר אחר. אם אתם רוצים להשתמש בתכונות נוספות של TrainingPipeline, כמו אימון עם מערך נתונים מנוהל, תוכלו לקרוא את המאמר יצירת צינורות אימון.

  1. במסוף Google Cloud , בקטע Agent Platform, עוברים לדף Training pipelines.

    מעבר אל Training pipelines

  2. לוחצים על יצירה כדי לפתוח את החלונית אימון מודל חדש.

  3. בשלב שיטת האימון, מציינים את ההגדרות הבאות:

    1. ברשימה הנפתחת Dataset (קבוצת נתונים), בוחרים באפשרות No managed dataset (אין קבוצת נתונים מנוהלת).

    2. בוחרים באפשרות אימון מותאם אישית (מתקדם).

    לוחצים על Continue.

  4. בשלב פרטי המודל, בוחרים באפשרות אימון מודל חדש או אימון גרסה חדשה. אם בוחרים באפשרות 'אימון מודל חדש', מזינים שם לבחירה, MODEL_NAME, למודל. לוחצים על המשך.

  5. בשלב Training container (מאגר תגים לאימון), מציינים את ההגדרות הבאות:

    1. בוחרים אם להשתמש במאגר תגים מוכן מראש או במאגר תגים בהתאמה אישית להדרכה.

    2. בהתאם לבחירה, מבצעים אחת מהפעולות הבאות:

    3. בשדה Model output directory (ספריית פלט של המודל), אפשר לציין את ה-URI של Cloud Storage של ספרייה בקטגוריה שיש לכם גישה אליה. הספרייה לא צריכה להתקיים עדיין.

      הערך הזה מועבר אל Agent Platform בשדה baseOutputDirectory API, שקובע כמה משתני סביבה שאפליקציית האימון יכולה לגשת אליהם כשהיא פועלת.

    4. אופציונלי: בשדה Arguments (ארגומנטים), אפשר לציין ארגומנטים לשימוש בפלטפורמת הסוכנים כשהיא מתחילה להריץ את קוד ההכשרה. האורך המקסימלי של כל הארגומנטים ביחד הוא 100,000 תווים. ההתנהגות של הארגומנטים האלה שונה בהתאם לסוג מאגר התגים שבו אתם משתמשים:

    לוחצים על Continue.

  6. בשלב Hyperparameter tuning (התאמת היפרפרמטרים), מסמנים את התיבה Enable hyperparameter tuning (הפעלת התאמת היפרפרמטרים) ומציינים את ההגדרות הבאות:

    1. בקטע New Hyperparameter (היפרפרמטר חדש), מציינים את Parameter name (שם הפרמטר) ואת Type (הסוג) של ההיפרפרמטר שרוצים לכוונן. בהתאם לסוג שתציינו, תצטרכו להגדיר את ההגדרות הנוספות של ההיפרפרמטרים שיופיעו.

      מידע נוסף על סוגי היפרפרמטרים וההגדרות שלהם

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

      חוזרים על הפעולה הזו לכל היפרפרמטר שרוצים לכוון.

    3. בשדה Metric to optimize וברשימה הנפתחת Goal, מציינים את השם והיעד של המדד שרוצים לבצע לו אופטימיזציה.

    4. בשדה Maximum number of trials (מספר הניסויים המקסימלי), מציינים את מספר הניסויים המקסימלי שרוצים שהפלטפורמה של הסוכנים תריץ עבור משימת ההתאמה של ההיפרפרמטרים.

    5. בשדה Maximum number of parallel trials (מספר מקסימלי של ניסויים מקבילים), מציינים את המספר המקסימלי של ניסויים ש-Agent Platform יכולה להריץ בו-זמנית.

    6. ברשימה הנפתחת Search algorithm, מציינים search algorithm לשימוש ב-Agent Platform.

    7. אין צורך להפעיל את המתג הפעלת עצירה מוקדמת, כי הוא לא משפיע על התוצאות.

    לוחצים על Continue.

  7. בשלב Compute and pricing (חישוב ותמחור), מציינים את ההגדרות הבאות:

    1. בתפריט הנפתח Region, בוחרים באפשרות region that supports custom training (אזור שתומך באימון מותאם אישית).

    2. בקטע Worker pool 0, מציינים את משאבי המחשוב שבהם רוצים להשתמש לאימון.

      אם מציינים מאיצים, צריך לוודא שסוג המאיץ שנבחר זמין באזור שנבחר.

      אם רוצים לבצע אימון מבוזר, לוחצים על Add more worker pools (הוספת עוד מאגרי עובדים) ומציינים קבוצה נוספת של משאבי מחשוב לכל מאגר עובדים נוסף שרוצים להוסיף.

    לוחצים על Continue.

  8. בשלב Prediction container (מאגר תגים של תחזיות), בוחרים באפשרות No prediction container (אין מאגר תגים של תחזיות).

  9. כדי להפעיל את פייפליין האימון בלי שרת (serverless), לוחצים על Start training (התחלת אימון).

gcloud

בשלבים הבאים מוסבר איך להשתמש ב-Google Cloud CLI כדי ליצור HyperparameterTuningJob עם הגדרה מינימלית יחסית. כדי לקבל מידע על כל אפשרויות ההגדרה שאפשר להשתמש בהן למשימה הזו, אפשר לעיין במסמכי העזרה של הפקודה gcloud ai hp-tuning-jobs create ושל משאב ה-API ‏HyperparameterTuningJob.

  1. יוצרים קובץ YAML בשם config.yaml עם כמה שדות API שרוצים לציין עבור HyerparameterTuningJob החדש:

    config.yaml
    studySpec:
      metrics:
      - metricId: METRIC_ID
        goal: METRIC_GOAL
      parameters:
      - parameterId: HYPERPARAMETER_ID
        doubleValueSpec:
          minValue: DOUBLE_MIN_VALUE
          maxValue: DOUBLE_MAX_VALUE
    trialJobSpec:
      workerPoolSpecs:
        - machineSpec:
            machineType: MACHINE_TYPE
          replicaCount: 1
          containerSpec:
            imageUri: CUSTOM_CONTAINER_IMAGE_URI
    

    מחליפים את מה שכתוב בשדות הבאים:

  2. באותה ספרייה שבה נמצא הקובץ config.yaml, מריצים את פקודת ה-Shell הבאה:

    gcloud ai hp-tuning-jobs create \
        --region=LOCATION \
        --display-name=DISPLAY_NAME \
        --max-trial-count=MAX_TRIAL_COUNT \
        --parallel-trial-count=PARALLEL_TRIAL_COUNT \
        --config=config.yaml
    

    מחליפים את מה שכתוב בשדות הבאים:

REST

בדוגמת הקוד הבאה מוסבר איך ליצור משימת כוונון של היפר-פרמטרים באמצעות השיטה create של המשאב hyperparameterTuningJob.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • LOCATION: האזור שבו רוצים ליצור את HyperparameterTuningJob. להשתמש באזור שתומך באימון ללא שרת.
  • PROJECT: מזהה הפרויקט.
  • DISPLAY_NAME: שם תצוגה קליט לבחירתכם עבור HyperparameterTuningJob. מידע נוסף זמין במאמר בנושא משאב REST.
  • מציינים את המדדים:
  • מציינים את ההיפרפרמטרים:
    • HYPERPARAMETER_ID: השם של היפר-פרמטר שרוצים לכוון. קוד האימון צריך לנתח דגל של שורת פקודה עם השם הזה.
    • PARAMETER_SCALE: (אופציונלי) איך צריך לשנות את קנה המידה של הפרמטר. אם הפרמטר הוא מסוג CATEGORICAL, לא צריך להגדיר את הערך הזה. הערכים האפשריים הם UNIT_LINEAR_SCALE, ‏ UNIT_LOG_SCALE, ‏ UNIT_REVERSE_LOG_SCALE או SCALE_TYPE_UNSPECIFIED.
    • אם סוג ההיפרפרמטר הזה הוא DOUBLE, מציינים את הערכים המינימלי (DOUBLE_MIN_VALUE) והמקסימלי (DOUBLE_MAX_VALUE) של ההיפרפרמטר הזה.
    • אם הסוג של ההיפר-פרמטר הזה הוא INTEGER, מציינים את הערכים המינימלי (INTEGER_MIN_VALUE) והמקסימלי (INTEGER_MAX_VALUE) של ההיפר-פרמטר הזה.
    • אם סוג ההיפרפרמטר הזה הוא CATEGORICAL, מציינים את הערכים הקבילים (CATEGORICAL_VALUES) כמערך של מחרוזות.
    • אם סוג ההיפרפרמטר הזה הוא DISCRETE, מציינים את הערכים הקבילים (DISCRETE_VALUES) כמערך של מספרים.
    • מציינים היפרפרמטרים מותנים. היפרפרמטרים מותנים מתווספים לניסוי כשערך ההיפרפרמטר הראשי תואם לתנאי שציינתם. מידע נוסף על היפרפרמטרים מותנים
      • CONDITIONAL_PARAMETER: ParameterSpec של הפרמטר המותנה. המפרט הזה כולל את שם הפרמטר, קנה המידה, טווח הערכים וכל הפרמטרים המותנים שתלויים בהיפרפרמטר הזה.
      • אם הסוג של היפרפרמטר האב הוא INTEGER, צריך לציין רשימה של מספרים שלמים בתור INTEGERS_TO_MATCH. אם הערך של היפרפרמטר האב תואם לאחד מהערכים שצוינו, הפרמטר המותנה הזה יתווסף לניסוי.
      • אם הסוג של פרמטר ההורה הוא CATEGORICAL, מציינים רשימה של קטגוריות בתור CATEGORIES_TO_MATCH. אם הערך של פרמטר ההורה תואם לאחד מהערכים שצוינו, הפרמטר המותנה הזה מתווסף לניסוי.
      • אם סוג הפרמטר ההיפר-פרמטר של ההורה הוא DISCRETE, צריך לציין רשימה של מספרים שלמים בתור DISCRETE_VALUES_TO_MATCH. אם הערך של ההיפרפרמטר הראשי תואם לאחד מהערכים שצוינו, הפרמטר המותנה הזה יתווסף לניסוי.
  • ALGORITHM: (אופציונלי). אלגוריתם החיפוש שבו יש להשתמש במשימת כוונון ההיפר-פרמטרים הזו. הערכים האפשריים הם: יכול להיות ALGORITHM_UNSPECIFIED, GRID_SEARCH או RANDOM_SEARCH.
  • MAX_TRIAL_COUNT: המספר המקסימלי של ניסיונות להרצה.
  • PARALLEL_TRIAL_COUNT: המספר המקסימלי של ניסויים להרצה במקביל.
  • MAX_FAILED_TRIAL_COUNT: מספר המשימות שיכולות להיכשל לפני שמשימת כוונון ההיפר-פרמטר נכשלת.
  • מגדירים את משימת ההכשרה המותאמת אישית של תקופת הניסיון:
    • MACHINE_TYPE: סוג המכונה הווירטואלית שבה רוצים להשתמש לאימון.
    • ACCELERATOR_TYPE: (אופציונלי). סוג המאיץ לצירוף לכל תקופת ניסיון.
    • ACCELERATOR_COUNT: (אופציונלי). מספר המאיצים לצירוף לכל תקופת ניסיון.
    • REPLICA_COUNT: מספר העותקים המשוכפלים של העובדים שבהם יש להשתמש בכל ניסיון.
    • אם אפליקציית האימון פועלת בקונטיינר בהתאמה אישית, צריך לציין את הפרטים הבאים:
      • CUSTOM_CONTAINER_IMAGE_URI: ה-URI של קובץ אימג' של קונטיינר Docker עם קוד האימון. איך יוצרים קובץ אימג' של קונטיינר בהתאמה אישית
      • CUSTOM_CONTAINER_COMMAND: (אופציונלי). הפקודה שתופעל כשהקונטיינר יופעל. הפקודה הזו מבטלת את נקודת הכניסה שמוגדרת כברירת מחדל במאגר.
      • CUSTOM_CONTAINER_ARGS: (אופציונלי). הארגומנטים שיועברו כשמפעילים את הקונטיינר.
    • אם אפליקציית האימון היא חבילת Python שפועלת בקונטיינר מוכן מראש, צריך לציין את הפרטים הבאים:
      • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: ה-URI של קובץ אימג' של קונטיינר שמריץ את חבילת ה-Python שצוינה. מידע נוסף על קונטיינרים מוכנים מראש לאימון
      • PYTHON_PACKAGE_URIS: המיקום ב-Cloud Storage של קובצי חבילת Python, שהם תוכנית האימון והחבילות שתלויות בה. המספר המקסימלי של כתובות ה-URI של החבילות הוא 100.
      • PYTHON_MODULE: השם של מודול Python להפעלה אחרי התקנת החבילות.
      • PYTHON_PACKAGE_ARGS: (אופציונלי). ארגומנטים בשורת הפקודה שיועברו אל מודול Python.
    • SERVICE_ACCOUNT: (אופציונלי). חשבון השירות שבו Agent Platform ישתמש כדי להריץ את הקוד. מידע נוסף על צירוף חשבון שירות בהתאמה אישית
    • TIMEOUT: (אופציונלי). זמן הריצה המקסימלי לכל תקופת ניסיון.
  • מציינים את LABEL_NAME ואת LABEL_VALUE לכל התוויות שרוצים להחיל על משימה זו של כוונון היפר-פרמטרים.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/hyperparameterTuningJobs

תוכן בקשת JSON:

{
  "displayName": DISPLAY_NAME,
  "studySpec": {
    "metrics": [
      {
        "metricId": METRIC_ID,
        "goal": METRIC_GOAL
      }
    ],
    "parameters": [
      {
        "parameterId": PARAMETER_ID,
        "scaleType": PARAMETER_SCALE,

        // Union field parameter_value_spec can be only one of the following:
        "doubleValueSpec": {
            "minValue": DOUBLE_MIN_VALUE,
            "maxValue": DOUBLE_MAX_VALUE
        },
        "integerValueSpec": {
            "minValue": INTEGER_MIN_VALUE,
            "maxValue": INTEGER_MAX_VALUE
        },
        "categoricalValueSpec": {
            "values": [
              CATEGORICAL_VALUES
            ]
        },
        "discreteValueSpec": {
            "values": [
              DISCRETE_VALUES
            ]
        }
        // End of list of possible types for union field parameter_value_spec.

        "conditionalParameterSpecs": [
            "parameterSpec": {
              CONDITIONAL_PARAMETER
            }

            // Union field parent_value_condition can be only one of the following:
            "parentIntValues": {
                "values": [INTEGERS_TO_MATCH]
            }
            "parentCategoricalValues": {
                "values": [CATEGORIES_TO_MATCH]
            }
            "parentDiscreteValues": {
                "values": [DISCRETE_VALUES_TO_MATCH]
            }
            // End of list of possible types for union field parent_value_condition.
        ]
      }
    ],
    "ALGORITHM": ALGORITHM
  },
  "maxTrialCount": MAX_TRIAL_COUNT,
  "parallelTrialCount": PARALLEL_TRIAL_COUNT,
  "maxFailedTrialCount": MAX_FAILED_TRIAL_COUNT,
  "trialJobSpec": {
      "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      },
      "serviceAccount": SERVICE_ACCOUNT
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "name": "projects/12345/locations/us-central1/hyperparameterTuningJobs/6789",
  "displayName": "myHyperparameterTuningJob",
  "studySpec": {
    "metrics": [
      {
        "metricId": "myMetric",
        "goal": "MINIMIZE"
      }
    ],
    "parameters": [
      {
        "parameterId": "myParameter1",
        "integerValueSpec": {
          "minValue": "1",
          "maxValue": "128"
        },
        "scaleType": "UNIT_LINEAR_SCALE"
      },
      {
        "parameterId": "myParameter2",
        "doubleValueSpec": {
          "minValue": 1e-07,
          "maxValue": 1
        },
        "scaleType": "UNIT_LINEAR_SCALE"
      }
    ],
    "ALGORITHM": "RANDOM_SEARCH"
  },
  "maxTrialCount": 20,
  "parallelTrialCount": 1,
  "trialJobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-4"
        },
        "replicaCount": "1",
        "pythonPackageSpec": {
          "executorImageUri": "us-docker.pkg.dev/vertex-ai/training/training-tf-cpu.2-1:latest",
          "packageUris": [
            "gs://my-bucket/my-training-application/trainer.tar.bz2"
          ],
          "pythonModule": "my-trainer.trainer"
        }
      }
    ]
  }
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.CustomJobSpec;
import com.google.cloud.aiplatform.v1.HyperparameterTuningJob;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.PythonPackageSpec;
import com.google.cloud.aiplatform.v1.StudySpec;
import com.google.cloud.aiplatform.v1.StudySpec.MetricSpec;
import com.google.cloud.aiplatform.v1.StudySpec.MetricSpec.GoalType;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ConditionalParameterSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ConditionalParameterSpec.DiscreteValueCondition;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.DiscreteValueSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.DoubleValueSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ScaleType;
import com.google.cloud.aiplatform.v1.WorkerPoolSpec;
import java.io.IOException;
import java.util.Arrays;

public class CreateHyperparameterTuningJobPythonPackageSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String executorImageUri = "EXECUTOR_IMAGE_URI";
    String packageUri = "PACKAGE_URI";
    String pythonModule = "PYTHON_MODULE";
    createHyperparameterTuningJobPythonPackageSample(
        project, displayName, executorImageUri, packageUri, pythonModule);
  }

  static void createHyperparameterTuningJobPythonPackageSample(
      String project,
      String displayName,
      String executorImageUri,
      String packageUri,
      String pythonModule)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient client = JobServiceClient.create(settings)) {
      // study spec
      MetricSpec metric =
          MetricSpec.newBuilder().setMetricId("val_rmse").setGoal(GoalType.MINIMIZE).build();

      // decay
      DoubleValueSpec doubleValueSpec =
          DoubleValueSpec.newBuilder().setMinValue(1e-07).setMaxValue(1).build();
      ParameterSpec parameterDecaySpec =
          ParameterSpec.newBuilder()
              .setParameterId("decay")
              .setDoubleValueSpec(doubleValueSpec)
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .build();
      Double[] decayValues = {32.0, 64.0};
      DiscreteValueCondition discreteValueDecay =
          DiscreteValueCondition.newBuilder().addAllValues(Arrays.asList(decayValues)).build();
      ConditionalParameterSpec conditionalParameterDecay =
          ConditionalParameterSpec.newBuilder()
              .setParameterSpec(parameterDecaySpec)
              .setParentDiscreteValues(discreteValueDecay)
              .build();

      // learning rate
      ParameterSpec parameterLearningSpec =
          ParameterSpec.newBuilder()
              .setParameterId("learning_rate")
              .setDoubleValueSpec(doubleValueSpec) // Use the same min/max as for decay
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .build();

      Double[] learningRateValues = {4.0, 8.0, 16.0};
      DiscreteValueCondition discreteValueLearning =
          DiscreteValueCondition.newBuilder()
              .addAllValues(Arrays.asList(learningRateValues))
              .build();
      ConditionalParameterSpec conditionalParameterLearning =
          ConditionalParameterSpec.newBuilder()
              .setParameterSpec(parameterLearningSpec)
              .setParentDiscreteValues(discreteValueLearning)
              .build();

      // batch size
      Double[] batchSizeValues = {4.0, 8.0, 16.0, 32.0, 64.0, 128.0};

      DiscreteValueSpec discreteValueSpec =
          DiscreteValueSpec.newBuilder().addAllValues(Arrays.asList(batchSizeValues)).build();
      ParameterSpec parameter =
          ParameterSpec.newBuilder()
              .setParameterId("batch_size")
              .setDiscreteValueSpec(discreteValueSpec)
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .addConditionalParameterSpecs(conditionalParameterDecay)
              .addConditionalParameterSpecs(conditionalParameterLearning)
              .build();

      // trial_job_spec
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-4")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_T4)
              .setAcceleratorCount(1)
              .build();

      PythonPackageSpec pythonPackageSpec =
          PythonPackageSpec.newBuilder()
              .setExecutorImageUri(executorImageUri)
              .addPackageUris(packageUri)
              .setPythonModule(pythonModule)
              .build();

      WorkerPoolSpec workerPoolSpec =
          WorkerPoolSpec.newBuilder()
              .setMachineSpec(machineSpec)
              .setReplicaCount(1)
              .setPythonPackageSpec(pythonPackageSpec)
              .build();

      StudySpec studySpec =
          StudySpec.newBuilder()
              .addMetrics(metric)
              .addParameters(parameter)
              .setAlgorithm(StudySpec.Algorithm.RANDOM_SEARCH)
              .build();
      CustomJobSpec trialJobSpec =
          CustomJobSpec.newBuilder().addWorkerPoolSpecs(workerPoolSpec).build();
      // hyperparameter_tuning_job
      HyperparameterTuningJob hyperparameterTuningJob =
          HyperparameterTuningJob.newBuilder()
              .setDisplayName(displayName)
              .setMaxTrialCount(4)
              .setParallelTrialCount(2)
              .setStudySpec(studySpec)
              .setTrialJobSpec(trialJobSpec)
              .build();
      LocationName parent = LocationName.of(project, location);
      HyperparameterTuningJob response =
          client.createHyperparameterTuningJob(parent, hyperparameterTuningJob);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

from google.cloud import aiplatform

from google.cloud.aiplatform import hyperparameter_tuning as hpt


def create_hyperparameter_tuning_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    container_uri: str,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    worker_pool_specs = [
        {
            "machine_spec": {
                "machine_type": "n1-standard-4",
                "accelerator_type": "NVIDIA_TESLA_K80",
                "accelerator_count": 1,
            },
            "replica_count": 1,
            "container_spec": {
                "image_uri": container_uri,
                "command": [],
                "args": [],
            },
        }
    ]

    custom_job = aiplatform.CustomJob(
        display_name='custom_job',
        worker_pool_specs=worker_pool_specs,
    )

    hpt_job = aiplatform.HyperparameterTuningJob(
        display_name=display_name,
        custom_job=custom_job,
        metric_spec={
            'loss': 'minimize',
        },
        parameter_spec={
            'lr': hpt.DoubleParameterSpec(min=0.001, max=0.1, scale='log'),
            'units': hpt.IntegerParameterSpec(min=4, max=128, scale='linear'),
            'activation': hpt.CategoricalParameterSpec(values=['relu', 'selu']),
            'batch_size': hpt.DiscreteParameterSpec(values=[128, 256], scale='linear')
        },
        max_trial_count=128,
        parallel_trial_count=8,
        labels={'my_key': 'my_value'},
    )

    hpt_job.run()

    print(hpt_job.resource_name)
    return hpt_job

הגדרת משימת אימון של היפר-פרמטרים

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

כשמגדירים משימת כוונון של היפר-פרמטר, צריך לציין את הפרטים הבאים:

הגבלת מספר תקופות הניסיון

מחליטים כמה ניסויים רוצים לאפשר לשירות להריץ ומגדירים את הערך maxTrialCount באובייקט HyperparameterTuningJob.

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

  • זמן (ולכן גם עלות)
  • דיוק

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

כדי להפיק את המרב מהתאמת היפרפרמטרים, לא מומלץ להגדיר ערך מקסימלי שהוא נמוך מפי עשרה ממספר ההיפרפרמטרים שבהם אתם משתמשים.

ניסויים מקבילים

אפשר לציין כמה ניסויים יכולים לפעול במקביל על ידי הגדרת parallelTrialCount ב-HyperparameterTuningJob.

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

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

טיפול בתקופות ניסיון שנכשלו

אם ניסיונות כוונון ההיפרפרמטרים מסתיימים עם שגיאות, כדאי לסיים את משימת האימון מוקדם מהמתוכנן. מגדירים את השדה maxFailedTrialCount ב-HyperparameterTuningJob למספר הניסיונות שנכשלו שרוצים לאפשר. אחרי שמספר הניסיונות הזה נכשל, Agent Platform מסיים את משימת ההדרכה. הערך של maxFailedTrialCount חייב להיות קטן מ-maxTrialCount או שווה לו.

אם לא מגדירים את הערך maxFailedTrialCount, או אם מגדירים אותו לערך 0, Agent Platform משתמשת בכללים הבאים כדי לטפל בניסיונות שלא צלחו:

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

הכללים האלה עשויים להשתנות. כדי להבטיח התנהגות ספציפית, צריך להגדיר את השדה maxFailedTrialCount.

ניהול משימות כוונון של היפר-פרמטר

בקטעים הבאים מוסבר איך לנהל את משימות האופטימיזציה של ההיפרפרמטרים.

אחזור מידע על משימת כוונון של היפרפרמטרים

בדוגמאות הקוד הבאות אפשר לראות איך לאחזר משימת כוונון של היפר-פרמטרים.

gcloud

משתמשים בפקודה gcloud ai hp-tuning-jobs describe:

gcloud ai hp-tuning-jobs describe ID_OR_NAME \
    --region=LOCATION

מחליפים את מה שכתוב בשדות הבאים:

  • ID_OR_NAME: השם או המזהה המספרי של HyperparameterTuningJob. (המזהה הוא החלק האחרון של השם).

    יכול להיות שראיתם את המזהה או השם כשנוצר HyperparameterTuningJob. אם אתם לא יודעים מה המזהה או השם, אתם יכולים להריץ את הפקודה gcloud ai hp-tuning-jobs list ולחפש את המשאב המתאים.

  • LOCATION: האזור שבו נוצר HyperparameterTuningJob.

REST

דוגמת הקוד הבאה מראה איך לאחזר משימה של כוונון היפר-פרמטרים באמצעות השיטה get של משאב hyperparameterTuningJob.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • LOCATION: האזור שבו נוצר HyperparameterTuningJob.
  • NAME: שם משימת כוונון ההיפר-פרמטר. שם המשימה מופיע בפורמט הבא: projects/{project}/LOCATIONS/{LOCATION}/hyperparameterTuningJobs/{hyperparameterTuningJob}.

ה-method של ה-HTTP וכתובת ה-URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/NAME

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "name": "projects/12345/LOCATIONs/us-central1/hyperparameterTuningJobs/6789",
  "displayName": "my-hyperparameter-tuning-job",
  "studySpec": {
    "metrics": [
      {
        "metricId": "my_metric",
        "goal": "MINIMIZE"
      }
    ],
    "parameters": [
      {
        "parameterId": "my_parameter",
        "doubleValueSpec": {
          "minValue": 1e-05,
          "maxValue": 1
        }
      }
    ]
  },
  "maxTrialCount": 3,
  "parallelTrialCount": 1,
  "trialJobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-4"
        },
        "replicaCount": "1",
        "pythonPackageSpec": {
          "executorImageUri": "us-docker.pkg.dev/vertex-ai/training/training-tf-cpu.2-1:latest",
          "packageUris": [
            "gs://my-bucket/my-training-application/trainer.tar.bz2"
          ],
          "pythonModule": "my-trainer.trainer"
        }
      }
    ]
  },
  "trials": [
    {
      "id": "2",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.71426874725564571
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30007445812225342
          }
        ]
      },
      "startTime": "2020-09-09T23:39:15.549112551Z",
      "endTime": "2020-09-09T23:47:08Z"
    },
    {
      "id": "3",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.3078893356622992
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30000102519989014
          }
        ]
      },
      "startTime": "2020-09-09T23:49:22.451699360Z",
      "endTime": "2020-09-09T23:57:15Z"
    },
    {
      "id": "1",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.500005
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30005377531051636
          }
        ]
      },
      "startTime": "2020-09-09T23:23:12.283374629Z",
      "endTime": "2020-09-09T23:36:56Z"
    }
  ],
  "state": "JOB_STATE_SUCCEEDED",
  "createTime": "2020-09-09T23:22:31.777386Z",
  "startTime": "2020-09-09T23:22:34Z",
  "endTime": "2020-09-10T01:31:24.271307Z",
  "updateTime": "2020-09-10T01:31:24.271307Z"
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import com.google.cloud.aiplatform.v1.HyperparameterTuningJob;
import com.google.cloud.aiplatform.v1.HyperparameterTuningJobName;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import java.io.IOException;

public class GetHyperparameterTuningJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String hyperparameterTuningJobId = "HYPERPARAMETER_TUNING_JOB_ID";
    getHyperparameterTuningJobSample(project, hyperparameterTuningJobId);
  }

  static void getHyperparameterTuningJobSample(String project, String hyperparameterTuningJobId)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient client = JobServiceClient.create(settings)) {
      HyperparameterTuningJobName name =
          HyperparameterTuningJobName.of(project, location, hyperparameterTuningJobId);
      HyperparameterTuningJob response = client.getHyperparameterTuningJob(name);
      System.out.format("response: %s\n", response);
    }
  }
}

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from google.cloud import aiplatform


def get_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    return hpt_job


ביטול משימת כוונון של היפר-פרמטר

בדוגמאות הקוד הבאות אפשר לראות איך לבטל משימת כוונון של היפר-פרמטרים.

gcloud

משתמשים בפקודה gcloud ai hp-tuning-jobs cancel:

gcloud ai hp-tuning-jobs cancel ID_OR_NAME \
    --region=LOCATION

מחליפים את מה שכתוב בשדות הבאים:

  • ID_OR_NAME: השם או המזהה המספרי של HyperparameterTuningJob. (המזהה הוא החלק האחרון של השם).

    יכול להיות שראיתם את המזהה או השם כשנוצר HyperparameterTuningJob. אם אתם לא יודעים מה המזהה או השם, אתם יכולים להריץ את הפקודה gcloud ai hp-tuning-jobs list ולחפש את המשאב המתאים.

  • LOCATION: האזור שבו נוצר HyperparameterTuningJob.

REST

בדוגמת הקוד הבאה מוצג איך לבטל משימת כוונון היפר-פרמטרים באמצעות השיטה cancel של המשאב hyperparameterTuningJob.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • LOCATION: האזור שבו נוצר HyperparameterTuningJob.
  • NAME: שם משימת כוונון ההיפר-פרמטר. שם המשימה מופיע בפורמט הבא: projects/{project}/locations/{location}/hyperparameterTuningJobs/{hyperparameterTuningJob}.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/NAME:cancel

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אמורים לקבל קוד סטטוס של הצלחה (2xx) ותגובה ריקה.

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

from google.cloud import aiplatform


def cancel_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    hpt_job.cancel()

מחיקה של משימת כוונון היפר-פרמטר

בדוגמאות הקוד הבאות מוסבר איך למחוק משימת כוונון היפר-פרמטרים באמצעות Agent Platform SDK ל-Python ו-API בארכיטקטורת REST.

REST

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

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • LOCATION: האזור שלכם.
  • NAME: שם משימת כוונון ההיפר-פרמטר. שם המשימה מופיע בפורמט הבא: projects/{project}/LOCATIONs/{LOCATION}/hyperparameterTuningJobs/{hyperparameterTuningJob}.

ה-method של ה-HTTP וכתובת ה-URL:

DELETE https://LOCATION-aiplatform.googleapis.com/v1/NAME

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אמורים לקבל קוד סטטוס של הצלחה (2xx) ותגובה ריקה.

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

from google.cloud import aiplatform


def delete_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    hpt_job.delete()

המאמרים הבאים