【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?

别再手动翻译PDF了!手把手教你用Zotero PDF Translate插件搞定外文文献(附最新GitHub下载链接) 本文详细介绍如何利用Zotero PDF Translate插件高效翻译外文文献,包括插件安装、配置及多引擎对比。通过划词翻译、段落翻译和全文翻译功能,显著提升科研工作效率,特别适合处理大量英文PDF文献的研究人员。 阅读详情

平时做开发时最烦人的除了项目不会做,恐怕就是环境依赖的问题了吧。

一个好好的项目,换个环境总是出问题,开源库一升级就挂掉,总有“坏人”搞掉自己的系统库,今天就来随便聊聊吧。

作者 | 言有三

编辑 | 言有三

640?wx_fmt=png

如今开源生态甚好,享受着便利的同时自然也要承担一些烦恼,每一个开发人员都遇到过各种各样的库的问题,通常都跟版本有关,软硬件的都有,今天有三来随便聊聊怎么应对,仅仅只是个人习惯。

这里不是说bug噢,而是聚焦于版本依赖。

以深度学习方向为例,我们通常面对的就是Linux,Python相关的一系列深度学习开源库。

1 了解现状:有哪些烦人的小妖精 

总有那么几个库,三天两天出问题。

1、NumPy

640?wx_fmt=png

对于搞深度学习的人来说,bug出镜率最高的,很有可能就是它了,因为不同的开源框架,甚至是开源框架的不同版本,依赖的NumPy很有可能都不一样。

Numpy是不得不用的python科学计算基础库,被几乎所有的深度学习框架依赖,目前版本已经到1.6。


Tips:Numpy出问题,基本上就是版本问题,框架未必支持最新版,比如如下我遇到的tensorflow的问题。

640?wx_fmt=png

tensorflow 1.10.0 has requirement numpy<=1.14.5,>=1.13.3, but you'll have numpy 1.16.2 which is incompatible.

mxnet 1.4.0 has requirement numpy<1.15.0,>=1.8.2, but you'll have numpy 1.16.2 which is incompatible.

解决方案就是不要用pip install numpy这样的方式安装最新版,而是加上版本号安装框架支持的版本,比如pip install -U numpy==1.14.1之类的。

2、CUDA/CuDNN

640?wx_fmt=jpeg

没个GPU恐怕深度学习是搞不起来的,而NVIDIA GPU和CUDA现在又是绑定的软硬件,CUDA有不少版本了,最新的已经是CUDA Toolkit 10.1了,而笔者的笔记本上用的还是CUDA 8.0,所以tensorflow用不了高于1.4版本。一个版本的CUDA匹配一个版本的CuDNN,具体可以查官网。


Tips:CUDA/CuDNN出问题,基本上也是版本问题,比如下面的这个,CUDA版本太低,tensorflow框架报错的问题。

libcudart.so.9.0: cannot open shared object file: No such file or directory

由于CUDA已经是非常底层的硬件库了,建议没事就不要动,安装个9.0吧。

3、Protobuf

640?wx_fmt=png

Google的protobuf是一种和平台、语言无关、轻便高效方便扩展的序列化数据结构的协议,被很多框架使用,比如caffe。

Tips:这位主也是闹bug的专业户,通常还是版本不对,类似于这样:

.build_release/src/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer headers.  Please update your headers.

这里我们要注意,说的是c版本的protobuf,就是可以运行protoc命令的,查看自己的版本很容易,protobuf --version。

640?wx_fmt=png

Linux系统自带的protobuf通常都是2.6.1,而很多的库却依赖于高于2.6.1的版本,编译caffe需要的protoc版本需要2.6或者3.3,所以如果你装过其他依赖不同的开源库,很可能不知不觉将其环境破坏掉了。


这个时候最好的办法是自己找个目录另外弄一个,与系统的隔离,让一些包比如caffe编译的时候依赖上自己的这个库,版本的下载在此:

https://github.com/protocolbuffers/protobuf/releases

2 自建环境:与别人的环境和平共处

