[Python] 環境建置與套件管理工具-pip、conda、mamba

[Python] 環境建置與套件管理工具-pip、conda、mamba
快速導覽

前言

相信各位在學習使用python的過程中,會發現有很多安裝環境與套件的方式。隨著套件越裝越多,一定都會遇到環境安裝的問題,套件總是裝了又刪,卻總是弄不好環境,尤其當開始試著建立不同版本的機器學習環境,再加上要使用GPU時,更是常常裝一裝就壞了。面對這樣的問題,以及各式各樣的套件管理工具與安裝方式如pip、conda、anaconda、miniconda、miniforge、mamba,我們應該如何選擇與使用,這些工具之間的差異是又什麼呢? 本文將介紹上述這些工具,讓大家選擇合適的方式來管理python環境吧!

套件管理工具

"套件管理? 遇到module not found?直接pip install 錯了嗎?"

首先,在介紹這些工具之前,必須先了解為什麼需要套件管理工具。

相信會點進來閱讀本文的你,都知道我們在用Python開發的時候,會用到很多不同的套件。但在安裝套件時,你會怎麼做呢? 缺什麼就都直接pip install嗎?

大部分人在看套件的安裝文件時,可能會看到它提供兩種不同的安裝方式 conda & pip,以畫圖的套件seaborn為例:

這個時候再往下滑,會發現dependency區塊,寫著安裝seaborn所需的依賴項目:


這個時候,我相信各位不一定都會滑到dependencies,往往都是直接下pip install seaborn 一切就搞定了。讓我們來看看 pip install 做了什麼事:

從下圖可以看到,盡管只是下了pip install seaborn的指令,安裝的卻不只是seaborn,同時也安裝了許多seaborn相依的套件像是pandas、matplotlib、numpy...。

使用pip安裝 seaborn

如果使用conda install的話,則會先列出下載的套件,並再作一次安裝確認:

使用conda安裝seaborn

由此可知,我們在安裝套件的時候,其實有也處理了相依套件。當安裝的套件越來越多時,相依關係就會越來越複雜,這時就需要有東西來處理這些複雜關係,而pip和conda就是負責安裝解決這些相依關係的套件管理工具。

套件管理的重要性

現在我們知道,套件安裝時,一個套件會依賴多個套件,而這些套件可能又有各自依賴的更多套件。

如果沒有做好套件管理,可能會發生的事:

功能A 裝好了結果功能B壞了

開發時,我們通常會使用到多個套件來滿足不同的功能需求,如果不做管理都直接安裝,就很有可能發生一個裝好了結果另一個壞掉的問題。

安裝某個套件以後,整個環境都壞掉了

因為套件安裝時沒有嚴格檢查相依關係,導致套件衝突,原先所有可執行的部分都無法使用。

pip vs conda

兩者都是套件管理工具,但有一些使用上的差異。

pip主要針對python來打包套件,使用的來源是PyPI(Python Package Index),對應的虛擬環境工具是vitualenv,並且在安裝時只會檢查最低安裝要求。

conda是使用python開發,但支援多語言如Python、R、Ruby、Lua、Scala、Java、JavaScript、C/C++、Fortran 等。使用來源主要是anaconda.org,對應的虛擬環境工具是env,並且在安裝時會嚴格檢查衝突。

綜合以上的差異,如果你需要多個版本的python環境(ex: 3.8、3.9…),或是經常有安裝套件衝突的問題,筆者建議優先使用conda做管理。當conda的來源沒有需要的套件時,再考慮使用pip。

使用conda的好處

  • 嚴格檢查套件衝突
  • 可以安裝多版本的python在不同的虛擬環境
  • 有需求時可以支援多語言
  • 較清楚的安裝來源檢查與呈現

這時相信聰明的你一定會發現,Anaconda、Miniconda、Miniforge看起來感覺就跟conda有關,那這些工具跟conda又有什麼關係呢?

Anaconda vs Miniconda vs Miniforge

其實Anaconda vs Miniconda vs Miniforge的核心都是包含conda,並利用來安裝實現環境建置與套件管理。

主要是預設的安裝內容與套件來源有差異。

conda套件來源

如果有使用conda的經驗,可能會發現 conda install -c 這個指令,這個 -c 代表channel是指套件的來源,

以scikit-learn為例,可以在anaconda.org找到anconda conda-forge兩個不同來源的版本,差異會來自包含的版本或是可安裝的作業系統不同,大部分時候conda-forge可能會包含比較多的套件跟版本:

Anaconda

Anaconda相信是很多人學習python的起點。好處是下載後安裝就包含圖形化的介面以及開發相關的工具。

管理環境時也可以藉由圖形介面來點選、安裝及管理。然而,如果你仔細看,其實這一整包非常臃腫佔空間,很多工具也不是每個人都會用到,偶爾安裝套件時遇到問題也不好解決。

Miniconda

Miniconda跟Anaconda來自於同一間公司,只是它只安裝最小所需的套件,也沒有圖形化介面,好處是相對不佔空間,只要安裝自己所需的套件和工具即可。


Miniforge

Miniforge是社群主導,跟Miniconda 同樣都是輕量的conda版本,最主要的差別在於預設的套件來源不一樣。當然,使用的來源都可以利用 conda install 加上 -c 參數來指定來源。

綜合來說,筆者會建議如果是有經驗的開發者,可以使用 miniconda或miniforge兩個較輕量的管理工具,在自行安裝其他自己習慣的工具。

然而,相信有些人在使用conda一段時間後會發現,當安裝的套件一多的時候,檢查套件衝突的步驟會變得很慢很慢。這個時候就要來看看mamba。

Mamba
mamba 同樣也是套件管理工具,有相似但更簡潔的呈現,只是利用c++重寫部分conda的功能,讓檢查衝突的效率明顯提升,且可以併行下載,基本上使用方式跟conda相同,只要將conda替換成mamba即可。

使用mamba的好處:

  • 保有conda的優點,並以c++重寫部分功能達到效率的優化,不用再安裝等半天。
  • 與conda使用相同,不需要再學新方法。
  • 自帶多線程安裝套件資料。

綜上所述,筆者建議想使用或已經使用conda的開發者都可以改為使用mamba,指令相同但有更好的效率。

虛擬環境的重要性

在介紹完套件管理工具的差別後,必須一提的是虛擬環境的重要性。

相信大家在開發時,可能會有不同的專案或是任務,將所有套件安裝在同一個環境風險就很大,一旦環境壞掉就會需要很辛苦的重建,因此環境的隔離就非常重要。

大家可以試想,套件安裝時,會有複雜的相依關係。而你開發的各種不同專案,肯定會需要各種不同的套件。想建立一個所有事情都能做的環境一定是非常困難,總會遇到套件衝突的時候,如果運氣不好,一旦環境壞了全部都要重來。因此,環境的獨立隔離非常重要。

以下舉幾個不做虛擬環境,可能發生的問題:

python版本的衝突

專案A需要的套件使用python3.7的版本,然而專案B使用的套件需要python3.9以上。如果沒有多個環境就難以實現在一台電腦中同時開發需要不同環境的專案。

套件的衝突

如果剛好,你的新專案與舊專案使用相同的python版本,於是將所有套件都安裝在同一環境,當新專案安裝時遇到套件衝突,新舊環境無法找到可同時運行的組合,甚至是整個環境壞掉時,就只能全部砍掉重練。

功能的維護與升級

很幸運的,你的多個專案都能在同一個環境運行,然而當有功能維護或升級的的需求時,若剛好遇到套件需要升級,同樣的會有機會發生套件的衝突,此時若沒有進行環境的區分,會容易遇到調整的困難。

簡單建立虛擬環境

虛擬環境將環境隔離開來,可使用不同版本的python,甚至是不同的cuda+cudnn版本(使用顯卡加速所需,將來有機會再提)。只要藉由以下簡單的指令,就可以創建:

在base環境下創造虛擬(子)環境:

conda create -n env_name python=3.x

或是

mamba create -n env_name python=3.x

(-n 是環境的名稱, 後面可以指定python版本)

建立完成後,它會告訴你可以用activate 或deactivate 來啟動進入/結束退出環境:

利用 mamba/conda activate 進到該環境中,就可以在虛擬環境安裝所需的套件了。

結論

經過本文的介紹,相信你已經更了解python的套件管理方式。

以下整理幾個重點

  • conda比pip 支援更多語言,有更好的虛擬環境切分,且更嚴謹的套件衝突檢查。
  • Anaconda適合初學者,而Miniconda、Miniforge可以更輕量的使用conda。
  • Mamba 解決了 conda 效率差的問題,可以更有效率的檢查衝突來安裝套件。

最後,筆者建議有經驗的開發者,可以直接用Mamba來管理python環境喔!

當遇到conda來源沒有的套件時,再使用pip安裝即可。