분산형 학습

이 페이지에서는 Vertex AI에서 분산 학습 작업을 실행하는 방법을 설명합니다.

코드 요구사항

분산 학습을 지원하는 ML 프레임워크를 사용합니다. 학습 코드에서 CLUSTER_SPEC 또는 TF_CONFIG 환경 변수를 사용하여 학습 클러스터의 특정 부분을 참조할 수 있습니다.

학습 클러스터 구조

Vertex AI를 사용하여 분산형 학습 작업을 실행하는 경우, 학습 클러스터에 여러 머신(노드)을 지정합니다. 학습 서비스는 개발자가 지정한 머신 유형에 리소스를 할당합니다. 제공된 노드에서 실행 중인 작업을 복제본이라 합니다. 구성이 동일한 복제본 그룹을 작업자 풀이라고 부릅니다.

학습 클러스터에서 각 복제본에는 분산 학습 시 단일 역할 또는 태스크가 제공됩니다. 예를 들면 다음과 같습니다.

  • 기본 복제본: 정확히 하나의 복제본이 기본 복제본으로 지정됩니다. 이 태스크는 다른 작업을 관리하고 작업 상태를 전체적으로 보고합니다.

  • 작업자: 복제본 한 개 이상을 작업자로 지정할 수 있습니다. 이러한 복제본은 작업 구성에서 지정한 대로 작업의 일부분을 수행합니다.

  • 매개변수 서버: ML 프레임워크에서 지원되는 경우 하나 이상의 복제본이 매개변수 서버로 지정될 수 있습니다. 이 복제본은 모델 매개변수를 저장하고 각 작업자 간에 공유 모델 상태를 조정합니다.

  • 평가자: ML 프레임워크에서 지원되는 경우 하나 이상의 복제본이 평가자로 지정될 수 있습니다. 이러한 복제본을 사용하여 모델을 평가할 수 있습니다. TensorFlow를 사용하는 경우 일반적으로 TensorFlow는 평가자를 두 개 이상 사용하지 않을 것으로 예상합니다.

분산 학습 작업 구성

여러 작업자 풀을 정의하여 커스텀 학습 작업을 분산 학습 작업으로 구성할 수 있습니다. 또한 학습 파이프라인 또는 초매개변수 조정 작업 내에서 분산 학습을 실행할 수도 있습니다.

분산 학습 작업을 구성하려면 각 태스크 유형에 대해 하나의 WorkerPoolSpec을 지정하여 작업자 풀 목록(workerPoolSpecs[])을 정의합니다.

workerPoolSpecs[]의 위치 클러스터에서 수행되는 태스크
첫 번째(workerPoolSpecs[0]) 기본, 주, 스케줄러, '마스터'
두 번째(workerPoolSpecs[1]) 보조, 복제본, 작업자
세 번째(workerPoolSpecs[2]) 매개변수 서버, Reduction Server
네 번째(workerPoolSpecs[3]) 평가자

다른 모든 복제본에서 수행되는 작업을 조정하는 기본 복제본을 지정해야 합니다. 기본 복제본에 대해서만 첫 번째 작업자 풀 사양을 사용하고 해당 replicaCount1로 설정합니다.

{
  "workerPoolSpecs": [
     // `WorkerPoolSpec` for worker pool 0, primary replica, required
     {
       "machineSpec": {...},
       "replicaCount": 1,
       "diskSpec": {...},
       ...
     },
     // `WorkerPoolSpec` for worker pool 1, optional
     {},
     // `WorkerPoolSpec` for worker pool 2, optional
     {},
     // `WorkerPoolSpec` for worker pool 3, optional
     {}
   ]
   ...
}

추가 작업자 풀 지정

ML 프레임워크에 따라 다른 목적의 추가 작업자 풀을 지정할 수 있습니다. 예를 들어 TensorFlow를 사용하는 경우 작업자 풀을 지정하여 작업자 복제본, 매개변수 서버 복제본, 평가자 복제본을 구성할 수 있습니다.

workerPoolSpecs[] 목록에 지정하는 작업자 풀의 순서에 따라 작업자 풀 유형이 결정됩니다. 사용하지 않을 작업자 풀의 값은 비워둡니다. 그러면 workerPoolSpecs[] 목록에서 이를 건너뛰고 사용하려는 작업자 풀을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

기본 복제본 및 매개변수 서버 작업자 풀만 포함된 작업을 지정하려면 작업자 풀의 빈 값을 1로 설정해야 합니다.

