多GPU使用詳解

目錄:

介紹

記錄設備狀態

手動分配狀態

允許GPU內存增長

在多GPU系統是使用單個GPU

使用多個 GPU

一、介紹

在一個典型的系統中,有多個計算設備。在 TensorFlow 中支持的設備類型包括 CPU 和 GPU。他們用字符串來表達,例如:

?

  • “/cpu:0”: 機器的 CPU
  • “/device:GPU:0”: 機器的 GPU 如果你只有一個
  • “/device:GPU:1”: 機器的第二個 GPU

?

如果 TensorFlow 操作同時有 CPU 和 GPU 的實現,操作將會優先分配給 GPU 設備。例如,matmul 同時有 CPU 和 GPU 核心,在一個系統中同時有設備 cpu:0 和 gpu:0,gpu:0 將會被選擇來執行 matmul。

?

二、記錄設備狀態

?

為了確定你的操作和張量分配給了哪一個設備,創建一個把 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)

創建一個 session,它的 log_device_placement 被設置為 True.

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

運行這個操作

print(sess.run(c))

你將會看到一下輸出:

?

Device mapping:

/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus

id: 0000:05:00.0

b: /job:localhost/replica:0/task:0/device:GPU:0

a: /job:localhost/replica:0/task:0/device:GPU:0

MatMul: /job:localhost/replica:0/task:0/device:GPU:0

[[ 22. 28.]

[ 49. 64.]]

?

三、手動分配設備

?

如果你希望一個特定的操作運行在一個你選擇的設備上,而不是自動選擇的設備,你可以使用 tf.device 來創建一個設備環境,這樣所有在這個環境的操作會有相同的設備分配選項。

?

創建一個會話

with tf.device(‘/cpu:0’):

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)

創建一個 session,它的 log_device_placement 被設置為 True

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

運行這個操作

print(sess.run(c))

?

你將會看到 a 和 b 被分配給了 cpu:0。因為沒有指定特定的設備來執行 matmul 操作,TensorFlow 將會根據操作和已有的設備來選擇(在這個例子中是 gpu:0),并且如果有需要會自動在設備之間復制張量。

?

Device mapping:

/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus

id: 0000:05:00.0

b: /job:localhost/replica:0/task:0/cpu:0

a: /job:localhost/replica:0/task:0/cpu:0

MatMul: /job:localhost/replica:0/task:0/device:GPU:0

[[ 22. 28.]

[ 49. 64.]]

?

四、允許 GPU 內存增長

?

默認情況下,TensorFlow 將幾乎所有的 GPU的顯存(受 CUDA_VISIBLE_DEVICES 影響)映射到進程。 通過減少內存碎片,可以更有效地使用設備上寶貴的GPU內存資源。

?

在某些情況下,只需要分配可用內存的一個子集給進程,或者僅根據進程需要增加內存使用量。 TensorFlow 在 Session 上提供了兩個 Config 選項來控制這個選項。

?

第一個是 allow_growth 選項,它根據運行時的需要分配 GPU 內存:它開始分配很少的內存,并且隨著 Sessions 運行并需要更多的 GPU 內存,我們根據 TensorFlow 進程需要繼續擴展了GPU所需的內存區域。請注意,我們不釋放內存,因為這會導致內存碎片變得更糟。要打開此選項,請通過以下方式在 ConfigProto 中設置選項:

?

?

config = tf.ConfigProto()

config.gpu_options.allow_growth = True

session = tf.Session(config=config, …)

?

?

第二種方法是 per_process_gpu_memory_fraction 選項,它決定了每個可見GPU應該分配的總內存量的一部分。例如,可以通過以下方式告訴 TensorFlow 僅分配每個GPU的總內存的40%:

?

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上運行,則需要明確指定首選項:

?

創建一個計算圖

with tf.device(‘/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)

創建一個 log_device_placement 設置為True 的會話

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

運行這個操作

print(sess.run(c))

?

?

你會看到現在 a 和 b 被分配給 cpu:0。 由于未明確指定設備用于 MatMul 操作,因此 TensorFlow 運行時將根據操作和可用設備(本例中為 gpu:0)選擇一個設備,并根據需要自動復制設備之間的張量。

?

如果指定的設備不存在,將得到 InvalidArgumentError:

InvalidArgumentError: Invalid argument: Cannot assign a device to node ‘b’:

Could not satisfy explicit device specification ‘/device:GPU:2’

[[Node: b = Const[dtype=DT_FLOAT, value=Tensor<type: float shape: [3,2]

values: 1 2 3…>, _device=”/device:GPU:2”]()]]

?

如果希望 TensorFlow 在指定的設備不存在的情況下自動選擇現有的受支持設備來運行操作,則可以在創建會話時在配置選項中將 allow_soft_placement 設置為 True。

