세상 무술 중에서 빠른 것만이 깨지지 않는다. 업계에서는 딥 러닝 모델을 더 빠르게 학습시키는 방법에 중점을 두어 각자 고유한 능력을 발휘하는 특수 하드웨어를 개발하거나 소프트웨어 프레임워크를 개발했습니다.
물론 이러한 법칙은 이 "컴퓨터 아키텍처: 정량적 접근 방식"과 같은 컴퓨터 아키텍처 교과서 및 문헌에서 볼 수 있지만 이 기사의 가치는 대상 접근 방식에 있습니다. 가장 기본적인 법칙을 선택하고 이를 이를 이해하기 위한 딥러닝 엔진입니다.
병렬 컴퓨팅의 정량적 모델을 연구하기 전에 먼저 몇 가지 설정을 합니다. 특정 딥러닝 모델 훈련 작업에 대해 총 계산량 V가 고정되어 있다고 가정하면 V의 크기 계산이 완료되면 딥러닝 모델이 훈련을 완료한다고 대략적으로 생각할 수 있습니다.
이 GitHub 페이지(https://github.com/albanie/convnet-burden)에는 이미지를 처리하기 위해 일반적인 CNN 모델에 필요한 계산량이 나열되어 있습니다. 이 페이지에는 전진 단계가 나열되어 있습니다. 훈련 단계에서는 역방향 단계의 계산도 필요합니다. 일반적으로 역방향 단계의 계산량이 순방향 계산량보다 많습니다. 이 논문(https://openreview.net/pdf?id=Bygq-H9eg)은 학습 단계에서 이미지를 처리하는 계산량에 대한 직관적인 시각화 결과를 제공합니다.
ResNet-50을 예로 들어 , 훈련 단계에서는 224X224x3 이미지를 처리하기 위해 8G-Ops(약 80억 개의 계산)가 필요합니다. 전체 ImageNet 데이터 세트에는 약 120만 개의 이미지가 포함되어 있습니다. 훈련 프로세스에는 전체 데이터 세트를 90번(Epochs) 처리해야 합니다. 총 (8*10^9) *(1.2*10^6)* 90 = 0.864*10^18 작업이 필요합니다. 그러면 ResNet-50 교육 프로세스의 총 계산 양은 약 10억 x 10억 작업입니다. 간단히 말해서 이러한 계산이 완료되면 모델 연산이 완료된다고 볼 수 있습니다. 딥러닝 컴퓨팅 엔진의 목표는 주어진 양의 계산을 최단 시간 내에 완료하는 것입니다.
이 기사는 아래 그림에 표시된 프로세서 중심 컴퓨팅 장치(Processor-centric Computing)에 국한되어 있지만 업계에서는 아직 주류가 아닙니다.
위 그림에 표시된 컴퓨팅 장치에서 컴퓨팅 장치는 CPU, GPGPU와 같은 범용 프로세서 또는 TPU와 같은 특수 목적 칩일 수 있습니다. 컴퓨팅 유닛이 범용 칩인 경우 일반적으로 프로그램과 데이터는 오늘날 가장 널리 사용되는 폰 노이만 구조 컴퓨터인 메모리 유닛에 저장됩니다.
컴퓨팅 유닛이 전용 칩인 경우 일반적으로 메모리 유닛에는 데이터만 저장됩니다. 통신 장치는 메모리 장치에서 컴퓨팅 장치로 데이터를 전송하고 데이터 로딩을 완료하는 역할을 담당합니다. 컴퓨팅 장치가 데이터를 얻은 후 계산(데이터 형식 변환)을 완료하는 역할을 합니다. 계산 결과를 메모리 유닛에 저장하여 데이터 저장을 완료합니다.
통신 장치의 전송 능력은 일반적으로 메모리 액세스 대역폭 베타, 즉 초당 전송할 수 있는 바이트 수로 표현되며, 이는 일반적으로 케이블 수 및 신호 주파수와 관련이 있습니다. 컴퓨팅 장치의 컴퓨팅 능력은 일반적으로 초당 완료할 수 있는 부동 소수점 계산(플롭) 수인 처리율 pi로 표시됩니다. 이는 일반적으로 컴퓨팅에 통합된 논리적 컴퓨팅 장치의 수와 관련됩니다. 단위 및 클럭 주파수.
딥러닝 엔진의 목표는 소프트웨어와 하드웨어의 공동 설계를 통해 컴퓨팅 장치의 데이터 처리 능력을 극대화하는 것, 즉 주어진 양의 계산을 최단 시간에 완료하는 것입니다.
컴퓨팅 장치가 작업을 실행할 때 달성할 수 있는 실제 컴퓨팅 성능(초당 완료되는 작업 수)은 메모리 액세스 대역폭 베타 및 컴퓨팅 유닛의 이론적 피크 pi 이는 현재 작업 자체의 산술 강도(또는 연산 강도)와도 관련이 있습니다.
작업의 컴퓨팅 강도는 데이터 바이트당 필요한 부동 소수점 계산 수, 즉 바이트당 플롭으로 정의됩니다. 일반적으로 이해되는 계산 강도가 낮은 작업은 컴퓨팅 장치가 통신 장치에서 전송한 바이트에 대해 더 적은 작업을 수행해야 함을 의미합니다. 이 경우 컴퓨팅 장치를 계속 사용하려면 통신 장치가 데이터를 자주 전송해야 합니다. 계산 강도가 높은 작업은 컴퓨팅 장치가 통신 장치에 의해 전송된 바이트에 대해 더 많은 작업을 수행해야 함을 의미합니다. 컴퓨팅 장치를 계속 사용하기 위해 통신 장치는 데이터를 너무 자주 전송할 필요가 없습니다.
우선, 실제 컴퓨팅 성능은 컴퓨팅 장치의 이론적인 최고치 pi를 초과하지 않습니다. 둘째, 메모리 액세스 대역폭 베타가 매우 작은 경우 베타 바이트만 1초에 메모리에서 컴퓨팅 장치로 전송될 수 있습니다. 현재 컴퓨팅 작업에서 각 바이트에 필요한 작업 수를 나타내면 베타 * I 1초를 나타냅니다. 클럭 내에서 데이터를 전송하는 데 필요한 실제 작업 수입니다. beta * I
Roofline 모델은 메모리 액세스 대역폭, 컴퓨팅 장치의 최대 처리량 속도 및 작업의 컴퓨팅 강도 간의 관계를 기반으로 실제 컴퓨팅 성능을 추론하는 수학적 모델입니다. 2008년 David Patterson의 Communications of ACM 팀(https://en.wikipedia.org/wiki/Roofline_model)에서 출판한 이 모델은 간단하고 우아한 시각적 모델입니다.
그림 1: Roofline Model
독립 그림 1의 가로축에 있는 변수는 다양한 작업의 계산 강도, 즉 바이트당 필요한 부동 소수점 연산 수를 나타냅니다. 세로축의 종속변수는 실제로 달성 가능한 컴퓨팅 성능, 즉 초당 수행되는 부동 소수점 연산 수를 나타냅니다. 위 그림은 컴퓨팅 강도 I_1과 I_2의 두 가지 작업으로 달성할 수 있는 실제 컴퓨팅 성능을 보여줍니다. I_1의 컴퓨팅 강도는 pi/beta보다 작으며 이를 실제 컴퓨팅 성능 베타 * I_1이라고 합니다. 이론적인 피크 pi보다 낮습니다.
I_2의 컴퓨팅 강도는 pi/beta보다 높으며, 이를 컴퓨팅 제한 작업이라고 합니다. 실제 컴퓨팅 성능은 이론상 최대 pi에 도달하고 메모리 액세스 대역폭은 pi/(I_2*beta)만 사용합니다. 그림에서 기울기의 기울기는 베타이며 이론적인 피크 pi 수평선의 교차점을 능선점이라고 합니다. 작업의 계산 강도가 같을 때입니다. 통신 장치인 pi/beta는 컴퓨팅 장치와 균형을 이루고 어느 하나도 낭비되지 않는 상태입니다.
딥 러닝 엔진의 목표는 "최단 시간 내에 주어진 양의 계산을 완료"하는 것, 즉 시스템에서 실제로 달성 가능한 컴퓨팅 성능을 최대화하는 것임을 기억하세요. 이 목표를 달성하기 위해 몇 가지 전략을 사용할 수 있습니다.
I_2 그림 1은 컴퓨팅 제한 작업으로, 컴퓨팅 장치에 더 많은 산술 논리 장치(ALU)를 통합하는 등 컴퓨팅 장치의 병렬성을 높여 이론적인 피크 값을 높이면 실제 컴퓨팅 성능을 향상시킬 수 있습니다. 딥 러닝 시나리오의 경우 이는 하나의 GPU에서 동시에 작동하는 여러 GPU에 GPU를 추가하는 것을 의미합니다.
그림 2에서 볼 수 있듯이 컴퓨팅 장치 내에 더 많은 병렬 처리가 추가되면 이론상 최고 값은 베타 * I_2보다 높으며 I_2의 실제 컴퓨팅 성능은 더 높아지고 더 짧은 시간만 필요합니다.
그림 2: 컴퓨팅 장치의 이론적 피크 값을 높여 실제 컴퓨팅 성능 향상
그림 1의 I_1은 메모리 액세스가 제한된 작업이므로 전송 대역폭을 향상시켜 실제 컴퓨팅 성능을 향상시킬 수 있습니다. 통신 유닛은 데이터 공급 능력을 향상시킵니다. 그림 3에서 볼 수 있듯이 기울기의 기울기는 통신 장치의 전송 대역폭을 나타냅니다. 기울기의 기울기가 증가하면 I_1은 메모리 액세스 제한 작업에서 계산 제한 작업으로 변경되며 실제 컴퓨팅 성능은 다음과 같습니다. 향상.
그림 3: 통신 장치의 데이터 공급 용량을 개선하여 실제 컴퓨팅 성능 향상
하드웨어의 전송 대역폭이나 이론적 피크 값을 개선하여 실제 컴퓨팅 성능을 향상시키는 것 외에도 성능 향상도 가능합니다. 작업 자체의 컴퓨팅 강도를 향상하여 실제 컴퓨팅 성능을 향상시킵니다. 동일한 작업을 다양한 방식으로 구현할 수 있으며, 구현마다 계산 강도도 다릅니다. 컴퓨팅 강도가 I_1에서 pi/beta를 초과하도록 변환된 후에는 컴퓨팅 제한 작업이 되며 실제 컴퓨팅 성능은 원래 beta*I_1을 초과하는 pi에 도달합니다.
실제 딥러닝 엔진에서는 위의 세 가지 방법(병렬성 증가, 전송 대역폭 향상, 더 나은 계산 강도를 가진 알고리즘 사용)이 모두 사용됩니다.
그림 2의 예는 컴퓨팅 유닛의 병렬성을 높여 실제 컴퓨팅 성능을 향상시킵니다. 작업 실행 시간은 얼마나 단축될 수 있나요? 이는 가속도 비율의 문제, 즉 효율성이 여러 배로 증가하는 문제입니다.
토론의 편의를 위해 (1) 현재 작업이 계산적으로 제한되어 있다고 가정하고 계산 강도, 즉 I*beta>pi를 나타내겠습니다. 컴퓨팅 장치의 컴퓨팅 단위를 s배 증가시킨 후 이론적인 계산 피크는 s * pi입니다. 작업의 컴퓨팅 강도 I가 충분히 높아 이론적인 피크 값이 s배 증가한 후에도 여전히 유지된다고 가정합니다. 계산적으로 제한됨, 즉 I*beta > s*pi; (2) 파이프라인이 사용되지 않는다고 가정하면 통신 장치와 컴퓨팅 장치는 항상 순차적으로 실행됩니다(파이프라인의 영향에 대해서는 나중에 구체적으로 논의하겠습니다). 작업 수행 효율성이 몇 배나 향상되었는지 계산해 보겠습니다.
이론적 피크 값이 pi인 초기 상황에서 통신 장치는 1초 안에 베타바이트의 데이터를 전송하고 컴퓨팅 장치는 계산을 완료하는 데 (I*beta)/pi초가 필요합니다. 즉, I*beta의 계산이 1+(I*beta)/pi초 내에 완료되면 단위당 (I*beta) / (1 + (I*beta)/pi)의 계산이 완료될 수 있습니다. 총 계산량이 V라고 가정하면 총 t1=V*(1+(I*beta)/pi)/(I*beta)초가 소요됩니다.
병렬성을 늘려 이론적 계산 피크를 s배 늘린 후에도 통신 장치는 베타 바이트의 데이터를 전송하는 데 여전히 1초가 필요하고 컴퓨팅 장치는 전송을 완료하는 데 (I*beta)/(s*pi)초가 필요합니다. 계산. 총 계산량이 V라고 가정하면 작업을 완료하는 데 t2=V*(1+(I*beta)/(s*pi))/(I*beta) 초가 걸립니다.
t1/t2를 계산하여 가속 비율을 얻습니다: 1/(pi/(pi+I*beta)+(I*beta)/(s*(pi+I*beta))). 독자 여러분, 직접 파생해 볼 수도 있습니다. 비교적 간단합니다.
이론적 피크 값을 pi라고 하면 데이터를 전송하는 데 1초가 걸리고 계산하는 데 (I*beta)/pi초가 걸립니다. 그러면 계산 시간의 비율은 (I*beta)/(pi + I*beta)입니다. p가 이 비율을 (I*beta)/(pi + I*beta)와 같다고 가정합니다.
p를 t1/t2의 가속도 비율에 대입하면 1/(1-p+p/s)의 가속도 비율을 얻을 수 있습니다. 이것이 유명한 암달의 법칙입니다( https://en.wikipedia.org/wiki). /암달% 27s_law). 여기서 p는 병렬화할 수 있는 원래 작업의 비율을 나타내고, s는 병렬화의 배수를 나타내며, 1/(1-p+p/s)는 얻은 속도 향상을 나타냅니다.
간단한 숫자를 사용하여 계산해 보겠습니다. 통신 장치가 데이터를 전송하는 데 1초가 걸리고 컴퓨팅 장치가 계산하는 데 9초가 걸린다고 가정하면 p=0.9입니다. 컴퓨팅 유닛의 병렬성을 강화하고 이론적인 피크 값을 3배, 즉 s=3으로 증가시킨다고 가정하면 컴퓨팅 유닛이 계산을 완료하는 데 3초밖에 걸리지 않습니다. 암달의 법칙을 사용하면 가속 비율이 2.5배이고 가속 비율 2.5가 컴퓨팅 장치의 병렬 처리 배수 3보다 작다는 것을 알 수 있습니다.
컴퓨팅 유닛의 병렬성을 높이는 즐거움을 맛보았습니다. 병렬성을 더 높이면 더 나은 가속률을 얻을 수 있을까요? 할 수 있다. 예를 들어 s=9이면 5배의 가속 비율을 얻을 수 있으며, 병렬성을 높이면 얻을 수 있는 이점이 점점 작아지는 것을 알 수 있습니다.
s를 무한대로 늘려서 속도 향상 비율을 높일 수 있나요? 예, 하지만 비용 효율성이 점점 낮아지고 있습니다. s가 무한대에 가까워지면(즉, 컴퓨팅 장치의 이론적인 최고 값이 무한대에 도달하면) p/s는 0이 되고 최대 가속도는 0이 될 것입니다. 비율은 1/(1-p)=10입니다.
시스템에 병렬화할 수 없는 부분(통신 장치)이 있는 한 가속 비율은 1/(1-p)를 초과할 수 없습니다.
실제 상황은 가속도 비율의 상한인 1/(1-p)보다 더 나쁠 수 있습니다. 위의 분석에서는 컴퓨팅 강도 I가 무한하다고 가정하고 컴퓨팅 장치의 병렬성을 높이면 전송 대역폭 통신 단위는 일반적으로 감소하므로 p가 더 작아지므로 1/(1-p)가 더 커집니다.
이 결론은 매우 비관적입니다. 통신 오버헤드(1-p)가 0.01에 불과하더라도, 수만 개의 병렬 장치를 사용해도 최대 100배의 속도 향상만 얻을 수 있다는 의미입니다. p를 최대한 1에 가깝게, 즉 1-p가 0에 가까워지도록 하여 가속도 비율을 향상시킬 수 있는 방법은 없을까요? 마법의 총알이 있습니다. 바로 조립 라인입니다.
Amdahl의 법칙을 도출할 때 통신 장치와 컴퓨팅 장치가 직렬로 작동한다고 가정했습니다. 통신 장치는 항상 데이터를 전송하기 위해 먼저 전송된 후 계산이 수행됩니다. 완료되면 통신 단위가 데이터로 다시 전송됩니다.
통신 장치와 컴퓨팅 장치가 동시에 작동하여 데이터 전송과 계산을 동시에 할 수 있나요? 컴퓨팅 유닛이 데이터를 계산한 후 즉시 다음 데이터 배치 계산을 시작할 수 있다면 p는 거의 1이 될 것입니다. 병렬도 s가 몇 배 증가하더라도 선형 가속 비율을 얻을 수 있습니다. 선형 속도 향상을 얻을 수 있는 조건을 살펴보겠습니다.
그림 4: (그림 1과 동일) 그림 4의 Roofline Model
I_1은 통신 제한 작업입니다. 통신 장치는 베타 바이트의 데이터를 1초에 전송할 수 있으며 컴퓨팅 장치는 이를 처리해야 합니다. 베타 바이트입니다. 계산량은 beta*I_1 연산이고 이론적인 계산 피크는 pi이며 계산을 완료하는 데 총 (beta*I_1)/pi초가 걸립니다.
통신 제한 작업의 경우 beta*I_1 그림 4의 I_2는 계산적으로 제한된 작업입니다. 통신 장치는 베타 바이트의 데이터를 1초 안에 전송할 수 있습니다. 계산 장치가 이러한 베타 바이트를 처리하는 데 필요한 계산량은 베타*I_2 연산입니다. 계산을 완료하는 데 총 (beta*I_2)/pi 초가 걸립니다. 컴퓨팅 제한 작업의 경우 beta*I_2>pi가 있으므로 컴퓨팅 장치의 컴퓨팅 시간이 1초보다 큽니다. 이것은 또한 전송하는 데 1초가 걸리는 데이터의 계산을 완료하는 데 몇 초가 걸린다는 것을 의미합니다. 계산 시간 내에 다음 데이터 배치를 전송할 시간이 충분하므로 계산 시간이 데이터 전송 시간 최대 p는 1입니다. I가 무한한 한 가속 비율은 무한할 수 있습니다. 통신부와 컴퓨팅부가 겹쳐져 작동하도록 하는 기술을 파이프라이닝(Pipeling: https://en.wikipedia.org/wiki/Pipeline_(computing))이라고 합니다. 컴퓨팅 유닛 활용도를 효과적으로 향상시키고 가속률을 향상시키는 기술입니다. 위에서 논의한 다양한 정량적 모델은 딥러닝 엔진 개발에도 적용 가능합니다. 병렬성 수준 높이기(그래픽 카드 증가) 동일한 하드웨어 장치를 사용하더라도 다른 병렬 방법(데이터 병렬성, 모델 병렬성 또는 파이프라인 병렬성)을 사용하면 컴퓨팅 강도 I에 영향을 미치므로 실제 컴퓨팅 성능에 영향을 줍니다. 분산 딥 러닝 엔진에는 다량의 통신 오버헤드와 런타임 오버헤드가 포함되어 있으므로 이러한 오버헤드를 줄이거나 마스킹하는 방법은 가속 효과에 매우 중요합니다. 프로세서 중심 컴퓨팅 장치의 관점에서 GPU 트레이닝 기반 딥 러닝 모델을 이해하면 독자는 더 나은 가속 비율을 얻기 위해 딥 러닝 엔진을 설계하는 방법에 대해 생각할 수 있습니다. 단일 머신과 단일 카드의 경우 GPU 활용률을 100% 달성하려면 데이터 전송 및 계산 파이프라인만 완료하면 됩니다. 실제 컴퓨팅 성능은 궁극적으로 기본 행렬 계산의 효율성, 즉 cudnn의 효율성에 따라 달라집니다. 이론적으로는 단일 카드 시나리오에서 다양한 딥러닝 프레임워크 간에 성능 격차가 없어야 합니다. 동일한 시스템 내에서 GPU를 추가하여 가속을 얻으려는 경우 단일 카드 시나리오에 비해 GPU 간 데이터 전송의 복잡성이 증가하고 작업 분할 방법에 따라 컴퓨팅 강도가 달라질 수 있습니다. 예를 들어 컨벌루션 레이어는 데이터 병렬성에 적합하고 완전 연결 레이어는 모델 병렬성에 적합합니다. 통신 오버헤드 외에도 런타임 예약 오버헤드도 속도 향상에 영향을 미칩니다. 다중 시스템 및 다중 카드 시나리오에서는 GPU 간 데이터 전송의 복잡성이 더욱 증가합니다. 네트워크를 통한 시스템 간 데이터 전송 대역폭은 일반적으로 시스템 내 PCIe를 통한 데이터 전송 대역폭보다 낮습니다. , 이는 병렬성 정도는 증가했지만 데이터 전송 대역폭이 감소했음을 의미하며 이는 일반적으로 CNN과 같이 데이터 병렬성에 적합한 시나리오가 상대적으로 작아졌다는 것을 의미합니다. 컴퓨팅 강도 I가 높고 RNN/LSTM과 같은 일부 모델이 있는데, 컴퓨팅 강도 I가 훨씬 작습니다. 이는 또한 파이프라인의 통신 오버헤드를 은폐하기가 더 어렵다는 것을 의미합니다. 분산 딥러닝 엔진을 사용해 본 독자라면 소프트웨어 프레임워크의 가속 비율을 직접 경험해 보아야 합니다. 기본적으로 데이터 병렬성에 적합한 모델인 컨볼루션 신경망(상대적으로 높은 컴퓨팅 강도 I)은 GPU의 가속 효과는 상당히 만족스럽습니다. 그러나 계산 강도가 더 높은 모델 병렬성을 사용하는 대규모 유형의 신경망이 있으며, 모델 병렬성을 사용하더라도 계산 강도는 그에 비해 훨씬 낮습니다. GPU 병렬성을 높여 이러한 애플리케이션을 어떻게 가속화할 수 있는지는 업계에서 해결되지 않은 문제입니다. 이전 딥 러닝 평가에서는 여러 GPU를 사용하여 RNN을 훈련하는 것이 단일 GPU보다 느린 경우도 있었습니다( https://rare-technologies.com/machine-learning-hardware-benchmarks/ ). 딥 러닝 엔진의 효율성 문제를 해결하기 위해 어떤 기술을 사용하든 항상 동일하게 유지됩니다. 가속 비율을 향상시키기 위해서는 런타임 오버헤드를 줄이고, 컴퓨팅 강도를 높이기 위해 적절한 병렬 모드를 선택하고, 파이프라인을 통해 통신 오버헤드를 마스킹합니다. 이 문서에 설명된 기본 법칙이 적용되는 범위 내입니다. 6 딥러닝 엔진을 위한 병렬 컴퓨팅의 정량적 모델 영감
7 요약
위 내용은 병렬 컴퓨팅의 정량적 모델과 딥러닝 엔진에서의 응용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!