Linux升級python到3.8.2(源碼編譯)

Linux升級python到3.8.2

系統環境 Ubuntu 18.04, 記一次升級過程, 以免搞忘了.

1 卸載已安裝的python

我的環境使用apt安裝了python3.6和python3.8, 現在卸載這兩個. 然後使用源碼編譯安裝最新版python3.8.2.

# 卸載3.6
sudo apt purge python3.6
# 查看系統還有哪些python包
sudo dpkg -l | grep python
# 清除配置
sudo apt purge python3.6-minimal python3.6-dev python3.6-venv python3 
# 刪除3.6的pip安裝的包
sudo rm -rf /usr/local/lib/python3.6 
rm -rf ~/.local/lib/python3.6 

# 同理卸載python3.8
sudo apt purge python3.8-minimal python3.8-venv python3.8 
# 刪除3.8的pip安裝的包
sudo rm -rf /usr/local/lib/python3.8 
rm -rf ~/.local/lib/python3.8 

# 自動卸載不需要的包  
sudo apt autoremove   # 可能會誤刪一些包, 不過不怕, 以後缺什麼再安裝什麼
# 安裝一個常用的但被誤卸載的軟件
sudo apt install wget
# 刪除爲了滿足某些依賴安裝的,但現在不再需要的軟件包
sudo apt autoclean

2 從源碼編譯安裝python

mkdir -p ~/src; cd ~/src    # 下載源碼包 放到該目錄
# 解壓源碼
tar -zxf Python-3.8.2.tgz

# 編譯源碼
# 進入源碼目錄
cd ~/src/Python-3.8.2
# configure
./configure
# 使用make命令編譯源碼 -j表示並行數量
make -j64

這裏要查看是否有module沒有成功, 比如我這裏顯示沒有成功的模塊有

The necessary bits to build these optional modules were not found:
_bz2                  _curses               _curses_panel      
_dbm                  _gdbm                 _lzma              
_sqlite3              _tkinter              _uuid              
readline                                                       
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

安裝相關依賴再進行編譯

# 安裝依賴
sudo apt update 
sudo apt install libgdbm-dev tk-dev libsqlite3-dev libncurses5-dev libffi-dev liblzma-dev libreadline-dev libbz2-dev libssl-dev uuid-dev libgdbm-compat-dev
# 使用configure生成構建檔
./configure
# 使用make命令編譯源碼 -j表示並行數量
make -j64

然後看提示還會有報錯信息: uuid和curses會編譯出錯. 處理方法參考: python編輯錯誤解決

# 解決curses的錯誤
sed -i "s/Werror=implicit-function-declaration/Wno-error/g" configure
# 解決uuid的錯誤 設置環境變量
export CPPFLAGS=" -Wno-error=coverage-mismatch"

# 重新運行configure
./configure
# 編譯
make -j64

確保不再有報錯信息, 再使用make編譯後的文件進行安裝

# 安裝
sudo make install 
# 重新軟鏈接
sudo rm -rf /usr/local/bin/{python,pip}
sudo ln -sf /usr/local/bin/python3 /usr/local/bin/python
sudo ln -sf /usr/local/bin/pip3 /usr/local/bin/pip
# 更新pip 
sudo pip install --upgrade pip
# 全局安裝 wheel 和 virtualenv
sudo pip install wheel
sudo pip install virtualenv

3 安裝 lightGBM 和 xgboost

參考文檔: 官網

# 更新cmake工具 安裝 lightGBM 和 xgboost 需要cmake來進行編譯
# 卸載cmake
sudo apt purge cmake 
# 下載源碼
cd ~/src;    # 下載 cmake-3.17.0.tar.gz 放到該目錄
# 解壓源碼
tar -zxf cmake-3.17.0.tar.gz && cd cmake-3.17.0 
# 編譯cmake
./bootstrap 
make -j64 
# 安裝cmake 
sudo make install 

# lightGBM 安裝方式有兩種 可以使用pip安裝  以下兩種方式選一種即可, 我使用源碼安裝
# 方式 1 使用源碼編譯安裝lightGBM gpu版本
#    啓用代理 
source /opt/.net_env
#    下載源碼
cd ~/src
git clone --recursive https://github.com/microsoft/LightGBM 
#   使用cmake生成構建檔 並使用make編譯
mkdir -p LightGBM/build && cd LightGBM/build
cmake -DUSE_GPU=1 ..
make -j64
#   生成 whl 包
cd ../python-package
python setup.py bdist_wheel
#   使用 pip 安裝 whl 包
pip install --user dist/lightgbm-2.3.2-py3-none-any.whl

# 方式 2 使用pip安裝 gpu版本
pip install lightgbm --install-option=--gpu    # 如果遇到權限錯誤 用sudo提權


# 安裝xgboost 安裝方式有兩種 可以使用pip安裝  以下兩種方式選一種即可, 我使用源碼安裝 
# 方式 1 使用源碼編譯安裝 xgboost 支持gpu版本
cd ~/src
git clone --recursive https://github.com/dmlc/xgboost
mkdir -p xgboost/build && cd xgboost/build 
#   使用cmake生成構建檔 並使用make編譯
cmake .. -DUSE_CUDA=ON
make -j64
#   生成 whl 包
cd ../python-package
python setup.py bdist_wheel
#   使用 pip 安裝 whl 包
pip install --user dist/xgboost-1.1.0_SNAPSHOT-cp38-cp38-linux_x86_64.whl
#   測試xgboost
python tests/benchmark/benchmark_tree.py --tree_method=gpu_hist    # 4.32秒
python tests/benchmark/benchmark_tree.py --tree_method=hist    # 14.98秒

# 方式 2 使用pip安裝
pip install xgboost    # 如果遇到權限錯誤 用sudo提權


# 至於其他包 使用pip安裝即可

lightgbm和xgboost安裝gpu版本, 我的測試結果: 日常訓練模型速度會提升近10倍(使用cpu訓練用19分37秒, 使用gpu用時2分14秒).

4 刪除臨時文件

rm -rf /tmp/* 
rm -rf /var/cache/apt/* 
rm -rf ~/.cache/pip/*

5 添加環境變量

我習慣使用非root權限來pip安裝包, 所以需要添加可執行程序目錄到 PATH 環境變量中. 新建 ~/.profile 添加環境變量, 然後在 ~/.bash_profile~/.zshrc 中引入該文件, 以便對我的 bash 和 zsh 環境都生效, 後期加環境變量也不用配置兩次
~/.profile

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

~/.bash_profile~/.zshrc 中增加以下內容

# if ~/.profile exists
if [ -f ~/.profile ]; then
    . ~/.profile
fi

6 管理jupyter的kernel

python 升級之後, 之前的jupyter的kernel還可能是舊的配置, 如果需要管理, 可以使用以下的方法進行. 參考文檔: 這裏

查看當前的內核

jupyter kernelspec list

刪除指定的內核

jupyter kernelspec remove KERNEL_NAME

增加指定的內核

# 比如想要增加哪個路徑下的python 就執行對應目錄的python就行了
/home/user-name/anaconda3/envs/newenv/bin/python -m ipykernel install --name XXXX

完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章