# 使用多個執行程序
您將意識到 TensorFlow 有許多功能,包括計算圖,它們可以自然地并行計算。計算圖可以分為不同的處理器以及處理不同的批量。我們將討論如何在此秘籍中訪問同一臺機器上的不同處理器。
## 做好準備
對于此秘籍,我們將向您展示如何在同一系統上訪問多個設備并對其進行訓練。這是一種非常常見的情況:與 CPU 一起,機器可能具有一個或多個可以共享計算負載的 GPU。如果 TensorFlow 可以訪問這些設備,它將通過貪婪的過程自動將計算分配給多個設備。但是,TensorFlow 還允許程序通過名稱范圍放置指定哪些設備將在哪個設備上。
要訪問 GPU 設備,必須安裝 GPU 版本的 TensorFlow。要安裝 TensorFlow 的 GPU 版本,請訪問 [https://www.tensorflow.org/versions/master/get_started/os_setup.html](https://www.tensorflow.org/versions/master/get_started/os_setup.html) 。下載,設置并按照特定系統的說明進行操作。請注意,TensorFlow 的 GPU 版本需要 CUDA 才能使用 GPU。
在本文中,我們將向您展示各種命令,允許您訪問系統上的各種設備;我們還將演示如何找出 TensorFlow 正在使用的設備。
## 操作步驟
1. 為了找出 TensorFlow 用于哪些操作的設備,我們需要在會話參數中設置`config`,將`log_device_placement`設置為`True`。當我們從命令行運行腳本時,我們將看到特定的設備放置,如以下輸出所示:
```py
import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
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)
# Runs the op.
print(sess.run(c))
```
1. 從終端,運行以下命令:
```py
$python3 using_multiple_devices.py
Device mapping: no known devices.
I tensorflow/core/common_runtime/direct_session.cc:175] Device mapping:
MatMul: /job:localhost/replica:0/task:0/cpu:0
I tensorflow/core/common_runtime/simple_placer.cc:818] MatMul: /job:localhost/replica:0/task:0/cpu:0
b: /job:localhost/replica:0/task:0/cpu:0
I tensorflow/core/common_runtime/simple_placer.cc:818] b: /job:localhost/replica:0/task:0/cpu:0
a: /job:localhost/replica:0/task:0/cpu:0
I tensorflow/core/common_runtime/simple_placer.cc:818] a: /job:localhost/replica:0/task:0/cpu:0
[[ 22\. 28.]
[ 49\. 64.]]
```
1. 默認情況下,TensorFlow 會自動決定如何跨計算設備(CPU 和 GPU)分配計算,有時我們需要了解這些展示位置。這在加載早期的現有模型時非常有用,該模型在我們的計算機具有不同設備時在圖中分配了硬展示位置。我們可以在配置中設置軟放置以解決此問題,如下所示:
```py
config = tf.ConfigProto()
config.allow_soft_placement = True
sess_soft = tf.Session(config=config)
```
1. 使用 GPU 時,TensorFlow 會自動占用 GPU 內存的很大一部分。雖然通常需要這樣做,但我們可以采取措施更加小心 GPU 內存分配。雖然 TensorFlow 從未發布 GPU 內存,但我們可以通過設置 GPU 內存增長選項,將其分配緩慢增加到最大限制(僅在需要時),如下所示:
```py
config.gpu_options.allow_growth = True
sess_grow = tf.Session(config=config)
```
1. 如果我們想對 TensorFlow 使用的 GPU 內存百分比設置硬限制,我們可以使用`config`設置`per_process_gpu_memory_fraction`,如下所示:
```py
config.gpu_options.per_process_gpu_memory_fraction = 0.4
sess_limited = tf.Session(config=config)
```
1. 有時我們可能需要編寫可靠的代碼來確定它是否在 GPU 可用的情況下運行。 TensorFlow 具有內置功能,可以測試 GPU 是否可用。當我們想要編寫在可用時利用 GPU 并為其分配特定操作的代碼時,這很有用。這是通過以下代碼完成的:
```py
if tf.test.is_built_with_cuda():
<Run GPU specific code here>
```
1. 如果我們需要為 GPU 分配特定操作,請輸入以下代碼。這將執行簡單的計算并將操作分配給主 CPU 和兩個輔助 GPU:
```py
with tf.device('/cpu:0'):
a = tf.constant([1.0, 3.0, 5.0], shape=[1, 3])
b = tf.constant([2.0, 4.0, 6.0], shape=[3, 1])
with tf.device('/gpu:0'):
c = tf.matmul(a,b)
c = tf.reshape(c, [-1])
with tf.device('/gpu:1'):
d = tf.matmul(b,a)
flat_d = tf.reshape(d, [-1])
combined = tf.multiply(c, flat_d)
print(sess.run(combined))
```
## 工作原理
當我們想在我們的機器上為 TensorFlow 操作指定特定設備時,我們需要知道 TensorFlow 如何引用這些設備。 TensorFlow 中的設備名稱遵循以下約定:
| 設備 | 設備名稱 |
| --- | --- | --- |
| 主 CPU | `/CPU:0` |
| 第二個 CPU | `/CPU:1` |
| 主 GPU | `/GPU:0` |
| 第二個 GPU | `/GPU:1` |
| 第三個 GPU | `/GPU:2` |
## 更多
幸運的是,在云中運行 TensorFlow 現在比以往更容易。許多云計算服務提供商都提供 GPU 實例,其中包含主 CPU 和強大的 GPU。 Amazon Web Services(AWS)具有 G 實例和 P2 實例,允許使用功能強大的 GPU,為 TensorFlow 流程提供極快的速度。您甚至可以免費選擇 AWS Machine Images(AMI),它將在安裝了 TensorFlow 的 GPU 實例的情況下啟動選定的實例。
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras