成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

人工智能 深度學習
2015年11月9日谷歌開源了人工智能平臺TensorFlow,同時成為2015年最受關(guān)注的開源項目之一。經(jīng)歷了從v0.1到v0.12的12個版本迭代后,谷歌于2017年2月15日發(fā)布了TensorFlow 1.0 版本,并同時在美國加州山景城舉辦了首屆TensorFlow Dev Summit會議。

2015年11月9日谷歌開源了人工智能平臺TensorFlow,同時成為2015年最受關(guān)注的開源項目之一。經(jīng)歷了從v0.1到v0.12的12個版本迭代后,谷歌于2017年2月15日發(fā)布了TensorFlow 1.0 版本,并同時在美國加州山景城舉辦了首屆TensorFlow Dev Summit會議。

TensorFlow 1.0及Dev Summit(2017)回顧

和以往版本相比,TensorFlow 1.0 的特性改進主要體現(xiàn)在以下幾個方面:

  • 速度更快 :TensorFlow 1.0版本采用了XLA的編譯技術(shù),改進了TensorFlow的運行性能及內(nèi)存利用。從Benchmark問題的測試結(jié)果來看,對單機Inception v3模型,實現(xiàn)了在單機8 GPUs上7.3倍的運算加速;對分布式Inception v3模型,實現(xiàn)了在多機64 GPUs上58倍的運算加速。
  • 更加靈活 :該版本除了支持tf.layers,tf.metrics及tf.losses模型的High-Level API外,實現(xiàn)了對keras(high-level neural networks library)API的全面兼容。
  • 更產(chǎn)品化 :TensorFlow Python API在v1.0版本中趨于穩(wěn)定,為產(chǎn)品兼容性打下堅實基礎(chǔ)。

在TensorFlow 1.0版本發(fā)布的當天,谷歌公司還舉辦了TensorFlow 2017 DEV Summit。該 日程主要包括以下幾個方面的主題演講:

  • Hands-on TensorBoard可視化技術(shù):介紹了如何使用TensorBoard,以及TensorFlow圖模型、訓練數(shù)據(jù)的可視化等。
  • TensorFlow High-Level API:介紹了使用Layers, Estimators, and Canned Estimators High-Level API定義訓練模型。
  • Integrating Keras & TensorFlow: 介紹了如何在TensorFlow中使用Keras API進行模型定義及訓練。
  • TensorFlow at DeepMind:介紹了在DeepMind中使用TensorFlow平臺的典型案例,包括AlphaGo等應(yīng)用。
  • Skin Cancer Image Classification:介紹了斯坦福醫(yī)學院使用TensorFlow分類皮膚癌照片,用于醫(yī)學診斷。
  • Mobile and Embedded TensorFlow:介紹了如何把TensorFlow模型運行在移動終端、嵌入式設(shè)備,包括安卓,iOS等系統(tǒng)。
  • Distributed TensorFlow:系統(tǒng)性地介紹了分布式TensorFlow的相關(guān)技術(shù),以及如何應(yīng)用于大規(guī)模模型訓練。
  • TensorFlow Ecosystem:講解了TensorFlow的生態(tài)系統(tǒng),包括生成訓練數(shù)據(jù),分布式運行TensorFlow和serving models的產(chǎn)品化流程。
  • Serving Models in Production with TensorFlow Serving:系統(tǒng)性講解了如何在生產(chǎn)環(huán)境中應(yīng)用TensorFlow Serving模型。
  • ML Toolkit:介紹了TensorFlow的機器學習庫,如線性回歸,KMeans等算法模型的使用。
  • Sequence Models and the RNN API:介紹了如何構(gòu)建高性能的sequence-to-sequence模型,以及相關(guān)API。
  • Wide & Deep Learning: 介紹了如何結(jié)合Wide模型和Deep模型構(gòu)建綜合訓練模型。
  • Magenta,Music and Art Generation:使用增強型深度學習模型生成音樂聲音和藝術(shù)圖片。
  • Case Study,TensorFlow in Medicine – Retinal Imaging:使用TensorFlow機器學習平臺對醫(yī)學視網(wǎng)膜圖片進行分類,輔助醫(yī)學診斷。

