技巧与提示
使用多个频道
通常从 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-forge 软件 pinning 都可以在这里找到:https://github.com/conda-forge/conda-forge-pinning-feedstock/blob/master/recipe/conda_build_config.yaml
如何修复?
较新的 conda
版本(>=4.6)引入了严格的频道优先级功能。输入 conda config --describe channel_priority
获取更多信息。
解决方案是在使用 conda-forge 软件包时,在您的 .condarc
文件中将 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
环境中安装软件包。使用 envs 可以更轻松地调试软件包问题,并确保根环境的稳定性。
:::
使用外部消息传递接口 (MPI) 库
在某些高性能计算 (HPC) 系统上,用户应使用系统上可用的 MPI 二进制文件,而不是 conda-forge 构建的那些。这些二进制文件通常针对系统进行了专门化,并与作业调度程序等正确接口。但是,这种做法给 conda-forge 用户带来了问题。当您从 conda-forge 安装依赖于 MPI 的软件包时,conda
将安装由 conda-forge 构建的 MPI 二进制文件,并且该软件包将链接到这些二进制文件。这种设置通常根本不起作用,或者在 HPC 系统上以意想不到的方式运行。
为了解决这些问题,conda-forge 创建了 mpich
和 openmpi
库的特殊虚拟构建,它们只是没有内容的 shell 软件包。这些软件包允许 conda
求解器生成正确的环境,同时避免从 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 软件包的受限构建环境,可能会缺少诸如 mpich
的 XPMEM 和 openmpi
的 CMA 等重要功能。
在 Apple Silicon 上安装 Apple Intel 软件包
使用 Rosetta 2,您可以在配备 Apple 芯片的 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 的计算对应节点通常没有互联网访问。在这种情况下,用户可以Override 默认设置,通过环境变量 CONDA_OVERRIDE_CUDA
在登录节点上安装 GPU 软件包,以便稍后在计算节点上使用。在撰写本文时(2022 年 2 月),我们得出结论,对于大多数 conda-forge 用户来说,这种安全的默认行为是最好的,并且提供了易于使用的Override 选项并进行了文档记录。如果您对此有任何想法或问题,请告知我们。
为了Override 默认行为,用户可以像下面这样设置环境变量 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