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

Slurm集群上Snakemake重复下载Zenodo文件报错,本地运行正常

问题分析与解决

核心问题

在Slurm集群环境下,使用Snakemake 8.11.6搭配Slurm执行器运行工作流时,Zenodo存储插件对a.tar.gz的重复下载触发了429请求限制错误,但b.tar.gz和Git仓库相关步骤运行正常;本地执行完全无异常。

可能原因及对应解决方案

1. 跨节点缓存路径不统一

  • 原因:--keep-storage-local-copies在集群中,不同Slurm节点的本地缓存路径未共享,导致每个节点都重新下载a.tar.gz;而b.tar.gz解压后文件名与Git目录b的文件同名,Snakemake直接复用了Git中已存在的文件,跳过了重复下载。
  • 解决:
    • 指定共享存储路径作为统一缓存目录,通过--storage-zenodo-local-prefix参数配置:
      snakemake --profile <profile> --keep-storage-local-copies --storage-zenodo-local-prefix /scratch/user/shared_cache --sdm conda --configfile config/config.yml --directory /scratch/user/something
      
    • 检查Slurm profile配置,确保所有作业使用统一的工作目录和缓存相关环境变量,避免节点本地临时目录被重复调用。

2. Checkpoint输出跟踪失效

  • 原因:work_a依赖a.tar.gz解压后的多文件,这些文件由checkpoint生成,集群模式下Snakemake无法正确关联checkpoint输出文件与a.tar.gz的依赖关系,导致wildcard触发时反复发起存储请求。b.tar.gz因同名文件已存在于Git目录,无需触发下载。
  • 解决:
    • 在checkpoint规则中显式指定输出路径,并添加persist=True参数确保文件被持久化跟踪:
      checkpoint get_a_data:
          output:
              directory("a_unpacked"),
          persist=True
          shell:
              "zenodo-get <a-tar-url> | tar xzf - -C a_unpacked"
      
    • 在work_a规则中明确依赖checkpoint输出的完整路径,避免wildcard匹配的模糊性。

3. 存储缓存验证逻辑异常

  • 原因:集群共享存储的元数据同步延迟、文件权限问题,导致Snakemake每次都判定a.tar.gz缓存失效,重新下载;b.tar.gz因Git文件的哈希匹配通过,无需验证Zenodo存储文件。
  • 解决:
    • 手动预下载a.tar.gz到共享缓存目录,确保权限正确:
      zenodo-get <a-tar-url> --local-prefix /scratch/user/shared_cache
      
    • 临时调整存储验证级别(生产环境谨慎使用):
      snakemake --profile <profile> --keep-storage-local-copies --storage-verify none --sdm conda --configfile config/config.yml --directory /scratch/user/something
      

4. 并行调度触发请求过载

  • 原因:work_a的wildcard规则被多个Slurm作业同时触发,短时间内大量请求触发Zenodo的429限制;work_b因文件已存在,作业直接跳过下载步骤。
  • 解决:
    • 在work_a规则中限制并行度:
      rule work_a:
          input:
              git_a_files=expand("git_repo/a/{file}", file=checkpoint.get_a_data.output),
              unpacked_a_files=expand("a_unpacked/{wildcard}"),
          resources:
              slurm_jobs=1
          shell:
              # 执行work_a逻辑
      
    • 给Zenodo存储插件添加请求速率限制:
      snakemake --profile <profile> --keep-storage-local-copies --storage-zenodo-rate-limit 1 --sdm conda --configfile config/config.yml --directory /scratch/user/something
      

验证步骤

  1. 手动预下载a.tar.gz到共享缓存目录,运行工作流验证是否仍重复下载。
  2. 用snakemake --list-output查看输出文件列表,确认checkpoint输出被正确追踪。
  3. 测试单节点运行工作流(关闭Slurm并行),排除集群调度导致的冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:28:26