분산 학습 세부정보에 TF_CONFIG 사용

AI Platform은 각 학습 인스턴스에 TF_CONFIG라는 환경 변수를 설정합니다. 실행 중인 서비스와 애플리케이션은 TF_CONFIG의 학습 작업 세부정보에 액세스할 수 있습니다.

이 가이드에서는 TF_CONFIG 환경 변수의 학습 작업 세부정보에 액세스하는 방법을 설명합니다. 이 기술은 분산 학습 작업과 초매개변수 조정 작업에 유용한데, 그 이유는 이 두 작업 모두 학습 애플리케이션과 서비스 간에 추가 통신이 필요하기 때문입니다.

TensorFlow 및 TF_CONFIG

TensorFlow의 Estimator APITF_CONFIG 환경 변수가 있으면 이를 파싱하고 TF_CONFIG의 관련 세부정보를 사용하여 클러스터 사양, 태스크 ID, 기타 속성을 비롯한 분산 학습의 속성을 구성합니다.

애플리케이션에서 분산된 학습을 위해 tf.estimator를 사용하면 AI Platform이 TF_CONFIG를 설정하므로 속성이 클러스터 사양에 자동으로 전파됩니다.

마찬가지로, 커스텀 컨테이너를 사용하여 AI Platform에서 분산된 학습 애플리케이션을 실행하면 AI Platform이 각 머신에 TF_CONFIG를 설정하고 환경 변수 CLUSTER_SPEC을 입력합니다.

TF_CONFIG 형식

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

설명
"cluster" TensorFlow 클러스터 설명입니다. 이 객체는 TensorFlow 클러스터 사양으로 형식이 지정되며 tf.train.ClusterSpec의 생성자로 전달될 수 있습니다.
"task" 코드를 실행 중인 특정 노드의 태스크를 설명합니다. 이 정보를 사용하여 분산 작업의 특정 작업자에 대한 코드를 작성할 수 있습니다. 이 항목은 다음과 같은 키가 포함된 사전입니다.
"type" 이 노드에서 수행되는 태스크의 유형입니다. 가능한 값은 master, worker, ps입니다.
"index" 0부터 시작하는 태스크 색인입니다. 대부분의 분산 학습 작업에는 한 개의 마스터 태스크, 한 개 이상의 매개변수 서버, 한 개 이상의 작업자가 포함됩니다.
"trial" 현재 실행 중인 초매개변수 조정 시도의 식별자입니다. 작업에 초매개변수 조정을 구성하는 경우 학습 시도 횟수를 설정해야 합니다. 이 값을 통해 실행 중인 시도 간에 코드를 구분할 수 있습니다. 식별자는 시도 횟수를 포함하는 문자열 값이며 1부터 시작합니다.
"job" 작업을 시작할 때 사용한 작업 매개변수입니다. 대부분의 경우 명령줄 인수를 통해 애플리케이션에 전달된 데이터를 복제하므로 이 항목은 무시해도 됩니다.

TF_CONFIG 가져오기 및 분산 클러스터 사양 설정

아래의 예시는 애플리케이션에서 TF_CONFIG의 콘텐츠를 가져오는 방법을 설명합니다.

또한 이 예시에서는 분산 학습 중에 TF_CONFIG를 사용하여 tf.train.ClusterSpec을 설정하는 방법을 보여줍니다. 참고: 코드에서 TensorFlow Core API를 사용하는 경우 TF_CONFIG에서 tf.train.ClusterSpec을 빌드하기만 하면 됩니다. tf.estimator를 사용하면 TensorFlow가 변수를 파싱하고 클러스터 사양을 자동으로 빌드합니다. 이 페이지의 TensorFlow와 TF_CONFIG 섹션을 참조하세요.

def train_and_evaluate(args):
  """Parse TF_CONFIG to cluster_spec and call run() method.

  TF_CONFIG environment variable is available when running using
  gcloud either locally or on cloud. It has all the information required
  to create a ClusterSpec which is important for running distributed code.

  Args:
    args (args): Input arguments.
  """

  tf_config = os.environ.get('TF_CONFIG')
  # If TF_CONFIG is not available run local.
  if not tf_config:
    return run(target='', cluster_spec=None, is_chief=True, args=args)

  tf_config_json = json.loads(tf_config)
  cluster = tf_config_json.get('cluster')
  job_name = tf_config_json.get('task', {}).get('type')
  task_index = tf_config_json.get('task', {}).get('index')

  # If cluster information is empty run local.
  if job_name is None or task_index is None:
    return run(target='', cluster_spec=None, is_chief=True, args=args)

  cluster_spec = tf.train.ClusterSpec(cluster)
  server = tf.train.Server(cluster_spec,
                           job_name=job_name,
                           task_index=task_index)

  # Wait for incoming connections forever.
  # Worker ships the graph to the ps server.
  # The ps server manages the parameters of the model.
  #
  # See a detailed video on distributed TensorFlow
  # https://www.youtube.com/watch?v=la_M6bCV91M
  if job_name == 'ps':
    server.join()
    return
  elif job_name in ['master', 'worker']:
    return run(server.target, cluster_spec, is_chief=(job_name == 'master'),
               args=args)

분산 학습을 위한 device_filters 설정

대규모 분산 학습에서는 학습 애플리케이션이 머신 장애에 대해 복원력을 갖추도록 머신 간 통신이 안정적이어야 합니다.

이를 위해서는 마스터가 활성 상태인 작업자를 사용하지 않도록 학습 애플리케이션의 기기 필터를 설정해야 합니다. device_filters를 설정하면 마스터 및 작업자 시스템이 매개변수 서버와만 통신하도록 할 수 있습니다.

아래의 예시는 tf.estimator 라이브러리를 사용할 때 device_filters를 설정하는 방법을 보여줍니다.

def _get_session_config_from_env_var():
    """Returns a tf.ConfigProto instance that has appropriate device_filters
    set."""

    tf_config = json.loads(os.environ.get('TF_CONFIG', '{}'))

    if (tf_config and 'task' in tf_config and 'type' in tf_config['task'] and
            'index' in tf_config['task']):
        # Master should only communicate with itself and ps
        if tf_config['task']['type'] == 'master':
            return tf.ConfigProto(device_filters=['/job:ps', '/job:master'])
        # Worker should only communicate with itself and ps
        elif tf_config['task']['type'] == 'worker':
            return tf.ConfigProto(device_filters=[
                '/job:ps',
                '/job:worker/task:%d' % tf_config['task']['index']
            ])
    return None

그런 다음 아래와 같이 이 session_configtf.estimator.RunConfig로 전달합니다.

config = tf.estimator.RunConfig(session_config=_get_session_config_from_env_var())

TensorFlow 1.10 이상에서는 이 값이 tf.estimator 라이브러리에서 기본적으로 설정됩니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.