Conda 为什么越来越慢?

2021-10-15 13:01:48 浏览数 (1)

作者:生信宝典 | 生信宝典公众号 原文:https://mp.weixin.qq.com/s/OkOgN4j44MHNt1_noPVpzA

Conda 为什么越来越慢?

Conda 中包含的软件越来越多,而且软件的不同版本都保留了下来,软件的索引文件越来越大,安装一个新软件时搜索满足环境中所有软件依赖的软件的搜索空间也会越来越大,导致solving environment越来越慢。

Conda 是如何工作的?

  1. 从设定的通道(channel)处下载通道中所有软件的索引信息(repodata.json)(Collecting package metadata (repodata.json))。
代码语言:javascript复制
"packages" : {
 "moto-1.3.7-py_0.tar.bz2" : {
   "build" : "py_0",
   "build_number" : 0,
   "depends" : [ "aws-xray-sdk !=0.96,>=0.93", "backports.tempfile", "boto >=2.36.0", "boto3 >=1.6.15", "botocore >=1.12.13", "cookies", "dicttoxml", "docker-py", "flask", "jinja2 >=2.7.3", "jsondiff 1.1.1.*", "mock", "pyaml", "python", "python-dateutil", "python-jose <3.0.0", "pytz", "requests >=2.5", "responses >=0.9.0", "six", "werkzeug", "xmltodict" ],
   "license" : "Apache-2.0",
   "md5" : "17b424658cd07e678b5feebdc932eb52",
   "name" : "moto",
   "sha256" : "5924666f8c1758472dc4c3d22b270b46cd1c4b66c50a9ba50d5c636d2237bdd1",
   "size" : 399973,
   "subdir" : "noarch",
   "timestamp" : 1552438392680,
   "version" : "1.3.7"
 }
}



  1. 解析repodata中的信息获取所有依赖的包的信息。
  2. 采用SAT-solver算法决定需要下载包的哪个版本和它们的安装顺序。
  3. 下载并安装包。

Conda 哪一步慢?

主要是第3步,确定待安装包的依赖包之间的兼容和已安装软件之间的兼容,获得需要下载的包和对应版本。

如何提速 Conda?

  • 采用最新版的conda(Conda-4.7相比 Conda-4.6 提速 3.5 倍,Conda-4.8 应该不会比 4.7 慢)。
  • 安装时指定版本减少搜索空间conda install python=3.7.4
  • 安装 R 包时指定 R 的版本也会极大减小搜索空间(R 包因其数目众多,也是生物类软件依赖解析较慢的原因之一),例如:conda install r-base=4.0.2 r-ggplot2=3.3.2
  • 采用mamba加速软件依赖解析 [mamba采用 c 重写了部分解析过程,这个提速效果是很明显的] (安装好mamba后就可以用mamba替换conda进行安装了)。
代码语言:javascript复制
conda install mamba -c conda-forge
mamba install python=3.7.4
  • 默认 conda 解析软件依赖时优先考虑允许的最高版本,设置通道优先级权限高于软件版本新旧后,conda 会能更快的解决依赖关系,避免 defaults 和 conda-forge 通道的奇怪组合导致软件依赖解析迟迟不能将结束的问题:conda config --set channel_priority strict(这个命令只需要运行一次)。
  • 创建一个新环境(conda env create -n env_name)再安装软件,这样就不用考虑与已有的软件的兼容问题了,也可以大大降低搜索空间和提高解析软件依赖的速度。
  • 如果安装的软件提供了 environment.yaml 那么用起来,文件中对应的软件版本都很明确,解析依赖关系时更快(具体导出方式见《Bioconda 软件安装神器:多版本并存、环境复制、环境导出》)。
代码语言:javascript复制
channels:
 - qiime2/label/r2020.6
 - conda-forge
 - bioconda
 - defaults
dependencies:
 - _libgcc_mutex=0.1
 - _openmp_mutex=4.5
 - _r-mutex=1.0.1
 - alsa-lib=1.1.5
 - arb-bio-tools=6.0.6
 - attrs=19.3.0
 - backcall=0.2.0
 - bibtexparser=1.1.0
 - binutils_impl_linux-64=2.34
 - binutils_linux-64=2.34
 - bioconductor-biobase=2.42.0
 - bioconductor-biocgenerics=0.28.0
 - bioconductor-biocparallel=1.16.6
 - bioconductor-biostrings=2.50.2
 - bioconductor-dada2=1.10.0



  • 添加 bioconda 通道时,注意顺序,给予 conda-forge 最高优先级,其次是 bioconda。如果之前已经添加好了通道,自己在~/.condarc中调整顺序。