Linux有什么好?除了安全之外,最大的莫过于帐号管理,大家可以共享一套硬件,一套基本的环境,却隔离各自的目录。


不过对于新手来说,还应该学会一件事,那就是与别人的环境隔离,就是说用自己的库,不用别人的,也不让别人用自己的库。


关于哪些库需要共享,哪些库不需要共享,我的建议是这样的(这里说的是有多个人用同一台服务器,如果是你一个人,怎么搞开心就好)。

640?wx_fmt=png

所以意思就是很明显了,自己装一套python环境,自己编译一些常用的库放在自己目录下,比如opencv,protobuf等。这样的好处有两个:

1、不是管理员也可以随意安装库了,比如python。拥有管理员权限有时候很危险的,尤其是在企业,万一一不小心误操作搞出点什么幺蛾子,轻则让大家的工作成果丢失,重则可能要辞职走人,这是一直在上演的故事。

2、可以不用担心别人更改系统环境而对自己造成影响。比如python,很多人用anaconda,就可以不使用系统的python。个人不使用anaconda,而是原生的python环境,那样可以完全掌控。

3 使用Docker:快速迁移环境

640?wx_fmt=png

自己好不容易让环境稳定了,为了某个项目临时更改环境绝对不是一件很愉快的事情,不仅花费时间,还可能破坏稳定的系统。

这个时候,就可以上虚拟机了。关于虚拟机我们不介绍,而是介绍与之类似的Docker容器,现在运维们部署环境很多都是用Docker技术,我们这里还是针对个人用户。

相比虚拟机,我更推荐使用Docker,一,Docker容器上的程序,直接使用物理机的硬件资源,cpu、内存等利用率上有很大的优势。二,Docker镜像方便传播,使用别人的环境,找到提供好的Docker文件自动配置就行了。

如果真的需要在一个电脑上配置各种有冲突的环境,那就用Docker吧。

关于Docker技术本身这里就不做介绍,我们需要知道的是,它跟虚拟机差不多。

你可以将整个服务器的环境配置打包成一个文件随处带走,然后换一台电脑运行,这样两台电脑的环境都不会受到影响,直观理解就是这样,这也是两种我自己的用法。

640?wx_fmt=png

640?wx_fmt=jpeg

要用docker当然首先要安装,官网地址如下:

https://docs.docker.com/install/linux/docker-ce/ubuntu/

(1) 以ubuntu16.04为例,首先要安装Docker命令,如果没有安装成功,可能是命令问题,去官网查看最新安装方法。或者是电脑配置太低,不支持。

//清除旧版本

sudo apt-get remove docker docker-engine

sudo apt-get update

 

sudo apt-get install \

linux-image-extra-$(uname -r) \

linux-image-extra-virtual

 

//添加repository 

sudo apt-get install \

apt-transport-https \

ca-certificates \

curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \

"deb [arch=amd64] https://download.docker.com/linux/ubuntu \

   $(lsb_release -cs) \

   stable"

 

//安装最新版本

sudo apt-get update

sudo apt-get install docker-ce   

//检查安装情况

sudo docker run hello-world

(2) 要使用显卡,必须安装NVIDIA Docker。因为我们就是为了跑深度学习项目,所以以后运行容器就从nvidia-docker开始run,不要再用docker命令run,那样没有GPU环境。

wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb

sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

nvidia-docker run --rm nvidia/cuda nvidia-smi#测试安装是否成功

640?wx_fmt=jpeg

(3) 有了docker之后就可以使用或者制作自己的镜像了。

运行一个docker:

nvidia-docker run –it my_ubuntu bash

如果run添加—rm选项,则是不运行后台模式,exit退出时,容器就会退出


导入镜像:

sudo nvidia-docker load --input my_ubuntu.tar 

导出镜像:

docker save –o my_ubuntu.tar 

ubuntu_momo_multimedia

(4) 挂载本机目录方便训练,这样就不用将数据放到容器中了。

nvidia-docker run –it –v /home/longpeng:/home/longpeng-outer nvidia/cuda bash

