我正在尝试使用 GNU 并行在我们使用 SLURM 的超级计算机上使用 MATLAB 运行一组实验。我有一个文本文件,其中包含 4 个参数的组合,这些参数被读入并传递给 MATLAB 函数。该文本文件称为
gnu_parameters.txt
,有 4 列,并用一个空格分隔。
fs_method data_name use_vars 1
fs_method1 data_name use_vars 1
fs_method3 data_name use_vars 1
其中第 1-3 列参数应以字符串形式读入,参数 4 为数字。
我想并行运行每个参数组合以加快该过程。我的 SLURM 脚本如下,但是当我使用符号
{1} {2} {3} {4}
告诉 GNU-parallel 将每个参数放在哪里时,我收到一条错误,指出 MATLAB 无法识别变量 fs_method
。查看日志告诉我,该错误意味着 MATLAB 没有将 fs_method
读取为字符串。为了解决这个问题,我尝试在 SLURM 脚本中添加单引号,如下所示:
#!/bin/bash -l
#SBATCH --time=4-00:00:00
#SBATCH --ntasks=1
#SBATCH --mem=1200g
#SBATCH --tmp=500g
#SBATCH --cpus-per-task=115
#SBATCH --mail-type=FAIL,END
#SBATCH --mail-user=myemail
#SBATCH -p groupPartition
cd $WRK_DIR
module load matlab
module load parallel
export JOBS_PER_NODE=$(( $SLURM_CPUS_ON_NODE / $SLURM_CPUS_PER_TASK ))
echo $JOBS_PER_NODE
cat gnu_parameters.txt | parallel --jobs $JOBS_PER_NODE --joblog tasklog.log --progress --colsep ' ' 'matlab -nodisplay -r "run_holdout_parallel('{1}', '{2}', '{3}', {4});exit" '
以下是日志文件、错误文件和输出文件的摘录。
日志
Seq Host Starttime JobRuntime Send Receive Exitval Signal Command
1 : 1719498346.300 14.911 0 298 0 0 matlab -nodisplay -r "run_holdout_parallel(fs_method, data_name, use_vars, 1);exit"
2 : 1719498361.751 14.387 0 298 0 0 matlab -nodisplay -r "run_holdout_parallel(fs_method1, data_name, use_vars, 1);exit"
3 : 1719498376.666 14.385 0 298 0 0 matlab -nodisplay -r "run_holdout_parallel(fs_method3, data_name, use_vars, 1);exit"
错误文件
local:1/0/100%/0.0s sh: /dev/tty: No such device or address
local:1/0/100%/0.0s sh: /dev/tty: No such device or address
local:1/0/100%/0.0s {Unrecognized function or variable 'fs_method'.
}
local:0/1/100%/15.0s
输出文件
< M A T L A B (R) >
Copyright 1984-2023 The MathWorks, Inc.
R2023b Update 7 (23.2.0.2515942) 64-bit (glnxa64)
January 30, 2024
To get started, type doc.
For product information, visit www.mathworks.com.
< M A T L A B (R) >
Copyright 1984-2023 The MathWorks, Inc.
R2023b Update 7 (23.2.0.2515942) 64-bit (glnxa64)
January 30, 2024
To get started, type doc.
For product information, visit www.mathworks.com.
但这会返回相同的错误。如何将这些参数作为字符串传递给 MATLAB?有没有比我正在做的方法更好的并行运行这些实验的方法?
问题在于引号是如何转义的。对我有用的方法是
'matlab -nodisplay -r "run_holdout_parallel(\\\"{1}\\\", \\\"{2}\\\", \\\"{3}\\\", {4});exit" '
出于某种原因,使用评论中的答案
'matlab -nodisplay -r "run_holdout_parallel('"'"{1}"'"', '"'"{2}"'"', '"'"{3}"'"', {4});exit" '
运行良好,但没有执行任何命令。