代码语言:javascript复制
conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge

综合以上组合,之前尝试多次都没安装好的工具,直接搞定。

下载提速

  1. 国内镜像,见《软件安装不上,可能是网速慢!Conda/R/pip/brew 等国内镜像大全拿走不谢》。
  2. 换个网或从朋友处拷贝已经下载好的压缩包一般在 anaconda_root_dir/pkgs 下,拷贝放在自己的 anaconda3/pkgs 下面,再次下载时系统会识别已经下载好的包而跳过(并不总是有效)。
  3. 获取所有相关包的名字,从朋友处拷贝下载好的安装包。如果拷贝过来未能自动识别,可手动安装conda install --offline local_path
代码语言:javascript复制
mamba install r-base=4.0.2 r-ggplot2=3.3.2 --dry-run >package_solving_result

# _anaconda_depends pkgs/main/linux-64::_anaconda_depends-2020.07-py37_0
# _r-mutex conda-forge/noarch::_r-mutex-1.0.1-anacondar_1
# binutils_impl_lin~ pkgs/main/linux-64::binutils_impl_linux-64-2.33.1-he6710b0_7
# binutils_linux-64 conda-forge/linux-64::binutils_linux-64-2.33.1-h9595d00_17
# brotlipy conda-forge/linux-64::brotlipy-0.7.0-py37h516909a_1000
# bwidget conda-forge/linux-64::bwidget-1.9.14-0
# gcc_impl_linux-64 pkgs/main/linux-64::gcc_impl_linux-64-7.3.0-habb00fd_1
# gcc_linux-64 conda-forge/linux-64::gcc_linux-64-7.3.0-h553295d_17

# 获取所有包的名字
grep '::' a | sed 's/.*:://' | sed 's/$/.tar.bz2/'

# 手动安装
for i in `grep '::' a | sed 's/.*:://' | sed 's/$/.tar.bz2/'`; do conda install --offline /anaconda3/pkgs/$i; done



代码语言:javascript复制

使用 conda-pack 直接从已经安装好的地方拷贝一份

安装conda-pack:

代码语言:javascript复制
conda install -c conda-forge conda-pack
# pip install git https://github.com/conda/conda-pack.git

打包已经安装好的环境:

代码语言:javascript复制
conda pack -n my_env_name -o my_env_name.tar.gz

拷贝打包好的环境 my_env_name.tar.gz 到目标机器,并解压到任何目录,一般推荐放到 envs 目录下(anaconda_root/envs,注意:anaconda_root 改为自己的 conda安装路径)。

代码语言:javascript复制
# 解压打包好的环境
# 默认是全都解压到当前目录,场面很壮观
# -C 一定要指定
mkdir -p anaconda_root/envs/my_env
tar -xzf my_env.tar.gz -C anaconda_root/envs/my_env

# 激活环境
source my_env/bin/activate

# Unpack
conda-unpack

# 至此环境就完全拷贝过来了

# 去激活
source deactivate


目前在同样的操作系统(CentOS)测试可以通过,不同操作系统如 centos-ubuntu 尚未测试,各位可以测试下提供下反馈。

参考资料

  1. msarahan,《How We Made Conda Faster in 4.7》,Anaconda
  2. bgruening, msarahan, etc.《Conda solver slowdown FAQ and recommendations》,GitHub Issue
  3. Wolf Vollprecht, Johan Mabille, etc.《GitHub: TheSnakePit/mamba》,GitHub
  4. Marius van Niekerk,《conda-metachannel》,Medium
  5. Anaconda Team,《Understanding and Improving Conda's performance》,Anaconda
  6. 生信宝典,《Conda 软件安装 core dump error/Segment fault/段错误 怎么办?》,生信宝典公众号
  7. 生信宝典,《软件安装不上,可能是网速慢!Conda/R/pip/brew 等国内镜像大全拿走不谢》,生信宝典公众号
  8. 陈同,《用了 Docker,妈妈再也不担心我的软件安装了 - 基础篇》,生信宝典公众号
  9. 陈同,《Linux 学习 - 又双叒叕一个软件安装方法》,生信宝典公众号
  10. Jim Crist,《conda-pack: A tool for packaging and distributing conda environments》,Conda-Pack
  11. 封面来源于 Free Image on Pixabay - Motivational Quote, Try And Stop Me.

猜您喜欢

0 人点赞