我们可以使用 tf.device(' cpu或gpu')来分配不同的设备以在Tensorflow图中执行不同的操作,目前尚不清楚如何划分他们。 其他的事情是,如果我们使用默认的东西,TF是否总是使用GPU,如果有GPU?
更新
何时有两个GPU如何划分操作。 allow_soft_device_placement 可以自动执行此操作吗?
答案 0 :(得分:3)
在TF中查找设备的工作方式如下:
有一个可以理解的测试: if no other devices is chosen 归结为
TEST(VirtualPlacerTest, LocalDevices) {
// Create a virtual cluster with a local CPU and a local GPU
std::unordered_map<string, DeviceProperties> devices;
devices[".../cpu:0"] = cpu_device;
devices[".../device:GPU:0"] = gpu_device;
NodeDef node;
node.set_op("Conv2D");
// node.device() is empty, but GPU is default device if there is.
EXPECT_EQ("GPU", placer.get_device(node).type());
node.set_device("CPU");
EXPECT_EQ("CPU", placer.get_device(node).type());
node.set_device("GPU:0");
EXPECT_EQ("GPU", placer.get_device(node).type());
}
我们从哪里获得默认设备?每个设备都是https://github.com/tensorflow/tensorflow/blob/3bc73f5e2ac437b1d9d559751af789c8c965a7f9/tensorflow/core/grappler/costs/virtual_placer_test.cc#L26-L54,优先级为:
void DeviceFactory::Register(const string& device_type, DeviceFactory* factory,int priority)
评论registered很有意思,快速here给出了:
如果可能,TF-placer使用具有更高优先级的设备。 因此,只要有可用的GPU 和,就会有针对GPU的操作的注册内核和没有进行手动分配=&gt;它使用GPU。
如果您关心效率,那么您的第二个问题(“如何划分它们”)就无法轻易回答。在大多数情况下,无需将操作放在CPU上。
根据经验:如果您觉得不需要手动分配设备,请相信幕后的启发式方法。
编辑:在编辑问题时,以下是其他详细信息:
soft_device_placement
仅为search,无法在预期的设备上运行。考虑在GPU上进行培训并在笔记本电脑上进行推理。由于每个Op-Kernel仅注册到applied to nodes,不能直接在不同的GPU之间分配Op(它们是相同的设备类型)。
主要有{{3}}分发培训。你应该关心变量的放置位置。我不确定你在找什么。但TF允许您device type (CPU, GPU)通过所有GPU。
请允许我再补充一条说明: 由于我只使用two ways,因此我知道它支持balance the placement中的分布式培训,如TensorPack所示。所以说它会关注场景背后的所有这些。