Tensorflow 如何使用TPU诊断内存不足错误

Tensorflow 如何使用TPU诊断内存不足错误,tensorflow,tpu,Tensorflow,Tpu,我正在尝试在TPU上训练u-net的一个变体,似乎有3个操作使用24 Gig的内存。鉴于网络相当庞大,我无法知道他们在哪里。如何计算这些不透明堆栈跟踪所指的实际操作 RuntimeError: Compilation failed: Compilation failure: Ran out of memory in memory space hbm. Used 27.90G of 16.00G hbm. Exceeded hbm capacity by 11.90G. Total hbm us

我正在尝试在TPU上训练u-net的一个变体,似乎有3个操作使用24 Gig的内存。鉴于网络相当庞大,我无法知道他们在哪里。如何计算这些不透明堆栈跟踪所指的实际操作

RuntimeError: Compilation failed: Compilation failure: Ran out of memory in memory space hbm. Used 27.90G of 16.00G hbm. Exceeded hbm capacity by 11.90G.

Total hbm usage >= 27.90G:
    reserved        528.00M
    program          27.38G
    arguments       unknown size

Output size unknown.

Program hbm requirement 27.38G:
    reserved          12.0K
    scoped             1.0K
    HLO temp         27.38G (5.6% utilization, 0.0% fragmentation (1.14M))

  Largest program allocations in hbm:

  1. Size: 8.00G
     Operator: op_type="CrossReplicaSum" op_name="tpu_139655909282424/CrossReplicaSum"
     Shape: f32[256,512,128,2]{3,2,1,0}
     Unpadded size: 128.00M
     Extra memory due to padding: 7.88G (64.0x expansion)
     XLA label: %cross-replica-sum = f32[256,512,128,2]{3,2,1,0} cross-replica-sum(f32[256,512,128,2]{3,2,1,0} %bitcast.1), replica_groups={{0,1,2,3,4,5,6,7}}, barrier="custom:0", to_apply=%sum.902, metadata={op_type="CrossReplicaSum" op_name="tpu_139655909282424/CrossRep...
     Allocation type: HLO temp
     ==========================

  2. Size: 8.00G
     Operator: op_type="Mul" op_name="tpu_139655909282424/mul_1"
     Shape: f32[8,32,512,128,2]{4,3,2,1,0}
     Unpadded size: 128.00M
     Extra memory due to padding: 7.88G (64.0x expansion)
     XLA label: %fusion.4 = (f32[8,32,512,128,2]{4,3,2,1,0}, f32[8,32,512,128,2]{4,3,2,1,0}) fusion(f32[8]{0} %fusion.1265, f32[32,512,128,2]{3,2,1,0} %reshape.319, f32[32,512,128,2]{3,2,1,0} %copy.5), kind=kLoop, calls=%fused_computation.4, metadata={op_type="Mul" op_nam...
     Allocation type: HLO temp
     ==========================

  3. Size: 8.00G
     Operator: op_type="Mul" op_name="tpu_139655909282424/mul_1"
     Shape: f32[8,32,512,128,2]{4,3,2,1,0}
     Unpadded size: 128.00M
     Extra memory due to padding: 7.88G (64.0x expansion)
     XLA label: %fusion.4 = (f32[8,32,512,128,2]{4,3,2,1,0}, f32[8,32,512,128,2]{4,3,2,1,0}) fusion(f32[8]{0} %fusion.1265, f32[32,512,128,2]{3,2,1,0} %reshape.319, f32[32,512,128,2]{3,2,1,0} %copy.5), kind=kLoop, calls=%fused_computation.4, metadata={op_type="Mul" op_nam...
     Allocation type: HLO temp
     ==========================

您可以通过/properties找到操作定义点的回溯。例如,要打印op的回溯,可以编写如下函数:

def print_op_traceback(op):#注意这需要一个tf.Operation,对于tf.Tensor,使用Tensor.op
对于操作回溯中的f、lno、func行:
打印(f'{f}:{lno}({func})\n{line})
#或者在Python 3.6之前
#打印({}:{}({})\n{}'。格式(f,lno,func,line))
然后,您可以通过以下方式查看问题操作的回溯:

op=tf.get_default_graph().get_operation_by_name('tpu_139655909282424/CrossReplicaSum'))
打印\操作\回溯(操作)

但这是在编译模型时发生的(我使用的是tf.keras)。我该如何保存图形,以便在错误发生后重新加载它?@Luke啊,我明白了,我以为问题出在运行或训练模型时。我不知道为什么图形编译只需要占用这么多内存。我发现,由于填充,大部分内存都在
额外内存下,这使得内存比“未添加的大小”大64倍,这正常吗?在任何情况下,运行上述代码都不需要保存图形,只需在包含这些操作的活动图形中运行即可。不确定它是否可以工作,但也许您可以捕获该异常,并尝试在
except
块上获取这些操作的回溯?