如題 pcie介面足夠 用於tensorflow計算 淘寶賣家說「所有伺服器都只能接一塊顯卡」 被嚇到了 是真的嗎?如果是 怎麼解決?

補土

機架伺服器(DELL R730 C612晶元組)加倆GPU效果圖。還有個塔式的機器叫做T630,官方表示可以加最多四塊(顯卡的話泰坦X呀1080TI之類的)

看老闆的意思是,他的店裡的機器最多只能加一塊顯卡的意思(比如只有一顆CPU、比如電源功率不足,再比如PCI-E的插槽不夠等等等等)

另外你說的那個什麼機器學習多顯卡。。。

我認為換成多GPU會更合適些。。。。

下面貼上一個英偉達官方的鏈接:

在哪裡購買 Tesla 個人超級計算機 HPC GPU |NVIDIA?

www.nvidia.cn圖標

下面有張各廠商支持GPU的伺服器的型號對照圖,參考參考。

商業用途,還是Tesla好些。


作者:itsAndy

鏈接:https://www.zhihu.com/question/271226455/answer/1411456425來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

還是推薦使用智星雲吧,有多卡的伺服器配置,環境都是配置好的,用起來很方便順手。

關於多gpu訓練,tf並沒有給太多的學習資料,比較官方的只有:tensorflow-models/tutorials/image/cifar10/cifar10_multi_gpu_train.py但代碼比較簡單,只是針對cifar做了數據並行的多gpu訓練,利用到的layer、activation類型不多,針對更複雜網路的情況,並沒有給出指導。一、思路單GPU時,思路很簡單,前向、後向都在一個GPU上進行,模型參數更新時只涉及一個GPU。多GPU時,有模型並行和數據並行兩種情況。模型並行指模型的不同部分在不同GPU上運行。數據並行指不同GPU上訓練數據不同,但模型是同一個(相當於是同一個模型的副本)。在此只考慮數據並行,這個在tf的實現思路如下:模型參數保存在一個指定gpu/cpu上,模型參數的副本在不同gpu上,每次訓練,提供batch_size*gpu_num數據,並等量拆分成多個batch,分別送入不同GPU。前向在不同gpu上進行,模型參數更新時,將多個GPU後向計算得到的梯度數據進行平均,並在指定GPU/CPU上利用梯度數據更新模型參數。假設有兩個GPU(gpu0,gpu1),模型參數實際存放在cpu0上,實際一次訓練過程如下圖所示:

二、tf代碼實現大部分需要修改的部分集中在構建計算圖上,假設在構建計算圖時,數據部分基於tensorflow1.4版本的dataset類,那麼代碼要按照如下方式編寫: next_img, next_label = iterator.get_next()image_splits = tf.split(next_img, num_gpus) label_splits = tf.split(next_label, num_gpus) tower_grads = [] tower_loss = [] counter = 0 for d in self.gpu_id: with tf.device(/gpu:%s % d): with tf.name_scope(%s_%s % (tower, d)): cross_entropy = build_train_model(image_splits[counter], label_splits[counter], for_training=True) counter += 1 with tf.variable_scope("loss"): grads = opt.compute_gradients(cross_entropy) tower_grads.append(grads) tower_loss.append(cross_entropy) tf.get_variable_scope().reuse_variables() mean_loss = tf.stack(axis=0, values=tower_loss) mean_loss = tf.reduce_mean(mean_loss, 0) mean_grads = util.average_gradients(tower_grads) update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops): train_op = opt.apply_gradients(mean_grads, global_step=global_step)第1行得到image和對應label第2-3行對image和label根據使用的gpu數量做平均拆分(默認兩個gpu運算能力相同,如果gpu運算能力不同,可以自己設定拆分策略)第 4-5行,保存來自不同GPU計算出的梯度、loss列表第7-16行,開始在每個GPU上創建計算圖,最重要的是14-16三行,14,15把當前GPU計算出的梯度、loss值append到列表後,以便後續計算平均值。16行表示同名變數將會復用,這個是什麼意思呢?假設現在gpu0上創建了兩個變數var0,var1,那麼在gpu1上創建計算圖的時候,如果還有var0和var1,則默認復用之前gpu0上的創建的那兩個值。第18-20行計算不同GPU獲取的grad、loss的平均值,其中第20行使用了cifar10_multi_gpu_train.py中的函數。第23行利用梯度平均值更新參數。

注意:上述代碼中,所有變數(vars)都放在了第一個GPU上,運行時會發現第一個GPU佔用的顯存比其他GPU多一些。如果想把變數放在CPU上,則需要在創建計算圖時,針對每層使用到的變數進行設備指定,很麻煩,所以建議把變數放在GPU上。

