הגדרת תקשורת בין משימות באמצעות ספריית MPI

במסמך הזה מוסבר איך להגדיר עבודת Batch עם משימות שקשורות זו לזו באופן הדוק ומתקשרות ביניהן במכונות וירטואליות שונות באמצעות ספריית Message Passing Interface (MPI).

במשימות Batch, המונח coupling מתאר את התלות ההדדית בין המשימות. זה משפיע על האופן שבו מגדירים את מספר המשימות שיכולות לפעול במקביל (במקום ברצף) באמצעות השדה parallelism של המשימה. אפשר לתאר משימות באמצעות סוגי הצימוד הבאים:

  • משימות עם צימוד רופף: משימות שיכולות לפעול באופן עצמאי.
  • משימות עם תלות הדוקה: משימות שתלויות זו בזו כדי לפעול.

אפשר גם ליצור משימה שמשתמשת בספריית MPI כדי לאפשר למשימות עם תלות הדדית לתקשר ביניהן במכונות וירטואליות שונות. מקרה שימוש נפוץ ב-MPI הוא עומסי עבודה של מחשוב עתיר ביצועים (HPC) עם צימוד הדוק.

לפני שמתחילים

  1. אם עוד לא השתמשתם ב-Batch, כדאי לעיין במאמר תחילת העבודה עם Batch ולהפעיל את Batch על ידי השלמת הדרישות המוקדמות לפרויקטים ולמשתמשים.
  2. כדי לקבל את ההרשאות שדרושות ליצירת משימה, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

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

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

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

יצירה והרצה של משימה שמשתמשת ב-MPI למשימות שקשורות זו לזו באופן הדוק

בקטע הזה מובאות דוגמאות לאופן שבו אפשר ליצור עבודה שיכולה להשתמש ב-MPI. חשוב לציין שלמשימה לדוגמה יש 3 רכיבים שאפשר להפעיל:

  • הסקריפט הראשון שניתן להפעלה מכין את העבודה ל-MPI על ידי השבתת ריבוי הליכי משנה סימולטני והתקנת Intel MPI.
  • הקובץ השני שניתן להפעלה הוא barrier runnable ריק (בפורמט { "barrier": {} }), שמוודא שכל המשימות מסיימות את ההגדרה של MPI לפני שממשיכים לקבצים הבאים שניתנים להפעלה.
  • האפשרות השלישית להפעלה (וכל אפשרות הפעלה נוספת) זמינה לעומס העבודה של העבודה.

אפשר ליצור משימה שמשתמשת ב-MPI למשימות שקשורות זו לזו באופן הדוק באמצעות ה-CLI של gcloud או Batch API.

gcloud

כדי ליצור משימת סקריפט שמשתמשת ב-MPI למשימות עם צימוד הדוק באמצעות ה-CLI של gcloud:

  1. יוצרים קובץ הגדרות בפורמט JSON עם התוכן הבא:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                SCRIPT
                            }
                        }
                    ]
                },
                "taskCount": TASK_COUNT,
                "taskCountPerNode": TASK_COUNT_PER_NODE,
                "requireHostsFile": REQUIRE_HOSTS_FILE,
                "permissiveSsh": PERMISSIVE_SSH
            }
        ]
    }
    

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

    • SCRIPT: סקריפט שאפשר להריץ בעומס עבודה שמשתמש ב-MPI.
    • TASK_COUNT: מספר המשימות של העבודה. הערך צריך להיות מספר שלם בין 1 לבין המגבלה על מספר המשימות בכל קבוצת משימות. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה לערך 2 ומעלה.
    • TASK_COUNT_PER_NODE: מספר המשימות שעבודה יכולה להריץ בו-זמנית במופע של מכונה וירטואלית. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה לערך 1, ששווה להפעלת מופע VM אחד לכל משימה.
    • REQUIRE_HOSTS_FILE: אם ההגדרה היא true, העבודה יוצרת קובץ עם רשימה של מופעי מכונות וירטואליות שפועלים בקבוצת משימות. נתיב הקובץ מאוחסן במשתנה הסביבה BATCH_HOSTS_FILE. כדי להשתמש בספריות MPI שסופקו על ידי Batch, השדה הזה צריך להיות מוגדר כ-true.
    • PERMISSIVE_SSH: אם הערך מוגדר כ-true,‏ Batch מגדיר את SSH כך שיאפשר תקשורת ללא סיסמה בין המופעים של מכונות וירטואליות שפועלים בקבוצת משימות. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה ל-true.
  2. כדי ליצור את העבודה, משתמשים בפקודה gcloud batch jobs submit.

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

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

    • JOB_NAME: שם המשימה.
    • LOCATION: המיקום של המשרה.
    • JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של העבודה.

