slurm初步使用

先使用脚本.sh

 1 #!/bin/bash
 2 #SBATCH --job-name=test
 3 #SBATCH -p amd_256
 4 #SBATCH --error=log/%J.err
 5 # 作业运行的标准错误输出将写到文件log/[JOB ID].err文件中
 6 #SBATCH --output=log/%J.out
 7 # 作业运行的标准输出将写到文件log/[JOB ID].out文件中
 8 #SBATCH --time=1:00:00
 9 
10 #### 第一部分:环境配置(可选) ####
11 module load java/1.8.0_221-public3
12 # 1. 使用module指令载入所需的软件环境 #
13 # 2. 配置其他必要的环境变量 #
14 
15 #### 第二部分:获取主节点(即编号为0的slurm task)所在机器的Infiniband网卡IP地址
16 
17 NETWORK_INTERFACE=ib0
18 master_ip=$(srun --ntasks=1 --nodes=1 bash -c "ip -4 addr show $NETWORK_INTERFACE | grep -oP '(?<=inet ).*(?=/)'")
19 echo "The IP address of the master task is" $master_ip
20 random_port=$(($RANDOM + 10000))
21 
22 #### 第二部分:执行具体的程序 ####
23 ### 使用driver-script.py脚本来具体启动与运行程序,将主进程所在机器的IP地址、一个随机端口号作为启动脚本的参数
24 srun python3 driver-script.py $master_ip $random_port

然后加上.py脚本

 1 #!/usr/bin/env python3
 2 import os
 3 import sys
 4 import subprocess
 5 import time
 6 
 7 ## 第一部分:获得关键变量(本部分代码不要修改)
 8 # 主进程所在机器的IP地址
 9 master_ip = sys.argv[1]
10 # 主进程用于监听的一个随机端口号
11 master_port = int(sys.argv[2])
12 # 当前进程编号
13 proc_id = int(os.environ["SLURM_PROCID"])
14 # 本次计算参与的总进程数
15 num_proc = int(os.environ["SLURM_NTASKS"])
16 
17 ## 第二部分:启动计算所业(需要修改)
18 
19 if proc_id == 0:
20     # 启动主进程
21     print("Start the master process...")
22     # 通过os.system函数调用其他程序,启动主进程(修改这里)
23     #os.system("ls -lh") 
24     try:
25         subprocess.run(f"java -cp 1.jar org.example.TotalClient {master_port}", shell=True, stdout=sys.stdout, stderr=sys.stderr)
26     except subprocess.TimeoutExpired:
27         pass
28     print("The main process finishes.")
29 else:
30     # 启动从进程
31     time.sleep(10)  # 等待1s,等待主进程启动
32     print("Start the worker process {}...".format(proc_id))
33     # 通过os.system函数调用其他程序,启动从进程(修改这里)
34     #os.system("ls -lh")
35     subprocess.run(f"java -cp 1.jar org.example.PrimeNumberClient {master_ip} {master_port}", shell=True, stdout=sys.stdout, stderr=sys.stderr)
36     print("The worker process {} finishes.".format(proc_id))

将这两个脚本上传到平台的同一个文件夹,jar包也要放入这个文件(运用sftp parasc进行上传)

再用ssh parasc进入超算平台

进入xiaocai,输入

1 sbatch --nodes=1 --ntasks-per-node=5 文件名.sh
2 cd log
3 cat 任务名.out
4 scancel 人物名

发现没有进行多线程保护

目前可以在Server端实现gRPC的每个方法头添加上synchronized关键字(这个关键字可以保证Server端在同一时间只处理一个Client发来的请求,不会同时并行的处理多个Client发来的请求)。就是public synchronized void signClient...

posted @ 2024-02-15 10:19  小菜碟子  阅读(86)  评论(0编辑  收藏  举报