Amazon SageMaker PlatoBlockchain Data Intelligence에서 TensorFlow 1.x 가속 교육을 위한 모범 사례. 수직 검색. 일체 포함.

Amazon SageMaker에서 TensorFlow 1.x 가속 교육을 위한 모범 사례

오늘날 많은 고객이 TensorFlow를 사용하여 전자 상거래의 광고 및 개인화 권장 사항의 클릭률에 대한 딥 러닝 모델을 훈련하고 있습니다. 고객의 행동이 변화함에 따라 매일 많은 양의 새로운 데이터를 축적할 수 있습니다. 모델 반복은 데이터 과학자의 일상 업무 중 하나이지만 대규모 데이터 세트를 학습하는 데 너무 오래 걸리는 문제에 직면해 있습니다.

아마존 세이지 메이커 TensorFlow 및 PyTorch와 같은 자체 알고리즘 및 프레임워크에 대한 기본 지원을 통해 데이터 과학자가 인프라 대신 모델에 집중하는 데 도움이 될 수 있는 완전 관리형 머신 러닝(ML) 플랫폼입니다. SageMaker는 특정 워크플로에 맞게 조정되는 유연한 분산 교육 옵션을 제공합니다. 많은 데이터 과학자는 가속 교육 프로세스에 대한 경험이 부족할 수 있으므로 이 게시물에서는 SageMaker의 TensorFlow 1.x에 대한 가속 교육의 모범 사례와 빠른 딥 러닝 모델 교육에 중요한 요소를 보여줍니다. 우리는 또한 DeepFM SageMaker에 대한 분산 교육 GitHub 레포.

SageMaker에서 TensorFlow 스크립트를 실행할 때 CPU/GPU 활용을 극대화하기 위해 고려해야 할 많은 요소(예: 인프라, 가속기 유형, 분산 교육 방법, 데이터 로드 방법, 혼합 정밀도 교육 등)가 있습니다.

다음 영역에서 모범 사례를 논의합니다.

  • 단일 인스턴스에서 교육 가속화
  • 여러 인스턴스에 대한 교육 가속화
  • 데이터 파이프라인
  • 자동 혼합 정밀 훈련

단일 인스턴스에서 교육 가속화

단일 인스턴스에서 TensorFlow 스크립트를 실행할 때 다음과 같이 컴퓨터에 최적화된 시리즈를 선택할 수 있습니다. 아마존 엘라스틱 컴퓨트 클라우드 (Amazon EC2) C5 시리즈 또는 p3.8xlarge, p3.16xlarge, p3dn.24xlarge 및 p4d.24xlarge와 같은 단일 인스턴스에 여러 GPU가 있는 가속 컴퓨팅 시리즈.

이 섹션에서는 단일 인스턴스의 여러 CPU에 대한 전략과 단일 인스턴스의 여러 GPU를 사용한 분산 교육에 대해 설명합니다.

단일 인스턴스의 다중 CPU

이 섹션에서는 CPU 장치, 타워 방식, TensorFlow MirroredStrategy 및 Horovod에서 운영자의 병렬 처리를 수동으로 설정하는 방법에 대해 설명합니다.

CPU 장치에서 수동으로 작업자 병렬 설정

TensorFlow는 훈련 프로세스에서 연산 계산을 병렬화하기 위해 적절한 수의 스레드를 자동으로 선택합니다. 그러나 다음을 설정할 수 있습니다. intra_op 스레드 풀 및 inter_op TensorFlow에서 제공하는 병렬 처리 설정과 MKL-DNN의 환경 변수를 사용하여 OS 스레드에 대한 바인딩을 설정합니다. 다음 코드를 참조하십시오.

# Set parallelism of intra_op and inter_op
num_cpus = int(os.environ['SM_NUM_CPUS'])
config = tf.ConfigProto(allow_soft_placement=True, device_count={'CPU': num_cpus}, intra_op_parallelism_threads=num_cpus, inter_op_parallelism_threads=num_cpus)
run_config = tf.estimator.RunConfig().replace(session_config = config)

