每天資訊專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

菜單

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

伴隨著人工智慧技術的發展,尤其是深度學習的興起,許多之前機器學習領域的問題與難點逐步得到了解決,訓練效率與學習準確率都得到了質的提升。深度學習的實現,需要多種技術進行支撐,比如伺服器、GPU、叢集、叢集管理排程軟體、深度學習框架、深度學習的具體應用等。我們把這些技術進行歸類,認為伺服器、GPU、分散式叢集、叢集排程管理軟體等作為深度學習的系統支撐平臺,也是機器學習領域的必備技術。天雲軟體作為國內較早做雲計算、分散式叢集計算、叢集排程管理軟體等的公司,在機器學習系統支撐平臺上也有自己的獨特的理解與實現。因此,本次分享將作為一個專題系列,本文為第一篇。

專題內容羅列如下:

第1篇:深度學習簡介,GPU計算的原理,分散式機器學習原理;

第2篇:分散式深度學習的兩種叢集管理與排程的實現方式簡介;

第3篇:分散式機器學習的兩種叢集方案介紹之基於Kubernetes的實現

第4篇:分散式機器學習的兩種叢集方案介紹之HPC實現

深度學習簡介

深度學習的概念源於人工神經網路的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習透過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分散式特徵表示。

深度學習採用的模型為深層神經網路(Deep Neural Networks,DNN)模型,即包含多個隱藏層(Hidden Layer,也稱隱含層)的神經網路(Neural Networks,NN)。深度學習利用模型中的隱藏層,透過特徵組合的方式,逐層將原始輸入轉化為淺層特徵,中層特徵,高層特徵直至最終的任務目標。

如下圖所示:

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

相對於傳統的神經網路,深度學習含有更多的隱層(hidden layer),構造包含多隱藏層的深層網路結背後的理論依據包括仿生學依據與訓練任務的層次結構依據。

對於很多訓練任務來說,特徵具有天然的層次結構。以語音、影象、文字為例,層次結構大概如下表所示。

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

以影象識別為例,影象的原始輸入是畫素,相鄰畫素組成線條,多個線條組成紋理,進一步形成圖案,圖案構成了物體的區域性,直至整個物體的樣子。不難發現,可以找到原始輸入和淺層特徵之間的聯絡,再透過中層特徵,一步一步獲得和高層特徵的聯絡。想要從原始輸入直接跨越到高層特徵,無疑是困難的。

GPU計算的原理

1. GPU

算的

優勢

複雜的人工智慧演算法訓練與計算經常涉及上億的引數,這些引數的計算需要大量的計算能力,目前在深度學習領域,GPU計算已經成為主流,使用GPU運算的優勢如下:

目前,主流的GPU具有強大的計算能力和記憶體頻寬,如下圖所示,無論效能還是記憶體頻寬,均遠大於同代的CPU。 同時,GPU的thousands of cores的平行計算能力也是一大優勢。

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

理解 GPU 和 CPU 之間區別的一種簡單方式是比較它們如何處理任務。CPU 由專為順序序列處理而最佳化的幾個核心組成,而 GPU 則擁有一個由數以千計的更小、更高效的核心(專為同時處理多重任務而設計)組成的大規模平行計算架構。同時CPU相當的一部分時間在執行外設的中斷、程序的切換等任務,而GPU有更多的時間平行計算。

2. GPU

算的原理

那麼,CPU與GPU如何協同工作?下圖展示了CPU與GPU的並存體系模式。

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

在需要GPU進行運算時,以NVIDIA推出的CUDA(Compute Unified Device Architecture)為例,整體的原理如下:

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

整體分為4步:

從主機記憶體將需要處理的資料copy到GPU的記憶體

CPU傳送資料處理執行給GPU

GPU執行並行資料處理

將結果從GPU記憶體copy到主機記憶體

