0

0

在Slurm中通过Python脚本调用srun的性能考量与最佳实践

霞舞

霞舞

发布时间:2025-11-22 13:50:18

|

677人浏览过

|

来源于php中文网

原创

在Slurm中通过Python脚本调用srun的性能考量与最佳实践

在slurm集群中,通过bash脚本提交python脚本,再由python脚本调用`srun`来启动大规模并行计算任务,这种嵌套调用方式在启动阶段会引入极小的、几乎可以忽略的开销。只要python脚本的主要作用是任务编排且在并行任务启动后不进行大量计算,它对整个hpc工作负载的运行时性能不会产生负面影响。

1. 工作流解析

在高性能计算(HPC)环境中,通过Slurm调度系统提交任务是一种标准实践。当需要在一个更复杂的任务流中启动并行计算时,常见的工作流可能涉及多层脚本调用。本文将探讨一种具体场景:通过sbatch提交一个Bash脚本,该Bash脚本随后执行一个Python脚本,而这个Python脚本又通过subprocess模块调用srun来启动实际的大规模并行工作负载。其典型的执行链如下:

sbatch 命令 -> Bash Script -> Python Script -> srun 命令 -> HPC Workload

在这种工作流中,sbatch负责向Slurm提交整个作业,Bash Script作为入口点,Python Script则扮演着灵活的编排者角色,例如处理输入参数、配置环境或执行预处理步骤。最终,Python Script通过调用srun来启动由Slurm管理的实际并行计算任务。

2. 性能考量

用户普遍关心的问题是,这种多层嵌套的调用方式,特别是Python脚本作为中间层,是否会引入显著的性能开销,从而影响最终HPC工作负载的效率。

立即学习Python免费学习笔记(深入)”;

2.1 启动开销 (Startup Overhead)

当sbatch提交作业后,Slurm会分配资源并启动Bash脚本。Bash脚本随后启动Python解释器来执行Python脚本。Python解释器的启动和Python脚本的执行会消耗一定的CPU时间和内存。然而,对于大多数HPC任务而言,这部分开销是:

LangChain
LangChain

一个开源框架,用于构建基于大型语言模型(LLM)的应用程序。

下载
  • 极小的 (Negligible): Python解释器的启动时间通常在毫秒级别,即使Python脚本执行一些初始化逻辑,其总耗时也远低于大多数并行计算任务的整体运行时长(通常为数分钟到数小时)。
  • 一次性的 (One-time): 这部分开销仅发生在作业启动阶段,一旦Python脚本成功调用srun并启动了HPC工作负载,Python脚本通常会等待srun完成或直接退出。

因此,这种启动开销对于整个作业的性能影响微乎其微。

2.2 运行时性能 (Runtime Performance)

一旦Python脚本通过subprocess模块成功调用了srun,srun命令会接管控制权,并按照其参数启动并行程序。此时:

  • 资源管理: srun会根据Slurm的分配策略,在已分配给整个作业的节点和核心上启动并行进程。Python脚本本身作为一个进程,会继续占用少量资源,但它通常会等待srun完成。
  • 主工作负载独立性: 实际的HPC工作负载(例如MPI程序、CUDA程序等)在启动后,其性能主要取决于其自身的并行效率、算法复杂度、数据I/O以及Slurm分配的计算资源。Python脚本在后台的存活或等待状态,通常不会对主工作负载的并行通信、计算或I/O性能产生任何影响。

结论: 只要Python脚本的主要职责是编排和启动任务,而不是执行大量的计算密集型或I/O密集型操作,那么它对整个HPC工作负载的运行时性能不会造成负面影响。

3. 示例代码

为了更好地理解这种工作流,以下提供一个简单的示例:

3.1 myscript.sh (Bash提交脚本)

#!/bin/bash
#SBATCH --job-name=python_srun_test
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --time=00:05:00
#SBATCH --output=slurm-%j.out

echo "Starting myscript.sh on $(hostname)"
echo "Slurm job ID: $SLURM_JOB_ID"

# 激活conda环境或设置Python环境(如果需要)
# source /path/to/your/conda/etc/profile.d/conda.sh
# conda activate my_hpc_env

# 执行Python脚本,Python脚本将调用srun
python running.py "Hello HPC!"

echo "myscript.sh finished."

3.2 running.py (Python编排脚本)

import subprocess
import sys
import os

def run_hpc_workload(message):
    """
    通过srun调用一个简单的并行HPC程序。
    这里以一个简单的MPI程序为例,实际可以是任何并行应用。
    """
    # 假设你有一个名为 'my_mpi_program' 的MPI可执行文件
    # 并且它位于PATH中或者指定了完整路径
    hpc_program = "./my_mpi_program" # 假设my_mpi_program在当前目录

    # 构建srun命令。注意:srun会继承sbatch分配的资源。
    # 这里我们只传递了程序名和参数。
    # 如果需要更精细的srun控制,可以在这里添加更多srun参数,
    # 但通常sbatch的参数已经足够。
    srun_command = [
        "srun",
        hpc_program,
        message # 传递给HPC程序的参数
    ]

    print(f"Python script is about to call srun: {' '.join(srun_command)}")

    try:
        # 使用subprocess.check_call执行srun命令
        # check_call会在命令返回非零退出码时抛出CalledProcessError
        subprocess.check_call(srun_command)
        print("srun command executed successfully.")
    except subprocess.CalledProcessError as e:
        print(f"Error calling srun: {e}", file=sys.stderr)
        sys.exit(e.returncode)
    except FileNotFoundError:
        print(f"Error: '{hpc_program}' not found. Make sure it's compiled and in the correct path.", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    # 获取从bash脚本传递的参数
    if len(sys.argv) > 1:
        param = sys.argv[1]
    else:
        param = "Default Message"

    print(f"Python script running on host: {os.uname().nodename}")
    print(f"Received parameter: {param}")

    run_hpc_workload(param)
    print("Python script finished its orchestration role.")

3.3 my_mpi_program.c (一个简单的MPI程序示例)

#include 
#include 
#include 

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);

    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    char message[256];
    if (argc > 1) {
        strncpy(message, argv[1], sizeof(message) - 1);
        message[sizeof(message) - 1] = '\0';
    } else {
        strcpy(message, "No message provided.");
    }

    printf("Hello from processor %s, rank %d out of %d processes. Message: %s\n",
           processor_name, world_rank, world_size, message);

    MPI_Finalize();
    return 0;
}

3.4 编译MPI程序并提交作业

  1. 编译MPI程序:
    mpicc my_mpi_program.c -o my_mpi_program
  2. 提交Slurm作业:
    sbatch myscript.sh

4. 注意事项与最佳实践

  • 错误处理: 在Python脚本中,务必对subprocess.check_call进行适当的错误处理,例如使用try-except块捕获CalledProcessError,以便在srun命令失败时能及时发现问题并采取措施。
  • 环境管理: 确保Python脚本及其调用的HPC程序在Slurm作业环境中能够找到所有必要的库和可执行文件。这可能涉及在Bash脚本中激活conda环境、设置PATH或LD_LIBRARY_PATH等环境变量
  • 资源继承: srun在Python脚本中被调用时,它会继承由sbatch为整个作业分配的资源(节点、任务数、CPU等)。通常情况下,无需在Python脚本中再次显式地为srun指定这些资源参数,除非你需要在一个已分配的资源子集上运行更小的并行任务。
  • Python脚本的生命周期: 如果Python脚本在调用srun后没有其他任务,可以考虑让它在srun命令完成后退出,以释放其占用的少量资源。subprocess.check_call默认会等待子进程完成。
  • 避免不必要的计算: 确保Python脚本在调用srun之前和之后,不执行任何长时间运行或资源密集型的计算任务,除非这些任务是整个工作流的必要组成部分。
  • 日志记录: 在Python脚本中添加详细的日志记录,可以帮助调试和理解作业的执行流程,特别是在复杂的编排场景中。

5. 总结

在Slurm中通过Bash脚本提交Python脚本,再由Python脚本调用srun来启动大规模并行计算任务,是一种完全可行且常见的模式。这种方法在启动阶段引入的开销可以忽略不计,并且对主HPC工作负载的运行时性能没有实质性影响。关键在于将Python脚本作为高效的任务编排工具,而不是计算密集型任务的执行者。通过遵循上述最佳实践,可以确保这种嵌套调用方式既能提供灵活性,又能保持HPC任务的高效执行。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

753

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

707

2023.08.11

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.7万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号