# Use Intel MKL-DNN Setting to accelerate training speed
os.environ["KMP_AFFINITY"]= "verbose,disabled"
os.environ['OMP_NUM_THREADS'] = str(num_cpus)
os.environ['KMP_SETTINGS'] = '1'

환경 변수 KMP_AFFINITY MKL-DNN의 설정 granularity=fine,compact,1,0 기본적으로. TensorFlow의 내부 및 내부를 현재 인스턴스의 최대 vCPU 수로 설정한 후 CPU 사용량의 상한선은 훈련 인스턴스의 물리적 코어 수와 거의 동일합니다.

설정 한 경우 os.environ["KMP_AFFINITY"]= "verbose,disabled", OS 스레드는 하드웨어 하이퍼 스레드에 바인딩되지 않으며 CPU 사용량은 물리적 코어 수를 초과할 수 있습니다.

TensorFlow 내부 병렬 처리, TensorFlow 내부 병렬 처리 및 MKL-DNN 스레드 수의 설정과 관련하여 이 세 가지 매개변수의 다른 조합으로 인해 학습 속도가 달라집니다. 따라서 최상의 조합을 찾으려면 각 사례를 테스트해야 합니다. 일반적인 상황은 세 개의 매개변수(intra_op_parallelism_threadsinter_op_parallelism_threads 텐서플로우의 경우, os.environ['OMP_NUM_THREADS'] MKL-DNN의 경우) vCPU(물리적 코어) 수 또는 총 vCPU 수의 절반으로 줄입니다.

타워 방식

GPU를 통해 모델을 복제하기 위해 각 GPU는 순방향 패스의 고유한 인스턴스를 가져옵니다. 정방향 패스의 인스턴스를 호출합니다. . 타워 방식은 거의 항상 GPU 장치에 사용됩니다. 훈련 속도를 다른 방법과 비교하기 위해 여기에서도 CPU 장치에 대해 타워 방법을 사용합니다.

CPU 장치를 수동으로 설정하지 않으면 TensorFlow는 타워 방법을 사용하여 기울기를 평균화하지 않으므로 이러한 경우 배치 크기를 조정할 필요가 없습니다.

  1. CPU 장치를 수동으로 설정:
device_list = []
if manual_CPU_device_set:
		cpu_prefix=’/cpu:’
		for I in range(1, num_cpus):
			devices_list.append(cpu_prefix + str(i))

  1. replicate_model_fn 포장하다 model_fn:
DeepFM = tf.estimator.Estimator(model_fn=tf.contrib.estimator.replicate_model_fn(model_fn, devices=device_list), model_dir=FLAGS.model_dir, params=model_params, config=config)

  1. TowerOptimizer 포장하다 optimizer:
optimizer = tf.contrib.estimator.TowerOptimizer(optimizer)

  1. 포장 model_fn:
with tf.variable_scope(‘deepfm_model’, reuse=tf.AUTO_REUSE)

  1. 배치 크기를 (NUM_CPU – 1)로 조정합니다.

타워 모드가 활성화된 상태에서 CPU 사용률의 차이를 살펴보겠습니다. 다음 그림은 다음 구성에서 ml.c5.18xlarge 인스턴스의 CPU 사용률을 보여줍니다.

No Tower + LibSVM 데이터 + 파이프 모드 + MKL-DNN 비활성화 바인딩 + TensorFlow 내부/상호 연산 병렬 처리를 인스턴스의 최대 vCPU 수로 설정

타워 없음

다음 그림은 다음 구성에서 ml.c5.18xlarge 인스턴스의 CPU 사용률을 보여줍니다.

CPU 장치가 설정된 타워 + LibSVM 데이터 + 파이프 모드 + MKL-DNN 비활성화 바인딩 + 인스턴스의 최대 vCPU 수로 TensorFlow 내부/상호 연산 병렬 설정

타워 방식을 사용할 때 CPU 사용량이 더 높으며 물리적 코어 수를 초과합니다.

TensorFlow Mirrored전략

TensorFlow MirroredStrategy는 한 머신의 여러 복제본에 대한 동기식 학습을 의미합니다. 이 전략은 일반적으로 여러 GPU가 있는 한 머신에서 훈련하는 데 사용됩니다. 훈련 속도를 다른 방법과 비교하기 위해 CPU 장치에 MirroredStrategy를 사용합니다.

TensorFlow MirroredStrategy를 사용할 때 CPU 장치를 설정하지 않으면 TensorFlow는 하나의 CPU만 단일 작업자로 사용하므로 리소스 낭비입니다. CPU 장치가 감소 작업을 수행하므로 수동으로 CPU 장치를 설정하는 것이 좋습니다. /CPU:0때문에 /CPU:0 장치는 여기에서 복제본으로 사용되지 않습니다. 다음 코드를 참조하십시오.

device_list = []
if manual_CPU_device_set:
		cpu_prefix=’/cpu:’
		for I in range(1, num_cpus):
			devices_list.append(cpu_prefix + str(i))
mirrored_strategy = tf.distribute.MirroredStrategy(devices=devices_list)
	else:
mirrored_strategy = tf.distribute.MirroredStrategy()

# Set strategy to config:
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy,
eval_distribute=mirrored_strategy,
session_config = config)

MirroredStrategy를 사용할 때는 배치 크기를 조정해야 합니다. 예를 들어 배치 크기를 GPU 장치 수의 배수로 조정합니다.

CPU 장치를 설정할 때 하위 전략에 대해 설정하지 않으면 cross_device_ops 매개 변수 tf.distribute.MirroredStrategy(), TensorFlow는 ReductionToOneDevice 기본적으로 하위 전략. 그러나 설정하면 HierarchicalCopyAllReduce 하위 전략으로 TensorFlow는 /CPU:0. TensorFlow 데이터셋 API와 배포 전략을 함께 사용하는 경우 함수의 기능 및 레이블 대신 데이터셋 개체가 반환되어야 합니다. input_fn.

일반적으로 TensorFlow MirroredStrategy는 CPU 교육에서 타워 방식보다 느리므로 다중 CPU 단일 호스트에서 MirroredStrategy를 사용하지 않는 것이 좋습니다.

호로 보드

호로 보드 TensorFlow, Keras, PyTorch 및 Apache MXNet을 위한 분산 딥 러닝 교육 프레임워크입니다. Horovod의 목표는 분산 딥 러닝을 빠르고 사용하기 쉽게 만드는 것입니다.

의 매개변수가 있습니다. distribution Horovod 분산 교육을 명시하는 데 사용할 수 있는 SageMaker Python SDK Estimator API. SageMaker는 인프라를 프로비저닝하고 MPI로 스크립트를 실행합니다. 다음 코드를 참조하십시오.

hvd_processes_per_host = 4
distribution = {'mpi': { 
'enabled': True, 
'processes_per_host': hvd_processes_per_host,
'custom_mpi_options': '-verbose --NCCL_DEBUG=INFO -x OMPI_MCA_btl_vader_single_copy_mechanism=none' 
} 
}

ml.p3.8xlarge와 같은 GPU 인스턴스를 선택할 때 모든 작업자에 대해 각 GPU를 고정해야 합니다.

config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

모델 수렴 속도를 높이려면 Horovod 공식 문서에 따라 작업자 수에 따라 학습률을 조정합니다. 그러나 실제 프로젝트에서는 학습률을 어느 정도 확장해야 하지만 작업자 수를 기준으로 해서는 안 되므로 모델 성능이 좋지 않습니다. 예를 들어 원래 학습률이 0.001이라면 작업자가 0.0015명 이상인 경우에도 학습률을 XNUMX로 스케일링합니다.