/home/longpeng为本机目录, /home/longpeng-outer为挂载后的目录

(5) 定制版本,保存本次的环境,还可以进行导出。

nvidia-docker commit ID user-version   提交版本,不推荐使用该方式导出定制镜像,会出现超级大的包,有定制需求可使用dockerfile!

nvidia-docker run –it user-version bash 再次登录,与上次不同的就是版本号

(6) 自定义镜像/Dockerfile撰写,如果在当前目录下有一个编写正确的Dockerfile文件,就可以用docker build -t命令生成包进行发布了。

一般来说,如果这个系统安装的库都可以通过http协议下载,对外发布直接用这个dockerfile就可以了。但是有的时候,某些库只能离线加载配置,比如Matlab,无法在线用命令一键安装完,就可以发布真正的离线包。

如下就是在当前目录发布ubuntu:v3离线包,有了包以后,别人就可以加载使用。

docker build -t ubuntu:v3 .

一个格式正确的dockerfile文件通常如下:

FROM longpeng-docker_opencv3

LABEL maintainer " <zilizi_qiang@126.com>"

RUN apt-get install -y cmake \

  && pip3 install numpy \

  && cd / \

  && git clone https://github.com/Itseez/opencv.git \

  && cd opencv \

  #&& git checkout 3.2.0 \

  #&& cd ~ \

  #&& git clone https://github.com/Itseez/opencv_contrib.git \

  #&& cd opencv_contrib \

  #&& git checkout 3.2.0 \

  #&& cd ~/opencv \

  && mkdir build \

  && cd build \

  && cmake -D CMAKE_BUILD_TYPE=RELEASE \

-D CMAKE_INSTALL_PREFIX=/usr/local \

-D INSTALL_C_EXAMPLES=ON \

-D INSTALL_PYTHON_EXAMPLES=ON \

-D OPENCV_EXTRA_MODULES_PATH=/opencv_contrib/modules \

-D BUILD_EXAMPLES=ON .. \

  && make -j4 \

  && make install \

  && cd / \

  && rm -rf opencv \ 

  && rm -rf opencv_contrib \

FROM就是从一个已有的镜像开始。

RUN后面就接着要跑的命令,不需要用sudo,因为docker中默认就是root权限。可以看到在这里我们安装了numpy,cmake,编译了opencv,基本上就跟在平常的Linux环境下工作是一样的。

4 应对环境依赖的一些小情绪

大家改bug也是一步一步在实战中增强经验的,谁也不是一开始就能心平气和地接受,从小白走到大师兄的段位,心态也自然会有一些变化。

640?wx_fmt=png

纯净的小白,好不容易找到了一个开源项目开始跑起来了,一跑之后发现没有出结果,只好干着急等人来解决。


成长为少年郎之后,就开始各种百度什么的搜索匹配答案,找到了便是万事皆休,找不到就接着找。


到了有识青年后,打开Google上去stack overflow就是一把梭,寻找点赞数最高的,有时候还翻翻github issues等地方。


到了大师兄级别,一眼就洞穿真相不需要浏览器,可能还会动起改改这个项目的心思。

不知道你现在的心态怎么样了,毕竟依赖的问题可能是一辈子的事啊。

总结

万事皆有利弊,享受着开源项目带来的便利,也要忍受它带来的麻烦,希望大家都能尽快成为游刃有余的高手,提高工作效率。

本周直播

640?wx_fmt=png

今日小问题

640?wx_fmt=png

转载文章请后台联系

侵权必究

更多精彩内容请关注知乎专栏《有三AI学院》

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

往期精选

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置) 本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。 阅读详情

相关推荐

【Linux】U盘配置Ubuntu系统 ——(Win10+Ubuntu20.04)双系统安装教程

Ubuntu系统安装

WS_Change的博客 4337

mxnet版本与numpy,requests等都不兼容问题

跟着李沐学AI时遇到的mxnet环境问题。

zwx54088的博客 5016

Qt中常见的面试题总结

基于Qt开发的一些常用面试题

一名热爱编程的程序员 8493

开源依赖管理的最佳实践

