Rescale에서 다중 GPU를 사용한 딥 러닝: TensorFlow 튜토리얼

마크블로그텐서플로우
안에 이전 게시물, 우리는 여러 GPU를 사용하여 심층 신경망(DNN)을 훈련시키는 예를 보여주었습니다. 토치 머신러닝 라이브러리. 이 게시물에서는 다음을 사용하여 다중 GPU 교육을 수행하는 데 중점을 둘 것입니다. TensorFlow.

특히 Rescale에서 다중 GPU 및 다중 노드 구성을 사용한 데이터 병렬 GPU 교육을 살펴보겠습니다. Rescale의 기존 MPI 구성 클러스터를 활용하여 TensorFlow 분산 교육 작업자를 쉽게 시작할 것입니다. 단일 GPU에서 TensorFlow를 사용한 교육의 기본 예는 다음을 참조하세요. 이 이전 게시물.

데이터 준비
다중 GPU 교육 세션을 더욱 흥미롭게 만들기 위해 더 큰 데이터 세트를 사용할 것입니다. 나중에 인기 있는 교육 작업을 보여드리겠습니다. IMAGEnet 이미지 분류 데이터 세트. 이 150GB 데이터 세트로 시작하기 전에 ImageNet과 동일한 형식이 되도록 더 작은 데이터 세트를 준비하고 이를 사용하여 작업을 테스트하여 TensorFlow 트레이너가 제대로 작동하는지 확인합니다. 훈련 중에 데이터를 로컬로 유지하기 위해 Rescale은 훈련이 시작되기 전에 데이터 세트를 GPU 노드의 로컬 저장소에 동기화합니다. 몇 가지 예만 사용하여 반복적으로 모델을 개발할 때 ImageNet과 같은 대규모 데이터 세트가 동기화될 때까지 기다리는 것은 낭비입니다. 이러한 이유로 우리는 더 작은 것부터 시작하겠습니다. 꽃들 데이터 세트를 만들고 작업 예제가 있으면 ImageNet으로 이동하세요.
TensorFlow는 다음과 같은 형식의 이미지를 처리합니다. TF레코드 먼저 꽃 데이터세트에서 png를 다운로드하고 전처리하여 이 형식으로 만들어 보겠습니다. 오늘 보여드릴 모든 예제는 Inception 모듈에서 나온 것입니다. 텐서플로우/모델 저장소 GitHub에서 해당 저장소를 복제하는 것부터 시작합니다.

자식 클론 https://github.com/tensorflow/models

이제 우리는 바젤 꽃 다운로드 및 사전 처리 스크립트를 만든 다음 해당 스크립트를 실행하는 빌드 도구:

pushd 모델/inception bazel 클린 bazel 빌드 inception/download_and_preprocess_flowers popd 모델/inception/bazel-bin/inception/download_and_preprocess_flowers $(pwd)/flowers

그러면 ~220MB 아카이브가 다운로드되고 다음과 같은 내용이 생성됩니다.

$ ls 꽃 flower_photos.tgz 기차-00000-of-00002 유효성 검사-00000-of-00002 원시 데이터 기차-00001-of-00002 유효성 검사-00001-of-00002

우리는 이 아카이브를 모아서 Rescale에 업로드합니다. 필요한 모든 정보가 이제 TFRecords로 인코딩되므로 선택적으로 원시 데이터 및 아카이브 파일을 삭제할 수 있습니다.

pushd 꽃 rm -rf 원시 데이터 flower_photos.tgz popd tar czf flowers.tar.gz 꽃

우리는 Rescale의 전처리 작업에서 이러한 모든 작업을 조합했습니다. 여기에서 지금 확인해 보세요. 당신이 직접 복제하고 실행할 수 있습니다.

다음으로 방금 생성한 flowers.tar.gz 파일을 가져와서 다음 단계를 위한 입력 파일로 변환하겠습니다.
1-꽃 입력 파일

이제 훈련을 위한 전처리된 꽃 이미지 TFRecords가 준비되었습니다.

단일 노드 – 다중 GPU
다음 단계는 이 입력 데이터 세트를 가져와서 모델을 교육하는 것입니다. 위에서 언급한 대로 Tensorflow/models 저장소의 Inception v3 DNN 아키텍처를 사용할 것입니다. 여러 GPU를 사용하는 단일 노드에서의 훈련은 다음과 같습니다.

(https://github.com/tensorflow/models/tree/master/inception#how-to-train-from-scratch에서)


다중 노드 사례보다 움직이는 부분이 적기 때문에 먼저 단일 노드에서 실행되는 Rescale 작업을 생성하겠습니다. 실제로 작업에서 3개의 프로세스를 실행합니다.

  • 주요 GPU 기반 모델 훈련
  • 검증 세트에서 체크포인트 모델의 CPU 기반 평가
  • 텐서보드 시각화 도구

그럼 시작해 보겠습니다! 먼저 빌드 훈련평가 스크립트.

pushd 모델/inception bazel clean bazel 빌드 inception/imagenet_train inception/imagenet_eval popd

다음으로 일부 출력 디렉터리를 만들고 주요 훈련 프로세스를 시작합니다. 

mkdir -p out/train out/eval models/inception/bazel-bin/inception/imagenet_train --num_gpus=$RESCALE_GPUS_PER_SLOT --batch_size=32 --train_dir=out/train --data_dir=flowers

$RESCALE_GPUS_PER_SLOT 모든 Rescale 작업 환경에 설정된 변수입니다. 이 명령줄에서는 학습 이미지가 있는 flowers 디렉터리와 TensorFlow가 로그 및 모델 파일을 출력할 빈 out/train 디렉터리를 가리킵니다.

검증 세트의 정확도 평가는 별도로 수행할 수 있으며 GPU 가속이 필요하지 않습니다.

CUDA_VISIBLE_DEVICES='' 모델/inception/bazel-bin/inception/imagenet_eval --eval_dir=out/eval --checkpoint_dir=$HOME/work/out/train --eval_interval_secs=1200 --data_dir=flowers

imagenet_eval 반복해서 앉아서 매일 일어난다 eval_interval_secs 가장 최근에 훈련된 모델 체크포인트의 정확성을 평가합니다. out/train 검증 TFRecord에 대해 flowers 예배 규칙서. 정확도 결과는 다음에 기록됩니다. out/eval. CUDA_VISIBLE_DEVICES 여기서 중요한 매개변수입니다. TensorFlow는 GPU를 사용하지 않더라도 기본적으로 항상 GPU 메모리에 자체 로드됩니다. 이 매개변수가 없으면 교육 및 평가 프로세스 모두 GPU의 모든 메모리를 소모하여 교육이 실패하게 됩니다.

마지막으로 TensorBoard는 TensorFlow의 진행 상황을 모니터링하는 편리한 도구입니다. TensorBoard는 자체 웹 서버를 실행하여 학습 진행 상황 플롯, 모델 그래프 및 기타 시각화를 표시합니다. 시작하려면 다음을 가리키기만 하면 됩니다. out 교육 및 평가 프로세스가 출력되는 디렉터리:

CUDA_VISIBLE_DEVICES='' 텐서보드 --logdir=out

TensorBoard는 logdir의 모든 하위 디렉터리에 로그를 가져와 훈련 및 평가 데이터를 함께 표시합니다.

이 모든 것을 종합하면 다음과 같습니다.

DATASET=flowers pushd models/inception bazel clean bazel 빌드 inception/imagenet_train inception/imagenet_eval popd mkdir -p out/train out/eval echo "$RESCALE_GPUS_PER_SLOT GPU 교육" CUDA_VISIBLE_DEVICES='' tensorboard --logdir=out & ( sleep 600; CUDA_VISIBLE_DEVICES= 모델/inception/bazel-bin/inception/imagenet_eval --eval_dir=out/eval --checkpoint_dir=$HOME/work/out/train --eval_interval_secs=1200 --num_examples=350 --data_dir=$DATASET ) & 모델/inception/bazel-bin/inception/imagenet_train --num_gpus=$RESCALE_GPUS_PER_SLOT --batch_size=32 --train_dir=out/train --data_dir=$DATASET

이 모든 것이 단일 셸에서 실행되므로 TensorBoard 및 평가 프로세스를 배경으로 합니다. 또한 훈련 프로세스가 첫 번째 모델 체크포인트를 초기화하고 생성하는 데 몇 분이 필요하므로 평가 프로세스의 시작을 지연합니다.

Rescale에서 이 훈련 작업을 실행할 수 있습니다. 여기에서 지금 확인해 보세요..

TensorBoard는 인증 없이 자체 웹 서버를 실행하므로 Rescale에서는 기본적으로 액세스가 차단됩니다. TensorBoard에 액세스하는 가장 쉬운 방법은 노드에 대한 SSH 터널을 열고 포트 6006을 전달하는 것입니다.

ssh -L 6006:localhost:6006 @



이제 https://localhost:6006으로 이동하면 다음과 같은 내용이 표시됩니다.
4텐서보드

다중 노드
현재 최첨단 기술에서는 노드에 들어갈 수 있는 총 GPU 카드 수를 약 8개로 제한합니다. 또한 TensorFlow 프로세스가 GPU 간에 작업을 배포하는 데 사용하는 메커니즘인 CUDA PXNUMXP 시스템은 현재 다음과 같습니다. GPU 장치는 8개로 제한됩니다.. 이러한 수치는 계속해서 증가하겠지만 대규모 모델과 데이터세트에 맞게 교육을 확장할 수 있는 메커니즘을 갖는 것이 여전히 편리합니다. TensorFlow 분산 훈련은 네트워크를 통해 다양한 훈련 프로세스 간의 업데이트를 동기화하므로 모든 네트워크 패브릭에서 사용할 수 있으며 CUDA 구현 세부 사항에 의해 제한되지 않습니다. 분산 훈련은 몇 가지로 구성됩니다. 근로자매개 변수 서버 여기에 표시된대로 :
5-분산-훈련

(https://github.com/tensorflow/models/tree/master/inception#how-to-train-from-scratch에서)

매개변수 서버는 입력 배치를 평가하는 데 사용되는 모델 매개변수를 제공합니다. 각 작업자의 배치가 완료된 후 오류 그라데이션이 매개변수 서버로 다시 피드백되어 이를 사용하여 새 모델 매개변수를 생성합니다. GPU 클러스터의 맥락에서 작업자 프로세스를 실행하여 클러스터의 각 GPU를 사용한 다음 그라디언트 처리를 따라갈 수 있는 충분한 매개변수 서버를 선택할 수 있습니다.

지시에 따라 여기에서 지금 확인해 보세요., GPU당 작업자를 설정하고 노드당 매개변수 서버를 설정합니다. 모든 Rescale 클러스터와 함께 제공되는 MPI 구성을 활용하겠습니다.

시작하려면 각 매개변수 서버와 작업자에 전달될 호스트 문자열을 생성해야 합니다. 각 프로세스는 고유한 문자열을 가져옵니다. 호스트 이름:포트 예를 들면 다음과 같습니다.

--ps_hosts='host1:2222,host2:2222'
--worker_hosts='host1:2223,host1:2224,host2:2223,host2:2224'

매개변수 서버의 경우 호스트당 단일 항목이 필요하고 작업자의 경우 GPU당 단일 항목이 필요합니다. 우리는 모든 Rescale 클러스터에 자동으로 설정되는 머신 파일을 활용합니다. $HOME/machinefile 클러스터에 호스트 목록이 있고 $HOME/machinefile.gpu 각 호스트의 GPU 수로 주석이 달린 호스트 목록이 있습니다. Python 스크립트에서 호스트 문자열을 생성하기 위해 이를 구문 분석합니다. make_hoststrings.py

#!/usr/bin/env python import os.path PS_PORT = 2222 WORKER_PORT_START = 2223 ps_string = ','.join('{0}:{1}'.format(hostname.strip(), PS_PORT) for 호스트 이름 open(os.path.expanduser('~/machinefile'))) 작업자 = open(os.path.expanduser('~/machinefile.gpu'))의 호스트라인에 대한 []: 호스트 이름, 슬롯, max_slots = hostline.split () 슬롯 = int(slots.split('=')[1]) 작업자 += ['{0}:{1}'.format(hostname, WORKER_PORT_START + i) for i in range(slots)] 인쇄 ps_string , ','.join(작업자)

다음으로 이러한 호스트 문자열을 가져와서 실행하는 스크립트가 있습니다. imagenet_distributed_train 적절한 작업 ID와 GPU 화이트리스트가 있는 스크립트, tf_mpistart.sh:

#!/bin/bash PROC_TYPE=$1 DATADIR=$2 host_strings=$(./make_hoststrings.py) PS_HOSTS=$(echo $host_strings | cut -d' ' -f1) WORKER_HOSTS=$(echo $host_strings | cut -d' ' -f2) TASK_ID=$OMPI_COMM_WORLD_RANK if [ $PROC_TYPE == 'ps' ]; then CUDADEV='' else CUDADEV=$OMPI_COMM_WORLD_LOCAL_RANK fi CUDA_VISIBLE_DEVICES=$CUDADEV models/inception/bazel-bin/inception/imagenet_distributed_train --batch_size=32 --data_dir=$DATADIR --train_dir=out/train --job_name=$PROC_TYPE --task_id=$TASK_ID --ps_hosts="$PS_HOSTS" --worker_hosts="$WORKER_HOSTS" >>${PROC_TYPE}-$TASK_ID.log 2>&1

 tf_mpistart.sh OpenMPI로 실행됩니다 mpirun so $OMPI* 환경변수는 자동으로 주입됩니다. 우리는 사용 $OMPI_COMM_WORLD_RANK 전역 작업 색인을 얻으려면 $OMPI_COMM_WORLD_LOCAL_RANK 노드 로컬 GPU 인덱스를 얻으려면

이제 모든 것을 종합하면 다음과 같습니다.

DATASET=flowers mv tf_mpistart.sh make_hoststrings.py 모델 $DATASET shared/ cd 공유 pushd 모델/inception bazel clean bazel --output_base=$HOME/work/shared/.cache 빌드 inception/imagenet_distributed_train inception/imagenet_eval popd mkdir -p out/ 훈련 출력/평가 CUDA_VISIBLE_DEVICES= tensorboard --logdir=out & mpirun -machinefile ~/machinefile ./tf_mpistart.sh ps & ( sleep 600; CUDA_VISIBLE_DEVICES= models/inception/bazel-bin/inception/imagenet_eval --eval_dir=out/eval --checkpoint_dir=$HOME/work/shared/out/train --eval_interval_secs=1200 --num_examples=350 --data_dir=$DATASET ) & mpirun -machinefile ~/machinefile.gpu ./tf_mpistart.sh 작업자

우리는 동일한 디렉토리 생성 및 bazel 빌드 상용구부터 시작합니다. 2가지 예외는 다음과 같습니다.

1. 모든 입력 디렉터리를 shared/ 하위 디렉터리로 이동하여 노드 간에 공유되도록 합니다.
2. 이제 다음과 같이 bazel 빌드 명령을 호출합니다. --output_base Bazel이 빌드 제품을 심볼릭 링크하지 않도록 $HOME/.cache 대신 공유 파일 시스템에서 사용할 수 있게 만듭니다.

다음으로 TensorBoard를 실행하고 imagenet_eval MPI 마스터에서 로컬로. 이 두 프로세스는 mpirun을 사용하여 노드 전체에 복제될 필요가 없습니다.

마지막으로 매개변수 서버를 시작합니다. tf_mpistart.sh ps 노드 머신 파일당 단일 항목과 다음을 가진 작업자 tf_mpistart.sh worker GPU 순위의 machinefile.gpu를 사용합니다.
여기에 2개의 Jade 노드(8개 K520 GPU)를 사용하여 꽃 데이터 세트에 대해 위의 분산 교육을 수행하는 작업 예시입니다. Rescale에 이미 설정된 MPI 인프라를 사용하고 있으므로 노드 수 또는 노드당 GPU에 대해 이 동일한 예를 사용할 수 있습니다. 적절한 머신 파일을 사용하면 작업자 수와 매개변수 서버 수가 리소스와 일치하도록 자동으로 설정됩니다.
ImageNet 교육
이제 작은 꽃 데이터세트에 대해 TensorFlow 분산 학습 작업을 시작하는 기계를 개발했으므로 전체 ImageNet 데이터세트에 대해 학습할 준비가 되었습니다. ImageNet을 다운로드하려면 권한이 필요합니다. 여기에서 지금 확인해 보세요.. 액세스를 요청할 수 있으며, 수락하면 필요한 타르볼을 다운로드할 수 있는 사용자 이름과 비밀번호가 제공됩니다.
그런 다음 위의 꽃 작업과 유사한 준비 작업을 실행하여 데이터 세트를 다운로드하고 이미지 형식을 TFRecords로 지정할 수 있습니다.

# ************************* # 아래 이미지넷 값 설정 # ****************** ******* 내보내기 DATA_DIR=$HOME/work/imagenet-data 내보내기 IMAGENET_USERNAME= 내보내기 IMAGENET_ACCESS_KEY= cd 모델/inception bazel 빌드 inception/download_and_preprocess_imagenet bazel-bin/inception/download_and_preprocess_imagenet "${DATA_DIR}" rm -rf imagenet -data/raw-data imagenet-data/*.gz tar -cf ilsvrc2012.tar imagenet-data rm -rf imagenet-data

Rescale에서 이 준비 작업을 복제하고 실행할 수 있습니다. 여기에서 지금 확인해 보세요..
ImageNet 사이트(ILSVRC3_img_train.tar, ILSVRC2012_img_val.tar 및 ILSVRC2012_bbox_train_v2012.tar.gz)에서 필요한 입력 2개를 이미 다운로드하고 이를 HTTP를 통해 액세스할 수 있는 위치(예: AWS S3 버킷)에 배치한 경우 사용자 정의할 수 있습니다. 모델/인셉션/인셉션/데이터/download_imagenet.sh 사용자 정의 위치에서 다운로드하려면 tensorflow/models 저장소에서:

# ************************ # 아래에 BASE_URL 값 설정 # ******************* ***** 내보내기 DATA_DIR=$HOME/work/imagenet-data 내보내기 BASE_URL= sed -i "s#BASE_URL=.*#BASE_URL=${BASE_URL}#" download_imagenet_noauth.sh mv download_imagenet_noauth.sh 모델/인셉션/인셉션 /data/download_imagenet.sh CD 모델/inception bazel 빌드 inception/download_and_preprocess_imagenet bazel-bin/inception/download_and_preprocess_imagenet "${DATA_DIR}" rm -rf imagenet-data/raw-data imagenet-data/*.gz tar -cf ilsvrc2012. tar 이미지넷 데이터 rm -rf 이미지넷 데이터

이 버전의 준비 작업 복제 및 실행 여기에서 지금 확인해 보세요..
마지막으로 상단의 $DATASET 변수를 변경하여 꽃 디렉토리 대신 imagenet-data 데이터 세트 디렉토리를 사용하도록 다중 GPU 꽃 작업을 약간 수정할 수 있습니다.

DATASET=imagenet-data pushd models/inception bazel clean bazel 빌드 inception/imagenet_train bazel 빌드 inception/imagenet_eval popd mkdir -p out/train out/eval echo "$RESCALE_GPUS_PER_SLOT GPU 교육" CUDA_VISIBLE_DEVICES= tensorboard --logdir=out & ( sleep 600; CUDA_VISIBLE_DEVICES= 모델/inception/bazel-bin/inception/imagenet_eval --eval_dir=out/eval --checkpoint_dir=$HOME/work/out/train --eval_interval_secs=1200 --data_dir=$DATASET ) 및 모델/인셉션 /bazel-bin/inception/imagenet_train --num_gpus=$RESCALE_GPUS_PER_SLOT --batch_size=32 --train_dir=out/train --data_dir=$DATASET rm -rf $DATASET 모델

분산 교육 사례는 다음과 같습니다.

DATASET=imagenet-data pushd models/inception bazel clean bazel 빌드 inception/imagenet_train bazel 빌드 inception/imagenet_eval popd mkdir -p out/train out/eval echo "$RESCALE_GPUS_PER_SLOT GPU 교육" CUDA_VISIBLE_DEVICES= tensorboard --logdir=out & ( sleep 600; CUDA_VISIBLE_DEVICES= 모델/inception/bazel-bin/inception/imagenet_eval --eval_dir=out/eval --checkpoint_dir=$HOME/work/out/train --eval_interval_secs=1200 --data_dir=$DATASET ) 및 모델/인셉션 /bazel-bin/inception/imagenet_train --num_gpus=$RESCALE_GPUS_PER_SLOT --batch_size=32 --train_dir=out/train --data_dir=$DATASET rm -rf $DATASET 모델

TensorFlow를 사용하여 다중 GPU, 단일 및 다중 노드 모델 교육을 수행하기 위한 모든 세부 사항을 살펴보았습니다. 다음 게시물에서는 분산 훈련이 성능에 미치는 영향에 대해 논의하고 다양한 서버 구성에서 얼마나 잘 확장되는지 살펴보겠습니다.

작업 크기 조정
다음은 이 예에 사용된 Rescale 작업에 대한 요약입니다. 링크를 클릭하여 작업을 Rescale 계정으로 가져오세요.
꽃 데이터 세트 전처리
단일 노드 꽃 훈련 
다중 노드 꽃 훈련
ImageNet ILSVRC2012 다운로드 및 전처리 
기존 S2012 버킷에서 ImageNet ILSVRC3 다운로드

저자

  • 마크 휘트니

    Mark Whitney는 Rescale의 엔지니어링 이사입니다. 그의 전문 분야에는 고성능 컴퓨팅 아키텍처, 양자 정보 연구, 클라우드 컴퓨팅이 포함됩니다. 그는 캘리포니아 대학교 버클리 캠퍼스에서 컴퓨터 과학 박사 학위를 취득했습니다.

비슷한 게시물