Created by: Xreki
OP conv2d_fusion报错信息优化 [仅C++端]
(1) 抽取conv2d_fusion和conv的InferShape中的公共部分。
- conv2d_fusion的
InferShape
大部分代码与conv
中的一样。因此在ConvOp
的定义中,提取ComputeOutputShape(ctx)
函数,主要用来对输入、熟悉做一些公共的检查,并且计算出输出的shape。 - 对conv的
InferShape
中的报错信息进行了轻微的调整和优化。
InferShape
报错信息优化
(2) conv2d_fusion的-
InferShape
中改成调用ConvOp
基类的ComputeOutputShape(ctx)
,避免大量的重复代码。 - conv2d_fusion中的
Bias
输入应该是必须设置的,在Kernel里面有PADDLE_ENFORCE_NOT_NULL(bias, "The bias should not be null.");
这样的检查。这个PR将Bias
的检查增加到InferShape
中(OP_INOUT_CHECK(ctx->HasInput("Bias"), "Input", "Bias", "Conv2DFusion");
)。 - conv2d_fusion只支持2D卷积,增加输入是否是4-D Tensor的检查。
- conv2d_fusion只支持NCHW,因此增加
data_format
是否是NCHW
的检查。注意,此处最初使用PADDLE_ENFORCE_EQ(data_format, "NCHW")
进行检查,CI是报错,错误信息中显示data_format
的值为AnyLayout
,故而改成了跟ConvOp中一样的判断: -
split_channels
非空时,增加对输出Outputs
以及shape的检查。
conv2d_fusion
的Kernel
中的保存信息优化
(3) 主要是cudnn函数调用。目前只在报错信息中增加了增加了函数名的打印,但仅有这些信息,调试还是比较困难。由于cudnn这些函数是公共调用的函数,建议后续对这些函数的报错进行统一的封装和优化。
conv_op.h
的ConvOutputSize
函数中,2处PADDLE_ENFORCE
报错信息进行优化。
(4) 对(5) 在调整InferShape实现的过程,碰到一次错误,顺便优化了下动态图InferShape的一处报错
- 优化前
464: PreconditionNotMetError: dim size [4] is not match output var number [2]
464: [Hint: Expected it->second.size() == dims.size(), but received it->second.size():2 != dims.size():4.] at (/paddle/paddle/fluid/imperative/infer_shape_context.h:291)
- 优化后
464: InvalidArgumentError: The number of dims is expected to be equal to the number of Outputs(Outputs). But receieved: the number of dims = 4, the number of Outputs(Outputs) = 2.
464: [Hint: Expected dims.size() == it->second.size(), but received dims.size():4 != it->second.size():2.] at (/paddle/paddle/fluid/imperative/infer_shape_context.h:291)