Slurm作业脚本指定Git分支不生效的解决方案
Slurm作业Git分支切换不生效解决方案
核心问题是Slurm作业运行时的环境和你交互提交作业时的shell环境完全独立,你在交互端做的分支切换、路径切换,不会自动带到作业运行环境里,常见踩坑点如下:
- 作业启动时默认工作目录是你的用户家目录,不是你执行
sbatch命令时所在的Git仓库路径,直接执行git checkout要么找不到仓库,要么操作的是错误位置的文件 - 作业如果需要排队等待调度,你提交作业后手动切回其他分支,等作业真正启动时,仓库目录已经在main分支了,自然会跑main的代码
- 如果之前在conda环境里用
pip install -e .以可编辑模式装过main分支的代码,Python会优先导入环境中注册的包路径,无视你当前所在的Git分支
修正后的可直接用的作业脚本
把脚本里的仓库路径替换成你自己的实际绝对路径即可,所有校验逻辑都会把状态打到日志里,方便排查问题:
#!/bin/bash # 作业配置参数,可根据自己需求调整 #SBATCH --job-name=test_branch_task #SBATCH --output=task_%j_out.log #SBATCH --error=task_%j_err.log # 清理预加载模块 module purge > /dev/null 2>&1 # 加载conda环境 module load anaconda conda activate my_env # ------------ 核心修复逻辑 ------------ # *不要用相对路径*,替换成你Git仓库的实际绝对路径 REPO_ABS_PATH="/home/your_username/your_project_repo" # 切换到仓库目录,切换失败直接退出作业,避免后续逻辑跑错位置 cd $REPO_ABS_PATH || exit 1 # 同步远端分支状态,避免本地分支缓存异常 git fetch origin # 强制切到目标分支,丢弃本地未提交的改动(如果有需要保留的改动请提前提交) git checkout -f test_branch git pull origin test_branch # 把当前分支打印到日志里,第一时间确认分支是否正确 echo "=== Running on git branch: $(git rev-parse --abbrev-ref HEAD) ===" # -------------------------------------- # 执行Python脚本,用绝对路径调用避免路径歧义 python ${REPO_ABS_PATH}/my_python_script.py
仍未生效时的排查步骤
- 先看作业日志里打印的分支名,如果不是
test_branch,先检查REPO_ABS_PATH是否写对,看git命令的报错信息,绝大多数情况都是路径配置错误 - 如果日志显示已经在test_branch,但运行结果还是main分支的逻辑,直接在conda环境里执行
pip list | grep 你的项目名,看是不是装过editable模式的main分支版本。解决方法是切到test_branch后,在脚本里加一行pip install -e . --force-reinstall,覆盖环境里的旧版本包即可 - 不要依赖提交作业时手动切的分支状态,所有分支切换操作必须写在Slurm脚本里,作业调度的排队时间从几秒到几天不等,交互端的操作不会同步到作业运行环境
内容的提问来源于stack exchange,提问作者user1093541
相关产品推荐
相关产品推荐

