【问题标题】:How can I efficiently use tensorflow if I have a CPU with 64 cores?如果我有一个 64 核的 CPU,我如何有效地使用 tensorflow?
【发布时间】:2017-08-09 02:16:34
【问题描述】:

所以我有 1 个 64 核 CPU 的设施。我已经从 anaconda 安装了 tensorflow。我知道如果我有多个 CPU,我可以通过指定 CPUid 来分配计算。如下(改编自here):

with tf.device("/cpu:0"):
    a = tf.Variable(tf.ones(()))
    a = tf.square(a)
with tf.device("/cpu:1"):
    b = tf.Variable(tf.ones(()))
    b = tf.square(b)
with tf.device("/cpu:2"):
    loss = a+b
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = opt.minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10):
    loss0, _ = sess.run([loss, train_op])
    print("loss", loss0)

上面的示例代码假设三个 CPU。但我想知道我是否可以使用现有设施(1 个 CPU,64 个内核)有效地进行某种高效的深度学习练习?有人可以帮助或指导我吗?


更新:

  • 内核是 Intel Xeon Phi 处理器型号。

  • 另外请注意,我没有管理员权限,所以无法编译任何库。我通过 Anaconda 安装了每个 python 库。

  • 我试图理解一些东西。我在上面给出的代码中使用了时间线概念(来自here),如下所示:

    import tensorflow as tf
    from tensorflow.python.client import timeline
    
    
    with tf.device("/cpu:0"):
        a = tf.Variable(tf.ones(()))
        a = tf.square(a)
    with tf.device("/cpu:0"):
        b = tf.Variable(tf.ones(()))
        b = tf.square(b)
    with tf.device("/cpu:0"):
        loss = a+b
    opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    train_op = opt.minimize(loss)
    
    sess = tf.Session()
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
    run_metadata = tf.RunMetadata()
    sess.run(tf.global_variables_initializer())
    for i in range(10):
        run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
        run_metadata = tf.RunMetadata()
        loss0, _ = sess.run([loss, train_op], options=run_options,run_metadata=run_metadata)
        print("loss", loss0)
    
    # Create the Timeline object, and write it to a json
    tl = timeline.Timeline(run_metadata.step_stats)
    ctf = tl.generate_chrome_trace_format()
    with open('timeline_execution1.json', 'w') as f:
        f.write(ctf)
    

然后我生成了不同的 json 文件,以在 chrome 中查看时间线,并在 tf.Session() 中使用 config=tf.ConfigProto(intra_op_parallelism_threads=#,inter_op_parallelism_threads=#) 行。然后我得到了不同的输出。但我只明白一点。该程序使用 4 个内核,无论我在 tf.Session() 中给出什么选项。如下:

【问题讨论】:

  • 单CPU多核不是默认的吗?例如,您尝试了什么,结果如何?也就是说,64 核 CPU 要么是不起眼的 ARM,要么是 Xeon Phi 的 AFAIK。确切的架构可能对这个问题很重要。
  • @MSalters :内核是英特尔至强融核处理器型号。我会更新问题。
  • /cpu:0 指的是所有 64 个内核,并行化会自动发生。您还可以创建 cpu:1cpu:2 之类的逻辑设备,但它们指的是同一个物理 CPU,所以我认为没有理由使用它们
  • @YaroslavBulatov :我可以将 1CPU、64 核系统虚拟地制作成 8 个节点,每个节点有 8 个内核吗?我知道这是一个愚蠢的问题。关于逻辑 cpu:1 和 cpu:2,我认为它只有在我有多个节点时才有用。
  • 不容易。 TensorFlow 不支持固定到物理 CPU 内核。您可以将分布式 tensorflow 与运行 tensorflow 的 8 个独立进程一起使用,并使用操作系统级工具(任务集)将每个进程固定到特定的核心集

标签: tensorflow parallel-processing deep-learning


【解决方案1】:

如果您有 Intel CPU(可能是 XeonPhi),使用 MKL 编译 Tensorflow 可能会加快速度。

你可以看到它是如何完成的here

【讨论】:

  • 我在这台机器上没有管理员权限。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多