Keras PlatoBlockchain Data Intelligence를 사용한 다중 GPU 훈련을 위한 5가지 팁 수직 검색. 일체 포함.

Keras를 사용한 다중 GPU 교육을위한 5 가지 팁

딥 러닝 (2010 년 후반에 블록 체인 / 비트 코인 및 데이터 과학 / 머신 러닝과 함께 가장 좋아하는 유행어)을 통해 지난 몇 년 동안 정말 멋진 일을 할 수있었습니다. 알고리즘의 발전 (1990 년대부터 이미 "데이터 마이닝 시대"라고 알려진 아이디어를 기반으로 함)을 제외하고는 성공의 주된 이유는 대규모 무료 데이터 세트의 가용성, 오픈 소스 라이브러리의 도입 및 GPU 사용. 이 블로그 게시물에서는 마지막 두 가지에 중점을두고 어려운 방법을 배운 몇 가지 팁을 알려 드리겠습니다.

TensorFlow와 Keras가 필요한 이유

TensorFlow 는 Google이 개발 한 매우 인기있는 딥 러닝 라이브러리로 복잡한 네트워크를 신속하게 프로토 타입 할 수 있습니다. 자동 차별화 (비용 함수의 그라디언트 추정 / 코딩을 방지 함) 및 GPU 지원 (적절한 하드웨어를 사용하여 200 배 속도 향상을 쉽게 얻을 수 있음)과 같은 흥미로운 기능이 많이 있습니다. 또한 Python 인터페이스를 제공하므로 C 또는 CUDA 코드를 작성하지 않고도 신속하게 프로토 타입을 작성할 수 있습니다. 분명히 Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK 등과 같이 TensorFlow 대신 사용할 수있는 다른 프레임 워크가 많이 있지만 모두 사용 사례와 개인 취향에 따라 다릅니다.

그러나 왜 케 라스? 저에게 직접 TF를 사용하는 것은 Numpy로 기계 학습을하는 것과 같습니다. 예, 가능하며 때때로 (특히 사용자 정의 레이어 / 손실 기능을 작성하는 경우) 수행해야하지만 복잡한 네트워크를 일련의 벡터 작업으로 설명하는 코드를 작성하고 싶습니다 (예, 알고 있습니다) TF에는 더 높은 수준의 방법이 있지만 Keras만큼 시원하지는 않습니다.) 또한 다른 라이브러리로 이동하려면 어떻게해야합니까? 그렇다면 코드를 다시 작성해야 할 것입니다. Ta ta taaa, Keras가 구조합니다! Keras를 사용하면 고급 개념을 사용하여 네트워크를 설명하고 백엔드와 무관 한 코드를 작성할 수 있습니다. 즉, 다양한 딥 러닝 라이브러리에서 네트워크를 실행할 수 있습니다. Keras에 대해 내가 좋아하는 것은 잘 작성되어 있고 객체 지향 아키텍처가 있으며 기여하기 쉽고 친근한 커뮤니티가 있다는 것입니다. 당신이 그것을 좋아한다면, 감사합니다 프랑수아 콜레트 개발하고 오픈 소싱합니다.

다중 GPU 교육을위한 팁과 단점

더 이상 고민하지 않고 Keras와 GPU에 대한 GPU 교육을 최대한 활용하는 방법에 대한 몇 가지 팁으로 넘어가겠습니다.

1. 멀티 GPU 교육은 자동이 아닙니다

Keras 및 Tensorflow를 사용하는 GPU에서 모델 학습은 원활합니다. NVIDIA 카드가 있고 CUDA를 설치 한 경우 라이브러리는 자동으로이를 감지하여 교육에 사용합니다. 너무 멋져요! 그러나 당신이 버릇없는 녀석이고 여러 GPU를 가지고 있다면 어떨까요? 불행히도 다중 GPU 교육을 받으려면 약간의 작업이 필요합니다.
Keras PlatoBlockchain Data Intelligence를 사용한 다중 GPU 훈련을 위한 5가지 팁 수직 검색. 일체 포함.
달성하려는 목표에 따라 네트워크를 병렬화하는 여러 가지 방법이 있지만 주요 두 가지 접근 방식은 모델 및 데이터 병렬화입니다. 첫 번째는 모델이 너무 복잡하여 단일 GPU에 적합하지 않은 경우, 후자는 실행 속도를 높이고 자 할 때 도움이됩니다. 일반적으로 사람들이 다중 GPU 교육에 대해 이야기 할 때는 후자를 의미합니다. 달성하기가 어려웠지만 다행히도 Keras는 최근에 mutli_gpu_model 병렬 훈련 / 예측이 쉬워집니다 (현재 TF 백엔드에서만 사용 가능). 주요 아이디어는 메소드를 통해 모델을 전달하고 다른 GPU에 복사된다는 것입니다. 원래 입력은 여러 GPU로 공급되는 청크로 분할 된 다음 단일 출력으로 집계됩니다. 이 방법은 병렬 훈련 및 예측을 달성하는 데 사용될 수 있지만, 훈련을 위해서는 필요한 동기화로 인해 GPU의 양에 따라 선형으로 확장되지 않습니다.