?

創建計算圖

with tf.device(‘/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)

創建一個 allow_soft_placement 和 log_device_placement 設置為 True 的會話

?

sess = tf.Session(config=tf.ConfigProto(

allow_soft_placement=True, log_device_placement=True))

運行這個操作

print(sess.run(c))

?

六、使用多個 GPU

?

如果您想要在多個 GPU 上運行 TensorFlow ,則可以采用多塔式方式構建模型,其中每個塔都分配有不同的 GPU。 例如:

?

?

創建計算圖

c = []

for d in [‘/device:GPU:2’, ‘/device: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)

創建一個 log_device_placement 設置為 True 的會話

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

運行這個操作

print(sess.run(sum))

?

你將會看到以下的輸出:

?

Device mapping:

/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K20m, pci bus

id: 0000:02:00.0

/job:localhost/replica:0/task:0/device:GPU:1 -> device: 1, name: Tesla K20m, pci bus

id: 0000:03:00.0

/job:localhost/replica:0/task:0/device:GPU:2 -> device: 2, name: Tesla K20m, pci bus

id: 0000:83:00.0

/job:localhost/replica:0/task:0/device:GPU:3 -> device: 3, name: Tesla K20m, pci bus

id: 0000:84:00.0

Const_3: /job:localhost/replica:0/task:0/device:GPU:3

Const_2: /job:localhost/replica:0/task:0/device:GPU:3

MatMul_1: /job:localhost/replica:0/task:0/device:GPU:3

Const_1: /job:localhost/replica:0/task:0/device:GPU:2

Const: /job:localhost/replica:0/task:0/device:GPU:2

MatMul: /job:localhost/replica:0/task:0/device:GPU:2

AddN: /job:localhost/replica:0/task:0/cpu:0

[[ 44. 56.]

[ 98. 128.]]

?

?

翻譯自:

https://www.tensorflow.org/programmers_guide/using_gpu

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/451437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451437.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖片上傳的兩種方式

總的說圖片上傳有兩種方式&#xff0c;一種是把圖片文件寫到數據庫中&#xff0c;另一種是存到服務器文件目錄中。寫到數據庫中的圖片文件需要轉換成二進制流的格式&#xff0c;占用數據庫空間比較多&#xff0c;適合少量圖片的存儲&#xff0c;比如說&#xff0c;系統中某些小…

最好理解的: spring ioc原理講解,強烈推薦!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IOC&#xff08;DI&#xff09;&#xff1a;java程序中的每個業務邏輯至少需要兩個或以上的對象來協作完成。通常&#xff0c;每個對象在…

微信小程序 - 回到自己位置(map)

演示效果&#xff1a; 圖片資源 index.js 1 /** 2 * 回到自己位置&#xff0c;在cover-image上綁定點擊事件即可. 3 */ 4 clickcontrol(e) { 5 let mpCtx wx.createMapContext("map"); 6 mpCtx.moveToLocation(); 7 }, 轉載于:https://www.cnbl…

uwsgi搭配nginx

uwsgi搭配nginx可以做域名解析和負載均衡uWSGI&#xff0c;既不用wsgi協議也不用fcgi協議&#xff0c;而是自創了一個uwsgi的協議&#xff0c;據說該協議大約是fcgi協議的10倍那么快。uWSGI的主要特點如下&#xff1a;◆超快的性能。◆低內存占用&#xff08;實測為apache2的mo…

如何讓tomcat服務器運行在80端口,并且無需輸入項目名即可訪問項目()

這個問題最開始遇到的時候是半年前,自己買了個服務器玩,但是域名解析的時候出了問題,我查了查資料才知道騰訊云是默認解析到80端口,而且還改不了. 首先是修改tomcat運行端口號,默認是8080,但是我們可以通過修改配置文件更改, 打開conf/server.xml文件找到這個地方,: 將8080改為…

tailf、tail -f、tail -F三者區別

tail -f 等同于--followdescriptor&#xff0c;根據文件描述符進行追蹤&#xff0c;當文件改名或被刪除&#xff0c;追蹤停止 tail -F 等同于--followname --retry&#xff0c;根據文件名進行追蹤&#xff0c;并保持重試&#xff0c;即該文件被刪除或改名后&#xff…

使用圖形芯片加速電子自動化設計應用程序

以往EDA應用性能瓶頸主要受兩方面因素制約&#xff0c;首先大多數應用都是單線程的&#xff0c;而CPU和GPU架構擁有幾十到數千的并行內核&#xff0c;其次是應用程序內存延遲問題。目前EDA應用已經部署到傳統的常規處理器上。最重要的是這些應用促使人們設計出并行或向量處理器…

