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 파일을 가져와서 다음 단계를 위한 입력 파일로 변환하겠습니다.

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

다중 노드 사례보다 움직이는 부분이 적기 때문에 먼저 단일 노드에서 실행되는 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으로 이동하면 다음과 같은 내용이 표시됩니다.

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

(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 다운로드
