日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發(fā)布時間:2025/3/20 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

平時做開發(fā)時最煩人的除了項目不會做,恐怕就是環(huán)境依賴的問題了吧。

一個好好的項目,換個環(huán)境總是出問題,開源庫一升級就掛掉,總有“壞人”搞掉自己的系統(tǒng)庫,今天就來隨便聊聊吧。

作者 | 言有三

編輯 |?言有三

如今開源生態(tài)甚好,享受著便利的同時自然也要承擔(dān)一些煩惱,每一個開發(fā)人員都遇到過各種各樣的庫的問題,通常都跟版本有關(guān),軟硬件的都有,今天有三來隨便聊聊怎么應(yīng)對,僅僅只是個人習(xí)慣。

這里不是說bug噢,而是聚焦于版本依賴。

以深度學(xué)習(xí)方向為例,我們通常面對的就是Linux,Python相關(guān)的一系列深度學(xué)習(xí)開源庫。

1 了解現(xiàn)狀:有哪些煩人的小妖精?

總有那么幾個庫,三天兩天出問題。

1、NumPy

對于搞深度學(xué)習(xí)的人來說,bug出鏡率最高的,很有可能就是它了,因為不同的開源框架,甚至是開源框架的不同版本,依賴的NumPy很有可能都不一樣。

Numpy是不得不用的python科學(xué)計算基礎(chǔ)庫,被幾乎所有的深度學(xué)習(xí)框架依賴,目前版本已經(jīng)到1.6。


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

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

沒個GPU恐怕深度學(xué)習(xí)是搞不起來的,而NVIDIA GPU和CUDA現(xiàn)在又是綁定的軟硬件,CUDA有不少版本了,最新的已經(jīng)是CUDA Toolkit 10.1了,而筆者的筆記本上用的還是CUDA 8.0,所以tensorflow用不了高于1.4版本。一個版本的CUDA匹配一個版本的CuDNN,具體可以查官網(wǎng)。


Tips:CUDA/CuDNN出問題,基本上也是版本問題,比如下面的這個,CUDA版本太低,tensorflow框架報錯的問題。

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

由于CUDA已經(jīng)是非常底層的硬件庫了,建議沒事就不要動,安裝個9.0吧。

3、Protobuf

Google的protobuf是一種和平臺、語言無關(guān)、輕便高效方便擴展的序列化數(shù)據(jù)結(jié)構(gòu)的協(xié)議,被很多框架使用,比如caffe。

Tips:這位主也是鬧bug的專業(yè)戶,通常還是版本不對,類似于這樣:

.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。

Linux系統(tǒng)自帶的protobuf通常都是2.6.1,而很多的庫卻依賴于高于2.6.1的版本,編譯caffe需要的protoc版本需要2.6或者3.3,所以如果你裝過其他依賴不同的開源庫,很可能不知不覺將其環(huán)境破壞掉了。


這個時候最好的辦法是自己找個目錄另外弄一個,與系統(tǒng)的隔離,讓一些包比如caffe編譯的時候依賴上自己的這個庫,版本的下載在此:

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

2 自建環(huán)境:與別人的環(huán)境和平共處

Linux有什么好?除了安全之外,最大的莫過于帳號管理,大家可以共享一套硬件,一套基本的環(huán)境,卻隔離各自的目錄。


不過對于新手來說,還應(yīng)該學(xué)會一件事,那就是與別人的環(huán)境隔離,就是說用自己的庫,不用別人的,也不讓別人用自己的庫。


關(guān)于哪些庫需要共享,哪些庫不需要共享,我的建議是這樣的(這里說的是有多個人用同一臺服務(wù)器,如果是你一個人,怎么搞開心就好)。

所以意思就是很明顯了,自己裝一套python環(huán)境,自己編譯一些常用的庫放在自己目錄下,比如opencv,protobuf等。這樣的好處有兩個:

1、不是管理員也可以隨意安裝庫了,比如python。擁有管理員權(quán)限有時候很危險的,尤其是在企業(yè),萬一一不小心誤操作搞出點什么幺蛾子,輕則讓大家的工作成果丟失,重則可能要辭職走人,這是一直在上演的故事。

2、可以不用擔(dān)心別人更改系統(tǒng)環(huán)境而對自己造成影響。比如python,很多人用anaconda,就可以不使用系統(tǒng)的python。個人不使用anaconda,而是原生的python環(huán)境,那樣可以完全掌控。

3 使用Docker:快速遷移環(huán)境

自己好不容易讓環(huán)境穩(wěn)定了,為了某個項目臨時更改環(huán)境絕對不是一件很愉快的事情,不僅花費時間,還可能破壞穩(wěn)定的系統(tǒng)。

這個時候,就可以上虛擬機了。關(guān)于虛擬機我們不介紹,而是介紹與之類似的Docker容器,現(xiàn)在運維們部署環(huán)境很多都是用Docker技術(shù),我們這里還是針對個人用戶。

相比虛擬機,我更推薦使用Docker,一,Docker容器上的程序,直接使用物理機的硬件資源,cpu、內(nèi)存等利用率上有很大的優(yōu)勢。二,Docker鏡像方便傳播,使用別人的環(huán)境,找到提供好的Docker文件自動配置就行了。

如果真的需要在一個電腦上配置各種有沖突的環(huán)境,那就用Docker吧。

