You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SLURM任务sbatch提交失败但srun运行成功的原因排查求助

问题:sbatch提交SLURM任务失败,srun却能正常运行

有用户在集群提交任务时,遇到sbatch提交任务失败,但用srun直接运行却能成功的情况,错误信息如下:

Unable to init server: Could not connect: Connection refused

(canavier_model_changes_no_plots.py:1589287): Gdk-CRITICAL **: 22:46:57.434: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed

can't open DISPLAY

用户提供的SLURM脚本:

#SBATCH --job-name=networkmodel

#SBATCH --nodes=1

#SBATCH --cpus-per-task=10

#SBATCH --mem-per-cpu=4G

#SBATCH --time=00-00:05:00

python3 canavier_model_changes_no_plots.py

用户原本以为是代码中matplotlib绘图部分导致问题,但移除相关代码后任务依然失败。


原因分析

srun能成功是因为你在登录节点执行srun时,会话继承了当前的DISPLAY环境变量(比如通过X11转发连接集群),程序可以找到可用的显示服务;而sbatch提交的任务是在计算节点后台运行,计算节点没有图形界面环境,DISPLAY变量不存在或无效,程序尝试访问图形显示时就会报错。即使移除了matplotlib绘图代码,可能代码中还有其他依赖图形环境的模块(比如某些科学计算库、GUI相关组件)在初始化时会尝试连接显示。

解决办法

  1. 强制设置matplotlib为非交互式后端
    在Python代码开头添加:

    import matplotlib
    matplotlib.use('Agg')
    

    或者在SLURM脚本的python3命令前添加环境变量设置:

    export MPLBACKEND=Agg && python3 canavier_model_changes_no_plots.py
    
  2. 清除DISPLAY变量
    修改SLURM脚本,添加unset DISPLAY避免程序尝试连接无效的显示:

    #SBATCH --job-name=networkmodel
    #SBATCH --nodes=1
    #SBATCH --cpus-per-task=10
    #SBATCH --mem-per-cpu=4G
    #SBATCH --time=00-00:05:00
    
    unset DISPLAY
    python3 canavier_model_changes_no_plots.py
    
  3. 检查代码中的GUI依赖
    排查代码中是否有tkinter、PyQt等GUI相关模块的导入或调用,这些模块在无图形环境的计算节点会触发报错,需要替换为非GUI实现或禁用相关逻辑。


内容的提问来源于stack exchange,提问作者hduece

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:10:26