前言
近期很多小伙伴反馈为什么在集群中明明已经正确安装了Conda而且相关命令使用起来一切正常,但是一旦在作业脚本中写入conda activate 等命令的时候提交就会报错,提示消息如:CondaError: Run ‘conda init’ before ‘conda activate’,直接导致使用conda安装的软件无法正常使用,造成了很多困扰。
![](https://gbc.scau.edu.cn/wp-content/uploads/2024/09/image-5.png)
原理剖析用户登录后默认位于用户根目录,此时你使用ls -la 命令可以看到你的目录下有着许多点开头的隐藏文件。如果你在使用macOS或其他默认bash环境的Linux发行版,你就会在靠近文件列表上方的位置都有一个名为 .bashrc 的文件,这个是当前bash环境的一个配置文件,每次用户登录bash都会去加载这个文件初始化用户环境。
![](https://gbc.scau.edu.cn/wp-content/uploads/2024/09/image-6.png)
当在我们在安装conda软件或执行conda环境初始化命令conda init初始化命令的时候可以看到这样一个画面:
![](https://gbc.scau.edu.cn/wp-content/uploads/2024/09/image-7.png)
通过输出的信息可以看到,这个操作修改了一个文件,这个文件正是位于我们用户根目录的.bashrc。通过查看这个文件内容可以看到它向这个文件中写入了这么一段代码:
![](https://gbc.scau.edu.cn/wp-content/uploads/2024/09/image-8.png)
正是这段代码的存在,允许用户可以使用conda activate相关命令切换软件环境。如果想要conda环境临时失效又不想删除已有的文件希望日后可以恢复的话,可以注释掉这段代码。现在问题出现在这里,默认情况下用户登录系统的时候可以自动加载 .bashrc 文件,也就自动把conda相关的环境变量加载了进去,但是当使用slurm提交作业脚本的时候,集群的作业调度系统直接使用 /usr/bin/bash 运行你的作业内容,并不会去加载 .bashrc 文件,导致conda提示软件没有初始化。
解决方法下面介绍一些能够应对该问题的方法,其中包含了本人所推荐的方法以及涵盖了一些用户自己实现的一些方法。我将给大家简单介绍下各个方法的效果以及可能会出现的问题。
1. 作业脚本中加载.bashrc文件 (推荐)在编写作业脚本时,在作业具体命令前加一行以下代码重新加载该配置文件,让自己添加的环境变量以及conda的初始化代码生效,包含完整的conda命令。前提是你已经完成了初始化conda环境的操作。这是一个推荐做法,操作简单,推荐使用。
source ~/.bashrc
2. 指定 activate 命令激活环境
在conda环境部署完成后,通过手工指定 activate 命令的位置来激活指定环境。首先确定当前环境内所使用的conda位置:
which conda
![](https://gbc.scau.edu.cn/wp-content/uploads/2024/09/image-9.png)
只需要将返回结果中最后一个 conda 替换为 activate 即可。然后将替换后的内容参照以下代码进行拼接,放在作业脚本中,在执行作业命令前先执行该代码完成环境的激活。
source <activate绝对路径> <环境名称>
# 示例
# source /public/software/miniconda/py312_24.5.0-0/bin/activate wangzt
3. 通过export导入conda环境绝对路径 (不推荐)这是之前看到大家应对该问题最常见的方法。把conda环境的bin路径通过export命令临时添加到系统环境中来调用该环境中的软件。对于一些依赖较少或者不特殊的软件来说这样运行也没有问题,但是会存在很多不确定因素。如部分软件依赖项位于conda的BASE环境,此时BASE环境也空缺便会导致错误产生。
知识共享许可协议本文采用 知识共享署名-非商业性使用 (CC BY-NC) 4.0 协议进行许可。(https://creativecommons.org/licenses/by-nc/4.0/)。非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
![](https://gbc.scau.edu.cn/wp-content/uploads/2024/09/image-10.png)
发表回复