單機多GPU訓練先簡單介紹下單機的多GPU訓練,然後再介紹分散式的多機多GPU訓練。 單機的多GPU訓練, tensorflow的官方已經給了一個cifar的例子,已經有比較詳細的代碼和文檔介紹, 這裡大致說下多GPU的過程,以便方便引入到多機多GPU的介紹。 單機多GPU的訓練過程:
  1. 假設你的機器上有3個GPU;
  2. 在單機單GPU的訓練中,數據是一個batch一個batch的訓練。 在單機多GPU中,數據一次處理3個batch(假設是3個GPU訓練), 每個GPU處理一個batch的數據計算。
  3. 變數,或者說參數,保存在CPU上
  4. 剛開始的時候數據由CPU分發給3個GPU, 在GPU上完成了計算,得到每個batch要更新的梯度。
  5. 然後在CPU上收集完了3個GPU上的要更新的梯度, 計算一下平均梯度,然後更新參數。
  6. 然後繼續循環這個過程。

通過這個過程,處理的速度取決於最慢的那個GPU的速度。如果3個GPU的處理速度差不多的話, 處理速度就相當於單機單GPU的速度的3倍減去數據在CPU和GPU之間傳輸的開銷,實際的效率提升看CPU和GPU之間數據的速度和處理數據的大小。

通俗解釋寫到這裡覺得自己寫的還是不同通俗易懂, 下面就打一個更加通俗的比方來解釋一下:老師給小明和小華布置了10000張紙的乘法題並且把所有的乘法的結果加起來, 每張紙上有128道乘法題。 這裡一張紙就是一個batch, batch_size就是128. 小明算加法比較快, 小華算乘法比較快,於是小華就負責計算乘法, 小明負責把小華的乘法結果加起來 。 這樣小明就是CPU,小華就是GPU.這樣計算的話, 預計小明和小華兩個人得要花費一個星期的時間才能完成老師布置的題目。 於是小明就招來2個算乘法也很快的小紅和小亮。 於是每次小明就給小華,小紅,小亮各分發一張紙,讓他們算乘法, 他們三個人算完了之後, 把結果告訴小明, 小明把他們的結果加起來,然後再給他們沒人分發一張算乘法的紙,依次循環,知道所有的算完。這裡小明採用的是同步模式,就是每次要等他們三個都算完了之後, 再統一算加法,算完了加法之後,再給他們三個分發紙張。這樣速度就取決於他們三個中算乘法算的最慢的那個人, 和分發紙張的速度。

發佈於 2020-10-13繼續瀏覽內容知乎發現更大的世界打開Chrome繼續AcatdefAcatdef朝十晚十的互聯網公司運維

多卡的機器有很多啊,各家主流廠商的通用的2U伺服器如華為的2288V3,DELL的R730等都可以加2卡以上(有轉接卡),supermicro的4028GR-TR更是可以最多加到8卡。

這家店賣的伺服器是什麼型號?


多卡的機器有很多啊,各家主流廠商的通用的2U伺服器如華為的2288V3,DELL的R730等都可以加2卡以上(有轉接卡),supermicro的4028GR-TR更是可以最多加到8卡。

這家店賣的伺服器是什麼型號?


這個要看是用什麼伺服器的,很多機器都是可以多卡的,最多可以加到8張顯卡


還是推薦使用智星雲吧,有多卡的伺服器配置,環境都是配置好的,用起來很方便順手。

關於多gpu訓練,tf並沒有給太多的學習資料,比較官方的只有

:tensorflow-models/tutorials/image/cifar10/cifar10_multi_gpu_train.py

但代碼比較簡單,只是針對cifar做了數據並行的多gpu訓練,利用到的layer、activation類型不多,針對更複雜網路的情況,並沒有給出指導。

一、思路

單GPU時,思路很簡單,前向、後向都在一個GPU上進行,模型參數更新時只涉及一個GPU。多GPU時,有模型並行和數據並行兩種情況。模型並行指模型的不同部分在不同GPU上運行。數據並行指不同GPU上訓練數據不同,但模型是同一個(相當於是同一個模型的副本)。在此只考慮數據並行,這個在tf的實現思路如下:

模型參數保存在一個指定gpu/cpu上,模型參數的副本在不同gpu上,每次訓練,提供batch_size*gpu_num數據,並等量拆分成多個batch,分別送入不同GPU。前向在不同gpu上進行,模型參數更新時,將多個GPU後向計算得到的梯度數據進行平均,並在指定GPU/CPU上利用梯度數據更新模型參數。

假設有兩個GPU(gpu0,gpu1),模型參數實際存放在cpu0上,實際一次訓練過程如下圖所示:

二、tf代碼實現

大部分需要修改的部分集中在構建計算圖上,假設在構建計算圖時,數據部分基於tensorflow1.4版本的dataset類,那麼代碼要按照如下方式編寫: next_img, next_label = iterator.get_next()

