tensorflow / tensorflow

An Open Source Machine Learning Framework for Everyone
https://tensorflow.org
Apache License 2.0
186.56k stars 74.33k forks source link

Tensorflow Lite C++ error while building with cmake on windows with GPU support #61715

Open TurgutBababalim opened 1 year ago

TurgutBababalim commented 1 year ago

Issue type

Build/Install

Have you reproduced the bug with TensorFlow Nightly?

No

Source

source

TensorFlow version

2.14

Custom code

Yes

OS platform and distribution

Widnows 10

Mobile device

Asus pc

Python version

3.11

Bazel version

6.1.4

GCC/compiler version

gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

CUDA/cuDNN version

-

GPU model and memory

NVIDIA GeForce GTX 960m

Current behavior?

Relevant stackoverflow question: https://stackoverflow.com/questions/76990961/tensorflow-c-error-while-building-with-cmake-on-windows-with-gpu-support

I'm trying to get a tensorflow C++ build (or tensorflow lite) for Windows that runs on GPU (WITHOUT using CUDA, it should work on AMD). I decided to opt in for tensorflow lite with the -DTFLITE_ENABLE_GPU=ON flag to enable OpenCL.

Standalone code to reproduce the issue

The steps I followed:

- Clone tensorflow github repo to tensorflow_src and checout to r2.14
- Create a folder called tflite-opencl next to the cloned repo
- Go to tflite-opencl and run cmake C:/Users/Asus/Desktop/tensorflow/tensorflow/lite -DTFLITE_ENABLE_GPU=ON 
- Run cmake --build . -j

Relevant log output

When I try to run `cmake --build . -j` I get the following error:

C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,20): error
 C2039: 'any_cast': is not a member of 'std' [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]

...
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,1): error
C2065: 'any_cast': undeclared identifier [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,29): error
 C2275: 'tflite::gpu::ElementwiseAttributesBase<tflite::gpu::DataType::BOOL,T>': expected an expression instead of a
 type [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
          with
          [
              T=bool
          ]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(317,1): error
C3536: 'attr': cannot be used before it is initialized [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(317,17): error
 C2672: 'CreateElementwiseWithBroadcast': no matching overloaded function found [C:\Users\Asus\Desktop\tflite-opencl
\tensorflow-lite.vcxproj]

...

C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(321,17): error
 C2672: 'CreateElementwise': no matching overloaded function found [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-l
ite.vcxproj]

...

C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,29): error
 C2275: 'tflite::gpu::ElementwiseAttributesBase<tflite::gpu::DataType::INT32,T>': expected an expression instead of
a type [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
          with
          [
              T=int32_t
          ]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,29): error
 C2275: 'tflite::gpu::ElementwiseAttributesBase<tflite::gpu::DataType::FLOAT32,float>': expected an expression inste
ad of a type [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]

...

C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\tasks\special\conv_pointwise.cc(129,12): error
 C2039: 'any_cast': is not a member of 'std' [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\variant(30,1): message : s
ee declaration of 'std' [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\tasks\special\conv_pointwise.cc(129,20): error
 C2065: 'any_cast': undeclared identifier [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\tasks\special\conv_pointwise.cc(129,21): error
 C2275: 'tflite::gpu::ReduceAttributes': expected an expression instead of a type [C:\Users\Asus\Desktop\tflite-open
cl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\tasks\special\conv_pointwise.cc(130): error C3
536: 'reduce_attr': cannot be used before it is initialized [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcx
proj]

But despite these errors it kept on compiling and eventually ended on:

...
 tensorflow_profiler_logger_shim.cc
  tflite_with_xnnpack_optional.cc
  minimal_logging_default.cc
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\minimal_logging_default.cc(37,9): warning C4068: unknown pragma 'cl
ang' [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\minimal_logging_default.cc(38,9): warning C4068: unknown pragma 'cl
ang' [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\minimal_logging_default.cc(40,9): warning C4068: unknown pragma 'cl
ang' [C:\Users\Asus\Desktop\tflite-opencl\tensorflow-lite.vcxproj]
  platform_profiler.cc
  root_profiler.cc
  profiler.cc
  sparsity_format_converter.cc
  schema_utils.cc
  Generating Code...

C:\Users\Asus\Desktop\tflite-opencl>

I think I'm getting the any_cast is not a member of std because my C++ standard version is below 14. But I've been coding in windows for a while and I'm pretty sure I'm above 17 as I use many modern features. I've updated g++ from Visual Studio Installer but I'm not sure how to properly update my C++ version on Windows.

I'm sure this build has failed, but regardless I searched for the dll.

This failed build gave me a Visual Studio solution inside tflite-opencl. I need to import tflite into a huge project so I need either the dll files or the lib files. I tried looking under tflite-opencl/Release, tflite-opencl/Debug and tflite-opencl/x64 but found nothing. I'm also adviced to look under \bazel-bin\tensorflow\lite\kernels on [my previous question][1], which I can find under tensorflow_src and I can't find any dll's in it.

How can I fix that error and change my C++ standard on Windows? How can I get these dll or lib files to use under my project? If I should build INSTALL how am I supposed to do it? I developed mainly on Linux environments so I don't know how to use Visual Studio propperly.

TurgutBababalim commented 1 year ago

I've tried adding SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")

to cmake_install.cmake under tflite-opencl but it still generates the same error.

TurgutBababalim commented 1 year ago

Update: Apparently operation_selector.cc does not include #include <any> as it should, causing the aforementioned 'any_cast': is not a member of 'std' error. After including and building it, I get a .lib file under tflite-opencl/Debug (no .dll's found).

However, when I include it and try to use it on a project, I get many unresolved external symbol errors. Am I doing something wrong? Were there supposed to be a .dll file?

pkgoogle commented 1 year ago

Hi @TurgutBababalim, this is effectively a duplicate of https://github.com/tensorflow/tensorflow/issues/61269

misterBart commented 1 year ago

Yeah, I mentioned issue #61269 several months ago, and now more people bump into it... Two possible solutions: (1) Change std::any_cast to absl::any_cast (2) Add #include <any> in operation_selector.cc and conv_pointwise.cc You could propose a pull request with one of the above solutions. Though I believe such tiny matters can be solved far quicker by a Tensorflow member, than by an external person proposing a pull request.

Your other errors (as detailed in https://stackoverflow.com/q/76998448/7268445) are not related to the any_cast problem.