python使用pip与conda 的区别

今天正好用到这部分的内容,做一些简单总结,欢迎大家指正:conda install xxx:这种方式安装的库都会放在anaconda3/pkgs目录下,这样的好处就是,当在某个环境下已经下载好了某个库,再在另一个环境中还需要这个库时,就可以直接从pkgs目录下将该库复制至新环境而不用重复下载。pip install xxx:分两种情况,一种情况就是当前conda环境的python是conda安装的,和系统的不一样,那么xxx会被安装到anaconda3/envs/current_env/lib/python3.x/site-packages文件夹中,如果当前conda环境用的是系统的python,那么xxx会通常会被安装到~/.local/lib/python3.x/site-packages文件夹中这里引出一个问题:conda和pip安装同一个xxx库情况下,conda环境下python代码中import xxx时,谁安装的xxx优先级较高会被import,这个问题通过下面这条命令可以解决:python -m site在我的机器上,会有类似下面输出:(py3.6) [~/anaconda3/pkgs @ s64]$ python -m site
sys.path = [
‘~/anaconda3/pkgs’,
‘~/anaconda3/envs/py3.6/lib/python36.zip’,
‘~/anaconda3/envs/py3.6/lib/python3.6’,
‘~/anaconda3/envs/py3.6/lib/python3.6/lib-dynload’,
‘~/anaconda3/envs/py3.6/lib/python3.6/site-packages’,
]
USER_BASE: ‘~/.local’ (exists)
USER_SITE: ‘~/.local/lib/python3.6/site-packages’ (doesn’t exist)
ENABLE_USER_SITE: True这里的USER_BASE 和USER_SITE其实就是用户自定义的启用Python脚本和依赖安装包的基础路径,从上面的输出可以看到,import xxx时,先找的是anaconda3/pkgs目录,所以conda安装的包会被import进来。

pip是用来安装python包的,安装的是python wheel或者源代码的包。从源码安装的时候需要有编译器的支持,pip也不会去支持python语言之外的依赖项。conda是用来安装conda package,虽然大部分conda包是python的,但它支持了不少非python语言写的依赖项,比如mkl cuda这种c c++写的包。然后,conda安装的都是编译好的二进制包,不需要你自己编译。所以,pip有时候系统环境没有某个编译器可能会失败,conda不会。这导致了conda装东西的体积一般比较大,尤其是mkl这种,动不动几百兆甚至一G多。然后,conda功能其实比pip更多。pip几乎就是个安装包的软件,conda是个环境管理的工具。conda自己可以用来创建环境,pip不能,需要依赖virtualenv之类的。意味着你能用conda安装python解释器,pip不行。这一点我觉得是conda很有优势的地方,用conda env可以很轻松地管理很多个版本的python,pip不行。然后是一些可能不太容易察觉的地方。conda和pip对于环境依赖的处理不同,总体来讲,conda比pip更加严格,conda会检查当前环境下所有包之间的依赖关系,pip可能对之前安装的包就不管了。这样做的话,conda基本上安上了就能保证工作,pip有时候可能装上了也不work。不过我个人感觉这个影响不大,毕竟主流包的支持都挺不错的,很少遇到broken的情况。这个区别也导致了安装的时候conda算依赖项的时间比pip多很多,而且重新安装的包也会更多(会选择更新旧包的版本)。最后,pip的包跟conda不完全重叠,有些包只能通过其中一个装。

个人结论:conda和pip有区别,可能绝大多数使用者感觉不到两者太大区别,但我仍然建议能用conda安装的优先使用conda,尽量使用conda的环境隔离功能,为不同的任务创建不同的环境。如果某个包conda没有,再使用pip安装。其实,对于绝大多数人,只要你不搞GPU计算、不依赖很多底层库,pip已经能够满足需求。但是我仍然推荐使用conda。pip和conda的区别,先上图:conda的优势:包之间严格的依赖检查;是一个超越Python的环境管理器,可以创建多个环境,环境之间互相隔离;支持Python、R、C/C++;NumPy、SciPy直接使用Intel MKL,对Intel的CPU支持更好。缺点:没做好环境隔离的话,一些包可能安装不上。pip的优势:绝大多数包优先发布到pip上,安装方便,群众基础好。缺点:不进行严格的依赖检查。对于绝大多数朋友,只是在自己的个人电脑上,用用NumPy,做做图,其实用pip和conda区别真的不大。如果是搞研究或者开发,在一台服务器上多人共享使用,我建议最好是conda。另外一些朋友说conda也有各种问题,我认为主要是因为没有用好conda的环境隔离功能,因为一直在用基础环境(base),基础环境里各类包太多了,已经产生依赖冲突,无法再继续安装下去,或者安装上了也不能用。如果你需要做GPU计算,用到了CUDA、TensorFlow之类的库,尤其是使用版本迭代很快的库,我建议使用conda。以上精简版的介绍完了,下面我就从GPU加速角度仔细分析pip和conda到底有什么区别。我的网站公示显示效果更好,欢迎访问:https://lulaoshi.info/blog/2020/05/09/how-python-package.html。尽管依赖问题非常棘手,但明白包管理以及包编译安装原理有助于我们深刻理解计算机基本原理,避免成为一个调包侠。最近在一台GPU机器上安装了LightGBM,主要是希望LightGBM能够利用GPU的算力进行加速,中间遇到GPU驱动以及CUDA等问题,断断续续持续了一个月才完全使其正常运行。为了彻底弄明白Python打包和安装依赖的问题,我下载了LightGBM、TensorFlow等机器学习库的源码,并做了一些调研。为什么pip安装的机器学习库对GPU支持不好对于主流机器学习库,比如TensorFlow、PyTorch、LightGBM等,主要都是使用C/C++编写的。C/C++有如下优势:如果用Python语言实现,Python解释器(例如CPython)会将Python代码翻译转化成机器能够理解的代码。而C/C++代码被直接编译成机器码,能够充分利用CPU、GPU等硬件的算力。CPython有一个限制并行计算的GIL锁。C/C++程序能够更好地进行并行计算,避免了CPython的GIL锁。C/C++可以显式(Explicitly)管理变量和内存,处理结果具有确定性(Deterministically)。以TensorFlow为例,它提供了Python的调用接口,用户一般用Python来调用TensorFlow。实际上,其底层代码绝大多数是用C/C++编写的。Python只是TensorFlow的一个前端(Front End),Python需要通过调用C语言的API,进而调用底层的TensorFlow核心库。它的架构图如下所示: TensorFlow架构图 来源:TensorFlow Internals上图中,最底层是硬件,包括了网络和计算设备,这里先只关注计算设备。由于CPU、GPU等硬件设计的区别,一些矩阵运算在不同硬件上的机器码有质的区别。线性代数部分一般基于Eigen库,这是一个专注于向量和矩阵运算的C++库;Eigen::Tensor是一个使用C++模板技术,它可以为多核 CPU/GPU 生成高效的并发代码。 英伟达GPU软硬件依赖栈GPU部分最底层是操作系统和驱动,再往上是提供给程序员的开发接口CUDA。英伟达在CUDA之上提供了cuBLAS、cuDNN等库,cuBLAS是运行在英伟达GPU上的线性代数库(Basic Linear Algebra Subprograms,简称BLAS),cuDNN是英伟达为优化深度神经网络,在CUDA上包装的库,里面包含了Tensor计算、卷积、池化等常见DNN操作。cuBLAS和cuDNN代码会最终编译成英伟达GPU可运行的机器码。cuDNN对英伟达硬件、驱动和CUDA版本有依赖要求,由于版本迭代,新版本的cuDNN只能运行在高版本的驱动和CUDA上。英伟达官方提供了版本依赖表。对于使用英伟达GPU的朋友,第一件事是基于自己的硬件安装最新的驱动。如果驱动、CUDA和cuDNN版本与上层应用不匹配,容易出现各类问题。很多时候,我们按照网上的教程安装了驱动、CUDA,并用pip安装了TensorFlow,最后发现有99%的概率依然用不了。因为,TensorFlow提供的pip安装包主要基于下面的版本进行构建的。 TensorFlow官方提供的经过测试的版本依赖关系到底什么是包广义上来讲,包(Package)其实就是一个软件集合,安装完包之后,我们就可以使用包里的软件了。Windows上缺少包的概念,类Unix系统一般使用包管理软件(Package Manager)来管理和安装软件,我们在手机上常用的应用商店其实就是一个包管理软件。软件发布者将编译好的软件发布到包管理仓库(Repository,简称Repo),用户通过包管理软件来下载和安装,只不过类Unix系统一般使用命令行来安装这些软件。常见的包管理有:在操作系统上安装软件:Ubuntu的apt、CentOS的yum、macOS的homebrew 在编程语言中安装别人开发的库:Python的pip、Ruby的Gem 包管理软件有对应的Repo:pip的PyPI,conda的http://Anaconda.org、R的CRAN 无论包管理模式如何,这些包管理系统都会帮助我们解决:管理源码(Source Code)或者编译打包之后的二进制文件(Binary)。解决软件包之间的依赖问题。比如,LightGBM还依赖了NumPy等其他包。部分依赖还对版本号有要求。从源码开始编译一个包其实很麻烦:很多时候需要基础环境一致,这包括操作系统版本(高版本的操作系统glibc版本比较高,一些新兴机器学习包一般基于更高版本的glibc,这些包无法安装到低版本的操作系统上)、编译工具(例如类Unix系统的GCC、CMake,Windows上的Visual Studio等)。当前包所依赖的其他软件,比如GPU版的TensorFlow所依赖的cuDNN、LightGBM所依赖的NumPy等。编译过程相当耗时。比如,TensorFlow的构建时间就非常长。因此很多包管理系统在发布的时候,提供二进制文件。二进制文件下载解压之后就可以运行了,有点像Windows上的绿色免安装软件。但是:别人编译好的软件是在别人的基础环境上进行的,这就导致这个软件非常依赖当初编译它的环境。安装当前包之前肯定要先安装好这个包所依赖的软件包。可见,包管理也是一个有一定挑战的问题。就像很多桌面软件和游戏只有Windows的版本一样,一些大数据、深度学习类的应用因为基于Linux环境开发和构建,常常对Linux支持更好。pip和conda回到Python的包管理上,经过这些年的发展,Python领域目前有两大主流包管理系统:pip和conda。那这两个到底有什么区别呢?pip是Python官方的包管理工具:它从PyPI(Python Package Index)上拉取数据,或者说它的Repo在PyPI上。绝大多数的Python包会优先发布到PyPI上。目前(2020年5月),PyPI上的项目有23万之多。支持源码和二进制文件,二进制文件以Wheel文件形式存在。只支持Python,不关注其他一些非常重要但是更加底层的软件包,比如针对Intel CPU加速的数学库Intel MKL。pip安装包时,尽管也对当前包的依赖做检查,但是并不保证当前环境的所有包的所有依赖都同时满足。这可能导致一个环境的依赖冲突,当某个环境所安装的包越来越多,很早之前安装的包可能和当前包相互冲突。conda是另外一个被广泛应用的工具,它:它从http://Anaconda.org上拉取数据。Anaconda上有一些主流Python包,但在数量级上明显少于PyPI,缺少一些小众的包。 它只支持二进制文件,二进制文件是提前编译好的。 不仅支持Python,还支持R、C/C++等其他语言的包。 提供了环境隔离,可以使用conda命令创建多个环境,每个环境里安装Python、R等环境,某个特定的环境内包含了独立的Python解释器,不同环境之间互不影响。相比而言,pip只提供安装功能,多环境之间的隔离需要依赖另外的工具(如virtualenv)来完成。从这个角度来讲,conda可以管理Python解释器,而pip必须依附于Python解释器。 conda在安装包时,对所安装包的依赖检查更严格,它会保证当前环境里的所有包的所有依赖都满足。可以看到,目前没有一个完美的Python包管理模式,conda虽然对依赖检查更严格,但是它支持的包比较少。pip对依赖检查不够严格,会导致环境的冲突,但是很多Python包,尤其是一些小众的Python包会优先发布到PyPI上。因此,我们可能需要将conda和pip结合起来,并且要善于创建不同的环境,每个环境处理某些具体的计算任务,以免环境里的各类包越来越臃肿,造成依赖冲突。Intel MKL另外,conda对Intel MKL支持更好,MKL(Math Kernel Library)是支持线性代数和矩阵预算的底层包,也是很多Python科学计算的基础依赖。Intel MKL在Intel的CPU上计算效率是最高的,如果不安装,很可能使用的是OpenBLAS的开源版本。如果你使用的是Intel的CPU,那么使用conda会安装带有Intel MKL的NumPy、SciPy、scikit-learn等包。机器学习库安装方法TensorFlow如果想在GPU上使用TensorFlow,官方建议使用Docker。用户只需要安装GPU驱动即可,连CUDA都不需要安装。Docker在一定程序上能解决环境的隔离。如果不习惯使用Docker,一些文章推荐使用conda来安装TensorFlow。因为conda不仅管理Python,还支持C/C++的库。因此在安装TensorFlow时,它不仅将TensorFlow所需要的一些二进制文件下载安装,还安装了一些其他依赖包。使用conda创建一个名为tf_gpu的虚拟环境,安装GPU版本的TensorFlow:conda create --name tf_gpu tensorflow-gpu
安装过程中显示除了TensorFlow本身,conda还将安装包括CUDA、cuDNN在内的依赖包:conda安装TensorFlow时会安装相关依赖,包括CUDA、cuDNN、BLAS等LightGBM相比TensorFlow,LightGBM尽管也在http://Anaconda.org上有二进制文件,但是并没有明确是否支持GPU,其官方文件中GPU版本是基于源码安装的。因此,LightGBM可以作为一个小众的案例。如果我们使用pip安装LightGBM,可以直接安装二进制文件,也可以从使用源码安装。在LightGBM的PyPI页面中显示,LightGBM依赖C/C++库,比如Windows的Visual Studio(2015或更新版本),Linux的glibc >=2.14。拉取二进制文件并安装:pip install lightgbm
使用源码安装,Linux和macOS需要先安装CMake。pip install --no-binary :all: lightgbm

