【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?
平時做開發時最煩人的除了項目不會做,恐怕就是環境依賴的問題了吧。
一個好好的項目,換個環境總是出問題,開源庫一升級就掛掉,總有“壞人”搞掉自己的系統庫,今天就來隨便聊聊吧。
作者 | 言有三
編輯 |?言有三
如今開源生態甚好,享受著便利的同時自然也要承擔一些煩惱,每一個開發人員都遇到過各種各樣的庫的問題,通常都跟版本有關,軟硬件的都有,今天有三來隨便聊聊怎么應對,僅僅只是個人習慣。
這里不是說bug噢,而是聚焦于版本依賴。
以深度學習方向為例,我們通常面對的就是Linux,Python相關的一系列深度學習開源庫。
1 了解現狀:有哪些煩人的小妖精?
總有那么幾個庫,三天兩天出問題。
1、NumPy
對于搞深度學習的人來說,bug出鏡率最高的,很有可能就是它了,因為不同的開源框架,甚至是開源框架的不同版本,依賴的NumPy很有可能都不一樣。
Numpy是不得不用的python科學計算基礎庫,被幾乎所有的深度學習框架依賴,目前版本已經到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恐怕深度學習是搞不起來的,而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
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。
Linux系統自帶的protobuf通常都是2.6.1,而很多的庫卻依賴于高于2.6.1的版本,編譯caffe需要的protoc版本需要2.6或者3.3,所以如果你裝過其他依賴不同的開源庫,很可能不知不覺將其環境破壞掉了。
這個時候最好的辦法是自己找個目錄另外弄一個,與系統的隔離,讓一些包比如caffe編譯的時候依賴上自己的這個庫,版本的下載在此:
https://github.com/protocolbuffers/protobuf/releases
2 自建環境:與別人的環境和平共處
Linux有什么好?除了安全之外,最大的莫過于帳號管理,大家可以共享一套硬件,一套基本的環境,卻隔離各自的目錄。
不過對于新手來說,還應該學會一件事,那就是與別人的環境隔離,就是說用自己的庫,不用別人的,也不讓別人用自己的庫。
關于哪些庫需要共享,哪些庫不需要共享,我的建議是這樣的(這里說的是有多個人用同一臺服務器,如果是你一個人,怎么搞開心就好)。
所以意思就是很明顯了,自己裝一套python環境,自己編譯一些常用的庫放在自己目錄下,比如opencv,protobuf等。這樣的好處有兩個:
1、不是管理員也可以隨意安裝庫了,比如python。擁有管理員權限有時候很危險的,尤其是在企業,萬一一不小心誤操作搞出點什么幺蛾子,輕則讓大家的工作成果丟失,重則可能要辭職走人,這是一直在上演的故事。
2、可以不用擔心別人更改系統環境而對自己造成影響。比如python,很多人用anaconda,就可以不使用系統的python。個人不使用anaconda,而是原生的python環境,那樣可以完全掌控。
3 使用Docker:快速遷移環境
自己好不容易讓環境穩定了,為了某個項目臨時更改環境絕對不是一件很愉快的事情,不僅花費時間,還可能破壞穩定的系統。
這個時候,就可以上虛擬機了。關于虛擬機我們不介紹,而是介紹與之類似的Docker容器,現在運維們部署環境很多都是用Docker技術,我們這里還是針對個人用戶。
相比虛擬機,我更推薦使用Docker,一,Docker容器上的程序,直接使用物理機的硬件資源,cpu、內存等利用率上有很大的優勢。二,Docker鏡像方便傳播,使用別人的環境,找到提供好的Docker文件自動配置就行了。
如果真的需要在一個電腦上配置各種有沖突的環境,那就用Docker吧。
關于Docker技術本身這里就不做介紹,我們需要知道的是,它跟虛擬機差不多。
你可以將整個服務器的環境配置打包成一個文件隨處帶走,然后換一臺電腦運行,這樣兩臺電腦的環境都不會受到影響,直觀理解就是這樣,這也是兩種我自己的用法。
要用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#測試安裝是否成功
(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也是一步一步在實戰中增強經驗的,誰也不是一開始就能心平氣和地接受,從小白走到大師兄的段位,心態也自然會有一些變化。
純凈的小白,好不容易找到了一個開源項目開始跑起來了,一跑之后發現沒有出結果,只好干著急等人來解決。
成長為少年郎之后,就開始各種百度什么的搜索匹配答案,找到了便是萬事皆休,找不到就接著找。
到了有識青年后,打開Google上去stack overflow就是一把梭,尋找點贊數最高的,有時候還翻翻github issues等地方。
到了大師兄級別,一眼就洞穿真相不需要瀏覽器,可能還會動起改改這個項目的心思。
不知道你現在的心態怎么樣了,畢竟依賴的問題可能是一輩子的事啊。
總結
萬事皆有利弊,享受著開源項目帶來的便利,也要忍受它帶來的麻煩,希望大家都能盡快成為游刃有余的高手,提高工作效率。
本周直播
今日小問題
轉載文章請后臺聯系
侵權必究
更多精彩內容請關注知乎專欄《有三AI學院》
往期精選
創業第一天,有三AI扔出了深度學習的150多篇文章和10多個專欄
【雜談】如何學會看arxiv.org才能不錯過自己研究領域的最新論文?
【雜談】AI工業界都有哪些值得參加的比賽?
【雜談】為什么你學了AI,企業卻不要你
【雜談】那些酷炫的深度學習網絡圖怎么畫出來的?
【雜談】深度學習必備,各路免費爬蟲一舉拿下
【雜談】從GitHub上星星最多的男人開始發GitHub綜述資料
【雜談】提升寫代碼效率不得不做的三件事
【雜談】三人行必有AI,你會在其一嗎?
【雜談】想成為機器學習學霸?先學會做筆記吧
【雜談】天下苦公眾號久矣,如何利用這幾類公眾號進行深度學習?
【雜談】扒一扒Reddit,Medium,Quora與知乎等國內外高質量AI社區與內容平臺
【雜談】白身,初識,不惑,有識,不可知,你處于深度學習工程師哪一重境界了
總結
以上是生活随笔為你收集整理的【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图像分割模型】感受野与分辨率的控制术—
- 下一篇: 【完结】优秀的深度学习从业者都有哪些优秀