CUDA提供了對於一般性通用需求的大規模併發程式設計模型,使使用者可以對NVIDIA GPU方便的對於 GPU進行併發性程式設計。如果進行編譯最佳化會在特定作業系統裡面把計算並行化分配到GPU的多個core裡面,由於GPU有多個core(上千個),所以併發度大大提高,運算效率會比CPU高。下面用程式碼表明瞭如何透過GPU進行計算:

有三個陣列int a[10], b[10], c[10];我們要計算a和b的向量之和存放到c中。

一般

C語言

for(int i=0; i<10; i++)

c[i] = a[i] + b[i];

CUDA

程式設計做法:

GPU中的每個執行緒(核)有一個獨立序號叫index,那麼只要序號從0到9的執行緒執行c[index] = a[index] + b[index];就可以實現以上的for迴圈。以下為程式碼示例:

#include

#include

define N 10;/* 定義10個GPU運算執行緒 */

define SIZE N*sizeof(int);

/* 執行在GPU端的程式 */

__global__

void

vectorADD(

int

* a,

int

* b,

int

* c)

{

int

index = threadIdx。x;//獲得當前執行緒的序號

if

(index < blockDim。x)

c[index] = a[index] + b[index];

}

int

main ()

{

/* 本地開闢三個陣列存放我們要計算的內容 */

int

* a = (

int

*) malloc (SIZE);

int

* b = (

int

*) malloc (SIZE);

int

* c = (

int

*) malloc (SIZE);

/* 初始化陣列A, B和C */

for

int

i=0; i

{

h_a[i] = i;

h_b[i] = i;

}

/* 在GPU上分配同樣大小的三個陣列 */

int

* d_a;

int

* d_b;

int

* d_c;

cudaMalloc((

void

**)&d_a, SIZE);

cudaMalloc((

void

**)&d_b, SIZE);

cudaMalloc((

void

**)&d_c, SIZE);

/* 把本地的陣列複製進GPU記憶體 */

cudaMemcpy(d_a, a, SIZE, cudaMemcpyHostToDevice);

cudaMemcpy(d_b, b, SIZE, cudaMemcpyHostToDevice);

/* 定義一個GPU運算塊 由 10個運算執行緒組成 */

dim3 DimBlock = N;

/* 通知GPU用10個執行緒執行函式vectorADD */

vectorADD<<<1, DimBlock>>>(d_a, d_b, d_c);

/* 將GPU運算完的結果複製回本地 */

cudaMemcpy(c, d_c, SIZE, cudaMemcpyDeviceToHost);

/* 釋放GPU的記憶體 */

cudaFree(d_a);

cudaFree(d_b);

cudaFree(d_c);

/* 驗證計算結果 */

for

int

j=0; j

printf(“%d ”, c[j]);

printf(“\n”);

}

GPU平行計算的原理

由於每臺伺服器有多個CPU,多個GPU,同時為了進一步提高並行機器學習效率,我們的目標是為了多臺伺服器(每臺伺服器包含多塊GPU卡)採取分散式計算的形式進行,那麼要完成目標,在硬體層面需要進行伺服器叢集的構建,同時需要在深度學習框架層面也支援分散式,下面介紹GPU計算的分散式原理,深度學習分散式原理在下一個章節介紹。

首先簡單介紹下單主機內GPU平行計算的基本原理:

單GPU平行計算:

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

針對每次訓練資料,模型內計算透過多次GPU 核心的呼叫完成計算。權重W值一直存在GPU記憶體中,直到所有訓練資料計算完畢之後回傳到系統記憶體中。

多GPU平行計算之資料並行:

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

資料並行是指不同的GPU計算不同的訓練資料,即把訓練資料劃分給不同的GPU進行分別計算,由於訓練是逐步訓練的,後一個訓練資料的計算需要前一個訓練資料更新的W(W通常是指模型訓練變化了的資料),資料並行改變了這個計算順序,多GPU計算需要進行W的互相通訊,滿足訓練的特點,使訓練可以收斂。資料並行如上圖所示,多GPU訓練不同的資料,每訓練一次需要同步W,使得後面的訓練始終為最新的W。該模型的缺點是當模型較大時,GPU記憶體無法滿足儲存要求,無法完成計算。

