1
votes

Erreur Tensorflow Lite arm64: impossible de convertir «const int8x8_t?

J'ai essayé de construire AARCH64 sur ubuntu 16.04. J'ai suivi ce guide (Native Compling) https://tensorflow.google.cn/lite/guide/ build_arm64 .

Mais j'ai eu cette erreur. Quel est le problème? Je veux aussi essayer un exemple sur Orange Pi 3. Comment puis-je utiliser le fichier libtensorflow-lite.a après la construction pour arm64. Je connais Qt ide et c & c ++. Merci.

In file included from ./tensorflow/lite/kernels/internal/optimized/depthwiseconv_uint8.h:22:0,
                 from tensorflow/lite/kernels/depthwise_conv.cc:29:
./tensorflow/lite/kernels/internal/optimized/depthwiseconv_uint8_3x3_filter.h: In static member function ‘static void tflite::optimized_ops::depthwise_conv::WorkspacePrefetchWrite<(tflite::DepthwiseConvImplementation)3>::Run(int8, int, int8*)’:
./tensorflow/lite/kernels/internal/optimized/depthwiseconv_uint8_3x3_filter.h:5782:71: note: use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts
       vst1_lane_u32(reinterpret_cast<uint32_t*>(ptr), fill_data_vec, 0);
                                                                       ^
./tensorflow/lite/kernels/internal/optimized/depthwiseconv_uint8_3x3_filter.h:5782:71: error: cannot convert ‘const int8x8_t {aka const __vector(8) signed char}’ to ‘uint32x2_t {aka __vector(2) unsigned int}’ for argument ‘2’ to ‘void vst1_lane_u32(uint32_t*, uint32x2_t, int)’
./tensorflow/lite/kernels/internal/optimized/depthwiseconv_uint8_3x3_filter.h:5785:35: error: cannot convert ‘const int8x8_t {aka const __vector(8) signed char}’ to ‘uint32x2_t {aka __vector(2) unsigned int}’ for argument ‘2’ to ‘void vst1_lane_u32(uint32_t*, uint32x2_t, int)’
                   fill_data_vec, 0);
                                   ^
tensorflow/lite/tools/make/Makefile:225: recipe for target '/tensorflow/tensorflow/lite/tools/make/gen/aarch64_armv8-a/obj/tensorflow/lite/kernels/depthwise_conv.o' failed
make: *** [/tensorflow/tensorflow/lite/tools/make/gen/aarch64_armv8-a/obj/tensorflow/lite/kernels/depthwise_conv.o] Error 1
make: *** Waiting for unfinished jobs....


3 commentaires

-flax-vector-conversions fait-il une différence?


Je ne sais pas. je suis nouveau sur ce sujet. J'applique uniquement le guide tensorflow lite. @doctorlove


J'ai le même problème.


3 Réponses :


2
votes

Après avoir essayé de résoudre le problème pendant des heures, je pense avoir trouvé une solution à cela:

Il suffit d'ajouter le paramètre "-flax-vector-conversions" à la variable CXXFLAGS dans le tensorflow / lite / tools / make / Fichier Makefile.

Pour moi, c'était à la ligne 58:

LIBS := \
-lstdc++ \
-lpthread \
-lm \
-ldl \
-lrt

L'erreur précédente a disparu, mais maintenant j'obtiens une autre erreur: p >

undefined reference to `shm_open'

Après cela, j'ai ajouté "-lrt" à tensorflow / lite / tools / make / cibles / aarch64_makefile.inc

CXXFLAGS := -O3 -DNDEBUG -fPIC -flax-vector-conversions

et a changé BUILD_WITH_NNAPI dans le Makefile en false

Le processus de compilation a fonctionné. Je vais tester la bibliothèque TF dès que possible.


1 commentaires

J'obtiens toujours une erreur ": x29 ne peut pas être utilisé dans asm ici ".



1
votes

Pour construire Tensorflow Lite pour arm64, j'ai modifié:

tensorflow / lite / tools / make / cibles / aarch64_makefile.inc

en ajoutant aux CXXFLAGS et CFLAGS:

  CXXFLAGS += \
    -march=armv8-a \
    -funsafe-math-optimizations \
    -ftree-vectorize \
    -flax-vector-conversions \
    -fomit-frame-pointer \
    -fPIC

  CFLAGS += \
    -march=armv8-a \
    -funsafe-math-optimizations \
    -ftree-vectorize \
    -flax-vector-conversions \
    -fomit-frame-pointer \
    -fPIC

ce qui donne:

-flax-vector-conversions \
-fomit-frame-pointer \

Pour moi, cela a éliminé l'erreur : impossible de convertir ainsi que l'erreur : x29 ne peut pas être utilisé dans asm ici .

J'ai ensuite pu construire libtensorflow-lite.a.

La commande du tutoriel me donne toujours une erreur lors de la construction des exemples d'applications: référence non définie à flatbuffers :: ClassicLocale :: instance_ , la solution à ce problème est décrite dans

https://github.com/tensorflow/tensorflow/issues/28863


En guise de remarque si vous essayez d'utiliser le docker conteneur du guide:

https://tensorflow.google.cn/ lite / guide / build_arm64

Il recommande d'utiliser tensorflow / tensorflow: nightly-devel qui, selon docker hub, est actuellement une image vieille de 6 mois (certainement pas tous les soirs) :

https: //hub.docker .com / r / tensorflow / tensorflow / tags /? page = 1 p >

À partir de ce même lien, vous pouvez trouver un conteneur devel plus récent, dans mon cas, j'ai utilisé devel-py3


0 commentaires

1
votes

J'ai également rencontré un problème similaire lors de la construction de Tensorflow-1.14 sur aarch64. J'ai utilisé les modifications suggérées dans ce PR et cela a résolu ce problème. Résolvez les deux problèmes suivants sur un système linux_aarch64:

  • conversions interdites entre vecteurs
  • utilisation explicite interdite du registre de pointeur de trame x29 dans asm

Ajouter le cas suivant dans le def tflite_copts () du tensorflow/lite/build_def.bzl

        str(Label("//tensorflow:linux_aarch64")): [
            "-flax-vector-conversions",
            "-fomit-frame-pointer",
        ],


0 commentaires