TensorFlow系統(tǒng)架構(gòu)

TensorFlow作為分布式機器學習平臺,主要架構(gòu)如下圖所示。RPC和RDMA為網(wǎng)絡(luò)層,主要負責傳遞神經(jīng)網(wǎng)絡(luò)算法參數(shù)。CPU和GPU為設(shè)備層,主要負責神經(jīng)網(wǎng)絡(luò)算法中具體的運算操作。Kernel為TensorFlow中算法操作的具體實現(xiàn),如卷積操作,激活操作等。Distributed Master用于構(gòu)建子圖;切割子圖為多個分片,不同的子圖分片運行在不同的設(shè)備上;Master還負責分發(fā)子圖分片到Executor/Work端。Executor/Work在設(shè)備(CPUs,GPUs,etc.)上,調(diào)度執(zhí)行子圖操作;并負責向其它Worker發(fā)送和接收圖操作的運行結(jié)果。C API把TensorFlow分割為前端和后端,前端(Python/C++/Java Client)基于C API觸發(fā)TensorFlow后端程序運行。Training libraries和Inference libs是模型訓練和推導(dǎo)的庫函數(shù),為用戶開發(fā)應(yīng)用模型使用。

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

下圖為Client、Master及Worker的內(nèi)部工作原理。”/job:worker/task:0″ 和 “/job:ps/task:0” 表示worker中的執(zhí)行服務(wù)。”job:ps”表示參數(shù)服務(wù)器,用于存儲及更新模型參數(shù)。”job:worker”用于優(yōu)化模型參數(shù),并發(fā)參數(shù)發(fā)送到參數(shù)服務(wù)器上。Distributed Master和Worker Service只存在于分布式TensorFlow中。單機版本的TensorFlow實現(xiàn)了Local的Session,通過本地進程的內(nèi)部通訊實現(xiàn)上述功能。

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

用戶編寫TensorFlow應(yīng)用程序生成計算圖,Client組件會創(chuàng)建Session,并通過序列化技術(shù),發(fā)送圖定義到Distributed Master組件。下圖中,Client創(chuàng)建了一個 s+=w*x+b的圖計算模型。

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

當Client觸發(fā)Session運算的時候,Maser構(gòu)建將要運行的子圖。并根據(jù)設(shè)備情況,切割子圖為多個分片。下面為Master構(gòu)建的運行子圖:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

接著切割子圖,把模型參數(shù)分組在參數(shù)服務(wù)器上,圖計算操作分組在運算Worker上。下圖為一種可行的圖切割策略:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

Distributed Master會根據(jù)模型參數(shù)的分區(qū)情況進行切割邊,在Task間插入發(fā)送和接收Tensor信息的通信節(jié)點,如下圖所示:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

接著Distributed Master通過RegisterGraph方法發(fā)送子圖分片給Task,如下圖所示:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

Master通過RunGraph觸發(fā)子圖運算,Worker會使用GPU/CPU運算設(shè)備執(zhí)行TensorFlow Kernel運算。在本節(jié)點的CPU和GPU之間,使用cudaMemcpyAsync傳輸數(shù)據(jù);在本節(jié)點GPU和GPU之間,使用peer-to-peer DMA傳輸數(shù)據(jù),避免通過CPU復(fù)制數(shù)據(jù)。TensorFlow使用gRPC(TCP)和RDMA (Converged Ethernet)技術(shù),實現(xiàn)Worker間的數(shù)據(jù)通信及傳輸,如下圖所示:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

高性能程序設(shè)計

