<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 七、TensorFlow GPU 配置 要將 TensorFlow 與 NVIDIA GPU 配合使用,第一步是安裝 CUDA 工具包。 ### 注意 要了解更多信息,請訪問[此鏈接](https://developer.nvidia.com/cuda-downloads)。 安裝 CUDA 工具包后,必須從[此鏈接](https://developer.nvidia.com/cudnn)下載適用于 Linux 的 cuDNN v5.1 庫。 cuDNN 是一個有助于加速深度學習框架的庫,例如 TensorFlow 和 Theano。以下是 NVIDIA 網站的簡要說明: > NVIDIACUDA?深度神經網絡庫(cuDNN)是用于深度神經網絡的 GPU 加速原語庫.cuDNN 為標準例程提供高度調整的實現,例如前向和后向卷積,池化,正則化和激活層。cuDNN 是 NVIDIA 深度學習 SDK 的一部分。 在安裝之前,您需要在 NVIDIA 的加速計算開發人員計劃中注冊。注冊后,登錄并將 cuDNN 5.1 下載到本地計算機。 下載完成后,解壓縮文件并將其復制到 CUDA 工具包目錄中(我們假設目錄為`/usr/local/cuda/`): ```py $ sudo tar -xvf cudnn-8.0-linux-x64-v5.1-rc.tgz -C /usr/local ``` ## 更新 TensorFlow 我們假設您將使用 TensorFlow 來構建您的深度神經網絡模型。只需通過 PIP 用`upgrade`標志更新 TensorFlow。 我們假設您當前正在使用 TensorFlow 0.11: ```py pip install — upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl ``` 現在,您應該擁有使用 GPU 運行模型所需的一切。 ## GPU 表示 在 TensorFlow 中, 支持的設備表示為字符串: * `"/cpu:0"`:您機器的 CPU * `"/gpu:0"`:機器的 GPU,如果你有的話 * `"/gpu:1"`:你機器的第二個 GPU,依此類推 當將操作分配給 GPU 設備時, 執行流程給予優先級。 ## GPU 使用 要在 TensorFlow 程序中使用 GPU,只需鍵入以下內容: ```py with tf.device("/gpu:0"): ``` 然后你需要進行設置操作。這行代碼將創建一個新的上下文管理器,告訴 TensorFlow 在 GPU 上執行這些操作。 讓我們考慮以下示例,其中我們要執行以下兩個大矩陣的和:`A^n + B^n`。 定義基本導入: ```py import numpy as np import tensorflow as tf import datetime ``` 我們可以配置 TensorFlow 程序,以找出您的操作和張量分配給哪些設備。為此,我們將創建一個會話,并將以下`log_device_placement`參數設置為`True`: ```py log_device_placement = True ``` 然后我們設置`n`參數,這是要執行的乘法次數: ```py n=10 ``` 然后我們構建兩個隨機大矩陣。我們使用 NumPy `rand`函數來執行此操作: ```py A = np.random.rand(10000, 10000).astype('float32') B = np.random.rand(10000, 10000).astype('float32') ``` `A`和`B`各自的大小為`10000x10000`。 以下數組將用于存儲結果: ```py c1 = [] c2 = [] ``` 接下來,我們定義將由 GPU 執行的內核矩陣乘法函數: ```py def matpow(M, n): if n == 1: return M else: return tf.matmul(M, matpow(M, n-1)) ``` 正如我們之前解釋的 ,我們必須配置 GPU 和 GPU 以執行以下操作: GPU 將計算`A^n`和`B^n`操作并將結果存儲在`c1`中: ```py with tf.device('/gpu:0'): a = tf.placeholder(tf.float32, [10000, 10000]) b = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(a, n)) c1.append(matpow(b, n)) ``` `c1`(`A^n + B^n`)中所有元素的添加由 CPU 執行,因此我們定義以下內容: ```py with tf.device('/cpu:0'): sum = tf.add_n(c1) ``` `datetime`類允許我們得到計算時間: ```py t1_1 = datetime.datetime.now() with tf.Session(config=tf.ConfigProto\ (log_device_placement=log_device_placement)) as sess: sess.run(sum, {a:A, b:B}) t2_1 = datetime.datetime.now() ``` 然后顯示計算時間: ```py print("GPU computation time: " + str(t2_1-t1_1)) ``` 在我的筆記本電腦上,使用 GeForce 840M 顯卡,結果如下: ```py GPU computation time: 0:00:13.816644 ``` ## GPU 內存管理 在一些情況下,希望該過程僅分配可用內存的子集,或者僅增加該過程所需的內存使用量。 TensorFlow 在會話中提供兩個配置選項來控制它。 第一個是`allow_growth`選項,它嘗試根據運行時分配僅分配盡可能多的 GPU 內存:它開始分配非常少的內存,并且隨著會話運行并需要更多 GPU 內存,我們擴展 GPU 內存量 TensorFlow 流程需要。 請注意, 我們不釋放內存,因為這可能導致更糟糕的內存碎片。要打開此選項,請在`ConfigProto`中設置選項,如下所示: ```py config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config, ...) ``` 第二種方法是`per_process_gpu_memory_fraction`選項,它確定應分配每個可見 GPU 的總內存量的分數。例如,您可以告訴 TensorFlow 僅分配每個 GPU 總內存的 40%,如下所示: ```py config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = tf.Session(config=config, ...) ``` 如果要真正限制 TensorFlow 進程可用的 GPU 內存量,這非常有用。 ## 在多 GPU 系統上分配單個 GPU 如果系統中有多個 GPU,則默認情況下將選擇 ID 最低的 GPU。如果您想在不同的 GPU 上運行會話,則需要明確指定首選項。 例如,我們可以嘗試更改上一代碼中的 GPU 分配: ```py with tf.device('/gpu:1'): a = tf.placeholder(tf.float32, [10000, 10000]) b = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(a, n)) c1.append(matpow(b, n)) ``` 這樣,我們告訴`gpu1`執行內核函數。如果我們指定的設備不??存在(如我的情況),您將獲得`InvalidArgumentError`: ```py InvalidArgumentError (see above for traceback): Cannot assign a device to node 'Placeholder_1': Could not satisfy explicit device specification '/device:GPU:1' because no devices matching that specification are registered in this process; available devices: /job:localhost/replica:0/task:0/cpu:0 [[Node: Placeholder_1 = Placeholder[dtype=DT_FLOAT, shape=[100,100], _device="/device:GPU:1"]()]] ``` 如果您希望 TensorFlow 自動選擇現有且受支持的設備來運行操作(如果指定的設備不??存在),則可以在創建會話時在配置選項中將`allow_soft_placement`設置為`True`。 我們再次為以下節點設置`'/gpu:1'`: ```py with tf.device('/gpu:1'): a = tf.placeholder(tf.float32, [10000, 10000]) b = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(a, n)) c1.append(matpow(b, n)) ``` 然后我們構建一個`Session`,并將以下`allow_soft_placement`參數設置為`True`: ```py with tf.Session(config=tf.ConfigProto\ (allow_soft_placement=True,\ log_device_placement=log_device_placement))\ as sess: ``` 這樣,當我們運行會話時,不會顯示`InvalidArgumentError`。在這種情況下,我們會得到一個正確的結果,但有一點延遲: ```py GPU computation time: 0:00:15.006644 ``` ## 具有軟放置的 GPU 的源代碼 這是完整源代碼,僅為了清楚起見: ```py import numpy as np import tensorflow as tf import datetime log_device_placement = True n = 10 A = np.random.rand(10000, 10000).astype('float32') B = np.random.rand(10000, 10000).astype('float32') c1 = [] c2 = [] def matpow(M, n): if n == 1: return M else: return tf.matmul(M, matpow(M, n-1)) with tf.device('/gpu:0'): a = tf.placeholder(tf.float32, [10000, 10000]) b = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(a, n)) c1.append(matpow(b, n)) with tf.device('/cpu:0'): sum = tf.add_n(c1) t1_1 = datetime.datetime.now() with tf.Session(config=tf.ConfigProto\ (allow_soft_placement=True,\ log_device_placement=log_device_placement))\ as sess: sess.run(sum, {a:A, b:B}) t2_1 = datetime.datetime.now() ``` ## 使用多個 GPU 如果您想在多個 GPU 上運行 TensorFlow,您可以通過為 GPU 分配特定的代碼塊來構建模型。例如,如果我們有兩個 GPU,我們可以按如下方式拆分前面的代碼,將第一個矩陣計算分配給第一個 GPU: ```py with tf.device('/gpu:0'): a = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(a, n)) ``` 第二個矩陣計算分配給第二個 GPU: ```py with tf.device('/gpu:1'): b = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(b, n)) ``` CPU 將管理結果。另請注意,我們使用共享`c1`數組來收集它們: ```py with tf.device('/cpu:0'): sum = tf.add_n(c1) ``` 在下面的代碼片段中,我們提供了兩個 GPU 管理的具體示例: ```py import numpy as np import tensorflow as tf import datetime log_device_placement = True n = 10 A = np.random.rand(10000, 10000).astype('float32') B = np.random.rand(10000, 10000).astype('float32') c1 = [] def matpow(M, n): if n == 1: return M else: return tf.matmul(M, matpow(M, n-1)) #FIRST GPU with tf.device('/gpu:0'): a = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(a, n)) #SECOND GPU with tf.device('/gpu:1'): b = tf.placeholder(tf.float32, [10000, 10000]) c1.append(matpow(b, n)) with tf.device('/cpu:0'): sum = tf.add_n(c1) t1_1 = datetime.datetime.now() with tf.Session(config=tf.ConfigProto\ (allow_soft_placement=True,\ log_device_placement=log_device_placement))\ as sess: sess.run(sum, {a:A, b:B}) t2_1 = datetime.datetime.now() ``` # 分布式計算 DL 模型必須接受大量數據的訓練,以提高其表現。但是,訓練具有數百萬參數的深度網絡可能需要數天甚至數周。在大規模分布式深度網絡中,Dean 等人。提出了兩種范例,即模型并行性和數據并行性,它們允許我們在多個物理機器上訓練和服務網絡模型。在下一節中,我們引入了這些范例,重點關注分布式 TensorFlow 功能。 ## 模型并行 模型并行性為每個處理器提供相同的數據,但對其應用不同的模型。如果網絡模型太大而無法放入一臺機器的內存中,則可以將模型的不同部分分配給不同的機器。可能的模型并行方法是在機器(節點 1)上具有第一層,在第二機器(節點 2)上具有第二層,等等。有時這不是最佳方法,因為最后一層必須等待在前進步驟期間完成第一層的計算,并且第一層必須在反向傳播步驟期間等待最深層。只有模型可并行化(例如 GoogleNet)才能在不同的機器上實現,而不會遇到這樣的瓶頸: ![Model parallelism](https://img.kancloud.cn/1d/1e/1d1ebdcfc5b6c278d5d79d89f52e22ca_369x397.jpg) 圖 3:在模型并行性中,每個節點計算網絡的不同部分 大約 20 年前, 訓練神經網絡的人可能是術語模型并行性的創始人,因為他們有不同的神經網絡模型來訓練和測試,并且網絡中的多個層可以用相同的數據。 ## 數據并行 數據并行性表示將單個指令應用于多個數據項。它是 SIMD(單指令,多數據)計算機架構的理想工作負載,是電子數字計算機上最古老,最簡單的并行處理形式。 在這種方法中,網絡模型適合于一臺機器,稱為參數服務器,而大多數計算工作由多臺機器完成,稱為工作器: * 參數服務器:這是一個 CPU,您可以在其中存儲工作器所需的變量。就我而言,這是我定義網絡所需的權重變量的地方。 * 工作器:這是我們完成大部分計算密集型工作的地方。 每個工作器負責讀取,計算和更新模型參數,并將它們發送到參數服務器: * 在正向傳播中,工作者從參數服務器獲取變量,在我們的工作者上對它們執行某些操作。 * 在向后傳遞中,工作器將當前狀態發送回參數服務器,參數服務器執行更新操作,并為我們提供新的權重以進行嘗試: ![Data parallelism](https://img.kancloud.cn/32/4e/324e8ce5426e29c8069a74359895d66e_545x395.jpg) 圖 4:在數據并行模型中,每個節點計算所有參數 數據并行可能有兩個主要的選項: * 同步訓練:所有工作器同時讀取參數,計算訓練操作,并等待所有其他人完成。然后將梯度平均,并將單個更新發送到參數服務器。因此,在任何時間點,工作器都將意識到圖參數的相同值。 * 異步訓練:工作器將異步讀取參數服務器,計算訓練操作,并發送異步更新。在任何時間點,兩個不同的工作器可能會意識到圖參數的不同值。 # 分布式 TensorFlow 配置 在本節中,我們將探索 TensorFlow 中的計算可以分布的機制。運行分布式 TensorFlow 的第一步是使用`tf.train.ClusterSpec`指定集群的架構: ```py import tensorflow as tf cluster = tf.train.ClusterSpec({"ps": ["localhost:2222"],\ "worker": ["localhost:2223",\ "localhost:2224"]}) ``` 節點通常分為兩個作業:主機變量的參數服務器(`ps`)和執行大量計算的工作器。在上面的代碼中,我們有一個參數服務器和兩個工作器,以及每個節點的 IP 地址和端口。 然后我們必須為之前定義的每個參數服務器和工作器構建一個`tf.train.Server`: ```py ps = tf.train.Server(cluster, job_name="ps", task_index=0) worker0 = tf.train.Server(cluster,\ job_name="worker", task_index=0) worker1 = tf.train.Server(cluster,\ job_name="worker", task_index=1) ``` `tf.train.Server`對象包含一組本地設備,一組與`tf.train.ClusterSpec`中其他任務的連接,以及一個可以使用它們執行分布式計算的`tf.Session`。創建它是為了允許設備之間的連接。 接下來,我們使用以下命令將模型變量分配給工作器: ```py tf.device : with tf.device("/job:ps/task:0"): a = tf.constant(3.0, dtype=tf.float32) b = tf.constant(4.0) ``` 將這些指令復制到名為`main.py`的文件中。 在兩個單獨的文件`worker0.py`和`worker1.py`中,我們必須定義工作器。在`worker0.py`中,將兩個變量`a`和`b`相乘并打印出結果: ```py import tensorflow as tf from main import * with tf.Session(worker0.target) as sess: init = tf.global_variables_initializer() add_node = tf.multiply(a,b) sess.run(init) print(sess.run(add_node)) ``` 在`worker1.py`中,首先更改`a`的值,然后將兩個變量`a`和`b`相乘: ```py import tensorflow as tf from main import * with tf.Session(worker1.target) as sess: init = tf.global_variables_initializer() a = tf.constant(10.0, dtype=tf.float32) add_node = tf.multiply(a,b) sess.run(init) a = add_node print(sess.run(add_node)) ``` 要執行此示例,首先從命令提示符運行`main.py`文件。 你應該得到這樣的結果: ```py >python main.py Found device 0 with properties: name: GeForce 840M major: 5 minor: 0 memoryClockRate (GHz) 1.124 pciBusID 0000:08:00.0 Total memory: 2.00GiB Free memory: 1.66GiB Started server with target: grpc://localhost:2222 ``` 然后我們可以運行工作器: ```py > python worker0.py Found device 0 with properties: name: GeForce 840M major: 5 minor: 0 memoryClockRate (GHz) 1.124 pciBusID 0000:08:00.0 Total memory: 2.00GiB Free memory: 1.66GiB Start master session 83740f48d039c97d with config: 12.0 > python worker1.py Found device 0 with properties: name: GeForce 840M major: 5 minor: 0 memoryClockRate (GHz) 1.124 pciBusID 0000:08:00.0 Total memory: 2.00GiB Free memory: 1.66GiB Start master session 3465f63a4d9feb85 with config: 40.0 ``` # 總結 在本章中,我們快速了解了與優化 DNN 計算相關的兩個基本主題。 第一個主題解釋了如何使用 GPU 和 TensorFlow 來實現 DNN。它們以非常統一的方式構造,使得在網絡的每一層,數千個相同的人工神經元執行相同的計算。因此,DNN 的架構非常適合 GPU 可以有效執行的計算類型。 第二個主題介紹了分布式計算。這最初用于執行非常復雜的計算,這些計算無法由單個機器完成。同樣,在面對如此大的挑戰時,通過在不同節點之間拆分此任務來快速分析大量數據似乎是最佳策略。 同時,可以使用分布式計算來利用 DL 問題。 DL 計算可以分為多個活動(任務);他們每個人都將獲得一小部分數據,并返回一個結果,該結果必須與其他活動提供的結果重新組合。或者,在大多數復雜情況下,可以為每臺機器分配不同的計算算法。 最后,在最后一個例子中,我們展示了如何分配 TensorFlow 中的計算。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看