image_splits = tf.split(next_img, num_gpus)

label_splits = tf.split(next_label, num_gpus)

tower_grads = []

tower_loss = []

counter = 0

for d in self.gpu_id:

with tf.device(/gpu:%s % d):

with tf.name_scope(%s_%s % (tower, d)):

cross_entropy = build_train_model(image_splits[counter], label_splits[counter], for_training=True)

counter += 1

with tf.variable_scope("loss"):

grads = opt.compute_gradients(cross_entropy)

tower_grads.append(grads)

tower_loss.append(cross_entropy)

tf.get_variable_scope().reuse_variables()

mean_loss = tf.stack(axis=0, values=tower_loss)

mean_loss = tf.reduce_mean(mean_loss, 0)

mean_grads = util.average_gradients(tower_grads)

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)

with tf.control_dependencies(update_ops):

train_op = opt.apply_gradients(mean_grads, global_step=global_step)

第1行得到image和對應label

第2-3行對image和label根據使用的gpu數量做平均拆分(默認兩個gpu運算能力相同,如果gpu運算能力不同,可以自己設定拆分策略)

第 4-5行,保存來自不同GPU計算出的梯度、loss列表

第7-16行,開始在每個GPU上創建計算圖,最重要的是14-16三行,14,15把當前GPU計算出的梯度、loss值append到列表後,以便後續計算平均值。16行表示同名變數將會復用,這個是什麼意思呢?假設現在gpu0上創建了兩個變數var0,var1,那麼在gpu1上創建計算圖的時候,如果還有var0和var1,則默認復用之前gpu0上的創建的那兩個值。

第18-20行計算不同GPU獲取的grad、loss的平均值,其中第20行使用了cifar10_multi_gpu_train.py中的函數。

第23行利用梯度平均值更新參數。

注意:上述代碼中,所有變數(vars)都放在了第一個GPU上,運行時會發現第一個GPU佔用的顯存比其他GPU多一些。如果想把變數放在CPU上,則需要在創建計算圖時,針對每層使用到的變數進行設備指定,很麻煩,所以建議把變數放在GPU上。

單機多GPU訓練

先簡單介紹下單機的多GPU訓練,然後再介紹分散式的多機多GPU訓練。 單機的多GPU訓練, tensorflow的官方已經給了一個cifar的例子,已經有比較詳細的代碼和文檔介紹, 這裡大致說下多GPU的過程,以便方便引入到多機多GPU的介紹。 單機多GPU的訓練過程:

  1. 假設你的機器上有3個GPU;
  2. 在單機單GPU的訓練中,數據是一個batch一個batch的訓練。 在單機多GPU中,數據一次處理3個batch(假設是3個GPU訓練), 每個GPU處理一個batch的數據計算。
  3. 變數,或者說參數,保存在CPU上
  4. 剛開始的時候數據由CPU分發給3個GPU, 在GPU上完成了計算,得到每個batch要更新的梯度。
  5. 然後在CPU上收集完了3個GPU上的要更新的梯度, 計算一下平均梯度,然後更新參數。
  6. 然後繼續循環這個過程。

通過這個過程,處理的速度取決於最慢的那個GPU的速度。如果3個GPU的處理速度差不多的話, 處理速度就相當於單機單GPU的速度的3倍減去數據在CPU和GPU之間傳輸的開銷,實際的效率提升看CPU和GPU之間數據的速度和處理數據的大小。

通俗解釋

寫到這裡覺得自己寫的還是不同通俗易懂, 下面就打一個更加通俗的比方來解釋一下:

老師給小明和小華布置了10000張紙的乘法題並且把所有的乘法的結果加起來, 每張紙上有128道乘法題。 這裡一張紙就是一個batch, batch_size就是128. 小明算加法比較快, 小華算乘法比較快,於是小華就負責計算乘法, 小明負責把小華的乘法結果加起來 。 這樣小明就是CPU,小華就是GPU.

這樣計算的話, 預計小明和小華兩個人得要花費一個星期的時間才能完成老師布置的題目。 於是小明就招來2個算乘法也很快的小紅和小亮。 於是每次小明就給小華,小紅,小亮各分發一張紙,讓他們算乘法, 他們三個人算完了之後, 把結果告訴小明, 小明把他們的結果加起來,然後再給他們沒人分發一張算乘法的紙,依次循環,知道所有的算完。

這裡小明採用的是同步模式,就是每次要等他們三個都算完了之後, 再統一算加法,算完了加法之後,再給他們三個分發紙張。這樣速度就取決於他們三個中算乘法算的最慢的那個人, 和分發紙張的速度。


謝邀

賣家說所有可能武斷了點

不過我的C602 C612確實都只能用一塊顯卡,多了認不出來

普通的X79 x99多路是沒問題的


推薦閱讀:
相关文章