多GPU平行計算之模型並行:

模型並行是指多個GPU同時計算同一個訓練資料,多個GPU對模型內的資料進行劃分,在一次訓練資料多層計算過程中,每個GPU核心計算之後需要互相交換資料才能進行下一次的計算。

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

可以看出,模型並行需要更頻繁的通訊,增加通訊壓力,且實現難度較大

多GPU平行計算之叢集計算:

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

GPU叢集並行模式即為多GPU並行中各種並行模式的擴充套件,如上圖所示。節點間採用InfiniBand通訊,節點間的GPU透過RMDA通訊,節點內多GPU之間採用基於infiniband的通訊。

分散式機器學習原理

分散式深度學習框架的基本原理,每個深度學習框架在分散式實現上各有不同,在此,我們用tensorflow作為例子:

分散式TensorFlow叢集由多個服務端程序和客戶端程序組成。 服務端和客戶端的程式碼可以在不同的機器上也可以在同一個機器上。在具體實現上,分為ps伺服器與worker伺服器,ps伺服器即是引數伺服器,當模型越來越大,模型的引數越來越多,多到模型引數的更新,一臺機器的效能都不夠的時候,就需要把引數分開放到不同的機器去儲存和更新。

於是就有了引數伺服器的概念。

引數伺服器可以是多臺機器組成的叢集,類似分散式的儲存架構,涉及到資料的同步,一致性等等, 一般是key-value的形式,可以理解為一個分散式的key-value記憶體資料庫,然後再加上一些引數更新的操作,採取這種方式可以幾百億的引數分散到不同的機器上去儲存和更新,解決引數儲存和更新的效能問題。

在tensorflow中,計算節點稱做worker節點。

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

在執行在具體的物理叢集時,PS伺服器可以挑選如下圖中的node0、node1…,worker節點可以挑選如下圖中的node2,node3…

專題一:深度學習簡介,GPU計算的原理,分散式機器學習原理

tensorflow的分散式有in-graph和between-gragh兩種架構模式。

in-graph模式

,把計算已經從單機多GPU擴充套件到了多機多GPU, 不過資料分發還是在一個節點。 這樣的好處是配置簡單,但是這樣的壞處是訓練資料的分發依然在一個節點上,要把訓練資料分發到不同的機器上,嚴重影響併發訓練速度。在大資料訓練的情況下,不推薦使用這種模式。

between-graph模式

下,訓練的引數儲存在引數伺服器,資料不用分發,資料分片的儲存在各個計算節點,各個計算節點自己算自己的,算完了之後,把要更新的引數告訴引數伺服器,引數伺服器更新引數。 這種模式的優點是不用訓練資料的分發, 尤其是在資料量在TB級的時候,所以大資料深度學習推薦使用between-graph模式。

in-graph模式和between-graph模式都支援同步和非同步更新

在同步更新的時候,每次梯度更新,要等所有分發出去的資料計算完成後,返回回來結果之後,把梯度累加算了均值之後,再更新引數。這樣的好處是loss的下降比較穩定, 但是這個的壞處也很明顯, 處理的速度取決於最慢的那個分片計算的時間。

在非同步更新的時候,所有的計算節點,各自算自己的,更新引數也是自己更新自己計算的結果,這樣的優點就是計算速度快,計算資源能得到充分利用,但是缺點是loss的下降不穩定,抖動大。

總結

本文介紹了深度學習的概念,GPU的計算原理,包括GPU平行計算的實現,以及分散式深度學習框架(以tensorflow為例)實現的方式。分散式的深度學習框架如果需要進行動態的排程,以及多個學習框架以資源共享的方式執行與同一個叢集時,我們又需要在叢集上實現叢集管理與排程軟體,來實現分散式深度學習框架的資源排程,我們將在我們的下一篇:分散式深度學習的兩種叢集管理與排程的實現方式簡介中進行介紹。