开源软件无处不在。无论是哪个行业,每个企业都依赖软件来满足其业务需求。企业构建和使用的大多数应用程序在其代码中都包含开源元素。近几年软件行业逐渐迁移到云上,并且随着应用程序复杂性的增加,软件安全风险也随之增加。企业需要在其软件开发生命周期(SLDC)中实施开源依赖管理最佳实践,并选择正确的工具来管理其开源风险。对开发人员进行开源安全培训和实现功能强大的软件成分分析(SCA)工具都是保护代码免受开源软件风险的关键步骤。

分享 GPU 管理与大模型推理相关技术实践 715

基于 WebGoat 平台的 SQL 注入攻击

基于 WebGoat 平台的 SQL 注入攻击

Labulongdong的博客 3524

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 946

numpy 版本改换

今天为了将mxnet框架转为tensorflow 框架,参考了下面帖子来操作一下 pip install mmdnn 装好后,页面有提示,就先忽略掉了 mxnet-cu100 1.4.1 has requirement numpy<1.15.0,>=1.8.2, but you'll have numpy 1.16.4 which is incompatible. mxnet-...

shuijinghua的博客 2万+

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

3056

Tensorflow——更新到1.12.0报错处理(用安装指定版本命令装回以前的)

博主因需要安装skimage,使用了命令: pip install -U --ignore-installed scikit-image 在安装的时候发现如下一行内容: tensorflow 1.10.0 has requirement numpy&amp;amp;lt;=1.14.5,&amp;amp;gt;=1.13.3, but you'll have numpy 1.16.0 which is incompatible...

umbrellalalalala的博客 9146

Token 费用爆炸?教你用 Semantic Cache(语义缓存)把 API 成本降低 80%

本文介绍了语义缓存(Semantic Cache)技术在大模型应用中的关键作用。传统Redis缓存基于精确匹配,无法处理用户提问的语义相似性,导致重复调用昂贵的LLM API。语义缓存通过将问题向量化并在向量空间中进行相似度匹配,可识别30%-50%的重复提问,直接返回历史答案。文章详细解析了技术原理(Embedding+向量搜索)、架构设计,并提供了基于Python和ChromaDB的50行核心实现代码。同时指出了生产环境中的三大挑战:阈值设定、隐私保护和多轮对话处理,并给出相应解决方案。该技术能以极低成

BUG猿的博客 1056

【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解

AI赋能,使用DeepSeek 高效制作PPT实战详解

congge 1万+

numpy python 兼容_tensorflow与numpy的版本兼容性问题

在Python交互式窗口导入tensorflow出现了下面的错误:root@ubuntu:~# python3Python 3.6.8 (default, Oct 7 2019, 12:59:55)[GCC 8.3.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>&g...

weixin_39761822的博客 1239

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1515

ubuntu cuda版本查询_【杂谈】如何应对烦人的开源库版本依赖做一个心平气和的程序员?...

平时做开发时最烦人的除了项目不会做,恐怕就是环境依赖的问题了吧。一个好好的项目,换个环境总是出问题,开源库一升级就挂掉,总有“坏人”搞掉自己的系统库,今天就来随便聊聊吧。作者 | 言有三编辑 |言有三如今开源生态甚好,享受着便利的同时自然也要承担一些烦恼,每一个开发人员都遇到过各种各样的库的问题,通常都跟版本有关,软硬件的都有,今天有三来随便聊聊怎么应对,仅仅只是个人习惯。这里不是说b...

weixin_39845206的博客 87

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ubuntu cuda版本查询_「杂谈」如何应对烦人的开源库版本依赖-做个心平气和的程序员?...

平时做开发时最烦人的除了项目不会做,恐怕就是环境依赖的问题了吧。一个好好的项目,换个环境总是出问题,开源库一升级就挂掉,总有“坏人”搞掉自己的系统库,今天就来随便聊聊吧。作者 | 言有三编辑 | 言有三如今开源生态甚好,享受着便利的同时自然也要承担一些烦恼,每一个开发人员都遇到过各种各样的库的问题,通常都跟版本有关,软硬件的都有,今天有三来随便聊聊怎么应对,仅仅只是个人习惯。这里不是说bug噢,而...