{
  "workerPoolSpecs": [
     // `WorkerPoolSpec` for worker pool 0, required
     {
       "machineSpec": {...},
       "replicaCount": 1,
       "diskSpec": {...},
       ...
     },
     // `WorkerPoolSpec` for worker pool 1, optional
     {},
     // `WorkerPoolSpec` for worker pool 2, optional
     {
       "machineSpec": {...},
       "replicaCount": 1,
       "diskSpec": {...},
       ...
     },
     // `WorkerPoolSpec` for worker pool 3, optional
     {}
   ]
   ...
}

Reduction Server로 학습 시간 단축

여러 노드를 사용하여 대규모 ML 모델을 학습시킬 때 노드 간 그래디언트를 통신하면 상당한 지연 시간이 발생할 수 있습니다. Reduction Server는 분산 학습의 처리량을 늘리고 지연 시간을 줄일 수 있는 all-reduce 알고리즘입니다. Vertex AI는 분산 학습 중에 작업자 풀 중 하나에 사용할 수 있는 Docker 컨테이너 이미지에서 Reduction Server를 사용 가능하게 합니다.

Reduction Server의 작동 방식을 알아보려면 Vertex AI의 Reduction Server를 사용하는 보다 빠른 분산 GPU 학습을 참조하세요.

기본 요건

다음 요구사항을 충족하는 경우 Reduction Server를 사용할 수 있습니다.

  • GPU 작업자를 사용하여 분산 학습을 수행합니다.

  • 학습 코드에 TensorFlow 또는 PyTorch가 사용되며, NCCL all-reduce를 사용해서 GPU로 멀티 호스트 데이터 병렬 학습을 수행하도록 구성되었습니다. (NCCL을 사용하는 다른 ML 프레임워크를 사용할 수도 있습니다.)

  • 기본 노드(workerPoolSpecs[0]) 및 작업자(workerPoolSpecs[1])에서 실행 중인 컨테이너에 Reduction Server가 지원됩니다. 특히 각 컨테이너가 다음 중 하나입니다.

    • 사전 빌드된 TensorFlow 학습 컨테이너 버전 2.3 이상입니다.

    • 사전 빌드된 Pytorch 학습 컨테이너, 버전 1.4 이상입니다.

    • NCCL 2.7 이상 및 google-reduction-server 패키지가 설치된 커스텀 컨테이너입니다. 다음 줄을 Dockerfile에 추가하여 이 패키지를 커스텀 컨테이너 이미지에 설치할 수 있습니다.

      RUN echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | tee /etc/apt/sources.list.d/google-fast-socket.list && \
          curl -s -L https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
          apt update && apt install -y google-reduction-server
      

Reduction Server를 사용한 학습

Reduction Server를 사용하려면 커스텀 학습 리소스를 만들 때 다음을 수행합니다.

  1. 세 번째 작업자 풀(workerPoolSpecs[2])의 containerSpec.imageUri 필드에 다음 URI 중 하나를 지정합니다.

    • us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
    • europe-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
    • asia-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest

    커스텀 학습을 수행하는 위치에서 가장 가까운 멀티 리전을 선택하면 지연 시간을 줄일 수 있습니다.

  2. 세 번째 작업자 풀의 머신 유형 및 노드 수를 선택할 때 세 번째 작업자 풀의 총 네트워크 대역폭이 첫 번째 및 두 번째 작업자 풀의 총 네트워크 대역폭과 일치하거나 초과하는지 확인합니다.

    두 번째 작업자 풀에서 각 노드에 사용 가능한 최대 대역폭에 대해 자세히 알아보려면 네트워크 대역폭 및 GPU를 참조하세요.

    Reduction Server 노드에는 GPU를 사용하지 않습니다. 세 번째 작업자 풀에서 각 노드의 사용 가능한 최대 대역폭에 대한 자세한 내용은 범용 머신 계열의 '최대 이그레스 대역폭(Gbps)' 열을 참조하세요.

    예를 들어 첫 번째 및 두 번째 작업자 풀에서 각각 8개의 NVIDIA_TESLA_V100 GPU가 있는 5개의 n1-highmem-96 노드를 사용하도록 구성할 경우 각 노드의 최대 대역폭은 100Gbps이고 총 대역폭은 500Gbps입니다. 세 번째 작업자 풀에서 이 대역폭을 일치시키기 위해서는 각 최대 대역폭이 32Gbps이고 총 대역폭은 512Gbps인 n1-highcpu-16 노드 16개를 사용할 수 있습니다.

    Reduction Server 노드에는 n1-highcpu-16 머신 유형을 사용하는 것이 좋습니다. 이 머신 유형은 리소스에 비교적 높은 대역폭을 제공하기 때문입니다.