일반적으로 기본(Horovod 순위 0)만 평가 작업과 함께 체크포인트와 모델을 저장합니다. Horovod를 사용할 때 배치 크기를 조정할 필요가 없습니다. SageMaker 제공 파이프 모드 에서 데이터를 스트리밍 아마존 단순 스토리지 서비스 (Amazon S3)를 훈련 인스턴스로. 파이프 모드를 활성화할 때 동일한 호스트의 다른 작업자는 오류를 방지하기 위해 다른 채널을 사용해야 한다는 점에 유의하십시오. 이는 첫 번째 작업자 프로세스가 FIFO/채널 데이터를 읽고 동일한 인스턴스의 다른 작업자 프로세스가 동일한 FIFO/채널에서 데이터를 읽을 수 없기 때문에 중단되어 Horovod가 제대로 작동하지 않기 때문입니다. 이 문제를 방지하려면 인스턴스당 작업자 수에 따라 채널을 설정하십시오. 최소한 동일한 호스트의 다른 작업자가 다른 채널을 사용하는지 확인하십시오. 다른 호스트의 작업자가 동일한 채널을 사용할 수 있습니다.

Horovod를 사용할 때 다음 오류가 발생할 수 있습니다.

“One or more tensors were submitted to be reduced, gathered or broadcasted by subset of ranks and are waiting for remainder of ranks for more than 60 seconds. This may indicate that different ranks are trying to submit different tensors or that only subset of ranks is submitting tensors, which will cause deadlock.”

이 문제의 가능한 원인은 특정 순위(예: 순위 0)가 다른 순위보다 느리게 작동하거나 더 많은 작업을 수행하고 이로 인해 다른 순위가 오랜 시간 동안 대기하기 때문입니다. 0순위가 다른 순위보다 더 많은 작업을 수행해야 하는 경우가 있지만 0순위가 오랫동안 많은 일을 해서는 안 된다는 점에 유의해야 합니다. 예를 들어 검증 세트에 대한 모델 평가 및 학습 중 체크포인트 저장의 경우 이러한 작업에 오랜 시간이 소요되어 오류가 발생할 수 있는 불가피한 경우 한 가지 해결 방법은 모든 작업자가 순위 0(체크포인트 저장, 평가 등).

데이터 샤딩은 분산 교육을 사용할 때 고려해야 할 가장 중요한 사항 중 하나입니다. TensorFlow를 사용할 수 있습니다. dataset.shard() 당신의 스크립트에서. SageMaker는 또한 데이터 세트 샤드 기능을 제공합니다. 입력 채널 설정하여 distribution=S3shardbykey 데이터세트 채널에서 다음 코드를 참조하십시오.

dataset = PipeModeDataset(channel, record_format='TFRecord')

number_host = len(FLAGS.hosts)

if FLAGS.enable_data_multi_path : # If there are multi channels mapping with different S3 path
    if FLAGS.enable_s3_shard == False :
        if number_host > 1:
            index = hvd.rank() // FLAGS.worker_per_host
            dataset = dataset.shard(number_host, index)
else :
    if FLAGS.enable_s3_shard :
        dataset = dataset.shard(FLAGS.worker_per_host, hvd.local_rank())
    else :
        dataset = dataset.shard(hvd.size(), hvd.rank())

다음 그림은 타워 방식과 비교할 수 있는 Horovod(ml.c5.18xlarge, Horovod + LibSVM + 기본 intra op 및 inter op 설정)를 사용한 결과를 보여줍니다.

호로보드

단일 인스턴스에서 여러 GPU를 사용한 분산 학습

데이터 과학자는 하나의 인스턴스만 관리하고 GPU 간의 고속 상호 연결을 활용하면 되므로 단일 인스턴스에서 여러 GPU로 분산 교육을 시작하는 것이 일반적입니다. SageMaker 교육 작업은 ml.p3.8xlarge, ml.p3.16xlarge, ml.p3dn.24xlarge 및 ml.p4d.24xlarge와 같이 단일 인스턴스에 여러 GPU가 있는 여러 인스턴스 유형을 지원합니다. 방법은 단일 인스턴스의 여러 CPU와 동일하지만 스크립트에서 약간의 변경 사항이 있습니다.

