Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products
  • Manage your Dell EMC sites, products, and product-level contacts using Company Administration.

Nvidia V100 GPU를 사용한 Dell C4140에서 CheXNet 교육을 위한 최적화 기법(영문)

Summary: Dell EMC C4140 서버에서 Nvidia V100 SXM2 GPU를 활용하여 CheXNet의 분산 스케일 아웃 교육에서 최고의 성능을 달성하기 위한 모범 사례

This article may have been automatically translated. If you have any feedback regarding its quality, please let us know using the form at the bottom of this page.

Article Content


Symptoms

이 문서는 2019년 10월 HPC AI Innovation Lab에서 Rakshith Vasudev와 John Lockman이 집필했습니다.

Cause

  -

Resolution

앞서 소개된 바와 같이 CheXNet은 DenseNet을 활용하여 제공된 흉부 X선 영상에서 최대 14개의 병변을 식별하는 AI 방사선 기사 보조 모델입니다. 확장성과 교육 정확도(긍정적인 AUROC) 향상이라는 두 가지 가능성을 보여주는 ResNet-50을 사용하여 원래의 CheXNet-121과 성능이 비슷하거나 더 우수한 모델의 교육을 확장하기 위해 여러 가지 접근 방식이 연구되었습니다. 저자는 CPU 시스템의 확장성을 입증했지만, GPU의 병렬화를 활용하여 교육 프로세스를 가속화하고자 합니다. 이 문서에서는 Dell EMC C4140 서버에서 Nvidia V100 SXM2 GPU를 활용하여 CheXNet의 분산 스케일 아웃 교육에서 최고의 성능을 달성하기 위한 모범 사례에 대해 설명합니다. Dell EMC PowerEdge C4140은 SXM2 구성의 Nvidia V100 GPU 4개를 통해 밀도와 성능을 모두 제공합니다.


 

하드웨어 구성: 소프트웨어 구성:
  • PowerEdge C4140 4개
  • Nvidia V100 32GB SXM2 4개
  • 20 코어 인텔(R) 제온(R) Gold 6148 CPU@2.40GHz 2개
  • 384GB RAM, DDR4 2666MHz
  • Mellanox EDR HCA 1개
  • Lustre 파일 시스템
  • 딥 러닝 프레임워크: tensorflow-gpu
  • 프레임워크 버전: 1.12.0
  • Horovod 버전: 0.16.4
  • MPI 버전: CUDA 및 UCX 지원 포함 4.0.0
  • CUDA 버전: 10.1.105
  • CUDNN 버전: 7.6.0
  • NCCL 버전: 2.4.7
  • Python 버전: 3.6.8
  • OS 및 버전: RHEL 7.4


 


데이터 파이프라인은 가속기의 성능을 최대한 활용하는 데 매우 중요합니다.



 

tf 데이터란 무엇입니까? 왜 사용해야 합니까?

 

GPU 및 TPU와 같은 새로운 컴퓨팅 디바이스를 통해 신경망 네트워크를 더 빠른 속도로 교육할 수 있게 됨에 따라 CPU 처리 과정에서 병목 현상이 발생하기 쉽습니다. tf.data API는 사용자에게 CPU를 효과적으로 활용하는 입력 파이프라인을 설계하기 위한 빌딩 블록을 제공하여 ETL 프로세스의 각 단계를 최적화합니다.

 

교육 단계를 수행하려면 먼저 교육 데이터를 추출 및 변환한 다음 가속기에서 실행하는 모델에 제공해야 합니다. 하지만 단순한 동시 구현 환경에서는 CPU가 데이터를 준비하는 동안 가속기가 유휴 상태로 있습니다. 반대로, 가속기가 모델을 교육하는 동안 CPU가 유휴 상태로 있습니다. 따라서 교육 단계 시간은 CPU 사전 처리 시간과 가속기 교육 시간의 합이 됩니다.

 

