- すべてのアプリケーションの保存するためのディレクトリ名を
./conf.yml.erb
のapps_dir
に記入します。ここでは、apps_dir: ./apps
とします。 ./apps/
以下にアプリケーション用のディレクトリを作成します。アプリケーション名をtest
とした場合、./apps/test
を作成します。- 下記の設定ファイルを作成します。Embedded Ruby形式で作成する場合は、各ファイル名を
form.yml.erb
とmanifest.yml.erb
にしてください。
./apps/test/form.yml
:Webフォームの設定./apps/test/manifest.yml
:アプリケーションの説明
form.yml
は、form
、header
、script
、check
、submit
というキーで構成されており、それぞれメインウィジット、ヘッダウィジット、ジョブスクリプト、チェックスクリプト、ジョブ投入時の前処理を定義します。form
とscript
は必須項目ですが、header
、check
、submit
は省略できます。
次の図はform
、header
、script
の担当範囲を示しています。form
とheader
とscript
からジョブスクリプトが生成されます。header
を省略した場合は./lib/header.yml.erb
が代わりに利用されます(ほとんどの場合、header
をform.yml
で定義する必要はないでしょう)。なお、左上のアプリケーションの説明などはmanifest.yml
の担当範囲です。
check
はウィジットに設定された値のチェックをジョブの投入前に行います。submit
はジョブスケジューラにジョブを投入する際の前処理を定義します。
数値の入力欄を表示します。下の例のnodes
はウィジットの変数名です。label
はラベル、value
は初期値、min
は最小値、max
は最大値、step
はステップ幅です。required
は必須であるかどうかを指定します。help
は入力欄の下に表示されるヘルプメッセージです。ジョブスクリプトにはscript
内の文字列が表示されます。script
の中の#{nodes}
は入力した値に置き換えられます。
form:
nodes:
widget: number
label: Number of nodes (1 - 128)
value: 4
min: 1
max: 128
step: 1
required: false
help: The larger the number, the longer the wait time.
script: |
#SBATCH --nodes=#{nodes}
複数の数値の入力欄を表示することもできます。その場合、size
で入力欄の数を記述し、各項目を配列形式で記述します。script
の#{time_1}
と#{time_2}
は、1つ目と2つ目に入力した値に置き換えられます。
form:
time:
widget: number
label: [ Maximum run time (0 - 24 h), Maximum run time (0 - 59 m) ]
size: 2
value: [ 1, 0 ]
min: [ 0, 0 ]
max: [ 24, 59 ]
step: [ 1, 1 ]
script: |
#SBATCH --time=#{time_1}:#{time_2}:00
label
が配列形式ではない場合、一行の長いタイトルを記述することができます。help
も同様です。
form:
time:
widget: number
label: Maximum run time (0 - 24 h, 0 - 59 m)
size: 2
value: [ 1, 0 ]
min: [ 0, 0 ]
max: [ 24, 59 ]
step: [ 1, 1 ]
ジョブスクリプトのラベル(デフォルトは「Script Content」)を変更したい場合はscript
に対してlabel
を設定します。その場合、ジョブスクリプトはcontent
に記述します。
script:
label: Script Details
content: |
#SBATCH --nodes=#{nodes}
check
のサンプルは下記の通りです。Rubyスクリプトで記述します。下記のサンプルでは、24時間以上の値が入力された状態で「Submit」ボタンをクリックすると、エラーメッセージが出力され、ジョブスクリプトの投入は行わないことを意味しています。form
の変数を参照する場合は、@マークの後に変数名を記述してください。なお、すべての変数は文字列であることに注意ください。
check
では、下記の特殊な変数も利用できます。
- @OC_APP_NAME :
manifest.yml
のname
で定義しているアプリケーション名 - @OC_APP_PATH :
form.yml
が保存されているアプリケーションのパス(例:/Slurm
) - @OC_SCRIPT_LOCATION : ヘッダで定義されている
Script Location
- @OC_SCRIPT_NAME : ヘッダで定義されている
Script Name
- @OC_JOB_NAME :ヘッダで定義されている
Job Name
form:
time:
widget: number
label: [ Maximum run time (0 - 24 h), Maximum run time (0 - 59 m) ]
size: 2
value: [ 1, 0 ]
min: [ 0, 0 ]
max: [ 24, 59 ]
step: [ 1, 1 ]
script: |
#SBATCH --time=#{time_1}:#{time_2}:00
check: |
if @time_1.to_i == 24 && @time_2.to_i > 0
halt 500, "Exceeded Time"
end
submit
のサンプルは下記の通りです。シェルスクリプトで記述します。form
の変数を参照する場合は、form
と同様に#{...}
を利用してください。環境変数OC_SUBMIT_OPTIONS
は、ジョブスクリプト投入コマンドに追加のオプションを設定できます。この処理の実行後に、ジョブスクリプトを投入するためのコマンド(例えば、sbatch #{OC_SUBMIT_OPTIONS} -J #{OC_JOB_NAME} #{OC_SCRIPT_NAME})が実行されます。
submit: |
#!/bin/bash
cd #{OC_SCRIPT_LOCATION}
mv #{OC_SCRIPT_NAME} param.conf
genjs_ct param.conf > #{OC_SCRIPT_NAME}
OC_SUBMIT_OPTIONS="-n 1"
テキストの入力欄を表示します。
form:
comment:
widget: text
value: test
label: Comment
script: |
#SBATCH --comment=#{comment}
複数のテキストの入力欄を1行で表示することも可能です。
form:
option:
widget: text
value: [ --comment=, test ]
label: [ option, argument ]
size: 2
script: |
#SBATCH #{option_1}#{option_2}
widget: text
とほぼ同じですが、「Submit」ボタンをクリックする際にメールアドレスの形式がチェックされます。
form:
email:
widget: email
label: Email
script: |
#SBATCH --mail-user=#{email}
セレクトボックスをウィジットに表示します。options
に選択肢を配列形式で記述します。配列の1つ目の要素はセレクトボックスの項目名です。script
の#{partition}
はoptions
の2つ目の要素に置き換えられます。
form:
partition:
widget: select
label: Partition
value: Large Queue
options:
- [ Small Queue, small ]
- [ Large Queue, large ]
script: |
#SBATCH --partition=#{partition}
options
の2つ目の要素は配列で記述することも可能です。下記の例では、script
の#{package_1}
と#{package_2}
は、配列の第1要素と第2要素に置き換えられます。後述のwidget: multi_select
、widget: radio
、widget: checkbox
でも可能です。
form:
package:
widget: select
label: Select package
options:
- [A, [packageA, a.out]]
- [B, [packageB, b.out]]
script: |
module load #{package_1}
mpiexec #{package_2}
複数の項目を選択できる入力欄を表示します。options
に選択肢を記述します。
form:
load_modules:
widget: multi_select
label: Add modules
value: mpi/mpich-x86_64
options:
- [mpi/mpich-x86_64, mpi/mpich-x86_64]
- [mpi/openmpi-x86_64, mpi/openmpi-x86_64]
- [nvhpc/24.3, nvhpc/24.3]
- [nvhpc/24.5, nvhpc/24.5]
- [nvhpc/24.7, nvhpc/24.7]
script: |
module load #{load_modules}
例えばmpi/mpich-x86_64
とnvhpc/24.7
を選択した場合は、ジョブスクリプトは下記のように複数行で表示されます。
module load mpi/mpich-x86_64
module load nvhpc/24.7
1行で表示したい場合は、separator
で区切り文字を設定します。
form:
load_modules:
widget: multi_select
label: Add modules
value: mpi/mpich-x86_64
separator: " "
options:
- [mpi/mpich-x86_64, mpi/mpich-x86_64]
- [mpi/openmpi-x86_64, mpi/openmpi-x86_64]
- [nvhpc/24.3, nvhpc/24.3]
- [nvhpc/24.5, nvhpc/24.5]
- [nvhpc/24.7, nvhpc/24.7]
script: |
module load #{load_modules}
選択された項目が、separator
で設定した区切り文字を用いて1行で表示されます。
module load mpi/mpich-x86_64 nvhpc/24.7
value
に複数の初期値を設定する場合は、配列形式で記述します。
form:
load_modules:
widget: multi_select
label: Add modules
value: [mpi/mpich-x86_64, nvhpc/24.7]
options:
- [mpi/mpich-x86_64, mpi/mpich-x86_64]
- [mpi/openmpi-x86_64, mpi/openmpi-x86_64]
- [nvhpc/24.3, nvhpc/24.3]
- [nvhpc/24.5, nvhpc/24.5]
- [nvhpc/24.7, nvhpc/24.7]
ラジオボタンを表示します。widget: select
とほぼ同じですが、direction: horizontal
が設定可能です。direction: horizontal
を設定すると水平方向にラジオボタンを表示できます。direction: horizontal
がない場合は、垂直方向にラジオボタンを表示します。
form:
jupyter:
widget: radio
label: Jupyter
direction: horizontal
value: Jupyter Lab
options:
- [ Jupyter Lab, jupyterlab ]
- [ Jupyter Notebook, jupyter ]
script: |
module load #{jupyter}
チェックボックスを表示します。次のようにrequired
を配列形式で設定した場合、チェックボックスの各項目が必須かどうかを設定します。
form:
mail_option:
label: Mail option
widget: checkbox
direction: horizontal
value: [ Fail of job, When the job is requeued ]
required: [true, false, true, false, false]
options:
- [ Beginning of job execution, BEGIN ]
- [ End of job execution, END ]
- [ Fail of job, FAIL ]
- [ When the job is requeued, REQUEUE ]
- [ All, ALL ]
script: |
#SBATCH --mail-type=#{mail_option}
次のようにrequired
が配列形式でない場合かつ値がtrue
の場合、そのチェックボックスで1つ以上の項目がチェックがされていないとジョブの投入を行うことができない、という設定になります。
form:
mail_option:
label: Mail option
widget: checkbox
direction: horizontal
value: [ Fail of job, When the job is requeued ]
required: true
options:
- [ Beginning of job execution, BEGIN ]
- [ End of job execution, END ]
- [ Fail of job, FAIL ]
- [ When the job is requeued, REQUEUE ]
- [ All, ALL ]
script: |
#SBATCH --mail-type=#{mail_option}
widget: multi_select
と同様にseparator
の設定を行うことや、widget: radio
と同様にdirection
の設定を行うことができます。
Open Composerが動作しているサーバ上のファイルやディレクトリのパスを選択できる機能です。value
のデフォルトは${HOME}
です。show_files
はファイルを表示するかどうかのフラグであり、デフォルトはtrue
です。favorites
はショートカットパスを設定できます。
form:
working_dir:
widget: path
label: Working Directory
value: /work
show_files: false
favorites:
- /fs/ess
- /fs/scratch
script: |
cd #{working_dir}
script中で利用できる関数としてdirname(FILE_PATH)
とbasename(FILE_PATH)
を提供しています。
ディレクトリ名とファイル名を含むパス名から、dirname()
はディレクトリ部分を、basename()
はファイル部分だけを返します。
form:
input_file:
widget: path
label: Input file
script: |
cd #{dirname(input_file)}
mpiexec ./#{basename(input_file)}
select
、radio
、checkbox
のウィジットである項目を選択すると、他のウィジットの設定を動的に変更できます。
options
の各配列の第3要素以降にset-(min|max|step|label|value|required|help)-(KEY)[-(num|1st element in options)]:(VALUE)
を指定します。
次の例では、node_type
でMedium
を選択すると、cores
のラベルと最大値はNumber of Cores (1-8)
と8
になります。
form:
node_type:
widget: select
label: Node Type
options:
- [ Small, small ]
- [ Medium, medium, set-label-cores: Number of Cores (1-8), set-max-cores: 8 ]
- [ Large, large, set-label-cores: Number of Cores (1-16), set-max-cores: 16 ]
cores:
widget: number
label: Number of Cores (1-4)
value: 1
min: 1
max: 4
step: 1
number
、text
、email
において複数の入力欄を作っていた場合、設定対象の入力欄の指定に_(num)
を用います。次の例では、node_type
でGPU
を選択すると、time
の1つ目の入力欄のラベルと最大値がMaximum run time hours (0 - 24)
と24
になります。
form:
node_type:
widget: select
label: Node Type
options:
- [ 'Standard', '' ]
- [ 'GPU', '', set-label-time_1: Maximum run time (0 - 24h), set-max-time_1: 24 ]
time:
widget: number
label: [ Maximum run time (0 - 72 h), Maximum run time (0 - 59 m) ]
size: 2
value: [ 1, 0 ]
max: [ 72, 59 ]
min: [ 0, 0 ]
step: [ 1, 1 ]
select
、radio
、checkbox
の場合、設定対象のオプションの指定に1st element in options
を用います。次の例では、node_type
でGPU
を選択すると、enable_gpu
のEnable GPU
がチェックされます。
form:
node_type:
widget: select
label: Node Type
options:
- [ 'Standard', '' ]
- [ 'GPU', '', set-value-enable_gpu: Enable GPU ]
enable_gpu:
widget: checkbox
options:
- [ Enable GPU, gpu ]
options
の各配列の第3要素以降に[disable|enable]-(KEY)[-(1st element in options)][_num]
を指定します。
次の例ではcluster
でFugaku
を選択すると、node_type
のGPU
のオプションとcuda_ver
のウィジットが無効化されます。キーを無効化された場合は、そのキーを利用しているscript
中の行も削除されます。
form:
cluster:
widget: select
label: Cluster system
options:
- [ Fugaku, fugaku, disable-node_type-GPU, disable-cuda_ver ]
- [ Tsubame, tsubame ]
node_type:
widget: select
label: Node type
options:
- [ Standard, standard ]
- [ GPU, gpu ]
cuda_ver:
widget: number
label: CUDA version
value: 12
min: 12
max: 14
script: |
module load system/#{node_type}
module load cuda/#{cuda_ver}
options
の各配列の第3要素以降に[hide|show]-(KEY)
を指定します。次の例では、hide_advanced_options
をチェックするとcomment
が非表示になります。無効化とは異なり、そのキーのウィジットが表示されないだけであり、そのキーを利用しているscript
の行には影響しません。indent
はWebフォームの左側にインデントを作成します。数値は1〜5が入力でき、数値が大きくなるほどインデント幅は大きくなります。
form:
hide_advanced_option:
widget: checkbox
options:
- [ 'Hide advanced option', '', hide-comment ]
comment:
widget: text
label: Comment
indent: 1
script: |
#SBATCH --comment=#{comment}
次の例では、show_advanced_options
をチェックするとcomment
が表示されます。
form:
show_advanced_options:
widget: checkbox
options:
- [ 'Show advanced option', '', show-comment ]
comment:
widget: text
label: Comment
indent: 1
script: |
#SBATCH --comment=#{comment}
Widget | label value required help indent |
options (Dynamic Form Widget) |
size | separator | direction | min max step |
show_files favorites |
---|---|---|---|---|---|---|---|
number | ○ | ○ | ○ | ||||
text |
○ | ○ | |||||
select | ○ | ○ (○) | |||||
multi_select | ○ | ○ | ○ | ||||
radio | ○ | ○ (○) | ○ | ||||
checkbox | ○ | ○ (○) | ○ | ○ | |||
path | ○ | ○ |
options
のみは必須項目ですが、他の項目は省略可能です。
form.yml
と同じウィジットを用いることができます。ただし、lib/headers.yml.erb
で定義されているウィジットは必ず同じ名前で定義してください。
アプリケーションの説明を記述します。サンプルは下記の通りです。
name: Gaussian
category: Quantum Chemistry
icon: icon.png
description: |
[Gaussian](https://gaussian.com) is a general purpose computational chemistry software package.
related_app:
- OVITO: ovito.png
- GrADS: bi-airplane-fill
- ImageJ
- name: アプリケーション名(このキーを省略した場合はディレクトリ名が代わりに用いられます)
- category:カテゴリ名
- icon: アイコンのための画像ファイルへのパス。URL、Bootstrapアイコン、Font Awesomeアイコンも利用可能です。Bootstrapアイコンの場合は
icon: bi-airplane-fill
のように記述します。Font Awesomeアイコンの場合はicon: fa-solid fa-gear
のように記述します - description: アプリケーションの説明
- related_app: 後処理などを行う場合、Open OnDemandに登録されているアプリケーションを指定します。指定されたアプリケーションは履歴ページで表示されます。
icon:
と同様にアイコン画像などの指定が可能です。画像の指定がない場合は、Open OnDemandに登録されている画像が用いられます。
- ウィジット名に利用できるのは英数字とアンダースコア(
_
)のみです。また、数字とアンダースコアを先頭に用いることもできません。- アプリケーションを保存するディレクトリ名も同様です。
- 末尾がアンダースコア+数字のウィジット名(例:
nodes_1
)は、size
の属性を持つウィジットの値を参照するときに衝突する可能性があるので注意ください。 header
をform.yml
で定義する場合、lib/header.yml.erb
で用いられているアンダースコアで始まるウィジット名(_script_location
と_script
)は利用可能です。
options
で2つ目の要素がない場合、1つ目の要素が代わりに用いられます。script
において、ある行で利用されている変数が値を持たない場合、その行は表示されません。ただし、その変数の先頭にコロンを付加する(例:#{:nodes}
や#{basename(:input_file)}
)と、その変数が値を持たなくても行は出力されます。- Open Composerがジョブスクリプトをジョブスケジューラに投入するまでに行われる処理の順番は下記の通りです。
- アプリケーションページで「Submit」ボタンがクリックされる
form.yml
のcheck
に記述されたスクリプトを実行(check
がある場合)form.yml
のsubmit
に記述されたスクリプトを実行(submit
がある場合)- ジョブスケジューラにジョブスクリプトが投入される