Slurm运行Python作业时evaluate包安装失败报错问题
报错根因
几个报错是连锁出现的,不存在多个独立问题:
- 参考的方案默认集群预装了
virtualenv工具,但加载的PYTHON/3.7.4模块没有带这个命令,直接调用就会报virtualenv: command not found,虚拟环境从一开始就没创建成功。 - 虚拟环境不存在,自然找不到
/env/bin/activate激活文件,后续装包操作根本没有运行在隔离环境中。 - 集群默认pip源要么没有同步
evaluate==0.1.2版本,要么当前用户没有全局Python环境的装包权限,直接装包必然报找不到对应版本的错误,最终运行脚本时触发ModuleNotFoundError。 - 不要尝试把本地Python包路径加到服务器的PYTHONPATH里,本地和集群的操作系统、CPU架构、底层编译依赖版本大概率不一致,硬加不仅包无法正常运行,确实有概率搞乱系统Python的依赖环境,完全没必要这么操作。
解决步骤
所有操作都在个人作业目录下完成,不会修改任何系统级配置,不用担心破坏原有运行环境:
- 先在登录节点提前准备好运行环境,不要把创建虚拟环境、安装依赖的步骤全塞到Slurm作业脚本里交给计算节点执行。首先加载需要用到的Python模块:
module load PYTHON/3.7.4 - 用Python自带的venv模块创建独立虚拟环境,不需要依赖未预装的virtualenv:
python -m venv ./job_env - 激活刚创建的虚拟环境,升级pip并切换国内镜像源解决找不到包的问题,再安装所需依赖:
如果这步提示Python版本不兼容,就退出虚拟环境,换集群里更高版本的Python模块(3.8及以上均可),重复上述建环境、装包的步骤即可。source ./job_env/bin/activate pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install evaluate==0.1.2 - 编写Slurm提交脚本,不要加自动创建虚拟环境的逻辑,直接加载模块、激活提前建好的环境再跑脚本即可,参考示例:
#!/bin/bash #SBATCH --job-name=comet_eval #SBATCH --output=run_%j.log #SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=4 # 加载依赖模块,和之前使用的版本保持一致 module load GCC/10.2.0 module load ROCM/5.1.1 module load mkl/2018.4 module load PYTHON/3.7.4 # 激活虚拟环境,建议写虚拟环境的绝对路径,避免调度时工作目录异常找不到文件 source /个人用户目录/作业所在路径/job_env/bin/activate # 运行计算脚本 python eval_comet.py - 写完脚本直接用
sbatch命令提交即可,所有依赖都存放在个人目录的虚拟环境中,和系统环境完全隔离,不会产生冲突。
内容的提问来源于stack exchange,提问作者zest16
相关产品推荐
相关产品推荐