파이프라이닝은 교육 단계의 사전 처리 및 모델 실행과 겹칩니다. 가속기가 교육 N단계를 수행하는 동안 CPU가 N+1단계에 대한 데이터를 준비하고 있습니다. 이렇게 하면 교육 시간과 데이터를 추출하고 변환하는 데 걸리는 시간을 합계와 달리 최대한 줄일 수 있습니다.

 

파이프라이닝이 없는 경우 CPU와 GPU/TPU는 대부분의 시간을 유휴 상태로 둡니다.

SLN318898_en_US__1Sequantial execution
그림 1: 순차적 실행은 GPU를 유휴 상태로 두는 경우가 많음

 

파이프라이닝을 사용하면 유휴 시간이 크게 줄어듭니다.

SLN318898_en_US__2Pipelining overlaps
그림 2: 파이프라이닝은 CPU 및 GPU 활용도와 겹쳐져 GPU 활용도를 극대화

 

tf.data API는 Ttf.data.Dataset.prefetch 변환을 통해 소프트웨어 파이프라이닝 메커니즘을 제공합니다. 이 변환은 데이터가 소비된 시간부터 생성되는 시간 데이터를 분리하는 데 사용할 수 있습니다. 특히, 변환은 백그라운드 스레드와 내부 버퍼를 사용하여 입력 데이터 세트가 요청되기 전에 입력 데이터 세트에서 요소를 프리페치합니다.

 

자세한 내용은 https://www.tensorflow.org/guide/performance/datasets에서 참조하십시오.

 

Tensorflow가 제공하는 지침을 따르면 다음(기존 접근법)과 같이 보이는 데이터 파이프라인을 얻을 수 있습니다.
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py

 

기존 접근법이라고도 하는 이 접근법에서는 tf 데이터 파이프라인에서 다음과 같은 작업을 수행합니다(흉부 X 레이 데이터 세트가 TFRecords의 시퀀스라고 가정).

 

  1. 파일 이름의 전체 목록을 가져옵니다.
  2. TFRecordDataset()를 사용하여 파일 이름 목록에서 데이터 세트를 작성합니다.
  3. 이미지를 사전 처리하여 로드하고 포맷하는 새 데이터 세트를 만듭니다.
  4. 데이터 세트를 조각냅니다.
  5. 교육 시 데이터 세트를 섞습니다.
  6. 데이터 세트를 반복합니다.
  7. 데이터 세트를 일괄 처리합니다.
  8. batch_size에 대한 데이터 세트를 프리페치합니다.


 

그러나 이 코드가 가장 성능이 뛰어난 코드는 아닙니다. 갑자기 중단되고 GPU 사용률이 0%에 이를 수 있습니다. 기본적으로 가속기를 효과적으로 활용하지 않습니다.

tf 데이터 파이프라인을 올바르게 설정하기 위해, 특히 ResNet용 Tensorflow 공식 모델에서 채택한 접근법을 따릅니다.  이전 접근법과 새로운 접근법의 차이점은 모델에 데이터 파이프라인을 공급하기 전에 데이터 파이프라인을 설정하는 방법입니다.

 

새로운 접근 방식은 다음과 같습니다.
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py

 

