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

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

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

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

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

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

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

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

מידע נוסף על הדרישות לגבי אפליקציות לאימון מודלים ללא שרת שפועלות ב-Vertex AI

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

‫Vertex AI מגדיר ארגומנטים של שורת פקודה כשהוא קורא לאפליקציית האימון. משתמשים בארגומנטים של שורת הפקודה בקוד:

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

    לדוגמה, אם אפליקציית האימון היא מודול Python בשם my_trainer ואתם מבצעים אופטימיזציה של היפרפרמטר בשם learning_rate,‏ Vertex AI מתחיל כל ניסיון בפקודה כמו הבאה:

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

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

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

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

דיווח על המדדים ל-Vertex AI

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

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

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

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

המסוף

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

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

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

    מעבר אל 'אימון צינורות עיבוד נתונים'

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

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

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

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

    לוחצים על Continue.

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

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

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

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

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

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

    4. אופציונלי: בשדה Arguments (ארגומנטים), אפשר לציין ארגומנטים לשימוש ב-Vertex AI כשהוא מתחיל להריץ את קוד האימון. האורך המקסימלי של כל הארגומנטים יחד הוא 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 (מספר הניסיונות המקסימלי), מציינים את מספר הניסיונות המקסימלי שרוצים ש-Vertex AI תריץ עבור משימת כוונון ההיפר-פרמטרים.

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

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

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

    לוחצים על Continue.

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

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

    2. בקטע Worker pool 0 (מאגר עובדים 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: (אופציונלי). איך צריך לשנות את קנה המידה של הפרמטר. משאירים את הערך לא מוגדר לפרמטרים קטגוריים. יכול להיות 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: (אופציונלי). חשבון השירות שבו Vertex AI ישתמש כדי להריץ את הקוד. מידע נוסף על צירוף חשבון שירות בהתאמה אישית
    • 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הוראות ההגדרה במאמר Vertex AI quickstart using client libraries. מידע נוסף מופיע במאמרי העזרה של Vertex AI Java API.

כדי לבצע אימות ב-Vertex AI, צריך להגדיר את 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 למספר הניסיונות הכושלים שרוצים לאפשר. אחרי שמספר הניסיונות הזה נכשל, Vertex AI מסיים את משימת האימון. הערך של maxFailedTrialCount חייב להיות קטן מ-maxTrialCount או שווה לו.

אם לא מגדירים את maxFailedTrialCount, או אם מגדירים אותו ל-0,‏ Vertex AI משתמש בכללים הבאים כדי לטפל בניסיונות שנכשלו:

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

הכללים האלה עשויים להשתנות. כדי להבטיח התנהגות ספציפית, מגדירים את השדה 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הוראות ההגדרה במאמר Vertex AI quickstart using client libraries. מידע נוסף מופיע במאמרי העזרה של Vertex AI Java API.

כדי לבצע אימות ב-Vertex AI, צריך להגדיר את 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()

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

בדוגמאות הקוד הבאות אפשר לראות איך מוחקים משימת כוונון היפר-פרמטרים באמצעות Vertex AI 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()

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