다음 명령어는 Reduction Server를 사용하는 CustomJob 리소스를 만드는 방법의 예시를 보여줍니다.

gcloud ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=n1-highmem-96,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
  --worker-pool-spec=machine-type=n1-highmem-96,replica-count=4,accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
  --worker-pool-spec=machine-type=n1-highcpu-16,replica-count=16,container-image-uri=us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest

자세한 내용은 CustomJob 만들기 가이드를 참조하세요.

Reduction Server를 사용한 학습 권장사항

머신 유형 및 개수

Reduction Server 학습에서 각 작업자는 모든 감소기 호스트에 연결해야 합니다. 작업자 호스트에서 연결 수를 최소화하려면 감소기 호스트에 대해 네트워크 대역폭이 가장 높은 머신 유형을 사용하세요.

감소기 호스트에는 32Gbps 이그레스 대역폭을 제공하는 vCPU가 16개 이상인 범용 N1/N2 VM을 사용하는 것이 좋습니다(예: n1-highcpu-16n2-highcpu-16). N1/N2 VM의 등급 1 VM 대역폭은 최대 이그레스 대역폭을 50Gbps~100Gbps 범위로 증가시키므로 감소기 VM 노드에 적합합니다.

작업자와 감소기의 총 이그레스 대역폭은 동일해야 합니다. 예를 들어 8개의 a2-megagpu-16g VM을 작업자로 사용하는 경우 25개 이상의 n1-highcpu-16 VM을 감소기로 사용해야 합니다.

`(8 worker VMs * 100 Gbps) / 32 Gbps egress = 25 reducer VMs`.

작은 메시지 일괄 처리

Reduction Server는 집계할 메시지가 충분히 큰 경우 가장 잘 작동합니다. 대부분의 ML 프레임워크는 전체 축소를 수행하기 전에 작은 경사 텐서를 일괄 처리하는 다른 용어의 기술을 이미 제공하고 있습니다.

Horovod

Horovod는 Tensor Fusion을 지원하여 전체 축소를 위해 소규모 텐서를 일괄 처리합니다. 텐서는 버퍼가 완전히 채워지고 버퍼에 대한 전체 축소 작업이 실행될 때까지 퓨전 버퍼에 채워집니다. HOROVOD_FUSION_THRESHOLD 환경 변수를 설정하여 융합 버퍼의 크기를 조정할 수 있습니다.

HOROVOD_FUSION_THRESHOLD 환경 변수의 권장 값은 최소 128MB입니다. 이 경우 HOROVOD_FUSION_THRESHOLD 환경 변수를 134217728(128 * 1024 * 1024)로 설정하세요.

PyTorch

PyTorch DistributedDataParallel은 일괄 메시지를 '경사 버케팅'으로 지원합니다. DistributedDataParallel 생성자에서 bucket_cap_mb 매개변수를 설정하여 일괄 버킷의 크기를 제어합니다. 기본 크기는 25MB입니다.

권장사항: bucket_cap_mb의 권장 값은 64(64MB)입니다.

클러스터의 환경 변수

Vertex AI는 모든 복제본에 환경 변수, CLUSTER_SPEC을 채워 전체 클러스터가 설정된 방법을 설명합니다. TensorFlow의 TF_CONFIG와 마찬가지로 CLUSTER_SPEC은 색인과 역할(기본 복제본, 작업자, 매개변수 서버, 평가자)을 포함하여 클러스터의 모든 복제본을 설명합니다.

TensorFlow를 사용하여 분산형 학습을 실행하면 TF_CONFIG가 파싱되어 tf.train.ClusterSpec이 빌드됩니다. 마찬가지로 다른 머신러닝 프레임워크에서 분산형 학습을 실행하는 경우 CLUSTER_SPEC을 파싱하여 프레임워크에서 요구하는 환경 변수 또는 설정을 채워야 합니다.

CLUSTER_SPEC 형식

CLUSTER_SPEC 환경 변수는 다음과 같은 형식의 JSON 문자열입니다.

설명
"cluster"

커스텀 컨테이너에 대한 클러스터 설명입니다. TF_CONFIG와 마찬가지로 이 객체의 형식은 TensorFlow 클러스터 사양으로 지정되며 tf.train.ClusterSpec의 생성자에 전달될 수 있습니다.

클러스터 설명에는 지정된 각 작업자 풀의 복제본 이름 목록이 포함됩니다.

