【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?
平時做開發(fā)時最煩人的除了項(xiàng)目不會做,恐怕就是環(huán)境依賴的問題了吧。
一個好好的項(xiàng)目,換個環(huán)境總是出問題,開源庫一升級就掛掉,總有“壞人”搞掉自己的系統(tǒng)庫,今天就來隨便聊聊吧。
作者 | 言有三
編輯 |?言有三
如今開源生態(tài)甚好,享受著便利的同時自然也要承擔(dān)一些煩惱,每一個開發(fā)人員都遇到過各種各樣的庫的問題,通常都跟版本有關(guān),軟硬件的都有,今天有三來隨便聊聊怎么應(yīng)對,僅僅只是個人習(xí)慣。
這里不是說bug噢,而是聚焦于版本依賴。
以深度學(xué)習(xí)方向?yàn)槔?#xff0c;我們通常面對的就是Linux,Python相關(guān)的一系列深度學(xué)習(xí)開源庫。
1 了解現(xiàn)狀:有哪些煩人的小妖精?
總有那么幾個庫,三天兩天出問題。
1、NumPy
對于搞深度學(xué)習(xí)的人來說,bug出鏡率最高的,很有可能就是它了,因?yàn)椴煌拈_源框架,甚至是開源框架的不同版本,依賴的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)、輕便高效方便擴(kuò)展的序列化數(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,就是可以運(yùn)行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è),萬一一不小心誤操作搞出點(diǎn)什么幺蛾子,輕則讓大家的工作成果丟失,重則可能要辭職走人,這是一直在上演的故事。
2、可以不用擔(dān)心別人更改系統(tǒng)環(huán)境而對自己造成影響。比如python,很多人用anaconda,就可以不使用系統(tǒng)的python。個人不使用anaconda,而是原生的python環(huán)境,那樣可以完全掌控。
3 使用Docker:快速遷移環(huán)境
自己好不容易讓環(huán)境穩(wěn)定了,為了某個項(xiàng)目臨時更改環(huán)境絕對不是一件很愉快的事情,不僅花費(fèi)時間,還可能破壞穩(wěn)定的系統(tǒng)。
這個時候,就可以上虛擬機(jī)了。關(guān)于虛擬機(jī)我們不介紹,而是介紹與之類似的Docker容器,現(xiàn)在運(yùn)維們部署環(huán)境很多都是用Docker技術(shù),我們這里還是針對個人用戶。
相比虛擬機(jī),我更推薦使用Docker,一,Docker容器上的程序,直接使用物理機(jī)的硬件資源,cpu、內(nèi)存等利用率上有很大的優(yōu)勢。二,Docker鏡像方便傳播,使用別人的環(huán)境,找到提供好的Docker文件自動配置就行了。
如果真的需要在一個電腦上配置各種有沖突的環(huán)境,那就用Docker吧。
關(guān)于Docker技術(shù)本身這里就不做介紹,我們需要知道的是,它跟虛擬機(jī)差不多。
你可以將整個服務(wù)器的環(huán)境配置打包成一個文件隨處帶走,然后換一臺電腦運(yùn)行,這樣兩臺電腦的環(huán)境都不會受到影響,直觀理解就是這樣,這也是兩種我自己的用法。
要用docker當(dāng)然首先要安裝,官網(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。因?yàn)槲覀兙褪菫榱伺苌疃葘W(xué)習(xí)項(xiàng)目,所以以后運(yùn)行容器就從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之后就可以使用或者制作自己的鏡像了。
運(yùn)行一個docker:
nvidia-docker run –it my_ubuntu bash
如果run添加—rm選項(xiàng),則是不運(yùn)行后臺模式,exit退出時,容器就會退出
導(dǎo)入鏡像:
sudo nvidia-docker load --input my_ubuntu.tar?
導(dǎo)出鏡像:
docker save –o my_ubuntu.tar?
ubuntu_momo_multimedia
(4) 掛載本機(jī)目錄方便訓(xùn)練,這樣就不用將數(shù)據(jù)放到容器中了。
nvidia-docker run –it –v /home/longpeng:/home/longpeng-outer nvidia/cuda bash
/home/longpeng為本機(jī)目錄, /home/longpeng-outer為掛載后的目錄
(5) 定制版本,保存本次的環(huán)境,還可以進(jìn)行導(dǎo)出。
nvidia-docker commit ID user-version ? 提交版本,不推薦使用該方式導(dǎo)出定制鏡像,會出現(xiàn)超級大的包,有定制需求可使用dockerfile!
nvidia-docker run –it user-version bash 再次登錄,與上次不同的就是版本號
(6) 自定義鏡像/Dockerfile撰寫,如果在當(dāng)前目錄下有一個編寫正確的Dockerfile文件,就可以用docker build -t命令生成包進(jìn)行發(fā)布了。
一般來說,如果這個系統(tǒng)安裝的庫都可以通過http協(xié)議下載,對外發(fā)布直接用這個dockerfile就可以了。但是有的時候,某些庫只能離線加載配置,比如Matlab,無法在線用命令一鍵安裝完,就可以發(fā)布真正的離線包。
如下就是在當(dāng)前目錄發(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,因?yàn)閐ocker中默認(rèn)就是root權(quán)限。可以看到在這里我們安裝了numpy,cmake,編譯了opencv,基本上就跟在平常的Linux環(huán)境下工作是一樣的。
4 應(yīng)對環(huán)境依賴的一些小情緒
大家改bug也是一步一步在實(shí)戰(zhàn)中增強(qiáng)經(jīng)驗(yàn)的,誰也不是一開始就能心平氣和地接受,從小白走到大師兄的段位,心態(tài)也自然會有一些變化。
純凈的小白,好不容易找到了一個開源項(xiàng)目開始跑起來了,一跑之后發(fā)現(xiàn)沒有出結(jié)果,只好干著急等人來解決。
成長為少年郎之后,就開始各種百度什么的搜索匹配答案,找到了便是萬事皆休,找不到就接著找。
到了有識青年后,打開Google上去stack overflow就是一把梭,尋找點(diǎn)贊數(shù)最高的,有時候還翻翻github issues等地方。
到了大師兄級別,一眼就洞穿真相不需要瀏覽器,可能還會動起改改這個項(xiàng)目的心思。
不知道你現(xiàn)在的心態(tài)怎么樣了,畢竟依賴的問題可能是一輩子的事啊。
總結(jié)
萬事皆有利弊,享受著開源項(xiàng)目帶來的便利,也要忍受它帶來的麻煩,希望大家都能盡快成為游刃有余的高手,提高工作效率。
本周直播
今日小問題
轉(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í)必備,各路免費(fèi)爬蟲一舉拿下
【雜談】從GitHub上星星最多的男人開始發(fā)GitHub綜述資料
【雜談】提升寫代碼效率不得不做的三件事
【雜談】三人行必有AI,你會在其一嗎?
【雜談】想成為機(jī)器學(xué)習(xí)學(xué)霸?先學(xué)會做筆記吧
【雜談】天下苦公眾號久矣,如何利用這幾類公眾號進(jìn)行深度學(xué)習(xí)?
【雜談】扒一扒Reddit,Medium,Quora與知乎等國內(nèi)外高質(zhì)量AI社區(qū)與內(nèi)容平臺
【雜談】白身,初識,不惑,有識,不可知,你處于深度學(xué)習(xí)工程師哪一重境界了
總結(jié)
以上是生活随笔為你收集整理的【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图像分割模型】感受野与分辨率的控制术—
- 下一篇: 【完结】优秀的深度学习从业者都有哪些优秀