小编ROB*_* AI的帖子

分布式tensorflow:In-graph复制和Between-graph复制之间的区别

:我困惑的两个概念In-graph replicationBetween-graph replication读取时复制训练中tensorflow的官方操作方法.

  1. 在上面的链接中说

    图形内复制.在这种方法中,客户端构建一个包含一组参数的tf.Graph(在tf.Variable节点固定到/ job:ps); ...

    这是否意味着有多个 tf.Graph S IN Between-graph replication的方法吗?如果是,所提供示例中的相应代码在哪里?

  2. 虽然Between-graph replication在上面的链接中已经有一个例子,但是任何人都可以提供一个In-graph replication 实现(伪代码很好)并突出其主要区别Between-graph replication吗?

    提前致谢!


Edit_1:更多问题

非常感谢您的详细解释和主旨代码@mrry @YaroslavBulatov!在查看您的回复后,我有以下两个问题:

  1. 复制培训中有以下声明:

    图之间的复制.在这种方法中,每个/ jo​​b:worker任务都有一个单独的客户端,通常与worker任务在同一个进程中.每个客户端构建一个包含参数的类似图形(固定到/ job:ps,如前所述,使用tf.train.replica_device_setter()将它们确定性地映射到相同的任务); 以及模型的计算密集型部分的单个副本,固定到/ job:worker中的本地任务.

    我有两个与上面的单词粗体相关的子问题.

    (A)为什么我们说每个客户端构建相似的图形,但不是相同的图形?我想知道复制培训示例中每个客户端中构建的图形 应该是相同的,因为下面的图形构造代码在所有workers 中共享:

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

    (B)不应该是模型的计算密集型部分的多个副本,因为我们有多个workers

  2. 复制培训中的示例是否支持多台计算机上的培训,每台计算机都有多个GPU?如果没有,我们是否可以同时使用In-graph replication每台机器上的多GPU支持培训和Between-graph …

distributed graph tensorflow

22
推荐指数
1
解决办法
6636
查看次数

Tensorflow:为什么'pip uninstall tensorflow'找不到tensorflow

我在Ubuntu14.04上使用Tensorflow-0.8.我首先从源代码安装Tensorflow,然后根据官方教程设置Tensorflow进行开发.当我想使用以下命令卸载tensorflow时

sudo pip uninstall tensorflow
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误:

Can't uninstall 'tensorflow'. No files were found to uninstall
Run Code Online (Sandbox Code Playgroud)

谁能告诉我哪里出错了?

供您参考,输出 pip show tensorflow

Name: tensorflow
Version: 0.8.0
Location: /home/AIJ/tensorflow/_python_build
Requires: numpy, six, protobuf, wheel
Run Code Online (Sandbox Code Playgroud)

但我实际上找到了另一个Tensorflow目录

/usr/local/lib/python2.7/dist-packages/tensorflow
Run Code Online (Sandbox Code Playgroud)

此外,我还有一个关于Python的一般用法的问题.我在我的系统中看到过两个非常相似的目录,即

/usr/lib/python2.7/dist-packages
/usr/local/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)

谁能告诉我他们之间的区别?我注意到每次使用时sudo pip install <package>,都会/usr/local/lib/python2.7/dist-packages安装软件包,我可以将软件包安装到/usr/lib/python2.7/dist-packages使用中pip install吗?

非常感谢您的帮助!

python uninstall tensorflow

17
推荐指数
2
解决办法
3万
查看次数

为什么cuSparse比cuBlas慢得多,因为稀疏矩阵乘法

最近当我在CUDA TOOLKIT 6.5中使用cuSparse和cuBLAS进行稀疏矩阵乘法时,我发现cuSPARSE在所有情况下都比cuBLAS慢得多!

在我的所有实验中,我cusparseScsrmm在cuSparse和cublasSgemmcuBLAS中使用过.在稀疏矩阵中,总元素的一半为零.我使用的GPU是NVIDIA Titan Black.此外,所有消耗的时间都是nvvp通过NVIDIA提供的工具获得的.以下是一些结果:

