集羣個人用戶離線複製管理Python環境的一些問題

項目的Python環境一直沒有有效管理,大家都是用的同一個環境。某個包需要特定的版本,必然需要考慮升級會不會影響其他人、其他程序的運行。
在研究WaveGlow代碼時,其依賴的torch1.0高於當前的0.4版本,故研究了一下Python環境的複製和管理問題。中間遇到了一些問題,一一解決並決心記錄下來。
前置條件:個人非root用戶、集羣共享存儲、離線環境(增加了問題解決的難度)、使用了Anaconda環境(方便了Python環境的複製管理,但是也帶來了一些問題)

一. Anaconda環境複製

1. 環境複製

       Anaconda是一個Python環境管理工具,它附帶了 conda、Python 和 150 多個科學包及其依賴項。我們一直使用Anaconda來管理Python環境的,但是隻用了默認的root環境。可以在很多地方找到複製環境的命令:

  conda create --name lujian --clone root

以上就複製了root環境,並命名新環境爲lujian。通過conda env list或conda info -e可以查看所有的環境。

2. 路徑配置

       但是,新的環境默認是放置在用戶的家目錄下的,而家目錄並不是集羣的共享目錄,這樣新的環境就只能在本機使用了。通過以下命令:

  conda config --show

該命令可以查看conda的配置信息,其中的envs_dirs參數指示環境的路徑,默認爲/home/<user>/.conda/envs和/<anaconda-dir>/envs。按照優先級,新建的環境相關文件就放置在/home/<user>/.conda/envs目錄下。我們可以通過:

  conda config --append envs_dirs <new-dir>

將新的目錄添加到envs_dirs參數中,而該目錄可設置成集羣共享的目錄,這樣,當在執行conda create時,新建的環境就位於共享目錄了。

3. 在線/離線方式

       有搜索到環境導出和導入的方式來複制環境,命令如下:

  #導出環境
  conda env export --name root > environment.yaml
  #導入環境
  conda env create --name lujian -f environment.yaml

並提到複製的環境只是安裝了原來環境裏用conda命令直接安裝的包,用pip安裝的包沒有複製過來,需要重新安裝。

#導出pip安裝的包
pip freeze > requirements.txt
#導入到Python環境
pip install -r requirements.txt

然而conda包和pip包的導入都需要聯網,在離線環境下失敗。

       通過1中clone的方式可在離線時複製環境,有看到說該方式下複製的新環境也只是安裝了原來環境裏用conda命令直接安裝的包。然而經過實踐,源環境中的conda包和pip包都複製過來了。

4. 問題

       但是也發現了一些奇怪的問題,一個是新環境下很多文件都是源環境文件的一個鏈接。二是同一個包如果有conda和pip兩個不同的版本,使用時import的版本可能會和源環境不一樣。
       所以,以後安裝第三方包可以用conda安裝的儘量通過conda安裝吧,conda安裝還有的優勢就是能夠自動安裝其他的依賴包。

二. Pytorch與Python離線更新

1. Pytorch更新與問題

       新的環境中包含了原來已安裝的Pytorch0.4,而我需要的是1.0版本。在倉庫https://pypi.org中下載到1.0的離線包後,通過pip install --upgrade安裝,會先卸載0.4的包,並安裝了1.0的包。通過pip list可以查看安裝成功。
       安裝的過程很輕鬆,然而跑waveglow時,卻報了錯誤:

 symbol lookup error: <python-dir>/site-packages/torch/lib/libtorch_python.so: undefined symbol: PySlice_Unpack

搜索這個錯誤,然後重裝Pytorch以及一些依賴包都無效,也考慮了是否複製環境導致的包版本和一些庫文件錯亂導致的原因。直接在源root環境下通過pip install --user 將Pytorch1.0安裝到個人目錄下,然而仍然出錯。
       最終在https://github.com/pytorch/pytorch/issues/14931中確定了Pytorch1.0在Python3.6.0中存在bug,需要升級Python版本。

2. Python離線更新

       由於是離線環境,沒法使用conda update升級Python,所以首先下載了Python3.6.3的離線源碼包。
       嘗試將Python安裝到另外的目錄,通過環境變量配置使用其他的Python包,也宣告失敗。在https://www.quora.com/What-is-the-best-way-to-update-Python-on-Windows中看到,Python小版本的升級,可以直接通過安裝到已有Python目錄,自動刪除原始版本並安裝新的版本。
       由於以上我們創建了個人目錄下的新的Python環境,所以Python升級覆蓋新環境中的Python版本就可以了。按照安裝指示,最後一步make install等待的比較久,應該是將已有的Python第三方包用新版本的Python重新編譯了一遍。通過python -V可以看到Python3.6.3已經安裝成功。

三. numpy.linalg.svd運行內存出錯

1. 問題

       本以爲問題都解決了,結果程序一跑還是報了個segmentation fault。調試程序,發現是numpy.linalg.svd內出錯。

2. 原因

       搜索一下還是有提到這個問題的,主要是說當傳入的參數矩陣比較大可能會出現(雖然我的matrix只有[1024,1026]),而且是由於numpy和scipy編譯依賴的openblas出現的問題。當然也有提到很早就解決了這個bug:https://github.com/xianyi/OpenBLAS/issues/225,然而後面在各種環境下這個問題還是有人提及。

3. 解決

       使用conda list可以發現當前環境中有兩個版本的scipy。刪除已安裝的全部scipy和numpy,重新下載離線包並安裝,運行後一切正常。

四. 小結

  • 停止使用root環境,儘量爲各個項目創建獨立環境。
  • 儘量使用conda安裝包。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章