Python机器学习库是如何打包并安装的
off999 2024-09-18 22:31 43 浏览 0 评论
尽管依赖问题非常棘手,但明白包管理以及包编译安装原理有助于我们深刻理解计算机基本原理,避免成为一个调包侠。
最近在一台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核心库。它的架构图如下所示:
上图中,最底层是硬件,包括了网络和计算设备,这里先只关注计算设备。由于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安装包主要基于下面的版本进行构建的。
到底什么是包
广义上来讲,包(Package)其实就是一个软件集合,安装完包之后,我们就可以使用包里的软件了。Windows上缺少包的概念,类Unix系统一般使用包管理软件(Package Manager)来管理和安装软件,我们在手机上常用的应用商店其实就是一个包管理软件。软件发布者将编译好的软件发布到包管理仓库(Repository,简称Repo),用户通过包管理软件来下载和安装,只不过类Unix系统一般使用命令行来安装这些软件。
常见的包管理有:
- 在操作系统上安装软件:Ubuntu的apt、CentOS的yum、macOS的homebrew
- 在编程语言中安装别人开发的库:Python的pip、Ruby的Gem
- 包管理软件有对应的Repo:pip的PyPI,conda的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是另外一个被广泛应用的工具,它:
- 它从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结合起来,并且要善于创建不同的环境,每个环境处理某些具体的计算任务,以免环境里的各类包越来越臃肿,造成依赖冲突。
机器学习库安装方法
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在内的依赖包:
LightGBM
相比TensorFlow,LightGBM尽管也在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包:
- Docker
- conda
- pip
- 源码安装
尽管依赖问题非常棘手,但明白包管理以及包编译安装原理有助于我们深刻理解计算机基本原理,避免成为一个调包侠。
相关推荐
- 电脑总自动关机怎么解决(电脑总自动关机怎么办)
-
1、主机散热不良,这是最常见的一种,主要表现为:电脑声音不正常,如风扇转动的声音;主板等配件上有烧焦的痕迹或者闻一闻有烧焦的气味;cpu等主要元器件的温度,如cpu的温度过高等。2、病毒木马的...
- win7激活必须联网吗(win7激活要钱吗)
-
Windows操作系统在安装之后,需要激活才能正常使用。如果没有联网的情况下安装Windows操作系统,可以通过以下两种方法进行激活:1.电话激活:在Windows安装界面选择“电话激活”选项进行激活...
- 有必要买移动硬盘吗
-
1、虽然可以,但是不合算也不适合。 2、固态硬盘相对机械硬盘而言,胜出的是性能,软肋是寿命。 3、目前的硬盘盒大都是USB接口,成了固态硬盘的瓶颈,限制了固态硬盘性能的发挥。而固态硬盘最致命的...
- 移动宽带路由器怎么设置(移动宽带路由器怎么设置桥接模式)
-
1.结论:移动路由器设置过程包括SIM卡安装、路由器连接WiFi和设备、路由器管理界面设置等步骤。2.深入分析:(1)SIM卡安装1确认您购买的移动路由器支持的SIM卡规格,如果未知请咨询销售...
- 笔记本cpu天梯图全系列(笔记本cpu天梯图2020年最新版)
-
麒麟9000>>麒麟9000e>麒麟990>麒麟990e>麒麟980>麒麟985>麒麟820>麒麟820e>麒麟810>麒麟970>麒麟960>麒麟710>大于麒麟710a>麒麟950>麒麟955>...
- 怎么查询家里wifi密码(怎么查询家里wifi密码是多少)
-
一、通过已连接wifi的电脑查看1、找到电脑右下角的无线网图标,就是类似信号的图标,点开;2、然后右键自己的wifi名称,选择“属性”;3、进去之后勾选“显示字符”,然后就可以看见密码框的密码以数字显...
- 分区工具diskgenius怎么合并分区
-
DiskGenius是一款功能全面的磁盘管理工具,其可以帮助我们进行磁盘分区管理,包括创建新分区、删除分区、扩展分区等。如果您想要合并分区到C盘,可以按照以下步骤进行操作:1.打开DiskGeniu...
- windows10易升怎么用(微软windows10易升使用教程)
-
windows10易升是微软官方的。windows10易升是微软官方发布的升级助理或者叫升级助手(官方下载),帮助你升级到win10最新版本,同时也帮助Win7Win8.1用户升级到Windows1...
- 300兆光纤买什么路由器(300兆光纤买3000m的路由器有用吗)
-
对于300Mbps的网速,推荐选择支持AC750及以上的路由器型号。比如TP-LinkArcherC20、D-LinkDIR-816、NetgearR6020等,都是性价比不错的选择。此类路由...
- windows10产品密钥查询(查看windows10产品密钥)
-
要查看电脑上Windows10的产品密钥,你可以按照以下步骤进行操作:打开“开始”菜单,然后点击“设置”图标(齿轮状图标)。在“设置”窗口中,点击“更新和安全”选项。在左侧导航栏中,选择“激活”选项...
- 电脑总死机卡住不动怎么办(电脑老是死机卡住)
-
如果你的电脑经常卡死,而且只能强制关机,别忘了说明电脑这个配置不够造成的,你需要提高一下它的配置,比如说加一个内存条或者换一个固态硬盘,这样才能够正常运行,不然的话这种电脑是没有办法使用的,现在电脑都...
- win10自动修复死循环无法开机
-
答:1、请确保电脑有充足的电源供应,确保电源可以正常供电;2、检查U盘是否正常安装;3、检查是否有新的软硬件设备接入;4、运行chkdsk,检查硬盘并修复文件系统;5、检查Windows更新,如果存在...
-
- 查看台式电脑ip地址(查询台式电脑ip地址)
-
如何查看主机名和IP地址:右击我的电脑-属性-网络标识(win2000)/计算机名(winxp)-完整的计算机名称后面的就是你的主机名.右击网上邻居-,属性-右击本地连接-属性-双击INTERNET协议(tcp/ip)就可以看到自己的I...
-
2025-12-15 19:03 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