实验A:

  1. 稀疏矩阵大小:192x2400
  2. 密集矩阵大小:2400x256
  3. cusparse时间:1.4ms
  4. 古巴拉斯时间:0.21毫秒

实验B:

  1. 稀疏矩阵大小:192x75
  2. 密集矩阵大小:75x1024
  3. cusparse时间:0.27ms
  4. 古巴拉斯时间:0.04ms

所以,看到上面列出的结果是很奇怪的.因为cuSPARSE专门用于处理稀疏矩阵操作,所以它怎么能比cuBLAS更慢!?如果是这样,则根本不需要使用cuSPARSE.你能告诉我结果的任何解释吗?另外,你能否提出任何其他方法来加速稀疏矩阵乘法?

cuda matrix multiplication sparse-matrix cublas

8
推荐指数
1
解决办法
5347
查看次数

如何在Google Compute Engine上创建的两个实例之间进行ssh?

我在Google Compute Engine上创建了两个实例:

Instance A
hostname: robot-a
ip addr: 10.111.0.11

Instance B
hostname: robot-b
ip addr: 10.222.0.22
Run Code Online (Sandbox Code Playgroud)

我可以从本地计算机登录到这两个实例.但是如何从其中一个实例登录到另一个实例呢?


我尝试了以下,但失败了:

robot-a$ ssh robot-b
The authenticity of host 'robot-b (10.111.0.11)' can't be established.
ECDSA key fingerprint is 3a:1a:f1:23:6a:83:ab:db:d8:a1:e8:7d:f5:65:c8:c5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'robot-b' (ECDSA) to the list of known hosts.
Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)

ssh google-compute-engine google-cloud-platform

8
推荐指数
2
解决办法
3046
查看次数

为什么我的Google云计算实例总是意外重启?

救命!救命!救命!

这真的很烦人,我几乎忍不住了!我正在使用谷歌云计算引擎实例,但他们经常意外地重新启动而没有提前通知.实例的重启似乎是随机发生的,我不知道那里出了什么问题!当重启发生时,我很确定实例已被占用(CPU使用率> 50%且所有GPU都在使用中).谁能告诉我如何解决这个问题?提前致谢!

google-compute-engine

7
推荐指数
2
解决办法
3775
查看次数

Minion没有回来.执行时为[未连接]:salt'minion1'test.ping

在stackoverflow中可能已多次询问类似问题的问题.但经过搜索,我发现没有答案可以解决我的问题.所以我在这里张贴以寻求你的帮助.

我的系统是Ubuntu 14.04.在设置master和minion(名为"minion1")之后,我使用命令在master上测试salt

salt 'minion1' test.ping
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

minion1:
    Minion did not return. [Not connected]
Run Code Online (Sandbox Code Playgroud)

根据其他人的建议,我测试了以下命令:

  1. 在minion上,我首先删除以前的主密钥:

    rm /etc/salt/pki/minion/minion_master.pub

并重新启动minion,但仍然失败.因此我们消除了无与伦比的主密钥的情况.

  1. 在小兵身上,我执行

    salt-call test.ping

要得到:

local:
    True
Run Code Online (Sandbox Code Playgroud)

所以主人和奴才之间的沟通很好.

  1. 在minion上,我首先使用命令停止salt-minion:

    service salt-minion stop

并使用命令在调试模式下运行它:

salt-minion -l debug
Run Code Online (Sandbox Code Playgroud)

获得以下回报:

[DEBUG   ] Reading configuration from /etc/salt/minion
[INFO    ] Using cached minion ID from /etc/salt/minion_id: minion1
[DEBUG   ] loading log_handlers in ['/var/cache/salt/minion/extmods/log_handlers', '/usr/lib/python2.7/dist-packages/salt/log/handlers']
[DEBUG   ] Skipping /var/cache/salt/minion/extmods/log_handlers, it is not a directory
[DEBUG   ] Configuration file path: /etc/salt/minion
[INFO    ] Setting up the Salt Minion "minion1" …
Run Code Online (Sandbox Code Playgroud)