타워 방식

여기서 타워 방식은 다중 CPU 훈련에서와 거의 동일합니다. 사용 중인 GPU 수에 따라 배치 크기를 조정해야 합니다.

TensorFlow Mirrored전략

의 기본 하위 전략 MirroredStrategy is NcclAllReduce. 사용 중인 GPU 수에 따라 배치 크기를 조정해야 합니다. 다음 코드를 참조하십시오.

mirrored_strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy,
				eval_distribute=mirrored_strategy)

여러 인스턴스에 대한 교육 가속화

확장은 항상 훈련 속도를 향상시키는 옵션입니다. 점점 더 많은 데이터 과학자들이 분산 교육과 관련하여 이것을 기본 옵션으로 선택합니다. 이 섹션에서는 여러 호스트를 사용한 분산 교육 전략에 대해 설명합니다.

다중 인스턴스가 있는 다중 CPU

분산 교육을 활성화할 때 여러 인스턴스와 함께 여러 CPU를 사용하는 네 가지 주요 방법이 있습니다.

    • CPU 장치에서 작업자의 병렬 처리를 수동으로 설정하지 않는 매개변수 서버
    • CPU 장치에서 작업자의 병렬 처리를 수동으로 설정하는 매개변수 서버
    • 타워가 있는 매개변수 서버(CPU 장치를 수동으로 설정하고 allow_soft_placement=True in tf.ConfigProto)
    • 호로 보드

에서 매개변수 서버를 사용하는 경우 tf.estimator API에서 체크포인트의 경로는 Amazon S3 또는 로컬 경로와 같은 공유 가능한 경로여야 합니다. 아마존 엘라스틱 파일 서비스 (Amazon EFS) 컨테이너에 매핑합니다. 매개변수 서버의 경우 tf.keras, 체크포인트 경로를 로컬 경로로 설정할 수 있습니다. Horovod의 경우 체크포인트 경로를 훈련 인스턴스의 로컬 경로로 설정할 수 있습니다.

매개변수 서버를 사용하는 경우 tf.estimator Amazon S3에 대한 체크포인트 경로가 있는 API, 모델이 상당히 큰 경우 체크포인트를 S3에 저장할 때 기본 오류가 발생할 수 있습니다. SageMaker 내장 컨테이너 TensorFlow 1.15 또는 TensorFlow 1.15.2를 사용하거나 Amazon EFS를 공유의 체크포인트 경로로 사용할 수 있습니다.

여러 호스트에 대해 매개변수 서버를 사용할 때 각 매개변수 서버 프로세스의 매개변수 로드가 불균형할 수 있으며(특히 임베딩 테이블 변수가 상대적으로 큰 경우) 오류가 발생할 수 있습니다. 각 파라미터 서버는 체크포인트 파일의 샤드에 해당하므로 Amazon S3에서 각 샤드 체크포인트의 파일 크기를 확인하여 파라미터 서버의 파라미터가 균형을 이루고 있는지 확인할 수 있습니다. 이러한 문제를 방지하기 위해 파티셔너 기능을 사용하여 각 매개변수 서버의 매개변수가 고르게 분포되도록 할 수 있습니다.

with tf.variable_scope('deepfm_model', reuse=tf.AUTO_REUSE, partitioner = tf.fixed_size_partitioner(num_shards=len(FLAGS.hosts))):

여러 인스턴스가 있는 단일 GPU

SageMaker 교육 작업은 ml.p3.xlarge, ml.g4dn 및 ml.g5 시리즈와 같이 GPU가 하나만 있는 인스턴스를 지원합니다. 이 시나리오에는 매개변수 서버와 Horovod의 두 가지 주요 방법이 사용됩니다.

