【问题标题】:pip not installing numba/llvmlite properly within conda environmentpip 没有在 conda 环境中正确安装 numba/llvmlite
【发布时间】:2017-06-21 08:32:58
【问题描述】:

我创建了一个新的 conda 环境

user@machine:~/project$ conda create -n test-env -c numba python=3.5.2 llvmdev=3.8
Fetching package metadata ...........
Solving package specifications: .

Package plan for installation in environment /home/user/anaconda2/envs/test-env:

The following NEW packages will be INSTALLED:

    llvmdev:    3.8.1-7       numba
    openssl:    1.0.2k-0           
    pip:        9.0.1-py35_1       
    python:     3.5.2-0            
    readline:   6.2-2              
    setuptools: 27.2.0-py35_0      
    sqlite:     3.13.0-0           
    system:     5.8-2         numba
    tk:         8.5.18-0           
    wheel:      0.29.0-py35_0      
    xz:         5.2.2-1            
    zlib:       1.2.8-3            

Proceed ([y]/n)? y

#
# To activate this environment, use:
# > source activate test-env
#
# To deactivate this environment, use:
# > source deactivate test-env
#

然后激活它并尝试使用专门的pip(不是conda)来安装llvmlite和numba,这似乎成功了。 (注意:我也试过 --no-cache-dir 并没有改变任何东西。)

user@machine:~/project$ source activate test-env
(test-env) user@machine:~/project$ pip install llvmlite==0.15 numba==0.30.1
Collecting llvmlite==0.15
Collecting numba==0.30.1
Collecting numpy (from numba==0.30.1)
  Using cached numpy-1.12.0-cp35-cp35m-manylinux1_x86_64.whl
Installing collected packages: llvmlite, numpy, numba
Successfully installed llvmlite-0.15.0 numba-0.30.1 numpy-1.12.0

但是库没有正确安装,

(test-env) user@machine:~/project$ python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numba
Traceback (most recent call last):
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/ffi.py", line 42, in <module>
    lib = ctypes.CDLL(os.path.join(_lib_dir, _lib_name))
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/ctypes/__init__.py", line 347, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/libllvmlite.so: undefined symbol: _ZNKSt14error_category23default_error_conditionEi

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/numba/__init__.py", line 9, in <module>
    from . import config, errors, runtests, types
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/numba/config.py", line 11, in <module>
    import llvmlite.binding as ll
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/__init__.py", line 6, in <module>
    from .dylib import *
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/dylib.py", line 4, in <module>
    from . import ffi
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/ffi.py", line 47, in <module>
    lib = ctypes.CDLL(_lib_name)
  File "/home/user/anaconda2/envs/test-env/lib/python3.5/ctypes/__init__.py", line 347, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: libllvmlite.so: cannot open shared object file: No such file or directory

为什么从 numba 频道安装 llvmdev 的 conda 无法“正常工作”。

在我的用例中,我将进入一个具有 pip 样式的 requirements.txt 文件的项目,我需要从该文件创建 conda 环境。有的项目开发者会使用venv+pip,有的会使用conda,而且它包含的一些包在任何anaconda频道都找不到,所以pip安装是必须的。除了 requirements.txt 之外,我们不想维护单独的 envrionment.yaml,因此从 conda 环境中的 requirements.txt 安装是我的约束的一部分。

一切似乎都很好,除了 numba/llvmlite 的 pip 安装,它需要 llvm 3.8+ 的系统依赖项。不过,我想将其作为 conda 环境的一部分来满足。

如何从 conda 环境中确保仅存在用于安装 numba 和 llvmlite 的正确 llvmdev?

