🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
关注本专栏并在专栏中任何一篇文章下发表评论,即可获得【PyCharm、Clion、DataGrip、DataSpell、IDEA、Goland、Rider、PhpStorm等软件的破解版】。
目录
1. 前言
刚刚接触Python的同学一定会很困惑安装包的时候为什么会有两个方法:pip和conda。
两者的区别是什么?联系又是什么?我们要如何选择呢?
会不会有小伙伴图下载速度快而选择一直用pip安装,然后有一天突然发现包冲突🤣🤣
今天就让猫猫带你深入了解conda 和 pip的区别与联系~~
2. conda 和pip简介
在很多时候,由于conda和pip两个命令的某些功能存在重叠(比如可以用来安装第三方包),所以很多人认为他们是一样的。但其实两者最初被设计的目的并不相同。Pip是Python Packaging Authority(PyPA,是一个工作组,负责维护 python包中使用的一系列核心软件)推荐用来从Python Package Index(PyPI,是由PyPA开发的python包构成的索引包)下载第三方包的工具。Pip可以用来下载和安装.whl和源码格式的包,其中用pip进行源码安装可能会要求系统中已经成功安装了兼容的编译器以及必要的包。
而conda 则是一个跨平台的包和环境管理器,用于从Anaconda和Anaconda Cloud中安装和管理conda包。因为conda 包是二进制文件,所以我们不需要编译器来对它们进行编译,这是一个与pip不同的地方。此外,conda 包并不仅限于安装Python软件,还可以借助conda来安装包含 C 或 C++ 包、R 包在内的任何其他软件。
3. conda和pip的主要区别
Conda和pip虽然在某些功能上重叠,但两者也存在着许多不同,各有各的优缺点,详细可以见下表。
conda | pip | |
---|---|---|
包内容 | 二进制 | .whl和源码 |
是否需要编译 | 不需要 | 需要 |
安装包类型 | Python、C、R等任何类型 | 仅限于Python |
是否支持环境管理 | 是,可以创建多个环境 | 否,需要借助virtualenv or venv等其它工具 |
依赖包检查 | 检查十分严格 | 检查不严格 |
包来源 | Anaconda repo and cloud | PyPI |
包数量 | 约1500个 | 约150000个 |
4. Conda的优势
在了解了conda和pip的基本概念之后,我们结合上表来具体谈谈为何推荐优先使用conda啦。
首先,相比于pip只能安装Python包来说,conda可以安装用任何语言编写的软件包。这一优点带来的好处是巨大的,完全可以利用这一特性部署一个私有的个人环境。比如我在编译wrf时,除了服务器已经配置好的一些库以外,可能还缺少如libpng、zlib等库,这时便可以借助conda进行安装,十分方便。
其次在使用pip安装包之前必须先通过其他方式安装好python解释器,而conda则可以直接安装python解释器以及python软件包。
此外,conda还是一个超越python的内置环境管理工具,可以创建多个环境并使其相互隔离开,避免各个软件之间出现版本不兼容的现象。这在使用数据科学相关的工具时会非常有用,因为不同的处理工具可能包含相互冲突的需求,但使用conda的话可以避免将这些工具全部安装在一个环境中,比如可以在一个环境中安装python2.7版本的解释器,在另一个环境中安装Python3.7版本的解释器。而pip则不包含这样的内置环境管理工具,而是依赖于外部的其他工具,如virtualenv 或 venv来创建隔离的环境。
最后,由于conda对于环境中依赖关系的检查非常严格,所以基本上只要conda能安装上,软件包就能使用,但如果是使用pip的话,可能某些时候尽管显示你已成功安装,但由于包与包之间的依赖关系不满足,软件包会出现无法使用的情况。这主要是由于在安装软件包时,pip会在递归的串行循环中安装依赖项,并不能确保所有包的依赖关系同时满足。比如说若在安装顺序中较早安装的软件包与较晚安装的软件包具有不兼容的依赖项版本,就可能会导致环境错误,即使安装上也无法正常使用。而conda则会使用可满足性求解器(SAT)来验证是否满足环境中安装的所有软件包的全部要求。虽然这个检查可能需要一些额外的时间,但有利于防止出现上面环境不满足的现象。
以上就是推荐优先使用conda命令进行安装第三方库的全部原因了。虽然conda已经包含了数据科学、机器学习等领域的许多包了,但相对于PyPI上提供的超过150000个包相比,显得依然很小。所以当你想要的包在conda上没有的话,那就结合pip一起使用吧!
5. 为什么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核心库。它的架构图如下所示:
上图中,最底层是硬件,包括了网络和计算设备,这里先只关注计算设备。由于CPU、GPU等硬件设计的区别,一些矩阵运算在不同硬件上的机器码有质的区别。线性代数部分一般基于Eigen库,这是一个专注于向量和矩阵运算的C++库;Eigen::Tensor是一个使用C++模板技术,它可以为多核 CPU/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
安装包主要基于下面的版本进行构建的。
6. 到底什么是包
广义上来讲,包(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支持更好。
7. 总结
本文到这里就结束啦~~
如果觉得对你有帮助,辛苦友友点个赞哦~