"workerpool0" 모든 분산 학습 작업에는 첫 번째 작업자 풀에 기본 복제본 하나가 포함됩니다.
"workerpool1" 이 작업자 풀에는 작업을 만들 때 지정한 작업자 복제본이 포함됩니다.
"workerpool2" 이 작업자 풀에는 작업을 만들 때 지정한 매개변수 서버가 포함됩니다.
"workerpool3" 이 작업자 풀에는 작업을 만들 때 지정한 평가자가 포함됩니다.
"environment" cloud 문자열입니다.
"task" 코드를 실행 중인 특정 노드의 태스크를 설명합니다. 이 정보를 사용하여 분산 작업의 특정 작업자에 대한 코드를 작성할 수 있습니다. 이 항목은 다음과 같은 키가 포함된 사전입니다.
"type" 이 태스크가 실행되는 작업자 풀의 유형입니다. 예를 들어 "workerpool0"는 기본 복제본을 나타냅니다.
"index"

0부터 시작하는 태스크 색인입니다. 예를 들어 학습 작업에 두 작업자가 포함된 경우 이 값은 한 작업자에서는 0, 다른 작업자에서는 1로 설정됩니다.

"trial" 현재 실행 중인 초매개변수 조정 시도의 식별자입니다. 작업에 초매개변수 조정을 구성하는 경우 학습 시도 횟수를 설정해야 합니다. 이 값을 통해 실행 중인 시도 간에 코드를 구분할 수 있습니다. 식별자는 시도 횟수를 포함하는 문자열 값이며 1부터 시작합니다.
job

사전으로 표시된 현재 학습 작업을 생성하기 위해 제공했던 CustomJobSpec입니다.

CLUSTER_SPEC 예시

다음은 값 예시입니다.


{
   "cluster":{
      "workerpool0":[
         "cmle-training-workerpool0-ab-0:2222"
      ],
      "workerpool1":[
         "cmle-training-workerpool1-ab-0:2222",
         "cmle-training-workerpool1-ab-1:2222"
      ],
      "workerpool2":[
         "cmle-training-workerpool2-ab-0:2222",
         "cmle-training-workerpool2-ab-1:2222"
      ],
      "workerpool3":[
         "cmle-training-workerpool3-ab-0:2222",
         "cmle-training-workerpool3-ab-1:2222",
         "cmle-training-workerpool3-ab-2:2222"
      ]
   },
   "environment":"cloud",
   "task":{
      "type":"workerpool0",
      "index":0,
      "trial":"TRIAL_ID"
   },
   "job": {
      ...
   }
}

TF_CONFIG 형식

CLUSTER_SPEC 외에도 Vertex AI는 모든 분산 학습 작업의 각 복제본에 환경 변수TF_CONFIG를 설정합니다. Vertex AI는 단일 복제본 학습 작업에 TF_CONFIG를 설정하지 않습니다.

CLUSTER_SPECTF_CONFIG는 일부 값을 공유하지만 형식이 다릅니다. 두 환경 변수 모두 TensorFlow에 필요한 범위를 초과하는 추가 필드가 포함됩니다.

TensorFlow를 사용한 분산 학습은 사전 빌드된 컨테이너를 사용할 때와 같이 커스텀 컨테이너를 사용할 때와 동일한 방법으로 작동합니다.

TF_CONFIG 환경 변수는 다음과 같은 형식의 JSON 문자열입니다.

TF_CONFIG 필드
cluster

TensorFlow 클러스터 설명입니다. 하나 이상의 태스크 이름(chief , worker , ps 또는 master)을 이 태스크가 실행되는 네트워크 주소 목록에 매핑하는 사전입니다. 이 사전은 한 특정 학습 작업의 모든 VM에서 동일합니다.

tf.train.ClusterSpec 생성자의 유효한 첫 번째 인수입니다. 사용자가 평가자를 작업에 이용하더라도 평가자는 학습 클러스터의 일부로 간주되지 않으므로 이 사전은 evaluator를 키로 포함하지 않습니다.

task

이 환경 변수가 설정된 VM의 태스크 설명입니다. 이 사전은 같은 학습 작업에서도 VM마다 서로 다릅니다. 이 정보를 사용하여 분산 학습 작업의 각 VM에서 실행되는 코드를 맞춤설정할 수 있습니다. 또한 초매개변수 조정 작업의 시도마다 학습 코드의 동작을 변경할 수도 있습니다.

이 사전에는 다음 키-값 쌍이 포함됩니다.

task 필드
type

이 VM에서 수행 중인 태스크 유형입니다. 이 값은 작업자의 경우 worker, 매개변수 서버의 경우 ps, 평가자의 경우 evaluator로 설정됩니다. 작업의 마스터 작업자에서 값은 chief 또는 master로 설정됩니다. 이 문서의 chiefmaster 비교 섹션에서 두 값의 차이점에 대해 자세히 알아보세요.