2. 배치 크기에주의하십시오

다중 GPU 교육을 수행하는 경우 속도 / 메모리, 모델 수렴에 여러 영향을 미치므로 배치 크기에주의를 기울이십시오.주의하지 않으면 모델 가중치가 손상 될 수 있습니다!

속도 / 메모리 : 배치가 클수록 교육 / 예측이 더 빠릅니다. GPU에서 데이터를 가져오고 꺼내는 데 오버 헤드가 있기 때문에 작은 배치에는 더 많은 오버 헤드가 있기 때문입니다. 반면에 배치가 클수록 GPU에 더 많은 메모리가 필요합니다. 특히 훈련 중에는 역 전파 단계에서 필요로하는 각 레이어의 입력이 메모리에 유지되므로 배치 크기를 너무 많이 늘리면 메모리 부족 오류가 발생할 수 있습니다.

수렴: SGcha (Stochastic Gradient Decent) 또는 일부 변형을 사용하여 모델을 학습하는 경우 배치 크기가 네트워크의 수렴 및 일반화 기능에 영향을 줄 수 있음을 명심해야합니다. 많은 컴퓨터 비전 문제에서 일반적인 배치 크기는 32-512 예입니다. 같이 케 스카 외 "실제로 더 큰 배치 (512보다 큰)를 사용할 때 일반화 능력에 의해 측정 된 모델의 품질이 저하되는 것으로 관찰되었습니다." 다른 최적화 프로그램마다 다른 속성이 있으며 특수한 분산 최적화 기술이 문제를 해결하는 데 도움이 될 수 있습니다. 수학적 세부 사항에 관심이 있으시면 Joeri Hermans의 논문“확장 가능한 딥 러닝 및 병렬화 그라데이션 하강".
Keras PlatoBlockchain Data Intelligence를 사용한 다중 GPU 훈련을 위한 5가지 팁 수직 검색. 일체 포함.
가중치 손상 : 이것은 엄청난 결과를 가져올 수있는 불쾌한 기술적 세부 사항입니다. 다중 GPU 교육을 수행 할 때는 모든 GPU에 데이터를 공급하는 것이 중요합니다. 에포크의 마지막 배치에 정의 된 것보다 적은 데이터가있을 수 있습니다 (데이터 세트의 크기를 배치의 크기로 정확하게 나눌 수 없기 때문에). 이로 인해 마지막 단계에서 일부 GPU가 데이터를 수신하지 못할 수 있습니다. 불행히도 일부 Keras 레이어, 특히 Batch Normalization Layer는 가중치에 나타나는 난 값 (BN 레이어의 실행 평균 및 분산)으로 인해이를 극복 할 수 없습니다. 특정 계층이 추정에 배치의 평균 / 분산을 사용하기 때문에 학습 과정이 1 단계 인 동안 학습 과정에서 문제를 더 순조롭게하기 위해 문제를 관찰하지 못합니다. 그럼에도 불구하고 예측 중에 (학습 단계가 0으로 설정 됨) 실행 평균 / 분산이 사용되며,이 경우 결과가 나빠질 수 있습니다. 따라서 자신에게 유리한 태도를 취하고 다중 GPU 교육을 수행 할 때 항상 배치 크기가 고정되어 있는지 확인하십시오. 이를 수행하는 두 가지 간단한 방법은 사전 정의 된 크기와 일치하지 않는 배치를 거부하거나 사전 정의 된 크기에 도달 할 때까지 배치 내 레코드를 반복하는 것입니다. 마지막으로 다중 GPU 설정에서 배치 크기는 시스템에서 사용할 수있는 GPU의 배수 여야합니다.

3. GPU 데이터 굶주림 (일명 CPU가 GPU를 따라갈 수 없음)

