如题 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多路是没问题的


推荐阅读:
相关文章