GNU Parallel не передает строки в MATLAB

Я пытаюсь использовать GNU параллельно для проведения серии экспериментов с использованием MATLAB на нашем суперкомпьютере, который использует SLURM. У меня есть текстовый файл, содержащий комбинации из 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 приведен ниже, но когда я говорю GNU-parallel, куда поместить каждый параметр, используя обозначение {1} {2} {3} {4}, я получаю сообщение об ошибке, что MATLAB не распознает переменную fs_method. Просмотр журнала говорит мне, что ошибка означает, что MATLAB не читает как строку. Чтобы это исправить, я попробовал добавить одинарные кавычки в сценарий 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? Есть ли лучший способ провести эти эксперименты параллельно, чем тот метод, который я использую?

Можете ли вы поделиться соответствующим разделом журнала и/или выводом консоли?

Cris Luengo 27.06.2024 16:33

@CrisLuengo Да, я отредактировал свой вопрос, включив их.

m13op22 27.06.2024 16:43

Ага, понятно. Возможно, вам придется избежать кавычек. run_holdout_parallel(\'{1}\',

Cris Luengo 27.06.2024 17:01

@CrisLuengo Хорошая мысль. Я попробовал это и получил синтаксическую ошибку /var/spool/slurmd/job19168324/slurm_script: line 16: syntax error near unexpected token `)'` . Я думаю, что проблема в синтаксисе этих кавычек. Я не эксперт в bash :/

m13op22 27.06.2024 17:15

Да, кавычки в bash я всегда делаю методом проб и ошибок, я их правда не понимаю. Я думаю, что часть {1} должна быть за пределами одинарных кавычек. Но вам нужны одинарные кавычки для передачи в MATLAB. Так может быть что-то вроде run_holdout_parallel(\''{1}'\',?

Cris Luengo 27.06.2024 17:22

В настоящее время в журнале вы видите, что выполняется команда matlab -nodisplay -r "run_holdout_parallel(fs_method, data_name, use_vars, 1);exit". Вам нужно настроить bash-скрипт так, чтобы это стало matlab -nodisplay -r "run_holdout_parallel('fs_method', 'data_name', 'use_vars', 1);exit". Иногда кавычки необходимо экранировать дважды (\\\'), если они проходят два этапа интерпретации bash. Не спрашивай...

Cris Luengo 27.06.2024 17:24

Очевидно, вы не можете избежать одинарных кавычек. Вот обходной путь: stackoverflow.com/a/1250279/7328782 -- Так что, я думаю, будет run_holdout_parallel('"'"{1}"'"',.

Cris Luengo 27.06.2024 17:29

@CrisLuengo казалось, что это сработало, но в файле журнала ничего не отображается. Может быть, просто нужно время...

m13op22 27.06.2024 19:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема в том, как экранируются кавычки. Способ, который работает для меня, это

'matlab -nodisplay -r "run_holdout_parallel(\\\"{1}\\\", \\\"{2}\\\", \\\"{3}\\\", {4});exit" '

Почему-то воспользовавшись ответом в комментариях

'matlab -nodisplay -r "run_holdout_parallel('"'"{1}"'"', '"'"{2}"'"', '"'"{3}"'"', {4});exit" '

работал нормально, но команды не выполнялись.

Несколько советов, которые не дают прямого ответа на ваш вопрос, но могут быть полезны для более эффективного выполнения вашей работы.

  • Уточните у своего системного администратора, есть ли у вас Параллельный сервер MATLAB. Как правило, это более «эффективно» с точки зрения использования лицензий в кластере — ваш подход будет использовать несколько «полных лицензий MATLAB», а не просто рабочие лицензии Parallel Server.
  • Если вы можете использовать MATLAB Parallel Server, вы можете использовать простые конструкции MATLAB высокого уровня, такие как parfor, чтобы масштабировать свою работу до вашего кластера.
  • Если у вас нет Parallel Server, возможно, у вас еще есть Parallel Computing Toolbox и, следовательно, вы сможете запускать parpool('local') на узле, выделенном вам SLURM.
  • В наши дни matlab -batch является гораздо лучшим вариантом, чем matlab -r для подобных вещей.
Ответ принят как подходящий

Я ненавижу цитировать. man parallel говорит:

Вывод: если это сбивает с толку, подумайте о том, чтобы избежать необходимости иметь дело с кавычками, написав небольшой скрипт или функцию (не забудьте экспортировать -f функцию) и использовать параллельный вызов GNU.

Итак, в вашем случае создайте функцию:

run_holdout() {
  echo This should run_holdout_parallel on $1 $2 $3 $4
  matlab -nodisplay -r "run_holdout_parallel(\"$1\", \"$2\", \"$3\", $4);exit"
}

Когда вы можете запустить это в командной строке:

$ run_holdout fs_method3 data_name use_vars 1 

и это работает, затем распараллелите с:

$ export -f run_holdout
$ ... | parallel run_holdout {1} {2} {3} {4} 

Спасибо, это очень хорошо работает и легче читается!

m13op22 19.07.2024 21:02

Другие вопросы по теме