index

0부터 시작하는 태스크 색인입니다. 예를 들어 학습 작업에 두 작업자가 포함된 경우 이 값은 한 작업자에서는 0, 다른 작업자에서는 1로 설정됩니다.

trial

현재 이 VM에서 실행 중인 초매개변수 조정 시도의 ID입니다. 이 필드는 현재 학습 작업이 초매개변수 조정 작업인 경우에만 설정됩니다.

초매개변수 조정 작업의 경우 Vertex AI는 매번 다른 초매개변수를 사용한 여러 시도에서 반복적으로 학습 코드를 실행합니다. 이 필드는 현재 시도 횟수에 따른 번호이며 첫 시도는 1부터 시작합니다.

cloud

Vertex AI에서 내부적으로 사용하는 ID입니다. 이 필드는 무시해도 됩니다.

job

사전으로 표시된 현재 학습 작업을 생성하기 위해 제공했던 CustomJobSpec입니다.

environment

cloud 문자열입니다.

TF_CONFIG 예시

다음 코드 예시는 학습 로그에 TF_CONFIG 환경 변수를 출력합니다.

import json
import os

tf_config_str = os.environ.get('TF_CONFIG')
tf_config_dict  = json.loads(tf_config_str)

# Convert back to string just for pretty printing
print(json.dumps(tf_config_dict, indent=2))

런타임 버전 2.1 이상에서 실행되고 매개변수 서버, 마스터 작업자, 작업자 둘을 사용하는 초매개변수 조정 작업에서 이 코드는 첫 번째 초매개변수 조정 시도 중에 작업자 중 한 개에 대해 다음 로그를 생성합니다. 이 출력 예시에서는 간결성을 위해 job 필드를 숨기고 일부 ID를 일반적인 값으로 대체합니다.

{
  "cluster": {
    "chief": [
      "training-workerpool0-[ID_STRING_1]-0:2222"
    ],
    "ps": [
      "training-workerpool2-[ID_STRING_1]-0:2222"
    ],
    "worker": [
      "training-workerpool1-[ID_STRING_1]-0:2222",
      "training-workerpool1-[ID_STRING_1]-1:2222"
    ]
  },
  "environment": "cloud",
  "job": {
    ...
  },
  "task": {
    "cloud": "[ID_STRING_2]",
    "index": 0,
    "trial": "1",
    "type": "worker"
  }
}

TF_CONFIG 사용 시점

TF_CONFIG는 분산 학습 작업에만 설정됩니다.

학습 코드에서 TF_CONFIG 환경 변수를 직접 사용할 필요가 없습니다. 다음 섹션에 설명된 TensorFlow의 분산 전략 및 Vertex AI의 표준 초매개변수 조정 워크플로가 해당 작업에 적합하지 않은 경우에만 TF_CONFIG 환경 변수를 사용하세요.

분산형 학습

Vertex AI에서는 TensorFlow의 분산 학습에 필요한 사양을 확장하도록 TF_CONFIG 환경 변수를 설정합니다.

TensorFlow를 사용하여 분산 학습을 수행하려면 tf.distribute.Strategy API를 사용하세요. 특히 Keras API를 MultiWorkerMirroredStrategy 또는 ParameterServerStrategy(작업에 매개변수 서버를 지정하는 경우)와 함께 사용하는 것이 좋습니다. 그러나 TensorFlow는 현재 이 같은 전략에 대해 실험적 지원만 제공합니다.

이러한 배포 전략에서는 TF_CONFIG 환경 변수를 사용하여 학습 작업의 각 VM에 역할을 할당하고 VM 간의 통신을 용이하게 합니다. TensorFlow가 이 과정을 자동으로 처리하므로 학습 코드에서 TF_CONFIG 환경 변수에 직접 액세스할 필요가 없습니다.

학습 작업을 실행하는 여러 VM의 동작을 맞춤설정하려는 경우에만 TF_CONFIG 환경 변수를 직접 파싱하세요.

초매개변수 조정

초매개변수 조정 작업을 실행하면 Vertex AI에서 각 시도의 학습 코드에 서로 다른 인수를 제공합니다. 학습 코드가 현재 실행 중인 시도에 대해 인지해야 할 필요는 없습니다. 또한 Google Cloud 콘솔에서 초매개변수 조정 작업의 진행 상태를 모니터링할 수 있습니다.

필요한 경우 코드가 TF_CONFIG 환경 변수의 task 필드 내 trial 필드에서 현재 시도 횟수의 번호를 읽을 수 있습니다.

다음 단계