tensorflow 由于s390x上的字节顺序问题,FullyConnected引用_整数_ops错误计算输出数据

r1wp621o  于 2022-10-29  发布在  其他
关注(0)|答案(5)|浏览(150)

系统信息

  • 我是否编写了自定义代码(而不是使用TensorFlow中提供的常用示例脚本):没有
  • 操作系统平台和分发版(例如Linux Ubuntu 16.04):Ubuntu 18.04版
  • 移动的设备(例如iPhone 8、Pixel 2、Samsung Galaxy),如果问题发生在移动设备上:不适用
  • TensorFlow安装自(源代码或二进制文件):来源
  • TensorFlow版本(使用下面的命令):2.3.1
  • Python版本:3.6.9
  • Bazel版本(如果从源代码编译):3.4.1
  • GCC/编译器版本(如果从源代码编译):Ubuntu 7.5.0- 3Ubuntu 1 ~18.04版本
  • CUDA/cuDNN版本:不适用
  • GPU型号和内存:不适用
    描述当前行为

s390 x上的测试用例//tensorflow/lite/micro/examples/hello_world:hello_world_test失败,错误为:

Testing LoadModelAndPerformInference
0. (1.0*2^-127) near value (-1.1018541*2^0) failed at tensorflow/lite/micro/examples/hello_world/hello_world_test.cc:103
0.841 (1.6819992*2^-1) near value (-1.1018541*2^0) failed at tensorflow/lite/micro/examples/hello_world/hello_world_test.cc:111
0.141 (1.1279996*2^-3) near value (-1.1018541*2^0) failed at tensorflow/lite/micro/examples/hello_world/hello_world_test.cc:118
-0.959 (-1.9179993*2^-1) near value (-1.1018541*2^0) failed at tensorflow/lite/micro/examples/hello_world/hello_world_test.cc:125
0/1 tests passed
~~~SOME TESTS FAILED~~~

在调试时,我发现GetTensorData<int32_t>(bias)返回LE格式的Tensor数据,其中bias是一个可选输入Tensor,在Eval中填充为const TfLiteTensor* bias = GetOptionalInputTensor(context, node, kBiasTensor);
在计算acc时,在reference_integer_ops FullyConnected中使用偏差的Tensor数据。
我尝试了一个解决方案,在填充acc时对这些数据进行字节交换,这样就修复了测试用例。

if (bias_data) {

# if FLATBUFFERS_LITTLEENDIAN

        acc += bias_data[out_c];

# else

        acc += __bswap_32(bias_data[out_c]);

# endif

在完全连接的. h中
由于我不了解这个可选Tensor的范围和使用,您是否可以建议我尝试其他方法,或者我是否应该PR这个解决方案?

描述预期行为

BE系统上的Tensor数据必须采用正确的格式,测试用例应通过。

重现问题的独立代码

要重现此问题,请运行此测试用例:

bazel --host_jvm_args="-Xms1024m" --host_jvm_args="-Xmx2048m" test --host_javabase="@local_jdk//:jdk" --test_tag_filters=-gpu,-benchmark-test,-v1only,-no_oss,-oss_serial -k --test_timeout 300,450,1200,3600 --build_tests_only -c dbg --copt=-O -c opt --copt=-g --strip never --color=yes --curses=yes --test_output=errors --verbose_failures  -- //tensorflow/lite/micro/examples/hello_world:hello_world_test

其他信息/日志

1yjd4xko

1yjd4xko1#

我发现micro_speech_binary_mock_testmicro_speech_test测试用例也需要类似的修复才能在s390x上通过。需要在depthwise_conv. h中进行更改。这里也需要在填充acc之前对偏置数据进行字节交换。

3ks5zfa0

3ks5zfa02#

你好@advaitjain,只是在这里发布更新..
在Tensorflow发布版本2.4.1中,此解决方案导致回归到//tensorflow/lite/micro/kernels:fully_connected_test,同样,depthwise_conv.h中的修复导致//tensorflow/lite/micro/kernels:depthwise_conv_test测试用例失败。
看起来这些测试要求bias_data为Little Endian格式,并相应地处理数据,而对于hello_world_test和micro_speech_tests,bias_data在计算中使用时假定其为BE格式,因此,它会扰乱acc的计算。

xlpyo6sf

xlpyo6sf3#

社区对此问题有任何更新吗?谢谢!

toe95027

toe950274#

你好@advaitjain,希望一切顺利。
想知道你是否有任何更新注册这一问题?谢谢!

csga3l58

csga3l585#

由于测试用例//tensorflow/lite/micro/examples/hello_world:hello_world_test已移出tensorflow/tensorflow存储库,因此可以关闭此问题。

相关问题