【问题讨论】:

  • 我无法在 Ubuntu VM 上重现您的错误,但您可以尝试从 conda-forge 频道而不是 numba 开发频道拉取,看看是否有帮助。
  • 我可以在 Ubuntu 16.10 机器上本地重现它,也可以在远程 Centos7 机器上重现它。其他的还没试过。
  • 您使用的是什么版本的 conda? “conda config -a”你是从开源频道还是从内部镜像中提取的?
  • 使用 conda 4.6.2:conda create -n test -c numba -c defaults --override-channels numba llvmdev llvmlite,然后是 conda activate test,然后是 python -m numba,得到 OSError: /lib64/libpthread.so.0: version `GLIBC_2.12' not found (required by /hpc/uhome/gholl/miniconda3/envs/test/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.soOSError: libllvmlite.so: cannot open shared object file: No such file or directory。文件/hpc/uhome/gholl/miniconda3/envs/test/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so 存在。不确定这是否是同一个问题。
  • 我的问题是probably a different one

标签: python pip llvm conda numba


【解决方案1】:

这就是使用 Anaconda 环境对我有用的方法:

pip uninstall llvmlite
pip install -U --ignore-installed numba

【讨论】:

    【解决方案2】:

    安装 llvmdev: 从 conda-forge 频道安装 llvmdev 可以通过将 conda-forge 添加到您的频道来实现:

    conda config --add channels conda-forge
    

    启用conda-forge 通道后,llvmdev 可以安装:

    conda install llvmdev
    

    可以列出您平台上所有可用的 llvmdev 版本:

    conda search llvmdev --channel conda-forge
    

    帮助:我从他们的 GitHub 源中克隆了相关文件并做了

     python setup.py install 
    

    更多没有 conda 使用 pip

     sudo pip install -U llvmlite
     sudo pip install -U numba
    

    【讨论】:

      【解决方案3】:

      在理想情况下,所需的共享库应该在安装 llvmlite 之后存在。

      (test-env) ~/condaexpts$ conda create -n test-env -c numba python=3.5.2 llvmdev=3.8
      (test-env) ~/condaexpts$ source activate test-env
      (test-env) ~/condaexpts$ pip install numpy==1.12.0 llvmlite==0.15 numba==0.30.1
      (test-env) ~/condaexpts$ find $CONDA_PREFIX | grep libllvmlite
      /home/ubuntu/condaexpts/m3/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/libllvmlite.so
      

      如果 test-env 中不存在此文件,则说明安装 llvmlite 时出现问题。

      另外,请反过来考虑这种方法。您不需要将要求文件与 conda 环境文件分开。您可以在 conda 环境文件本身中同时拥有这两个依赖项:

      (test-env) ~/condaexpts$ conda env export               
      name: test-env
      channels:
      - !!python/unicode
        'numba'
      - !!python/unicode
        'defaults'
      dependencies:
      - !!python/unicode
        'openssl=1.0.2k=0'
      - !!python/unicode
        'pip=9.0.1=py35_1'
      - !!python/unicode
        'python=3.5.2=0'
      - !!python/unicode
        'readline=6.2=2'
      - !!python/unicode
        'setuptools=27.2.0=py35_0'
      - !!python/unicode
        'sqlite=3.13.0=0'
      - !!python/unicode
        'tk=8.5.18=0'
      - !!python/unicode
        'wheel=0.29.0=py35_0'
      - !!python/unicode
        'xz=5.2.2=1'
      - !!python/unicode
        'zlib=1.2.8=3'
      - !!python/unicode
        'llvmdev=3.8.1=7'
      - !!python/unicode
        'system=5.8=2'
      - pip:
        - llvmlite==0.15.0
        - numba==0.30.1
        - numpy==1.12.0
      prefix: !!python/unicode '/home/ubuntu/condaexpts/m3/envs/test-env'
      

      第二点,您可以安装“numba”conda 通道本身所需的预构建二进制文件。与:

      (root) ~/condaexpts$ ./Miniconda3-latest-Linux-x86_64.sh -b -p m3
      (root) ~/condaexpts$ source ./m3/bin/activate 
      (root) ~/condaexpts$ conda create -n test-env -c numba python=3.5.2 llvmdev=3.8 numba=0.30.1 llvmlite=0.15.0
      (root) ~/condaexpts$ source activate test-env
      (test-env) ~/condaexpts$ python
      Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:53:06) 
      [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import numba
      >>> numba.__version__
      '0.30.1'
      

      【讨论】:

      • 感谢您的回复。不幸的是,这些选项在我的场景中不起作用。通常我喜欢使用 anaconda 通道来获取预编译的二进制文件,尤其是对于像 llvmlite 这样的复杂依赖项。但是,在当前的这个项目中,它已经基于一个 pip requirements.txt 文件。您应该假设由于项目限制,我无法支持与它一起使用的配套 environment.yml。
      • 另外,关于您关于 llvm 共享对象的 CONDA_PREFIX 位置的第一点,请查看我的问题中错误消息的第一部分。它们表明共享对象/home/user/anaconda2/envs/test-env/lib/python3.5/site-packages/llvmlite/binding/libllvmlite.so 确实存在(我可以很容易地在文件系统中看到它)。但是,conda 通过llvmdev 安装的预编译二进制文件有缺少符号错误,目前还不清楚为什么 conda 安装的依赖项会出现这个问题。
      猜你喜欢
      • 2021-12-16
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2017-11-17
      • 2019-07-09
      • 2019-01-13
      • 1970-01-01
      相关资源
      最近更新 更多