SageMaker의 내장 매개변수 서버 분산 학습 방법은 매개변수 서버 프로세스와 각 학습 인스턴스(각 매개변수 서버는 모델 매개변수의 일부만 담당)에 대한 작업자 프로세스를 시작하는 것이므로 기본값은 다중 머신 단일- GPU 훈련. SageMaker 내장 매개변수 서버 분산 교육은 비동기 그라디언트 업데이트 방법입니다. 훈련 수렴에 대한 비동기 업데이트의 영향을 줄이려면 학습률을 줄이는 것이 좋습니다. 인스턴스의 모든 GPU를 사용하려면 매개변수 서버와 타워 방식을 조합하여 사용해야 합니다.

Horovod의 경우 설정만 하면 됩니다. processes_per_host=1 SageMaker Python Estimator API의 배포 매개변수에서.

여러 인스턴스가 있는 여러 GPU

파라미터 서버 및 타워 방식의 경우 코드 변경은 기본적으로 다중 GPU가 있는 단일 인스턴스의 타워 방식과 동일하며 GPU 장치를 수동으로 설정할 필요가 없습니다.

Horovod의 경우 distribution 매개변수의processs_per_host를 각 학습 인스턴스의 GPU 수로 설정합니다. 파이프 모드를 사용하는 경우 인스턴스당 작업자 수가 채널 수와 일치해야 합니다.

데이터 파이프라인

우리가 논의한 인프라 외에도 고려해야 할 또 다른 중요한 사항이 있습니다. 바로 데이터 파이프라인입니다. 데이터 파이프라인은 데이터가 신경망에 공급되기 전에 데이터를 로드하고 변환하는 방법을 나타냅니다. CPU는 데이터를 준비하는 데 사용되는 반면 GPU는 CPU에서 데이터를 계산하는 데 사용됩니다. GPU는 값비싼 리소스이므로 GPU 유휴 시간이 많을수록 비효율적입니다. 훈련 작업의 좋은 데이터 파이프라인은 GPU 및 CPU 사용률을 향상시킬 수 있습니다.

TensorFlow 데이터 입력 파이프라인을 최적화하려고 할 때 사용된 API 순서를 고려하십시오. TensorFlow 데이터세트, 훈련 데이터 크기(많은 작은 파일 또는 여러 개의 큰 파일), 배치 크기 등.

훈련 중 GPU와 CPU 간의 상호 작용을 살펴보겠습니다. 다음 그림은 파이프라인이 있는 경우와 없는 경우의 상호 작용을 비교합니다.

관로

더 나은 파이프라인은 GPU 유휴 시간을 줄일 수 있습니다. 다음 팁을 고려하십시오.

  • 기능 및 레이블 추출에 간단한 함수 논리 사용
  • 샘플을 메모리로 프리페치
  • 불필요한 디스크 I/O 및 네트워킹 I/O 감소
  • 처리된 기능 및 레이블을 메모리에 캐시
  • CPU와 GPU 간의 복제 횟수 감소
  • 다른 작업자가 교육 데이터 세트의 다른 부분을 처리하도록 합니다.
  • TensorFlow 데이터 세트 API 호출 시간 단축