salt-stack

5
推荐指数
0
解决办法
1865
查看次数

pyTorch可以向后两次,而无需设置keep_graph = True

pyTorch教程中所述

如果您甚至想对图形的某些部分进行两次向后的操作,则需要在第一遍中传递keep_graph = True。

但是,我发现以下代码片段实际上没有起作用。我正在使用pyTorch-0.4

x = torch.ones(2, 2, requires_grad=True)
y = x + 2
y.backward(torch.ones(2, 2)) # Note I do not set retain_graph=True
y.backward(torch.ones(2, 2)) # But it can still work!
print x.grad
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[ 2.,  2.], 
        [ 2.,  2.]]) 
Run Code Online (Sandbox Code Playgroud)

谁能解释?提前致谢!

pytorch autograd

3
推荐指数
1
解决办法
636
查看次数

在设计线程安全类时,在嵌套调用的情况下避免死锁

我知道我可以mutex在类中使用成员并将其锁定在每个方法中以防止数据在多线程环境中竞争.但是,如果有嵌套调用的类的方法,像这样的方法可能招致的僵局add_one(),并add_two()在下面的类.mutex对每种方法使用不同的是一种解决方法.但是,在嵌套调用的情况下,是否有更原则和优雅的方法来防止死锁?

class AddClass {
public:
  AddClass& operator=(AddClass const&) = delete; // disable copy-assignment constructor
  AddClass(int val) : base(val) {}
  int add_one() { return ++base; }
  int add_two() { 
    add_one; 
    add_one;
    return base;
  }
private:
  int base;
};
Run Code Online (Sandbox Code Playgroud)

c++ multithreading

2
推荐指数
1
解决办法
1340
查看次数

tensorflow如何分配Ops在GPU上运行?

我对tensorflow用于为CPU或GPU分配不同Ops的机制感到困惑.

  1. 以伪代码为例.我们可以说:只要SimpleOp在上下文中创建with tf.device('/gpu:0')它,它肯定会在GPU上运行(假设GPU的实现SimpleOp 是可用的),无论它的输入变量(in_1in_2)是在CPU还是GPU上创建的?

    with tf.device('/gpu:0'):
        out = tf.SimpleOp(in_1, in_2, name='Simple')
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我理解通过创建sessionwith log_device_placement=True,tensorflow输出所有变量/ Ops的设备位置.但是,有没有一种方法可以让我只检查一个Op的设备分配?

提前致谢!

tensorflow

2
推荐指数
1
解决办法
2694
查看次数

插入相同的键时,自定义类的unordered_map不会导致错误

我想弄清楚使用unordered_map自定义类的一些要点.下面是我用来练习一个简单类的练习代码Line.我很困惑,为什么插入Line2in main()不会使程序输出insert failedmfor Line1和的值Line2都是3.请注意,因为我只比较第一值(即m中)operator==功能class Line,从而Line1Line2在此代码应该有相同的密钥.不应该插入已存在的密钥无效吗?有人可以向我解释原因吗?谢谢!

#include<iostream>                                                                                                                                                                                                                                                                                                                                                                                                                                          
#include<unordered_map>                                                                                                                                                                                                                    

using namespace std;                                                                                                                                                                                                                       
class Line {                                                                                                                                                                                                                               
public:                                                                                                                                                                                                                                    
  float m;                                                                                                                                                                                                                                 
  float c;                                                                                                                                                                                                                                 

  Line() {m = 0; c = 0;}                                                                                                                                                                                                                   
  Line(float mInput, float cInput) {m = mInput; c = cInput;}                                                                                                                                                                               
  float getM() const {return m;}                                                                                                                                                                                                           
  float getC() const {return c;}                                                                                                                                                                                                           
  void setM(float mInput) {m = mInput;}                                                                                                                                                                                                    
  void setC(float cInput) …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map

1
推荐指数
1
解决办法
161
查看次数