<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 6. 并行 2015 年 11 月發布的第一個 TensorFlow 軟件包,已準備好在具有可用 GPU 的服務器上運行,并同時在其中執行訓練操作。 2016 年 2 月,更新添加了分布式和并行化處理的功能。 在這個簡短的章節中,我將介紹如何使用 GPU。 對于那些想要了解這些設備如何工作的讀者,有些參考文獻將在上一節中給出。但是,鑒于本書的介紹性,我不會詳細介紹分布式版本,但對于那些感興趣的讀者,一些參考將在上一節中給出。 ### 帶有 GPU 的執行環境 支持 GPU 的 TensorFlow 軟件包需要 CudaToolkit 7.0 和 CUDNN 6.5 V2。 對于安裝環境,我們建議訪問 cuda 安裝 [44] 網站,為了不會深入細節,同時信息也是最新的。 在 TensorFlow 中引用這些設備的方法如下: + `/cpu:0`:引用服務器的 CPU。 + `/gpu:0`:服務器的 GPU(如果只有一個可用)。 + `/gpu:1`:服務器的第二個 GPU,依此類推。 要知道我們的操作和張量分配在哪些設備中,我們需要創建一個`sesion`,選項`log_device_placement`為`True`。 我們在下面的例子中看到它: ```py import tensorflow as tf a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') c = tf.matmul(a, b) sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) printsess.run(c) ``` 當讀者在計算機中測試此代碼時,應出現類似的輸出: ``` . . . Device mapping: /job:localhost/replica:0/task:0/gpu:0 -&gt; device: 0, name: Tesla K40c, pci bus id: 0000:08:00.0 . . . b: /job:localhost/replica:0/task:0/gpu:0 a: /job:localhost/replica:0/task:0/gpu:0 MatMul: /job:localhost/replica:0/task:0/gpu:0 … [[ 22.28.] [ 49.64.]] … ``` 此外,使用操作的結果,它通知我們每個部分的執行位置。 如果我們想要在特定設備中執行特定操作,而不是讓系統自動選擇設備,我們可以使用變量`tf.device`來創建設備上下文,因此所有操作都在上下文將分配相同的設備。 如果我們在系統中擁有更多 GPU,則默認情況下將選擇具有較低標識符的 GPU。 如果我們想要在不同的 GPU 中執行操作,我們必須明確指定它。 例如,如果我們希望先前的代碼在 GPU#2 中執行,我們可以使用`tf.device('/gpu:2')`,如下所示: ```py import tensorflow as tf with tf.device('/gpu:2'): a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') c = tf.matmul(a, b) sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) printsess.run(c) ``` ### 多個 GPU 的并行 如果我們有更多的 GPU,通常我們希望一起使用它們來并行地解決同樣的問題。 為此,我們可以構建我們的模型,來在多個 GPU 之間分配工作。 我們在下一個例子中看到它: ```py import tensorflow as tf c = [] for d in ['/gpu:2', '/gpu:3']: with tf.device(d): a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3]) b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2]) c.append(tf.matmul(a, b)) with tf.device('/cpu:0'): sum = tf.add_n(c) # Creates a session with log_device_placement set to True. sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) print sess.run(sum) ``` 正如我們所看到的,代碼與前一代碼相同,但現在我們有 2 個 GPU,由`tf.device`指定,它們執行乘法(兩個 GPU 在這里都做同樣的操作,以便簡化示例代碼),稍后 CPU 執行加法。 假設我們將`log_device_placement`設置為`true`,我們可以在輸出中看到,操作如何分配給我們的設備 [45]。 ```py . . . Device mapping: /job:localhost/replica:0/task:0/gpu:0 -&gt; device: 0, name: Tesla K40c /job:localhost/replica:0/task:0/gpu:1 -&gt; device: 1, name: Tesla K40c /job:localhost/replica:0/task:0/gpu:2 -&gt; device: 2, name: Tesla K40c /job:localhost/replica:0/task:0/gpu:3 -&gt; device: 3, name: Tesla K40c . . . . . . Const_3: /job:localhost/replica:0/task:0/gpu:3 I tensorflow/core/common_runtime/simple_placer.cc:289] Const_3: /job:localhost/replica:0/task:0/gpu:3 Const_2: /job:localhost/replica:0/task:0/gpu:3 I tensorflow/core/common_runtime/simple_placer.cc:289] Const_2: /job:localhost/replica:0/task:0/gpu:3 MatMul_1: /job:localhost/replica:0/task:0/gpu:3 I tensorflow/core/common_runtime/simple_placer.cc:289] MatMul_1: /job:localhost/replica:0/task:0/gpu:3 Const_1: /job:localhost/replica:0/task:0/gpu:2 I tensorflow/core/common_runtime/simple_placer.cc:289] Const_1: /job:localhost/replica:0/task:0/gpu:2 Const: /job:localhost/replica:0/task:0/gpu:2 I tensorflow/core/common_runtime/simple_placer.cc:289] Const: /job:localhost/replica:0/task:0/gpu:2 MatMul: /job:localhost/replica:0/task:0/gpu:2 I tensorflow/core/common_runtime/simple_placer.cc:289] MatMul: /job:localhost/replica:0/task:0/gpu:2 AddN: /job:localhost/replica:0/task:0/cpu:0 I tensorflow/core/common_runtime/simple_placer.cc:289] AddN: /job:localhost/replica:0/task:0/cpu:0 [[44.56.] [98.128.]] . . . ``` ### GPU 的代碼示例 為了總結這一簡短的章節,我們提供了一段代碼,其靈感來自 DamienAymeric 在 Github [46] 中共享的代碼,計算`An + Bn`,`n=10`,使用 Python `datetime`包,將 1 GPU 的執行時間與 2 個 GPU 進行比較。 首先,我們導入所需的庫: ```py import numpy as np import tensorflow as tf import datetime ``` 我們使用`numpy`包創建兩個帶隨機值的矩陣: ```py A = np.random.rand(1e4, 1e4).astype('float32') B = np.random.rand(1e4, 1e4).astype('float32') n = 10 ``` 然后,我們創建兩個結構來存儲結果: ```py c1 = [] c2 = [] ``` 接下來,我們定義`matpow()`函數,如下所示: ```py defmatpow(M, n): if n &lt; 1: #Abstract cases where n &lt; 1 return M else: return tf.matmul(M, matpow(M, n-1)) ``` 正如我們所見,要在單個 GPU 中執行代碼,我們必須按如下方式指定: ```py with tf.device('/gpu:0'): a = tf.constant(A) b = tf.constant(B) 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(log_device_placement=True)) as sess: sess.run(sum) t2_1 = datetime.datetime.now() ``` 對于 2 個 GPU 的情況,代碼如下: ```py with tf.device('/gpu:0'): #compute A^n and store result in c2 a = tf.constant(A) c2.append(matpow(a, n)) with tf.device('/gpu:1'): #compute B^n and store result in c2 b = tf.constant(B) c2.append(matpow(b, n)) with tf.device('/cpu:0'): sum = tf.add_n(c2) #Addition of all elements in c2, i.e. A^n + B^n t1_2 = datetime.datetime.now() with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: # Runs the op. sess.run(sum) t2_2 = datetime.datetime.now() ``` 最后,我們打印計算時間的結果: ```py print "Single GPU computation time: " + str(t2_1-t1_1) print "Multi GPU computation time: " + str(t2_2-t1_2) ``` ### TensorFlow 的分布式版本 正如我之前在本章開頭所說,2016 年 2 月,Google 發布了 TensorFlow 的分布式版本,該版本由 gRPC 支持,這是一個用于進程間通信的高性能開源 RPC 框架(TensorFlow 服務使用的相同協議)。 對于它的用法,必須構建二進制文件,因為此時包只提供源代碼。 鑒于本書的介紹范圍,我不會在分布式版本中解釋它,但如果讀者想要了解它,我建議從 TensorFlow 的分布式版本的官網開始 [47]。 與前面的章節一樣,本書中使用的代碼可以在本書的 Github [48] 中找到。 我希望本章足以說明如何使用 GPU 加速代碼。
                  <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>

                              哎呀哎呀视频在线观看