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

2021-01-16 天雲軟體

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

專題內容羅列如下:

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

第2篇:分布式深度學習的兩種集群管理與調度的實現方式簡介;

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

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

深度學習簡介

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

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

如下圖所示:

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

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

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

GPU計算的原理

1. GPU計算的優勢

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

目前,主流的GPU具有強大的計算能力和內存帶寬,如下圖所示,無論性能還是內存帶寬,均遠大於同代的CPU。 同時,GPU的thousands of cores的並行計算能力也是一大優勢。

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

2. GPU計算的原理

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

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

整體分為4步:

從主機內存將需要處理的數據copy到GPU的內存CPU發送數據處理執行給GPUGPU執行並行數據處理將結果從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 <stdio.h>

#include <cuda_runtime.h>

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<N; 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<N; j++)

printf("%d ", c[j]);

printf("\n");

}

GPU並行計算的原理

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

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

單GPU並行計算:

針對每次訓練數據,模型內計算通過多次GPU 內核的調用完成計算。權重W值一直存在GPU內存中,直到所有訓練數據計算完畢之後回傳到系統內存中。

多GPU並行計算之數據並行:

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

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

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

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

多GPU並行計算之集群計算:

GPU集群並行模式即為多GPU並行中各種並行模式的擴展,如上圖所示。節點間採用InfiniBand通信,節點間的GPU通過RMDA通信,節點內多GPU之間採用基於infiniband的通信。

分布式機器學習原理

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

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

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

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

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

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

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

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

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

in-graph模式和between-graph模式都支持同步和異步更新

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

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

總結

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

