MPI 라이브러리를 사용하여 태스크 커뮤니케이션 구성

이 문서에서는 메시지 전달 인터페이스(MPI) 라이브러리를 사용하여 서로 다른 VM 간에 서로 통신하는 긴밀하게 결합된 태스크로 Batch 작업을 구성하는 방법을 설명합니다.

Batch 작업에서 결합은 상호 종속성 태스크를 설명합니다. 이 태스크는 작업의 parallelism 필드를 사용하여 순차적인 방식 대신 병렬로 실행할 수 있는 태스크 수를 구성하는 방법에 영향을 줍니다. 다음 유형의 결합을 사용하여 태스크를 설명할 수 있습니다.

  • 느슨하게 결합된 태스크: 독립적으로 실행될 수 있는 태스크입니다.
  • 긴밀하게 결합된 태스크: 실행되기 위해 서로 종속된 태스크입니다.

선택적으로 긴밀하게 결합된 태스크가 서로 다른 VM 인스턴스에서 서로 통신할 수 있도록 MPI 라이브러리를 사용하는 작업을 만들 수 있습니다. MPI의 일반적인 사용 사례는 긴밀하게 결합된 고성능 컴퓨팅(HPC) 워크로드입니다.

시작하기 전에

긴밀하게 결합된 태스크에 대해 MPI를 사용하는 작업 만들기 및 실행

이 섹션에서는 MPI를 사용할 수 있는 작업을 만드는 방법에 대한 예시를 제공합니다. 특히 예시 작업에는 3개의 실행 가능 항목이 포함됩니다.

  • 첫 번째 실행 가능 항목은 동시 멀티스레딩을 사용 중지하고 Intel MPI를 설치하여 MPI에 대한 작업을 준비하는 스크립트입니다.
  • 두 번째 실행 가능 항목은 빈 실행 가능한 장벽({ "barrier": {} } 형식)으로 이후 실행 가능 항목으로 계속되기 전에 모든 태스크가 MPI 설정을 완료하도록 보장합니다.
  • 세 번째 실행 가능 항목(및 이후 실행 가능 항목)은 작업 워크로드에 사용 가능합니다.

gcloud CLI 또는 Batch API를 사용하여 긴밀하게 결합된 작업에 MPI를 사용하는 작업을 만들 수 있습니다.

gcloud

gcloud CLI를 사용하여 긴밀하게 결합된 작업에 MPI를 사용하는 스크립트 작업을 만들려면 다음을 수행하세요.

  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태스크 그룹당 태스크 한도 사이의 정수여야 합니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드가 필요하며 2 이상으로 설정해야 합니다.
    • TASK_COUNT_PER_NODE: VM 인스턴스에서 작업이 동시에 실행할 수 있는 태스크 수입니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드가 필요하며 태스크당 하나의 VM 인스턴스를 실행하는 것과 동일한 1로 설정해야 합니다.
    • REQUIRE_HOSTS_FILE: true로 설정하면 태스크 그룹에서 실행되는 VM 인스턴스를 나열하는 파일이 작업으로 생성됩니다. 파일 경로는 BATCH_HOSTS_FILE 환경 변수에 저장됩니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드를 true로 설정해야 합니다.
    • PERMISSIVE_SSH: true로 설정하면 Batch는 태스크 그룹에서 실행 중인 VM 인스턴스 간에 비밀번호가 없는 통신을 허용하도록 SSH를 구성합니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드를 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 파일의 경로입니다.

선택적으로 다음을 수행하여 Batch에서 제공된 MPI 라이브러리의 성능을 늘릴 수 있습니다.

예를 들어 MPI를 사용하고 태스크 그룹의 3개 태스크의 호스트 이름을 태스크 출력 1개로 만드는 인스턴스 템플릿에서 스크립트 작업을 만들려면 다음 안내를 따르세요.

  1. 현재 디렉터리에 다음 콘텐츠로 example-job-uses-mpi.json이라는 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

Batch API를 사용하여 긴밀하게 결합된 태스크에 MPI를 사용하는 스크립트 작업을 만들려면 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: 프로젝트의 프로젝트 ID
  • LOCATION: 작업의 위치
  • JOB_NAME: 작업의 이름입니다.
  • SCRIPT: MPI를 사용하는 워크로드에 실행 가능한 스크립트입니다.
  • TASK_COUNT: 작업의 태스크 수입니다. 이 값은 1태스크 그룹당 태스크 한도 사이의 정수여야 합니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드가 필요하며 2 이상으로 설정해야 합니다.
  • TASK_COUNT_PER_NODE: VM 인스턴스에서 작업이 동시에 실행할 수 있는 태스크 수입니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드가 필요하며 태스크당 하나의 VM 인스턴스를 실행하는 것과 동일한 1로 설정해야 합니다.
  • REQUIRE_HOSTS_FILE: true로 설정하면 태스크 그룹에서 실행되는 VM 인스턴스를 나열하는 파일이 작업으로 생성됩니다. 파일 경로는 BATCH_HOSTS_FILE 환경 변수에 저장됩니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드를 true로 설정해야 합니다.
  • PERMISSIVE_SSH: true로 설정하면 Batch는 태스크 그룹에서 실행 중인 VM 인스턴스 간에 비밀번호가 없는 통신을 허용하도록 SSH를 구성합니다. Batch에서 제공하는 MPI 라이브러리를 사용하려면 이 필드를 true로 설정해야 합니다.

선택적으로 다음을 수행하여 Batch에서 제공된 MPI 라이브러리의 성능을 늘릴 수 있습니다.

예를 들어 MPI를 사용하고 태스크 그룹의 3개 태스크의 호스트 이름을 태스크 출력 1개로 만드는 인스턴스 템플릿에서 스크립트 작업을 만들려면 다음 요청을 사용합니다.

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는 프로젝트의 프로젝트 ID입니다.

다음 단계