TensorFlow는 데이터셋 형식과 관련된 변환 API를 제공하며, TensorFlow에서 변환 API의 순서는 학습 속도에 많은 영향을 미칩니다. TensorFlow 데이터 세트 API를 호출하는 가장 좋은 순서를 테스트해야 합니다. 다음은 몇 가지 기본 원칙입니다.

  • 벡터화된 지도를 사용합니다. 즉, 먼저 TensorFlow 데이터세트 배치 API를 호출한 다음 데이터세트 맵 API를 호출합니다. 다음과 같은 지도 기능에서 제공되는 사용자 정의 파싱 기능 decode_tfrecord 샘플 코드에서 데이터의 미니 배치를 구문 분석합니다. 이에 반해 map을 먼저 처리한 다음 배치를 수행하는 것은 스칼라 맵이고 사용자 정의 파서 함수는 하나의 샘플만 처리합니다.
  • TensorFlow 데이터세트 캐시 API를 사용하여 기능 및 라벨을 캐시합니다. TensorFlow 데이터 세트 캐시 API를 TensorFlow 데이터 세트 반복 API 앞에 두십시오. 그렇지 않으면 RAM 사용률이 시대별로 선형적으로 증가합니다. 데이터세트가 RAM만큼 큰 경우 TensorFlow 데이터세트 캐시 API를 사용하지 마세요. TensorFlow 데이터세트 캐시 API 및 셔플 API를 사용해야 하는 경우 TensorFlow 데이터세트 객체 생성 -> 캐시 API -> 셔플 API -> 배치 API -> 맵 API -> 반복 API -> 프리페치 API의 순서를 사용하는 것이 좋습니다.
  • 사용 tfrecord LibSVM 형식보다 데이터 세트 형식입니다.
  • 파일 모드 또는 파이프 모드는 데이터세트 형식과 파일 양에 따라 다릅니다. 그만큼 tfrecorddataset API 설정 가능 num_parallel_reads 여러 파일을 병렬로 읽고 설정하려면 buffer_size 데이터 읽기를 최적화하는 반면 pipemodedataset API에는 이러한 설정이 없습니다. 파이프 모드는 단일 파일이 크고 총 파일 수가 적은 상황에 더 적합합니다. SageMaker 처리 작업을 사용하여 레이블에 따라 더 큰 파일에 여러 파일을 결합하고, 데이터 세트를 보다 균형 있게 만들기 위한 샘플링 방법을 사용하고, 균형 잡힌 데이터 세트를 섞는 등의 전처리 작업을 수행하는 것이 좋습니다.

다음 코드 샘플을 참조하세요.

def decode_tfrecord(batch_examples):
        # The feature definition here should BE consistent with LibSVM TO TFRecord process.
        features = tf.parse_example(batch_examples,
                                           features={
                                               "label": tf.FixedLenFeature([], tf.float32),
                                               "ids": tf.FixedLenFeature(dtype=tf.int64, shape=[FLAGS.field_size]),
                                               "values": tf.FixedLenFeature(dtype=tf.float32, shape=[FLAGS.field_size]) 
                                           })
        
        batch_label = features["label"]
        batch_ids = features["ids"]
        batch_values = features["values"]
        
        return {"feat_ids": batch_ids, "feat_vals": batch_values}, batch_label


    def decode_libsvm(line):
        columns = tf.string_split([line], ' ')
        labels = tf.string_to_number(columns.values[0], out_type=tf.float32)
        splits = tf.string_split(columns.values[1:], ':')
        id_vals = tf.reshape(splits.values,splits.dense_shape)
        feat_ids, feat_vals = tf.split(id_vals,num_or_size_splits=2,axis=1)
        feat_ids = tf.string_to_number(feat_ids, out_type=tf.int32)
        feat_vals = tf.string_to_number(feat_vals, out_type=tf.float32)
        return {"feat_ids": feat_ids, "feat_vals": feat_vals}, labels

if FLAGS.pipe_mode == 0:
        dataset = tf.data.TFRecordDataset(filenames)
    else :
        # Enter Pipe mode
        dataset = PipeModeDataset(channel, record_format='TFRecord')
        
    if FLAGS.enable_s3_shard == False:
        host_rank = FLAGS.hosts.index(FLAGS.current_host)
        number_host = len(FLAGS.hosts)
        dataset = dataset.shard(number_host, host_rank)
    
    dataset = dataset.batch(batch_size, drop_remainder=True) # Batch size to use
    dataset = dataset.map(decode_tfrecord,
                          num_parallel_calls=tf.data.experimental.AUTOTUNE) 

    if num_epochs > 1:
        dataset = dataset.repeat(num_epochs)
    dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

CPU 인스턴스에 대한 교육의 경우 병렬 처리를 설정합니다. intra op, inter op, 그리고 MKL-DNN의 환경 변수는 좋은 출발점입니다.

자동 혼합 정밀 훈련