安装GPU版本

pip install lightgbm --install-option=–gpu
安装GPU版本之前需要先安装GPU驱动。LightGBM使用开源的OpenCL而不是CUDA进行GPU加速,因此还要安装OpenCL。使用源码安装本质上是使用CMake将C/C++代码编译,编译过程中依赖了本地的基础环境,包括了C/C++各个类库、GPU驱动、OpenCL等。安装命令成功执行之后,LightGBM会被放在当前Python解释器的site-packages目录下。cd prefix/lib/python3.6/site-packages/lightgbm
tree

.
├── basic.py
├── callback.py
├── compat.py
├── engine.py
├── init.py
├── lib_lightgbm.so
├── libpath.py
├── plotting.py
├── pycache
│ ├── basic.cpython-36.pyc
│ ├── callback.cpython-36.pyc
│ ├── compat.cpython-36.pyc
│ ├── engine.cpython-36.pyc
│ ├── init.cpython-36.pyc
│ ├── libpath.cpython-36.pyc
│ ├── plotting.cpython-36.pyc
│ └── sklearn.cpython-36.pyc
├── sklearn.py
└── VERSION.txt
安装之后会有一个lib_lightgbm.so的动态链接库。这是C/C++代码编译之后生成的库,Python通过ctypes来访问动态链接库中的C/C++接口。于是,我们就可以在Python中调用这些C/C++的程序。小结为了避免依赖问题,我们可能需要按照下面的顺序来管理我们的Python包:Dockercondapip源码安装尽管依赖问题非常棘手,但明白包管理以及包编译安装原理有助于我们深刻理解计算机基本原理,避免成为一个调包侠。编辑于 2020-06-05 21:07​赞同 320​​36 条评论​分享​收藏​喜欢​收起​pythonic生物人​23 人赞同了该回答之前专门整理过Conda、pip及virtualenv三者比较,截取过来:conda可同时管理python的包及环境;pip只能管理。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值