關(guān)于Docker技術(shù)本身這里就不做介紹,我們需要知道的是,它跟虛擬機差不多。

你可以將整個服務(wù)器的環(huán)境配置打包成一個文件隨處帶走,然后換一臺電腦運行,這樣兩臺電腦的環(huán)境都不會受到影響,直觀理解就是這樣,這也是兩種我自己的用法。

要用docker當然首先要安裝,官網(wǎng)地址如下:

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

(1) 以ubuntu16.04為例,首先要安裝Docker命令,如果沒有安裝成功,可能是命令問題,去官網(wǎng)查看最新安裝方法。或者是電腦配置太低,不支持。

//清除舊版本

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。因為我們就是為了跑深度學(xué)習(xí)項目,所以以后運行容器就從nvidia-docker開始run,不要再用docker命令run,那樣沒有GPU環(huán)境。

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#測試安裝是否成功

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

運行一個docker:

nvidia-docker run –it my_ubuntu bash

如果run添加—rm選項,則是不運行后臺模式,exit退出時,容器就會退出


導(dǎo)入鏡像:

sudo nvidia-docker load --input my_ubuntu.tar?

導(dǎo)出鏡像:

docker save –o my_ubuntu.tar?

ubuntu_momo_multimedia

(4) 掛載本機目錄方便訓(xùn)練,這樣就不用將數(shù)據(jù)放到容器中了。

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

/home/longpeng為本機目錄, /home/longpeng-outer為掛載后的目錄

(5) 定制版本,保存本次的環(huán)境,還可以進行導(dǎo)出。

nvidia-docker commit ID user-version ? 提交版本,不推薦使用該方式導(dǎo)出定制鏡像,會出現(xiàn)超級大的包,有定制需求可使用dockerfile!

nvidia-docker run –it user-version bash 再次登錄,與上次不同的就是版本號

(6) 自定義鏡像/Dockerfile撰寫,如果在當前目錄下有一個編寫正確的Dockerfile文件,就可以用docker build -t命令生成包進行發(fā)布了。

一般來說,如果這個系統(tǒng)安裝的庫都可以通過http協(xié)議下載,對外發(fā)布直接用這個dockerfile就可以了。但是有的時候,某些庫只能離線加載配置,比如Matlab,無法在線用命令一鍵安裝完,就可以發(fā)布真正的離線包。

如下就是在當前目錄發(fā)布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權(quán)限。可以看到在這里我們安裝了numpy,cmake,編譯了opencv,基本上就跟在平常的Linux環(huán)境下工作是一樣的。

4 應(yīng)對環(huán)境依賴的一些小情緒

大家改bug也是一步一步在實戰(zhàn)中增強經(jīng)驗的,誰也不是一開始就能心平氣和地接受,從小白走到大師兄的段位,心態(tài)也自然會有一些變化。

純凈的小白,好不容易找到了一個開源項目開始跑起來了,一跑之后發(fā)現(xiàn)沒有出結(jié)果,只好干著急等人來解決。


成長為少年郎之后,就開始各種百度什么的搜索匹配答案,找到了便是萬事皆休,找不到就接著找。


到了有識青年后,打開Google上去stack overflow就是一把梭,尋找點贊數(shù)最高的,有時候還翻翻github issues等地方。


到了大師兄級別,一眼就洞穿真相不需要瀏覽器,可能還會動起改改這個項目的心思。

不知道你現(xiàn)在的心態(tài)怎么樣了,畢竟依賴的問題可能是一輩子的事啊。

總結(jié)

萬事皆有利弊,享受著開源項目帶來的便利,也要忍受它帶來的麻煩,希望大家都能盡快成為游刃有余的高手,提高工作效率。

本周直播

今日小問題

轉(zhuǎn)載文章請后臺聯(lián)系

侵權(quán)必究

更多精彩內(nèi)容請關(guān)注知乎專欄《有三AI學(xué)院》

往期精選

  • 創(chuàng)業(yè)第一天,有三AI扔出了深度學(xué)習(xí)的150多篇文章和10多個專欄

  • 【雜談】如何學(xué)會看arxiv.org才能不錯過自己研究領(lǐng)域的最新論文?

  • 【雜談】AI工業(yè)界都有哪些值得參加的比賽?

  • 【雜談】為什么你學(xué)了AI,企業(yè)卻不要你

  • 【雜談】那些酷炫的深度學(xué)習(xí)網(wǎng)絡(luò)圖怎么畫出來的?

  • 【雜談】深度學(xué)習(xí)必備,各路免費爬蟲一舉拿下

  • 【雜談】從GitHub上星星最多的男人開始發(fā)GitHub綜述資料

  • 【雜談】提升寫代碼效率不得不做的三件事

  • 【雜談】三人行必有AI,你會在其一嗎?

  • 【雜談】想成為機器學(xué)習(xí)學(xué)霸?先學(xué)會做筆記吧

  • 【雜談】天下苦公眾號久矣,如何利用這幾類公眾號進行深度學(xué)習(xí)?

  • 【雜談】扒一扒Reddit,Medium,Quora與知乎等國內(nèi)外高質(zhì)量AI社區(qū)與內(nèi)容平臺

  • 【雜談】白身,初識,不惑,有識,不可知,你處于深度學(xué)習(xí)工程師哪一重境界了

總結(jié)

以上是生活随笔為你收集整理的【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。