跳到主要內容

訣竅與提示

使用多個頻道

從 conda-forge 安裝套件是很常見的,但當嘗試使用它時,會看到類似(OS X 範例)這樣的錯誤

ImportError: dlopen(.../site-packages/rpy2/rinterface/_rinterface.so, 2): Library not loaded: @rpath/libicuuc.54.dylib
Referenced from: .../site-packages/rpy2/rinterface/_rinterface.so
Reason: image not found

發生這種情況是因為 icu 的正確版本,或錯誤中的任何其他套件,不存在,或是該套件完全遺失。

您可以透過發出命令 conda list 並搜尋有問題的套件來確認這一點。

為什麼會這樣?

conda-forge 和 defaults 並非 100% 相容。在上面的範例中,已知 defaults 使用 icu 54.*,而 conda-forge 則依賴 icu 56.*,當安裝環境混合來自多個頻道的套件時,這種不匹配可能會導致錯誤。

如何修復?

較新的 conda 版本(>=4.6)引入了嚴格的頻道優先順序功能。輸入 conda config --describe channel_priority 以取得更多資訊。

解決方案是在您的 .condarc 檔案中,當使用 conda-forge 套件時,將 conda-forge 頻道添加到 defaults 之上,並使用以下命令啟用嚴格的頻道優先順序

$ conda config --set channel_priority strict

這將確保所有依賴項都來自 conda-forge 頻道,除非它們僅存在於 defaults 上。

以下是 .condarc 檔案的外觀範例

$ cat .condarc
channel_priority: strict
channels:
- conda-forge
- defaults

除了頻道優先順序之外,我們還建議始終在新環境中安裝套件,而不是從 anaconda/miniconda 安裝到 base 環境中。使用環境可以更輕鬆地偵錯套件問題,並確保根環境的穩定性。

:::

使用外部訊息傳遞介面 (MPI) 程式庫

在某些高效能運算 (HPC) 系統上,使用者應使用系統上可用的 MPI 二進位檔,而不是 conda-forge 建置的那些。這些二進位檔通常針對系統進行了特殊化,並與工作排程器等正確介面。但是,這種做法會為 conda-forge 使用者帶來問題。當您從 conda-forge 安裝依賴 MPI 的套件時,conda 將安裝 conda-forge 建置的 MPI 二進位檔,並且該套件將連結到這些二進位檔。這種設定通常在 HPC 系統上根本無法運作,或以非預期的方式運作。

為了解決這些問題,conda-forge 建立了 mpichopenmpi 程式庫的特殊虛擬建置版本,它們只是沒有內容的 shell 套件。這些套件允許 conda solver 產生正確的環境,同時避免從 conda-forge 安裝 MPI 二進位檔。您可以使用以下命令安裝虛擬套件

$ conda install "mpich=x.y.z=external_*"
$ conda install "openmpi=x.y.z=external_*"

只要您的連結路徑中有 mpich/openmpi 程式庫的本機副本,並且本機版本在適當的 ABI 範圍內與 conda 版本相符,則此程序應可運作。在執行時,依賴 MPI 的 conda-forge 套件應找到 mpich/openmpi 的本機副本並連結到它。

使用針對系統特殊化的您自己的 MPI 二進位檔的另一個重點是,如果您關心極致效能,則應自行建置/安裝 MPI 後端,而不是依賴 conda-forge 套件(它們是為了相容性而不是效能而建置的)。由於 conda-forge 套件的受限建置環境,因此可能缺少 mpichopenmpi 的 XPMEM 和 CMA 等重要功能。

在 Apple Silicon 上安裝 Apple Intel 套件

使用 Rosetta 2,您可以在配備 Apple silicon 處理器的 Mac 電腦上安裝最初為配備 Intel 處理器的 Mac 電腦編譯的套件。

可以針對每個環境使用以下命令啟用此功能

CONDA_SUBDIR=osx-64 conda create -n your_environment_name python   # Create a new environment called your_environment_name with intel packages.
conda activate your_environment_name
python -c "import platform;print(platform.machine())" # Confirm that the correct values are being used.
conda config --env --set subdir osx-64 # Make sure that conda commands in this environment use intel packages.

若要驗證是否正在使用正確的平台,請在環境啟用後執行以下命令

python -c "import platform;print(platform.machine())"  # Should print "x86_64"
echo "CONDA_SUBDIR: $CONDA_SUBDIR" # Should print "CONDA_SUBDIR: osx-64"

安裝啟用 CUDA 的套件,例如 TensorFlow 和 PyTorch

在 conda-forge 中,某些套件提供 GPU 支援。這些套件不僅需要更長的時間來編譯和建置,而且還會產生相當大的二進位檔,使用者隨後會下載這些檔案。為了最大限度地提高連線速度較慢和/或儲存頻寬較低的使用者的可訪問性,目前正在努力預設限制在僅限 CPU 的機器上不必要地安裝為 GPU 編譯的套件。這是透過新增 虛擬套件 執行依賴項 __cuda 來完成的,該依賴項會偵測本機機器是否具有 GPU。但是,這為可能仍然希望下載和使用啟用 GPU 的套件(即使在非 GPU 機器上)的使用者帶來了挑戰。例如,HPC 上的登入節點通常沒有 GPU,而具有 GPU 的運算對應節點通常沒有網際網路存取權。在這種情況下,使用者可以透過環境變數 CONDA_OVERRIDE_CUDA 覆寫預設設定,以便在登入節點上安裝 GPU 套件,以供稍後在運算節點上使用。在撰寫本文時(2022 年 2 月),我們得出的結論是,這種安全的預設行為最適合大多數 conda-forge 使用者,並且提供了一個簡單的覆寫選項並記錄在案。如果您對此有任何想法或問題,請告訴我們。

為了覆寫預設行為,使用者可以設定環境變數 CONDA_OVERRIDE_CUDA,如下所示,即使在僅限 CPU 的機器上也能安裝具有 GPU 支援的 TensorFlow。

CONDA_OVERRIDE_CUDA="<CUDA version>" conda install tensorflow -c conda-forge
# OR
CONDA_OVERRIDE_CUDA="<CUDA version>" mamba install tensorflow -c conda-forge
注意

有關更多資訊,請參閱 相關的 CUDA 使用者指南

對於上下文,安裝 TensorFlow 2.7.0 啟用 CUDA 的變體 tensorflow==2.7.0=cuda*,會導致大約 2 GB 的套件下載,而 CPU 變體 tensorflow=2.7.0=cpu*,會導致大約 200 MB 的下載。如果只需要 CPU 變體,這將浪費大量的頻寬和儲存空間!

使用 PyPy 作為直譯器

conda-forge 頻道支援使用 PyPy 直譯器 建立套件並將其安裝到環境中。許多套件已經可用。您需要啟用 conda-forge 頻道,並在建立環境時使用 pypy 識別碼

$ conda create -c conda-forge -n my-pypy-env pypy python=3.8
$ conda activate my-pypy-env

目前支援的 python 版本為 3.8 和 3.9。已放棄對 pypy3.7 的支援。雖然您仍然可以建立 python 3.7 環境,但您將不會獲得更新,因為新套件版本已發布(包括 pypy 本身)。

注意

截至 2020 年 3 月 8 日,如果您使用 defaults 作為低優先順序頻道,則需要使用嚴格的頻道優先順序,因為 defaults 中的元數據尚未修補,這允許 cpython 擴充套件與 pypy 一起安裝。

$ conda config --set channel_priority strict