代码之家  ›  专栏  ›  技术社区  ›  Gerry

运行import tensorflow后出现非法指令(内核转储)

  •  37
  • Gerry  · 技术社区  · 6 年前

    我创建了一个全新的虚拟环境: virtualenv -p python2 test_venv/ 并安装tensorflow: pip install --upgrade --no-cache-dir tensorflow

    import tensorflow 给了我 Illegal instruction (core dumped)

    请帮助我了解发生了什么,以及我如何修复它。非常感谢。

    CPU信息:

    -cpu
              description: CPU
              product: Intel(R) Core(TM) i3 CPU       M 330  @ 2.13GHz
              bus info: cpu@0
              version: CPU Version
              capabilities: x86-64 fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm tpr_shadow vnmi flexpriority ept vpid dtherm arat cpufreq
    

    使用gdb获得Stacktrace:

    #0  0x00007fffe5793880 in std::pair<std::__detail::_Node_iterator<std::pair<tensorflow::StringPiece const, std::function<bool (tensorflow::Variant*)> >, false, true>, bool> std::_Hashtable<tensorflow::StringPiece, std::pair<tensorflow::StringPiece const, std::function<bool (tensorflow::Variant*)> >, std::allocator<std::pair<tensorflow::StringPiece const, std::function<bool (tensorflow::Variant*)> > >, std::__detail::_Select1st, std::equal_to<tensorflow::StringPiece>, tensorflow::StringPieceHasher, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_emplace<std::pair<tensorflow::StringPiece, std::function<bool (tensorflow::Variant*)> > >(std::integral_constant<bool, true>, std::pair<tensorflow::StringPiece, std::function<bool (tensorflow::Variant*)> >&&) ()
       from /media/gerry/hdd_1/ws_hdd/test_venv/local/lib/python2.7/site-packages/tensorflow/python/../libtensorflow_framework.so
    #1  0x00007fffe5795735 in tensorflow::UnaryVariantOpRegistry::RegisterDecodeFn(std::string const&, std::function<bool (tensorflow::Variant*)> const&) () from /media/gerry/hdd_1/ws_hdd/test_venv/local/lib/python2.7/site-packages/tensorflow/python/../libtensorflow_framework.so
    #2  0x00007fffe5770a7c in tensorflow::variant_op_registry_fn_registration::UnaryVariantDecodeRegistration<tensorflow::Tensor>::UnaryVariantDecodeRegistration(std::string const&) ()
       from /media/gerry/hdd_1/ws_hdd/test_venv/local/lib/python2.7/site-packages/tensorflow/python/../libtensorflow_framework.so
    #3  0x00007fffe56ea165 in _GLOBAL__sub_I_tensor.cc ()
       from /media/gerry/hdd_1/ws_hdd/test_venv/local/lib/python2.7/site-packages/tensorflow/python/../libtensorflow_framework.so
    #4  0x00007ffff7de76ba in call_init (l=<optimized out>, argc=argc@entry=2, argv=argv@entry=0x7fffffffd5c8, env=env@entry=0xa7b4d0)
        at dl-init.c:72
    #5  0x00007ffff7de77cb in call_init (env=0xa7b4d0, argv=0x7fffffffd5c8, argc=2, l=<optimized out>) at dl-init.c:30
    #6  _dl_init (main_map=main_map@entry=0xa11920, argc=2, argv=0x7fffffffd5c8, env=0xa7b4d0) at dl-init.c:120
    #7  0x00007ffff7dec8e2 in dl_open_worker (a=a@entry=0x7fffffffb5c0) at dl-open.c:575
    #8  0x00007ffff7de7564 in _dl_catch_error (objname=objname@entry=0x7fffffffb5b0, errstring=errstring@entry=0x7fffffffb5b8, 
        mallocedp=mallocedp@entry=0x7fffffffb5af, operate=operate@entry=0x7ffff7dec4d0 <dl_open_worker>, args=args@entry=0x7fffffffb5c0)
        at dl-error.c:187
    #9  0x00007ffff7debda9 in _dl_open (
        file=0x7fffea7cbc34 "/media/gerry/hdd_1/ws_hdd/test_venv/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so", mode=-2147483646, caller_dlopen=0x51ad19 <_PyImport_GetDynLoadFunc+233>, nsid=-2, argc=<optimized out>, argv=<optimized out>, env=0xa7b4d0)
        at dl-open.c:660
    #10 0x00007ffff75ecf09 in dlopen_doit (a=a@entry=0x7fffffffb7f0) at dlopen.c:66
    #11 0x00007ffff7de7564 in _dl_catch_error (objname=0x9b1870, errstring=0x9b1878, mallocedp=0x9b1868, operate=0x7ffff75eceb0 <dlopen_doit>, 
        args=0x7fffffffb7f0) at dl-error.c:187
    #12 0x00007ffff75ed571 in _dlerror_run (operate=operate@entry=0x7ffff75eceb0 <dlopen_doit>, args=args@entry=0x7fffffffb7f0) at dlerror.c:163
    #13 0x00007ffff75ecfa1 in __dlopen (file=<optimized out>, mode=<optimized out>) at dlopen.c:87
    #14 0x000000000051ad19 in _PyImport_GetDynLoadFunc ()
    #15 0x000000000051a8e4 in _PyImport_LoadDynamicModule ()
    #16 0x00000000005b7b1b in ?? ()
    #17 0x00000000004bc3fa in PyEval_EvalFrameEx ()
    #18 0x00000000004c136f in PyEval_EvalFrameEx ()
    #19 0x00000000004b9ab6 in PyEval_EvalCodeEx ()
    #20 0x00000000004b97a6 in PyEval_EvalCode ()
    #21 0x00000000004b96df in PyImport_ExecCodeModuleEx ()
    #22 0x00000000004b2b06 in ?? ()
    #23 0x00000000004a4ae1 in ?? ()
    
    9 回复  |  直到 6 年前
        1
  •  56
  •   Dinesh    6 年前

    我会使用旧版本。看起来您的CPU不支持AVX指令。

    引用他们的 Release Page

    Breaking Changes
    Prebuilt binaries are now built against CUDA 9.0 and cuDNN 7.
    Prebuilt binaries will use AVX instructions. This may break TF on older CPUs.
    

    您至少有两个选项:

    1. 使用tensorflow 1.5或更早版本

    2. 从源代码生成

    考虑到您对差异的关注,您将错过新功能,但大多数基本功能和文档并没有那么大的不同。

        2
  •  5
  •   mjflory    6 年前

    不幸的是,1.6给了许多人同样的错误。我在使用旧Core2 CPU的机器上安装1.7后收到了它。我已经决定使用1.5,因为我无法将大型图形卡安装在配备最新处理器的机器中!

        3
  •  3
  •   mikaelfs    6 年前

    正如公认答案中所解释的,可以通过安装旧版本的TensorFlow(v1.5)或从源代码处构建来修复此问题。在这两者之间,尽管付出了额外的努力,但从源头建设可以说是首选路线。假设二进制文件包含TensorFlow的最新组件。

    This article 解释如何从源代码构建TensorFlow,并针对较旧的CPU进行优化。关键是在配置构建时检测CPU标志并启用所有CPU标志进行优化。

    以下命令用于检测常见的CPU优化标志:

    $ grep flags -m1 /proc/cpuinfo | cut -d ":" -f 2 | tr '[:upper:]' '[:lower:]' | { read FLAGS; OPT="-march=native"; for flag in $FLAGS; do case "$flag" in "sse4_1" | "sse4_2" | "ssse3" | "fma" | "cx16" | "popcnt" | "avx" | "avx2") OPT+=" -m$flag";; esac; done; MODOPT=${OPT//_/\.}; echo "$MODOPT"; }
    

    如果通过执行命令, -mavx 和/或 -mavx2 未显示,可以确认AVX支持缺失,源代码构建应该在输出中显示其他优化标志的情况下完成。

    在里面 a related article ,将更详细地讨论此问题的常见根本原因,作为补充参考。

        4
  •  1
  •   Ehab AlBadawy    5 年前

    我有一个类似的问题,结果是因为我的CPU有点旧,而这在TensorFlow的1.6以上版本中不能很好地工作 https://www.tensorflow.org/install/source

    注意:从TensorFlow 1.6开始,二进制文件使用的AVX指令可能不会在旧的CPU上运行。

    因此,如前所述,您可以安装TensorFlow 1.5,或者如果您仍然需要TF的最新版本,则需要使用conda来安装它(这两种解决方案都与我一起使用)

    对于conda安装:

    conda create -n tensorflow
    conda install tensorflow-gpu -n tensorflow
    

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

        5
  •  0
  •   Laurent S    6 年前
        6
  •  0
  •   elphi    4 年前

    以下步骤对我有效。 (移除现有tensorflow)

    conda虚拟环境内部

    步骤1:使用pip安装keras应用程序

    步骤2:安装tensorflow(无需降级)

        7
  •  0
  •   David Bacelj    4 年前

    我会使用docker将tf降级到以前的版本。您可以在dockerhub上找到不同的标签

    例如:

    docker run --gpus all -it tensorflow/tensorflow:2.2.1-gpu bash
    
        8
  •  0
  •   Emre    4 年前

    它可能与TensorFlow、Keras、Pytorch没有直接关系。 很抱歉。

    但这件事发生在我的L4T上,(Nvidia Jetson AGX Xavier)当我安装最新版本的NumPy、pandas、protobuf时,它在控制台上引发了奇怪的错误 我不知道为什么,我是说真的,如果有人能 . 它警告我 熊猫 打电话 python dateutil=2.8.1

    为了解决这个问题,请回到兔子洞,我尝试了以下步骤:

    pip3 uninstall numpy 
    pip3 uninstall pandas
    pip3 uninstall protobuf 
    pip3 uninstall python-dateutil 
    

    然后尝试使用特定版本安装它们

    pip3 install numpy==1.13.3
    pip3 install pandas==0.22.0
    pip3 install protobuf==3.0.0
    

    它现在可以很好地与TensorFlow:1.5.0、PyTorch:1.6、1.7配合使用

        9
  •  0
  •   Tobbey    3 年前

    类似问题从tensorflow==2.3.1到tensorflow==2.4.0 在当前cpu芯片短缺的情况下,预构建的二进制文件不能很好地工作,这使得很多人难以升级。

    可能需要自己构建tensorflow,才能使用tensorflow\u probability的最新功能(取决于tf 2.4.0)

    编辑2: 从…起 https://github.com/tensorflow/tensorflow/releases/tag/v2.4.1

    此版本从TF 2.4.0中删除了AVX2要求。

    看来我不是唯一一个在avx2支持方面有困难的人