Python 多版本共存問題 2
? 本文主要討論 多種版本的 Python 模塊的共存與調(diào)用問題上煤,并嘗試給出一種清爽的解決辦法锦聊。
多種版本的 Python Module逢净?
? 伴隨 Python 逐步成為數(shù)據(jù)科學(xué)領(lǐng)域的主力研發(fā)語言紧显,越來越多的機(jī)器學(xué)習(xí)庫都發(fā)布了 Python 版本,包括了著名的 scikit-learn茄猫,tensorflow誊抛,keras 等列牺。正是由于數(shù)據(jù)科學(xué)近年來在基礎(chǔ)算法和計(jì)算架構(gòu)上的迅猛發(fā)展,這些Python module 也頻繁地發(fā)布新版本拗窃。
? 最令人惡心的 Tensorflow 還未發(fā)布穩(wěn)定版 1.0.0 之前時昔园,幾乎每個次級版本的Tensorflow的 API都不一樣。當(dāng)然這主要是由于深度學(xué)習(xí)領(lǐng)域的算法層出不窮并炮,另一方面我個人猜測是由于Tensorflow代碼在不斷根據(jù)google的計(jì)算平臺變化做出演進(jìn)
? 那么問題就來了默刚,可能三個月前自己寫的 Seq2Seq 的 tf 代碼,在新版的 Tensorflow 中就已經(jīng)不能運(yùn)行逃魄,這就是因?yàn)榘姹咀兓瘞淼腁PI變化導(dǎo)致荤西。那么有人說,只要我一直不更新 TF 不就好了嗎?
? 理想豐滿邪锌,現(xiàn)實(shí)骨感勉躺!
筆者使用的Ubuntu 機(jī)器是實(shí)驗(yàn)室共有的,TF 是否更新觅丰,服務(wù)器管理員的決定權(quán)也是很重要的饵溅!
最新版本的 TF 的計(jì)算效率相對來說總是在改進(jìn)的:新版的 TF 可以使用更新的 CUDA 版本以及 CUDNN版本。
-
新來的開發(fā)者通常愿意去采用最新穩(wěn)定版的 TF 來開發(fā)算法妇萄,如果要使用他們開發(fā)的算法蜕企,那么勢必需要在對應(yīng)的 TF 版本中才能運(yùn)行。
有鑒于此冠句,為了同時運(yùn)行新老代碼轻掩,我們通常選擇在同一臺機(jī)器上配置共存的多版本 Module。
如何配置并使用多種版本 module懦底?
? 一個簡單的想法是唇牧,對每一個開發(fā)任務(wù),創(chuàng)建一個單獨(dú)的環(huán)境聚唐,這個環(huán)境有獨(dú)立于外界的模塊丐重。只要我們進(jìn)入了這個單獨(dú)的環(huán)境,就可以在里面安裝并使用任務(wù)對應(yīng)版本的模塊了杆查。
? 幸運(yùn)的是弥臼,這樣做的方法有很多,例如 docker根灯。但這里我們暫時用不到這么高大上的技術(shù),我們只需要采用 virtualenv 命令即可掺栅。
-
利用 virtualenv 命令創(chuàng)建獨(dú)立的 Python 環(huán)境
-
virtualenv 的安裝
# 安裝 Python 2.7下的virtualenv sudo pip install virtualenv
-
采用 virtualenv 命令創(chuàng)建一個獨(dú)立的 Python 環(huán)境
# 創(chuàng)建一個空間放置我可能創(chuàng)建的多個環(huán)境 mkdir ~/my_lib/py_env cd ~/my_lib/py_env # 假設(shè)系統(tǒng)默認(rèn)的 Python 為 Python 2.7 # 創(chuàng)建 Python 2.7 的獨(dú)立環(huán)境 virtualenv py27_env
-
如何進(jìn)入該獨(dú)立的 Python 環(huán)境呢烙肺?
? 注意到,這里的進(jìn)入 獨(dú)立的Python環(huán)境的意思并不是一定要 cd 到上一步創(chuàng)建的Python獨(dú)立環(huán)境所在文件夾處氧卧,幾乎可以在任意位置啟動環(huán)境桃笙。
? 啟動環(huán)境的意思是,在這個環(huán)境中沙绝,除了 Python 相關(guān)的命令搏明,其余諸如 cd,ls等命令與外界無異闪檬,只有和 Python 相關(guān)的命令例如 pip, python 等才會有獨(dú)立于外界的命令星著。
cd ~ # 可以在任意位置進(jìn)入該 Python 環(huán)境 source ~/my_lib/py_env/py27_env/bin/activate # 事實(shí)上,上述命令可以理解為將 ~/my_lib/py_env/py27_env/bin 加入系統(tǒng)路徑粗悯,且優(yōu)先級最高虚循。但 ~/my_lib/py_env/py27_env/bin 文件夾中只存在和 Python 相關(guān)的命令,因此只有 Python 相關(guān)命令的執(zhí)行會受該環(huán)境的影響
-
如何退出該獨(dú)立的 Python 環(huán)境
deactivate
-
-
在對應(yīng)的獨(dú)立環(huán)境中安裝任意版本的模塊
我們這里的任務(wù)是創(chuàng)建一個 Python 3.5 環(huán)境,然后利用 pip 安裝 tensorflow 的1.0.1 gpu版本
-
先創(chuàng)建 Python 3.5 環(huán)境横缔,激活它
# 創(chuàng)建 Python 3.5 環(huán)境 # -p PYTHON_EXE_PATH 參數(shù)铺遂,也可以換成 --python=PYTHON_EXE_PATH # 代表創(chuàng)建的該獨(dú)立環(huán)境所依據(jù)的系統(tǒng) Python 命令來自哪兒,改變參數(shù)可以得到不同版本 Python 獨(dú)立環(huán)境 virtualenv -p /usr/bin/python3.5 ~/my_lib/py_env/py35_env # 激活它 source ~/my_lib/py_env/py35_env/bin/activate
-
安裝 tensorflow 1.0.1 gpu 版本
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp34-cp34m-linux_x86_64.whl # 這里的執(zhí)行的命令 pip 換成 pip3 或者 pip3.5都可以茎刚,這三個命令都是~/my_lib/py_env/py35_env/bin/ 中的 # 值得注意的是襟锐,這里可以運(yùn)行 pip2,這里的 pip2就是系統(tǒng)命令了,即 /usr/bin/pip2了膛锭×肝耄可以采用 which pip2 驗(yàn)證一下 which pip2 which pip which pip3 which pip3.5
-
可以進(jìn)入 Python 解釋器看看
# 以下三個命令都可以進(jìn)入 該獨(dú)立環(huán)境對應(yīng)的 Python 3.5環(huán)境 python python3 python3.5
進(jìn)入解釋器之后
import tensorflow as tf # 查看該 tensorflow 的安裝位置 print(tf.__path__)
-
-
virtualenv 的更多選項(xiàng)
這里的系統(tǒng) Python 環(huán)境是指創(chuàng)建該獨(dú)立環(huán)境時的 -p 參數(shù)
- --no-site-packages 選項(xiàng)代表 安裝到系統(tǒng)Python環(huán)境中的所有第三方包都不會復(fù)制過來,目前我看到這個是默認(rèn)執(zhí)行的
- --system-site-packages 選項(xiàng)代表該虛擬環(huán)境可以訪問系統(tǒng) Python環(huán)境中的 第三方包
- 更多的選項(xiàng)直接在 shell 端輸入 virtualenv 即可查看