마지막으로 논의하는 것은 속도를 가속화하고 모델 성능을 향상시킬 수 있는 자동 혼합 정밀 훈련입니다. 이 글을 쓰는 시점에서 Nvidia V100 GPU(P3 인스턴스) 및 A100(P4dn 인스턴스)은 Tensor 코어를 지원합니다. 이러한 유형의 인스턴스를 사용할 때 TensorFlow에서 혼합 정밀도 훈련을 활성화할 수 있습니다. 버전 1.14부터 TensorFlow는 자동 혼합 정밀도 훈련을 지원합니다. 다음 문을 사용하여 원래 옵티마이저를 래핑할 수 있습니다.

tf.train.experimental.enable_mixed_precision_graph_rewrite(optimizer)

모델이 작고 GPU 활용도가 낮으면 자동 혼합 정밀도 훈련의 이점이 없습니다. 모델이 크면 자동 혼합 정밀도 훈련이 훈련 속도를 가속화할 수 있습니다.

결론

SageMaker에서 딥 러닝 모델 교육을 시작할 때 더 빠른 교육 속도를 얻으려면 다음 팁을 고려하십시오.

  • 다중 CPU, 단일 인스턴스 방법 또는 단일 GPU, 단일 인스턴스 방법을 먼저 시도하십시오. CPU/GPU 사용률이 매우 높으면(예: 90% 이상) 다음 단계로 이동합니다.
  • 단일 호스트에서 더 많은 CPU를 사용하거나 단일 호스트에서 더 많은 GPU를 사용해 보십시오. 사용률이 CPU 또는 GPU의 최대 사용률에 근접한 경우 다음 단계로 이동합니다.
  • 여러 호스트에서 여러 CPU 또는 여러 GPU를 사용해 보십시오.
  • 파라미터 서버나 Horovod를 사용할 때 코드를 수정해야 합니다. TensorFlow 세션 기반 API의 코드 수정은 동일하지 않으며, tf.estimator API 및 tf.keras API. 매개변수 서버 또는 Horovod는 훈련 사례 및 작업에 따라 다른 훈련 속도를 나타낼 수 있으므로 최상의 방법을 결정할 시간과 예산이 있는 경우 두 가지 방법을 모두 시도하십시오.

다음 조언을 염두에 두십시오.

  • 확장하기 전에 활용도를 확인하고, 데이터 파이프라인을 최적화하고, 타임라인에서 CPU와 GPU를 겹칩니다.
  • 먼저 확장한 다음 확장합니다.
  • 모든 방법 후에도 GPU 사용률을 생성할 수 없으면 CPU를 사용해 보십시오. CPU 인스턴스 훈련의 총 훈련 시간이 GPU 인스턴스 훈련보다 짧고 비용 효율적인 경우가 많습니다(특히 클릭률 순위 모델의 경우).

우리는 또한 GitHub 레포, 여기서 SageMaker에서 DeepFM 분산 교육의 두 가지 샘플을 보여줍니다. 하나는 CPU 인스턴스의 TensorFlow 매개변수 서버이고 다른 하나는 GPU 인스턴스의 Horovod입니다.


저자에 관하여

Amazon SageMaker PlatoBlockchain Data Intelligence에서 TensorFlow 1.x 가속 교육을 위한 모범 사례. 수직 검색. 일체 포함. 량위후이 수석 기계 학습 솔루션 설계자입니다. 그는 기계 학습의 홍보 및 적용에 중점을 두고 있으며 많은 고객의 기계 학습 프로젝트에 깊이 관여하고 있습니다. 그는 딥 러닝 분산 교육, 추천 시스템 및 컴퓨터 광고에 대한 풍부한 경험을 가지고 있습니다.

Amazon SageMaker PlatoBlockchain Data Intelligence에서 TensorFlow 1.x 가속 교육을 위한 모범 사례. 수직 검색. 일체 포함.시슈아이 왕 수석 기계 학습 솔루션 설계자입니다. 그는 AWS 고객과 협력하여 대규모 기계 학습을 채택하도록 돕습니다. 그는 영화를 보고 세계를 여행하는 것을 즐깁니다.

타임 스탬프 :

더보기 AWS 기계 학습