问题类型
Bug
你是否在TF nightly中复现了这个bug?
是的
来源
source
Tensorflow版本
v1.12.1-88697-g620bee79ab3 2.12.0-dev20230201
自定义代码
无
OS平台和发行版
Ubuntu 22.04
移动设备
- 无响应*
Python版本
Python 3.10
Bazel版本
5.3.0
GCC/编译器版本
gcc-11
CUDA/cuDNN版本
CUDA-11.8/cudnn-8.7.0/TensorRT-8.5.3
GPU型号和内存
RTX3090
当前行为?
See code snippet:
https://github.com/tensorflow/tensorflow/blob/4aec415b3f06b19c380d1a0ca92cc2de0d74cc21/tensorflow/compiler/tf2tensorrt/convert/convert_nodes.cc#L4399-L4436
In the case of NDHWC layout (triggered by the code below) an uninitialized value is returned from ConvertFusedBatchNorm which causes an exception to be raised.
I would expect it to build correctly. Changing ConvertFusedBatchNorm to do the same thing for NDHWC as for NHWC gets rid of the crash, but I don't know if this is correct.
独立代码以重现问题
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import (
BatchNormalization,
Conv3D,
Dense,
Flatten,
Input,
)
from tensorflow.keras.models import Model
from tensorflow.python.compiler.tensorrt import trt_convert as trt
inputs = Input(shape=(24, 24, 64, 1), name="x")
x = inputs
x = Conv3D(16, (3, 3, 3), activation="relu", padding="same")(x)
x = BatchNormalization()(x)
x = Flatten()(x)
x = Dense(128, activation="relu")(x)
x = Dense(128)(x)
m = Model(inputs=[inputs], outputs=[x])
m.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model_dir = "/tmp/model"
tf.keras.models.save_model(m, model_dir)
converter = trt.TrtGraphConverterV2(input_saved_model_dir=model_dir,
precision_mode=trt.TrtPrecisionMode.FP16)
trt_func = converter.convert()
def input_fn():
a = np.random.rand(1024, 24, 24, 64, 1).astype(np.float32)
yield [a]
converter.build(input_fn=input_fn)
相关日志输出
2023-02-02 11:32:14.336729: W tensorflow/compiler/tf2tensorrt/kernels/trt_engine_op.cc:1104] TF-TRT Warning: Engine creation for TRTEngineOp_000_000 failed. The native segment will be used instead. Reason: INVALID_ARGUMENT: Rank of perm for transpose does not match with that of the input.
5条答案
按热度按时间fwzugrvs1#
你好,@froody
对于延迟表示歉意,我认为你正在尝试将数据格式为
NHWC
的输入Tensor转换为NDHWC
,所以我不确定是否可以做到这一点,但我认为输入Tensor的数据格式应该等于输出Tensor的数据格式,因此NHWC
转换为NCHW
,NDHWC
转换为NCDHW
,甚至在日志输出中也清楚地显示为INVALID_ARGUMENT: Rank of perm for transpose does not match with that of the input.
。你可以参考这个 official documentation 的源代码,以下是一些参考资料 Ref-1 、 Ref-2 、 Ref-3 ,它们可能有助于解决你的问题。
每个字母的意义可能有助于理解:
请告诉我是否遗漏了任何内容?谢谢!
os8fio9y2#
请查看我提供的示例代码。您认为我在第几行创建了一个NHWCTensor?还是要求从NHWC转换为NDHWC?
我想说的是,
ConvertFusedBatchNorm
在convert_nodes.cc
中存在一个错误。代码看起来像这样:ITensorProxyPtr output_tensor;
if (data_format == "NCHW") {
...
}
if (data_format == "NHWC") {
...
}
params->outputs->push_back(TRT_TensorOrWeights(output_tensor));
如果您对这段代码进行插桩,打印出
data_format
的值,然后运行上面提供的示例Python代码,您会发现在某个时刻data_format = "NDHWC"
出现,导致代码跳过两个转换块,并将未初始化的output_tensor
值赋给params->outputs
。如果您对这段代码进行插桩,打印出
order_size
和dims.nbDims
在它们不相等的情况下的值,您应该会看到order_size = 4
和dims.nbDims
具有一些不合理的巨大值,略小于0xffff
,这是由于上述代码段引入的未初始化值导致的。inn6fuwd3#
你好,@sachinprasadhs
请问您能调查一下这个问题吗?谢谢!
mm9b1k5b4#
@froody,你提到的最近对上述功能的提交(1377c6e)是否对你有任何帮助?
hmtdttj45#
这段文本可以翻译为:
"在最近的提交中,查看主分支,我仍然看到以下格式的代码,这使得当 $x_1^m_0n_1^x$ 和 $x_1^a_0b_1^x$ 时,输出Tensor未初始化。"