딥 네트워크를 훈련 / 예측하는 동안 일반적으로 가장 비싼 부분은 GPU에서 발생하는 추정입니다. 데이터는 백그라운드의 CPU에서 사전 처리되며 주기적으로 GPU에 공급됩니다. 그럼에도 불구하고 GPU 속도를 과소 평가해서는 안됩니다. 네트워크가 너무 얕거나 전처리 단계가 너무 복잡하여 CPU가 GPU를 따라 잡을 수 없거나 다시 말해 데이터를 빠르게 공급하지 못하는 경우가 발생할 수 있습니다. 이로 인해 GPU 사용률이 낮아져 돈 / 자원 낭비로 이어질 수 있습니다.
Keras PlatoBlockchain Data Intelligence를 사용한 다중 GPU 훈련을 위한 5가지 팁 수직 검색. 일체 포함.
Keras는 일반적으로 Python의 GIL (Global Interpreter Lock)로 인해 배치의 병렬 평가를 병렬로 수행하므로 실제로는 Python에서 진정한 멀티 스레딩을 얻을 수 없습니다. 이에 대한 두 가지 해결책이 있습니다. 여러 프로세스를 사용하거나 (여기서 다루지 않을 많은 문제가 있음) 사전 처리 단계를 단순하게 유지하십시오. 과거에는 이미지 전처리 과정에서 CPU에 불필요한 불균형을 완화하기 위해 Keras에 Pull-Request를 보냈으므로 표준 생성기를 사용하는 경우 대부분의 사용자에게 영향을 미치지 않아야합니다. 사용자 정의 생성기가있는 경우 Numpy와 같은 C 라이브러리에 가능한 많은 로직을 푸시하십시오. 이러한 메소드 중 일부는 실제로 길을 풀어 라 이는 병렬화 수준을 높일 수 있음을 의미합니다. GPU 데이터 기아 상태에 있는지 여부를 감지하는 좋은 방법은 GPU 사용률을 모니터링하는 것입니다. 그럼에도 불구하고 이것이 이것이 관찰되는 유일한 이유는 아님을 경고합니다 (여러 GPU에서 훈련하는 동안 발생하는 동기화는 낮은 사용률을 비난하는 것입니다) ). 일반적으로 GPU 버스트를 관찰 한 후 활용률없이 길게 일시 중지하여 GPU 데이터 기아를 감지 할 수 있습니다. 과거에는 GPU 활용도를 측정하는 데 도움이되는 Dstat 용 확장 프로그램을 오픈 소스로 제공했습니다. 원본 블로그 게시물.

4. 병렬 모델 저장

mutli_gpu_model 메소드를 사용하여 모델을 병렬화하고 교육을 마쳤으며 이제 가중치를 유지하려고한다고 가정 해보십시오. 나쁜 소식은 save ()를 호출 할 수 없다는 것입니다. 현재 Keras에는 제한이 없습니다. 병렬 모델을 저장. 두 가지 방법이 있습니다. 원래 모델을 참조하여 save ()를 호출하거나 (가중치가 자동으로 업데이트 됨) 병렬화 된 버전을 잘라내어 불필요한 모든 연결을 정리하여 모델을 직렬화해야합니다. 첫 번째 옵션은 훨씬 쉬우나 앞으로는 후자를 수행하는 serialize () 메소드를 오픈 소스화할 계획입니다.

5. 사용 가능한 GPU를 계산하면 부작용이 심합니다

불행히도 현재 tensorflow.python.client.device_lib.list_local_devices () 메소드에는 부작용이 발생하여 새로운 TensorFlow 세션이 생성되고 시스템에서 사용 가능한 모든 GPU가 초기화됩니다. 이로 인해 지정된 것보다 많은 GPU를 보거나 새 세션을 조기에 초기화하는 등 예기치 않은 결과가 발생할 수 있습니다 (이에 대한 모든 세부 정보를 읽을 수 있음) 풀 요청). 비슷한 놀라움을 피하기 위해 대신 Keras의 K.get_session (). list_devices () 메소드를 사용하는 것이 좋습니다. 그러면 세션에서 현재 등록 된 모든 GPU가 반환됩니다. 마지막으로 list_devices () 메서드를 호출하는 것은 다소 비싸므로 사용 가능한 GPU 수에 관심이있는 경우 메서드를 한 번 호출하고 해당 숫자를 로컬 변수에 저장하십시오.

그게 다야! 이 목록이 도움이 되길 바랍니다. Keras에서 GPU 교육을위한 다른 문제 / 팁을 찾으면 아래에서 의견을 공유하십시오. 🙂

타임 스탬프 :

더보기 데이텀 박스