TensorFlow內(nèi)核采用C/C++開發(fā),并提供了C++,Python,Java,Go語言的Client API。特別是Python API,是目前主流的TensorFlow模型開發(fā)接口。但為什么還需要采用C++ API去訓練模型呢?本文基于如下 兩點考慮 ,首先當我們采用Python API去訓練模型的時候,需要不斷地用Python API調(diào)用C/C++底層接口,重復(fù)的接口調(diào)用一定程度上影響了程序的執(zhí)行性能。更為重要的是,在GPU上訓練模型的時候需要大量的內(nèi)存交換;如果采用C++ API去訓練模型,可提供更好的運算性能及更好地控制GPU內(nèi)存的分配。

下圖為Python API的運算架構(gòu):在模型訓練的每次迭代中,程序通過Python API讀取Batch Data,然后通過TensorFlow Session Run接口,傳遞數(shù)據(jù)給C++,并觸發(fā)神經(jīng)網(wǎng)絡(luò)訓練。如下圖所示:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

下圖為C++ API的運算架構(gòu):在模型訓練的每次迭代中,通過C++ API讀取Batch Data后,直接觸發(fā)模型訓練。減少了不同語言間API接口的循環(huán)調(diào)用及數(shù)據(jù)傳輸。如下圖所示:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

為了采用C++ API進行模型訓練,我們首先需要編寫訓練模型,這個編寫過程可以采用Python語言來完成。我們首先采用Python API編寫訓練模型,然后把圖模型轉(zhuǎn)換為Protobuf的序列化文件。接著通過C++ API加載該模型文件,創(chuàng)建TensorFlow Session,初始化模型變量,以及加載訓練數(shù)據(jù)并執(zhí)行神經(jīng)網(wǎng)絡(luò)訓練。程序架構(gòu)如下圖所示:

深度學習利器:TensorFlow系統(tǒng)架構(gòu)及高性能程序設(shè)計

下面為使用Python API定義訓練模型的示例:

with tf.Session() as sess:

  1. #定義Placeholder Tensor接入訓練數(shù)據(jù) 
  2.     x = tf.placeholder(tf.float32, [None, 32], name="x"
  3.     y = tf.placeholder(tf.float32, [None, 8], name="y"
  4.  
  5.     #定義訓練模型 
  6.     w1 = tf.Variable(tf.truncated_normal([32, 16], stddev=0.1)) 
  7.     b1 = tf.Variable(tf.constant(0.0, shape=[16])) 
  8.     w2 = tf.Variable(tf.truncated_normal([16, 8], stddev=0.1)) 
  9.     b2 = tf.Variable(tf.constant(0.0, shape=[8])) 
  10.     a = tf.nn.tanh(tf.nn.bias_add(tf.matmul(x, w1), b1)) 
  11.     y_out = tf.nn.tanh(tf.nn.bias_add(tf.matmul(a, w2), b2), name="y_out"
  12.     cost = tf.reduce_sum(tf.square(y-y_out), name="cost"
  13.     optimizer = tf.train.AdamOptimizer().minimize(cost, name="train"
  14.  
  15.     #定義變量初始化操作 
  16.     init = tf.initialize_variables(tf.all_variables(), name='init_all_vars_op'
  17.  
  18.     #把圖模型轉(zhuǎn)換為Protobuf文件 
  19. tf.train.write_graph(sess.graph_def, './''mlp.pb', as_text=False

下面為使用C++ API加載Protobuf圖模型,并執(zhí)行訓練的示例:

  1. #include "tensorflow/core/public/session.h" 
  2. #include "tensorflow/core/graph/default_device.h" 
  3. using namespace tensorflow; 
  4.  
  5. int main(int argc, char* argv[]) { 
  6.     //Protobuf模型文件名 
  7.     std::string graph_definition = "mlp.pb"
  8.     //Tensorflow Sesssion 
  9.     Session* session; 
  10.  
  11.     //定義圖模型對象 
  12.     GraphDef graph_def; 
  13.     SessionOptions opts; 
  14.  
  15.     //存儲Session會話的運行結(jié)果 
  16.     std::vector<Tensor> outputs;  
  17.  
  18.     #加載Protobuf模型文件到圖模型對象中 
  19.     TF_CHECK_OK(ReadBinaryProto(Env::Default(), graph_definition, &graph_def)); 
  20.  
  21.     // 默認在gpu 0上執(zhí)行模型的訓練操作 
  22.     graph::SetDefaultDevice("/gpu:0", &graph_def); 
  23.  
  24.     //設(shè)定GPU顯存使用參數(shù) 
  25.     opts.config.mutable_gpu_options()->set_per_process_gpu_memory_fraction(0.5); 
  26.     opts.config.mutable_gpu_options()->set_allow_growth(true); 
  27.  
  28.     //創(chuàng)建TensorFlow會話 
  29.     TF_CHECK_OK(NewSession(opts, &session)); 
  30.  
  31.     // 加載圖對象到會話中 
  32.     TF_CHECK_OK(session->Create(graph_def)); 
  33.  
  34.     // 執(zhí)行模型參數(shù)初始化操作 
  35.     TF_CHECK_OK(session->Run({}, {}, {"init_all_vars_op"}, nullptr)); 
  36.  
  37.     //定義模型輸入數(shù)據(jù),包括數(shù)據(jù)類型和維度信息 
  38.     Tensor x(DT_FLOAT, TensorShape({100, 32})); 
  39.     Tensor y(DT_FLOAT, TensorShape({100, 8})); 
  40.  
  41.     //把Tensor轉(zhuǎn)換為矩陣,并初始化Tensor數(shù)據(jù) 
  42.     auto _XTensor = x.matrix<float>(); 
  43.     auto _YTensor = y.matrix<float>(); 
  44.     _XTensor.setRandom(); 
  45.     _YTensor.setRandom(); 
  46.  
  47.     for (int i = 0; i < 10; ++i) { 
  48.         //執(zhí)行模型的訓練操作,{{"x", x}, {"y", y}}表示輸入數(shù)據(jù)Tensor名稱和Tensor對象;{"cost"}表示要獲取輸出值的操作名稱;&outputs表示執(zhí)行"cost"操作后返回的Tensor對象 
  49.         TF_CHECK_OK(session->Run({{"x", x}, {"y", y}}, {"cost"}, {}, &outputs));  
  50.  
  51.         //獲取執(zhí)行“cost“操作后的運算結(jié)果 
  52.         float cost = outputs[0].scalar<float>()(0); 
  53.         std::cout << "Cost: " << cost << std::endl; 
  54.  
  55.         //執(zhí)行"train"操作 
  56.         TF_CHECK_OK(session->Run({{"x", x}, {"y", y}}, {}, {"train"}, nullptr)); // Train 
  57.         outputs.clear(); 
  58.     } 
  59.  
  60.     //關(guān)閉Session及刪除Session對象 
  61.     session->Close(); 
  62.     delete session; 
  63.     return 0; 

當C++程序?qū)懞煤?,編譯時候需要鏈接的頭文件,開源已經(jīng)幫我們整理好了,存放于目錄/usr/lib/python2.7/site-packages/tensorflow/include下。編譯和運行的時候需要鏈接libtensorflow_cc.so,可以按照下面的方式編譯該庫文件:bazel build -c opt //tensorflow:libtensorflow_cc.so –copt=-m64 –linkopt=-m64 –spawn_strategy=standalone –genrule_strategy=standalone –verbose_failures。具體可參考TensorFlow源代碼的官方編譯文檔。

總結(jié)

本文首先回顧了TensorFlow 1.0主要新特性及TensorFlow 2017 Dev Summit的主要議程。到目前為止TensorFlow的GitHub Star排名為51000+, Fork排名已達24000+,有15000+ commits。并隨著TensorFlow新版本的不斷發(fā)布以及新特性的不斷增加,TensorFlow使用更加靈活,運行速度更快,使用方式更產(chǎn)品化,已成為目前主流的深度學習平臺之一。

接著介紹了TensorFlow的系統(tǒng)架構(gòu),包括Client,Master,Worker,Kernel的相關(guān)概念及運行方式,是一種適合大規(guī)模分布式訓練的機器學習平臺。從上述系統(tǒng)架構(gòu)中可以看到,TensorFlow內(nèi)核采用C/C++開發(fā),當采用Python API去訓練模型的時候,需要不斷地用Python調(diào)用C/C++底層接口,重復(fù)的接口調(diào)用一定程度上影響了程序的執(zhí)行性能。如果有最求高性能運算的朋友,可以嘗試用下本文高性能運算章節(jié)推薦的方法。

參考文獻

  1. http://www.tensorflow.org
  2. 深度學習利器:分布式TensorFlow及實例分析
  3. 深度學習利器:TensorFlow使用實戰(zhàn)

作者介紹

武維,博士,現(xiàn)為IBM Spectrum Computing 研發(fā)工程師。主要從事大數(shù)據(jù),深度學習,云計算等領(lǐng)域的研發(fā)工作。

責任編輯:未麗燕 來源: 36大數(shù)據(jù)
相關(guān)推薦

2017-08-16 10:57:52

深度學習TensorFlowNLP

2012-02-13 16:09:40

Java

2017-09-21 12:29:58

深度學習TensorFlow智能終端

2024-09-02 18:10:20

2011-04-22 16:23:16

ASP.NET動態(tài)應(yīng)用系統(tǒng)

2024-07-05 09:41:42

2010-01-11 10:34:22

C++程序

2023-02-02 08:18:41

2018-09-06 08:00:00

深度學習TensorFlowPython

2010-01-11 17:43:23

C++程序設(shè)計

2010-03-04 10:11:17

Android手機系統(tǒng)

2010-04-13 14:59:20

Unix操作系統(tǒng)

2020-07-16 08:06:53

網(wǎng)關(guān)高性能

2020-01-17 11:00:23

流量系統(tǒng)架構(gòu)

2021-01-03 09:58:39

StampedLock線程開發(fā)技術(shù)

2025-04-07 00:00:00

CaffeineJava數(shù)據(jù)存取

2011-08-25 10:35:14

Lua語言函數(shù)

2021-05-24 09:28:41

軟件開發(fā) 技術(shù)

2017-08-07 21:10:55

MySQLUbuntusysbench

2011-07-04 13:31:15

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲国产成人精品女人 | 噜噜噜色网 | 蜜桃一区二区三区在线 | 欧美一区二区三区一在线观看 | 免费人成在线观看网站 | 国产精品中文字幕在线 | 亚洲一区二区成人 | 国产一区二区三区视频 | 国产精品视频导航 | 日韩国产中文字幕 | 国产精品一区二区福利视频 | 国产一区视频在线 | 欧美二级 | 精品91久久久 | 国产日韩视频 | 日韩国产一区二区三区 | 国产在线观看 | 色网在线观看 | 亚洲精品一区二区三区蜜桃久 | 成人性生交大免费 | 视频一区二区中文字幕 | 免费视频一区二区 | 免费人成在线观看网站 | 日韩在线一区二区三区 | 亚洲视频 欧美视频 | 免费视频一区二区 | 欧美日韩在线综合 | 色婷婷av久久久久久久 | 久久精品国产99国产精品 | 美女爽到呻吟久久久久 | 国产一区二区在线免费观看 | 午夜精品一区二区三区在线视 | 日韩一区在线观看视频 | 中文字幕一区二区三区在线乱码 | 国产精品久久久亚洲 | 又爽又黄axxx片免费观看 | 国产在视频一区二区三区吞精 | 精品欧美一区二区精品久久久 | 夜夜艹| 国产一区二区三区在线看 | 九九视频网|