אפשר גם לשפר את הביצועים של ספריות MPI שסופקו על ידי Batch. לשם כך:

לדוגמה, כדי ליצור משימת סקריפט מתבנית של הגדרות מכונה שמשתמשת ב-MPI ומגדירה שמשימה אחת תוציא את שם המארח של 3 המשימות בקבוצת המשימות:

  1. יוצרים קובץ JSON בספרייה הנוכחית בשם example-job-uses-mpi.json עם התוכן הבא:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                "text":
                                    "if [ $BATCH_TASK_INDEX = 0 ]; then
                                    mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                    fi"
                            }
                        },
                        { "barrier": {} }
                    ]
                },
                "taskCount": 3,
                "taskCountPerNode": 1,
                "requireHostsFile": true,
                "permissiveSsh": true
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "instanceTemplate": "example-template-job-uses-mpi"
                }
            ]
        },
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    
  2. מריצים את הפקודה הבאה:

    gcloud batch jobs submit example-template-job-uses-mpi \
      --location us-central1 \
      --config example-job-uses-mpi.json
    

API

כדי ליצור עבודת סקריפט שמשתמשת ב-MPI למשימות שקשורות זו לזו באופן הדוק באמצעות Batch API, משתמשים בשיטה jobs.create ומציינים את השדות permissiveSsh,‏ requireHostsFile,‏ taskCount ו-taskCountPerNode.

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_ID

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            SCRIPT
                        }
                    }
                ]
            },
            "taskCount": TASK_COUNT,
            "taskCountPerNode": TASK_COUNT_PER_NODE,
            "requireHostsFile": REQUIRE_HOSTS_FILE,
            "permissiveSsh": PERMISSIVE_SSH
        }
    ]
}

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

  • PROJECT_ID: מזהה הפרויקט שלכם.
  • LOCATION: המיקום של המשרה.
  • JOB_NAME: שם המשימה.
  • SCRIPT: הסקריפט שניתן להפעלה עבור עומס עבודה שמשתמש ב-MPI.
  • TASK_COUNT: מספר המשימות של העבודה. הערך חייב להיות מספר שלם בין 1 לבין המגבלה על מספר המשימות בכל קבוצת משימות. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה לערך 2 ומעלה.
  • TASK_COUNT_PER_NODE: מספר המשימות שעבודה יכולה להריץ בו-זמנית במופע של מכונה וירטואלית. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה לערך 1, ששווה להפעלת מופע VM אחד לכל משימה.
  • REQUIRE_HOSTS_FILE: כשהערך מוגדר ל-true, העבודה יוצרת קובץ עם רשימה של המופעים של מכונות וירטואליות שפועלים בקבוצת משימות. נתיב הקובץ מאוחסן במשתנה הסביבה BATCH_HOSTS_FILE. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה ל-true.
  • PERMISSIVE_SSH: אם המדיניות מוגדרת לערך true,‏ Batch מגדיר SSH כדי לאפשר תקשורת ללא סיסמה בין המכונות הווירטואליות שפועלות בקבוצת משימות. כדי להשתמש בספריות MPI שסופקו על ידי Batch, צריך להגדיר את השדה הזה ל-true.

אפשר גם לשפר את הביצועים של ספריות MPI שסופקו על ידי Batch. לשם כך:

לדוגמה, כדי ליצור עבודת סקריפט מתבנית של הגדרות מכונה שמשתמשת ב-MPI וגורמת למשימה אחת להפיק את שם המארח של 3 המשימות בקבוצת המשימות, משתמשים בבקשה הבאה:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-template-job-uses-mpi

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            "text":
                                "if [ $BATCH_TASK_INDEX = 0 ]; then
                                mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                fi"
                        }
                    },
                    { "barrier": {} }
                ]
            },
            "taskCount": 3,
            "taskCountPerNode": 1,
            "requireHostsFile": true,
            "permissiveSsh": true
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "instanceTemplate": "example-template-job-uses-mpi"
            }
        ]
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

כאשר PROJECT_ID הוא מזהה הפרויקט של הפרויקט.

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