自我介紹的四個套路

四套路內容&#xff1a; 1、我是誰&#xff0c;叫什么名字&#xff0c;我從哪里來。 2、我因為什么機緣出現這個場合。 3、我能給大家帶來什么價值。 4、我希望能夠得到大家的什么幫助。 示例&#xff1a; 大家好&#xff0c;我叫XXX&#xff0c; 聽說今天會有幾個高人在場&…

加載樣式js

var MaskUtil (function(){ var $mask,$maskMsg; var defMsg 數據導出中&#xff0c;請稍待。。。; function init(){ if(!$mask){ $mask $("<div class\"datagrid-mask mymask\"></div>").appendTo("body"); } if(!$mask…

flush privileges

flush privileges 命令本質上的作用是將當前user和privilige表中的用戶信息/權限設置從mysql庫(MySQL數據庫的內置庫)中提取到內存里。MySQL用戶數據和權限有修改后&#xff0c;希望在"不重啟MySQL服務"的情況下直接生效&#xff0c;那么就需要執行這個命令。通常是在…

【Linux】Linux中常用操作命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 常用指令 ls   顯示文件或目錄 -l 列出文件詳細信息l(list) -a 列出當前目錄下所有文件及目錄&#xff0…

Mybatis的緩存機制Cache

Mybatis提供對緩存的支持&#xff0c;分為一級緩存和二級緩存&#xff0c;在沒有配置的情況下&#xff0c;系統默認會使用一級緩存。 一級緩存&#xff08;SqlSession級別&#xff09; 我們都知道每個SqlSession對象之間的緩存是互不影響的&#xff0c;當同一個SqlSession執行多…

大數據應用時代來襲 SaaS走向沒落?

隨著大量的信息涌入互聯網——90%的互聯網是過去兩年建立起來的——互聯網公司正在想方設法去熟悉并利用大數據來推動他們的業務。正如SaaS和云技術一樣完全變革了企業的運作方式一樣&#xff0c;大數據應用&#xff08;BDA&#xff09;也同樣可以。 BDA是基于網絡的應用&#…

為什么使用數據庫從庫

主庫用來進行寫操作&#xff0c;從庫用來進行讀操作&#xff0c;這樣一來的可以大大提高讀取的效率。在一般的互聯網應用中&#xff0c;經過一些數據調查得出結論&#xff0c;讀/寫的比例大概在 10&#xff1a;1左右 &#xff0c;也就是說大量的數據操作是集中在讀的操作。但是…

Java程序員必知的10個調試技巧

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在本文中&#xff0c;作者將使用大家常用的的開發工具Eclipse來調試Java應用程序。但這里介紹的調試方法基本都是通用的&#xff0c;也適…

【GPS】GPS的C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT配置,Linux系統中GPIO的設置

GPS的GPIO配置文件 客戶需要更改此變量C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT才能覆蓋NAVRF驅動程序ELNA設置。   modem_proc/gps/gnss/mgp/me/gen8/src/cgps_ext.c /* Customer needs to change this variable in order to override NAVRF driver ELNA setting */ gnss_ExternalG…

學習的境界

學習是有境界的&#xff0c;下面以C語言中的結構型為例簡單分析。 第一種境界&#xff1a;理解了。 結構型是自定義數據類型&#xff0c;與C語言中基本的數據類型如int的作用相同&#xff0c;用于定義變量。&#xff08;變量是內存中存儲單元的標識&#xff0c;C語言中通過變…

性能測試的重要意義(一)

?我是一下下面幾個方面來理解的&#xff1a; 1.秒的性能對于顧客的意義&#xff1f; 2.性能測試的重要意義 3.什么是軟件的性能&#xff1f; 4.軟件的性能測試是什么&#xff1f; 5.功能測試和性能測試對比&#xff1f; 6.項目組不同角色眼中的軟件性能&#xff1f; 7.性能測試…

ContextLoaderListener介紹

在給新同事培訓Spring MVC時&#xff0c;有人問&#xff1a;可以不配置ContextLoaderListener嗎 所謂ContextLoaderListener&#xff0c;就是在web部署描述符即web.xml里面經常配置的一個監聽器&#xff0c;如下 [html] view plaincopy <listener> <listener-cl…

PLSQL安裝教程,無需oracle客戶端(解決本地需要安裝oracle客戶端的煩惱)

最近用筆記本開發&#xff0c;項目用的是Oracle數據庫&#xff0c;不想本地安裝Oracle客戶端。 就只裝了一個PLSQL 連接數據庫的時候各種錯誤&#xff0c;現在解決了記錄一下。 詳細內容見 附件 1、運行 plsqldev1105_x64.exe2、運行 Language_zh_x86_x64.exe3、啟動 plsql 點…