Tensorflow 공식 모델 접근법은 다음과 같이 새로운 접근 방식이라고도 합니다.

 

  1. 파일 이름의 전체 목록을 가져옵니다.
  2. from_tensor_slices()를 사용하여 파일 이름 목록에서 데이터 세트를 작성합니다.
  3. 조각내기는 미리 가능합니다.
  4. 교육 중에 데이터 세트가 뒤섞입니다.
  5. 그런 다음 데이터 세트는 병렬 인터리빙되어 여러 파일(cycle_length에서 정의함)을 인터리빙하고 처리하여 TFRecord 데이터 세트를 생성하도록 이들을 변환합니다.
  6. 그런 다음 데이터 세트를 프리페치합니다. buffer_size는 프리페치되는 기록 수를 정의합니다. 이는 일반적으로 작업의 소형 batch_size입니다.
  7. 데이터 세트가 다시 뒤섞입니다. 셔플의 세부 사항은 buffer_size로 제어됩니다.
  8. 데이터 세트가 반복됩니다.  이 데이터 세트는 num_epochs가 훈련될 때까지 반복됩니다.
  9. 데이터 세트는 tf 기록 파일을 파싱하는 동시 map_and_batch()의 적용을 받으며, 이 파일은 이미지를 미리 처리하여 일괄 처리합니다.
  10. 사전 처리된 이미지가 데이터 세트로 준비되고 다시 프리페치됩니다.


 

다음은 TF 공식 모델을 사용하여 기존 접근법과 새로운 접근법의 성능을 비교한 것입니다.

SLN318898_en_US__3image(12053)
그림 3: 새로운 접근 방식을 통해 선형 확장에 가까운 것이 기대될 수 있습니다.

 

보시다시피 성능이 크게 향상되었으며 기존 접근법을 사용하는 경우 확장성이 전혀 없습니다. 활용이 거의 또는 전혀 되지 않아 GPU 성능이 저하되는 경우가 많습니다. 한 GPU에서 컴퓨팅 효율성을 높이면 통신이 잘 처리되는 경우 여러 노드에 있는 여러 GPU에서 컴퓨팅 효율성이 높아집니다.
CPU가 병렬로 전처리를 수행하므로 메모리 및 GPU에서 처리된 데이터를 프리페치하고 고속 통신을 통해 매트릭스 증배식을 수행하는 것은 이 새로운 접근 방식을 다중 노드 확장을 더욱 매력적으로 만드느 또 다른 측면입니다.


 


최적의 성능을 달성하기 위해 살펴볼 다른 기술:



 

올바른 환경을 갖추는 것이 중요합니다.

 

올바른 라이브러리/모듈을 갖추면 교육 성과에 영향을 주기 때문에 작업을 실행하는 환경이 작업만큼 중요합니다. 또한 최신 CUDA 관련 라이브러리가 있으면 성능을 향상시키는 데 도움이 될 수 있습니다.

작업 환경을 설정하지 않은 경우 이 튜토리얼을 따라 설치합니다.



 

MPI에 올바른 바인딩 매개변수 사용:

 

MPI는 horovod가 작업을 배포할 수 있도록 도와주는 통신 라이브러리입니다. 서로 다른 바인딩 및 매핑 매개변수 옵션을 살펴보았으며 C4140에 가장 적합한 매개변수는 소켓별 매핑이었습니다. 권장 설정은 다음과 같습니다.
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

하나의 프로세스가 하나의 GPU에서 작동하는지 확인합니다.

 

하나의 GPU를 작동하는 프로세스가 두 개 이상 있는 경우 GPU 리소스를 소모하고 GPU 메모리를 소비하며 배치당 더 많은 이미지를 효과적으로 맞추지 못하므로 GPU 성능이 크게 저하될 수 있습니다. Tensorflow 1.13.1에 대해 탐구했지만 당시 버그가 있었던 것 같습니다. GPU당 두 개 이상의 프로세스를 시작했습니다.


 

요약:

  • 성능 향상을 위해서는 데이터 파이프라인을 올바르게 설정하는 것이 중요합니다.
  • 올바른 환경을 설정하는 것은 성능 향상을 위한 좋은 기여 요소입니다.
  • MPI에 올바른 바인딩 매개변수를 사용하면 성능을 향상시키는 데 도움이 됩니다.
  • GPU가 완전히 활용되지 않을 때 병목 현상을 프로파일링하고 해결합니다.


 


Article Properties


Affected Product

High Performance Computing Solution Resources, Poweredge C4140

Last Published Date

17 Sep 2021

Version

5

Article Type

Solution