anaconda、pip的区别及选择

部署运行你感兴趣的模型镜像

作者:PP鲁
链接:https://www.zhihu.com/question/395145313/answer/1257660174
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

对于主流机器学习库,比如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:

无论包管理模式如何,这些包管理系统都会帮助我们解决:

  • 管理源码(Source Code)或者编译打包之后的二进制文件(Binary)。
  • 解决软件包之间的依赖问题。比如,LightGBM还依赖了NumPy等其他包。部分依赖还对版本号有要求。

从源码开始编译一个包其实很麻烦:

  • 很多时候需要基础环境一致,这包括操作系统版本(高版本的操作系统glibc版本比较高,一些新兴机器学习包一般基于更高版本的glibc,这些包无法安装到低版本的操作系统上)、编译工具(例如类Unix系统的GCC、CMake,Windows上的Visual Studio等)。
  • 当前包所依赖的其他软件,比如GPU版的TensorFlow所依赖的cuDNN、LightGBM所依赖的NumPy等。
  • 编译过程相当耗时。比如,TensorFlow的构建时间就非常长。

因此很多包管理系统在发布的时候,提供二进制文件。二进制文件下载解压之后就可以运行了,有点像Windows上的绿色免安装软件。但是:

  • 别人编译好的软件是在别人的基础环境上进行的,这就导致这个软件非常依赖当初编译它的环境。
  • 安装当前包之前肯定要先安装好这个包所依赖的软件包。

可见,包管理也是一个有一定挑战的问题。就像很多桌面软件和游戏只有Windows的版本一样,一些大数据、深度学习类的应用因为基于Linux环境开发和构建,常常对Linux支持更好。

作者:PP鲁
链接:https://www.zhihu.com/question/395145313/answer/1257660174
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

机器学习库安装方法

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等

 

小结

为了避免依赖问题,我们可能需要按照下面的顺序来管理我们的Python包:

  • Docker
  • conda
  • pip
  • 源码安装

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Anacondapip的关系 Anaconda 是一个用于科学计算的 Python R 的发行版,包含了 Conda 包管理器以及大量的预装库。Conda 不仅可以管理包,还可以创建独立的虚拟环境[^1]。而 pip 则是 Python 官方推荐的包管理工具。 尽管二者都可以用来安装管理软件包,但它们的工作方式有所不同: - **Conda** 使用自己的仓库来查找并安装依赖项,能够处理更广泛的二进制文件,因此更适合于跨平台管理复杂依赖关系。 - **Pip**, 另一方面, 主要是针对纯Python项目的分发安装,并且通常只支持通过PyPI (Python Package Index) 来获取资源[^2]。 当同时存在这两个工具时,在同一个环境中混合使用可能会引起冲突或者不兼容的情况发生。为了防止此类问题出现,建议优先考虑使用其中一个作为主要包管理者[^3]。 ### 解决Anacondapip之间的安装问题 如果决定继续沿用现有的配置即同时保留 anaconda pip 功能的话,请遵循以下原则操作以减少潜在风险: #### 配置镜像加速 由于网络原因可能导致国外官方源速度较慢甚至无法访问,可以通过更改国内镜像站点提高下载效率。例如清华大学开源软件镜像站提供了稳定可靠的 anaconda pypi 源服务[^4]: ```bash # 对于 conda 添加清华 TUNA 镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes # 设置 pip 使用中科大 PyPI 镜像 pip install pip -U pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple ``` 上述命令会修改用户的 `.condarc` 文件以及 `pip.conf`(Linux/macOS)/`pip.ini`(Windows),从而实现长期生效的效果[^5]。 #### 创建隔离开发空间 无论采用哪种方式进行项目构建都应先建立专属工作区以免干扰全局系统或其他已有工程结构。利用 conda 提供的功能可轻松完成此目标: ```bash # 建立名为 myenv 的新 python 版本为 3.x 的环境 conda create -n myenv python=3.x # 启动指定名称的空间 conda activate myenv # 卸载当前环境下所有非必要组件保持精简状态 conda remove --all -n other_env_name ``` 一旦进入特定区域后就可以放心大胆地调用对应版本下的 pip 或者 conda 执行后续动作了。 ### 结论 综上所述,虽然理论上允许在一个地方既运用到 conda 又涉及到了 pip ,但从长远来看还是应该尽量避免这种做法以防万一引发不必要的麻烦事端。最好的办法就是按照实际需求选取合适的方案单独执行下去即可获得最佳体验效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值