weixin_39858132的博客 173

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【杂谈】梦想与饼干,AI是你的谁?

这是我加入有三AI后与大家的第7次见面了,那今天就正式介绍一下我自己,也跟大家聊聊我眼中的AI。作者 | 孙叔桥编辑 | 言有三1、入坑计算机视觉与其说是我选择了从事计算...

hacker_long的专栏 654

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【完结】优秀的深度学习从业者都有哪些优秀的习惯

文/编辑 | 言有三 这是一篇总结文,说说优秀的深度学习从业者拥有的一些习惯,从看论文到写代码,从刷论坛到刷比赛。 1 拥有一台GPU 虽然各类深度学习框架caffe,tensorflow等都是可以支持CPU的,但是如果没有一台GPU,学深度学习始终只能做一个看客。 笔者工作四年,几乎每天背着一台移动GPU,是神舟的一台游戏本,加上书包约20斤左右。有一台移动GPU,不仅方便...

hacker_long的专栏 832

新手如何使用有三AI系统性跟读AI领域的论文

文/编辑 | 言有三不管是从事AI领域的研究还是开发,读论文总是免不了的,那么新手如何阅读相关的论文呢,下面来介绍一下有三AI的《每周读论文板块》。1 每周读论文板块是啥...

hacker_long的专栏 686

docker下配置EfficientLO

上对EfficientLO配置为CUDA 9.0。

m0_63629923的博客 247

tensorflow 报告 warning FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated

最近每次启动tensorflow总是报告一堆warning,没有什么影响,但是看着烦人。 它的问题根本是numpy的版本和tensorflow不匹配导致的。 C:\Users\Joy9\MyPythonWork>python Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (...

net_wolf的专栏 923

tensorflow与高版本numpy不兼容的问题

下载tensorflow: pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple/ 执行 import tensorflow as tf 会提示 ~/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type

Tang_Zhe的博客 2万+

tensorflow1.14和numpy版本对应

tensorflow是1.14.0版本。应该使用pip uninstall numpy卸载所有的numpy,再安装1.16.4即可

zzyzxb的博客 6219

tensorflow与numpy的版本兼容性问题

在Python交互式窗口导入tensorflow出现了下面的错误: root@ubuntu:~# python3 Python 3.6.8 (default, Oct 7 2019, 12:59:55) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information...

Youpeng 2万+

安装mxnet jupyter notebook过程中遇到的错误

enviroment.yml 文件内容: name: gluon dependencies: - python&amp;amp;gt;=3.6 - jupyter=1.0.0 - matplotlib=2.2.2 - pandas=0.23.2 - pip: - requests==2.18.4 - mxnet-cu80 conda env create -f enviroment.yml &amp;amp;...

风中落泪的花 4970

ERROR: paddlepaddle 1.6.3 has requirement numpy =1.16.4, =1.12, but you ll have numpy 1.19.0 which i

ERROR: paddlepaddle 1.6.3 has requirement numpy<=1.16.4,>=1.12, but you'll have numpy 1.19.0 which is incompatible. 小伙伴们,安装paddlepaddle时,看看是不是这个Error,就是说咱们的版本是1.19.0,paddlepaddle需要的numpy版本上限是1.16.4,故而不兼容 再执行一次安装就行: pip install paddlepaddle==1.6.3 -

先说一下,就简单地写点儿氵文,不是博客,只是我的笔记本/工具书 5083

Mac搭建TensorFlow环境踩过的那些坑

安装tensorflow时,输入Pip install tensorflow后出现错误提示,其中红色提示文字:matplotlib 1.3.1 requires nose,which is not installed.matplotlib 1.3.1 requires tornado,,which is not installed.matplotlib 1.3.1 has requirement ...

简言 5289
上一篇: 【图像分割模型】感受野与分辨率的控制术—空洞卷积
下一篇: 【AI-1000问】segmentation和matting有什么区别?
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值