相關焦點

  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    原標題:機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用高級研修班通信和信息技術創新人才培養工程項目辦公室 通人辦〔2018〕 第5號 機器學習、深度學習算法原理與案例實踐暨Python
  • 分布式機器學習之——Spark MLlib並行訓練原理
    這裡是 王喆的機器學習筆記 的第二十五篇文章。接下來的幾篇文章希望與大家一同討論一下機器學習模型的分布式訓練的問題。這個問題在推薦、廣告、搜索領域尤為突出,因為在網際網路場景下,動輒TB甚至PB級的數據量,幾乎不可能利用單點完成機器學習模型的訓練,分布式機器學習訓練成為唯一的選擇。
  • 一文讀懂「Parameter Server」的分布式機器學習訓練原理
    一文讀懂「Parameter Server」的分布式機器學習訓練原理這裡是 「王喆的機器學習筆記」 的第二十六篇文章。這篇文章我們繼續討論機器學習模型的分布式訓練問題。為了解決相應的問題,2014年分布式可擴展的Parameter Server被 沐神 李沐 提出,幾乎完美的解決了機器模型的分布式訓練問題,時至今日,parameter server不僅被直接應用在各大公司的機器學習平臺上,而且也被集成在TensorFlow,MXNet等主流的深度框架中,作為機器學習分布式訓練最重要的解決方案。
  • 詳解深度學習感知機原理
    大家好,歡迎閱讀深度學習專題。我們之前的機器學習專題已經結束了,我們把機器學習領域當中常用的算法、模型以及它們的原理以及實現都過了一遍。雖然還有一些技術,比如馬爾科夫、隱馬爾科夫、條件隨機場等等沒有涉及到。
  • 用三張圖理解深度學習的工作原理
    1.1.5 用三張圖理解深度學習的工作原理現在你已經知道,機器學習是將輸入(比如圖像)映射到目標(比如標籤「貓」),這一過程是通過觀察許多輸入和目標的示例來完成的。你還知道,深度神經網絡通過一系列簡單的數據變換(層)來實現這種輸入到目標的映射,而這些數據變換都是通過觀察示例學習到的。下面來具體看一下這種學習過程是如何發生的。
  • gpu工作原理介紹
    在 2003-2004年左右,圖形學之外的領域專家開始注意到gpu與眾不同的計算能力,開始嘗試把gpu用於通用計算(即GPgpu)。之後NVIDIA發布了CUDA,amd和等公司也發布了OpenCL,gpu開始在通用計算領域得到廣泛應用,包括:數值分析,海量數據處理(排序,Map- Reduce等),金融分析等等。
  • 谷歌,DeepMind,微軟和Uber大規模訓練深度學習模型框架簡介
    大規模訓練是在現實世界中構建深度學習解決方案最具挑戰性的方面之一。從訓練到優化,深度學習程序的生命周期需要健壯的基礎設施構建塊,以便能夠並行化和擴展計算工作負載。儘管深度學習框架正在快速發展,但相應的基礎架構模型仍處於初期階段。
  • DMLC深盟分布式深度機器學習開源平臺解析
    【編者按】算法速度、系統性能以及易用性的瓶頸,制約著目前機器學習的普及應用,DMLC分布式深度機器學習開源項目(中文名深盟)的誕生,正是要降低分布式機器學習的門檻。文章將被收錄到《程式設計師》電子刊(2015.06A)人工智慧實踐專題,以下為全文內容:機器學習能從數據中學習。通常數據越多,能學習到的模型就越好。在數據獲得越來越便利的今天,機器學習應用無論在廣度上還是在深度上都有了顯著進步。雖然近年來計算能力得到了大幅提高,但它仍然遠遠不及數據的增長和機器學習模型的複雜化。
  • 【CTO講堂】如何用Python一門語言通吃高性能並發、GPU計算和深度...
    本期邀請極驗驗證CTO黃勝藍帶來「如何用Python一門語言通吃高性能並發、GPU計算和深度學習 」的主題分享。歡迎加入CTO講堂微信群與業界大咖零距離溝通,1月7日本期講堂報名方式拖至文末查看。
  • 揭開AI、機器學習和深度學習的神秘面紗
    在這篇文章中,我們將通過一些真實世界的案例來解釋什麼是機器學習和深度學習。在這篇文章中,我們將通過一些真實世界的案例來解釋什麼是機器學習和深度學習。在以後的文章中,我們將探索垂直用例。這樣做的目的不是要把你變成一個數據科學家,而是讓你更好地理解你可以用機器學習做什麼。開發人員能越來越容易地使用機器學習,數據科學家時常與領域專家、架構師、開發人員和數據工程師一起工作,因此,詳細了解機器學習的可能性對每個人來說都很重要。你的業務產生的每一條信息都有增加價值的潛力。
  • AI領域最最最稀缺的人才——深度學習架構師
    如何才能高效地進行深度學習模型訓練呢?分布式技術,同時利用多個工作節點,分布式地、高效地訓練出性能優良的神經網絡模型,能夠顯著提高深度學習的訓練效率、進一步增大其應用範圍。分布式技術是深度學習技術的加速器。
  • 深度學習中GPU和顯存分析
    AI算法工程深度學習最吃機器,耗資源,在本文,我將來科普一下在深度學習中:何為「資源」不同操作都耗費什麼資源如何充分的利用有限的資源如何合理選擇顯卡並糾正幾個誤區:0 預備知識nvidia-smi是Nvidia顯卡命令行管理套件,基於NVML庫,旨在管理和監控
  • 新手必看:深度學習是什麼?它的工作原理是什麼?
    但你最近可能聽說過「機器學習」 ( Machine Learning )和「深度學習」 ( Deep Learning ) 等其他術語,它們有時會與人工智慧 ( AI ) 互換使用。因此,人工智慧、機器學習和深度學習之間的區別可能非常不清楚。關於這個主題的文章通常都有很多的高等數學、代碼,或者是其他令人困惑的高層次,以致於無法觸及。通過本文,您將了解AI和機器學習的基礎知識。
  • 騰訊內容首發:分布式核心原理解析+分布式消息中間件實踐筆記
    下面會為大家分享分布式消息中間件實踐筆記+分布式核心原理解析筆記,為了不影響大家的閱讀體驗,免費的獲取方式放在了文末!分布式計算技術分布式計算模式一MR分布式計算模式一Stream分布式計算模式一Actor分布式計算模式一流水線
  • 深度學習和機器學習的線性代數入門
    機器學習和深度學習建立在數學原理和概念之上,因此AI學習者需要了解基本數學原理。神經元是深度學習的基本單位,該結構完全基於數學概念,即輸入和權重的乘積和。至於Sigmoid,ReLU等等激活函數也依賴於數學原理。
  • 圖解機器學習:人人都能懂的算法原理
    機器之心機器之心報導機器之心編輯部算法公式挺費神,機器學習太傷人。任何一個剛入門機器學習的人都會被複雜的公式和晦澀難懂的術語嚇到。但其實,如果有通俗易懂的圖解,理解機器學習的原理就會非常容易。本文整理了一篇博客文章的內容,讀者可根據這些圖理解看似高深的機器學習算法。
  • 深度攝像頭測距原理簡介
    深度檢測主要技術方法: 1.雙目匹配(雙RGB攝像頭+可選的照明系統) 三角測量原理即目標點在左右兩幅視圖中成像的橫坐標之間存在的差異(視差Disparity),與目標點到成像平面的距離成反比例的關係:Z = ft/d;得到深度信息。
  • 阿里P7聯與京東T6出版:深度解構分布式緩存技術原理,實踐及電商
    所以,面試官通常會通過應聘者對緩存相關知識的理解深入程度,來判斷其開發經驗和學習能力。在這裡推薦一份數位一線用阿里P7聯手京東T6自己的項目經驗編寫的:深入分布式緩存從原理到實踐,深度解構分布式緩存技術原理及其在電商、社交、廣告等典型場最中的應用在文章開始前先放一份知識點圖譜,整個圖譜以 10 年分布式緩存經驗分享為主,相信有不少乾貨,值得一看
  • 微軟和谷歌分別開源分布式深度學習框架,各自厲害在哪
    我們需要分布式計算方法,這些方法可以並行化跨不同節點的訓練工作量,以擴展訓練規模。分布式訓練的概念聽起來很瑣碎,但實際上卻極其複雜。谷歌的 GPipe GPipe專注於擴展深度學習計劃的訓練工作量。從基礎架構的角度來看,訓練過程的複雜性是深度學習模型經常被忽視的一個方面。訓練數據集越來越大,越來越複雜。
  • 機器學習/深度學習工程實戰
    本文根據平安人壽AI資深專家吳建軍老師在平安人壽&DataFunTalk算法主題技術沙龍 —「機器學習/深度學習在金融領域最新研究和應用實踐」中分享的《機器學習/深度學習工程實戰》編輯整理而成,在未改變原意的基礎上稍做整理。今天主要從以下幾個方面進行分享:平安人壽AI應用技術概覽,數據處理和編碼,模型應用與實時服務,算法與模型訓練。