SIMULATIONS¶
Executable への引数¶
Executable に設定した評価プログラムがバッチファイル(拡張子 bat)または PowerShellスクリプト(拡張子 ps1)の場合は、プログラムへの引数に設計変数が設定されます。
例えば、設計変数 d1, d2 は以下の形式で引数に設定されます。
executable.bat /d1 1.1 /d2 2.2
executable.ps1 -d1 1.1 -d2 2.2
引数の取扱い¶
PowerShell スクリプトの引数取得¶
スクリプトの先頭で Parameter で引数を取得します。 以下の例は、4つの引数を、Double型の変数(Ts, R, L, Th)で参照します。
Param(
[Parameter(Mandatory=$true)][Double] $Ts,
[Parameter(Mandatory=$true)][Double] $R,
[Parameter(Mandatory=$true)][Double] $L,
[Parameter(Mandatory=$true)][Double] $Th
)
Note
バッチファイルや PowerShell スクリプトのサンプルがインストールされますので、ご参照ください。
入力値のフォーマット方法¶
Input File への設計変数の出力設定は、数値をフォーマットすることができません。
数値の書式(文字数・ゼロ埋め・指数表記など)が必要な場合は、OASIS AI から実行するバッチファイルや PowerShell スクリプトなどでフォーマットして設定してください。
例えば、次の条件で設計変数値をフォーマットしてファイルに出力したいとします。
- 変数範囲を"-1.0~0.357"で設定した
- 変数の出力を5カラムで固定したい
- 負の値の場合も値の使用するカラム数を変更したくない
以下の PowerShell スクリプトは、input.txtファイルに4つの設計変数(Ts, R, L, Th)を5~10カラムに出力します。
function replase {
param (
[String] $line,
[Double] $value
)
$in = "{0:F5}" -f $value
$fixed = $in.Substring(0,5)
$line1 = $line.Substring(0,5)
$line2 = $line.Substring(10)
$line0 = $line1 + $fixed + $line2
return $line0
}
$txt = ".\input.txt"
$content = Get-Content -Path $txt
$content[0] = replase -line $content[0] -value $Ts
$content[1] = replase -line $content[1] -value $R
$content[2] = replase -line $content[2] -value $L
$content[3] = replase -line $content[3] -value $Th
Set-Content -Path $txt -Value $content
PowerShell 実行ポリシーの確認と設定¶
Executable で PowerShell スクリプトを使用する場合は、PowerShell スクリプトが実行できるように Windows で実行ポリシーを設定します。
以下のコマンドで現在の設定を確認します。
PowerShell スクリプトを実行するためには、いづれかのスコープに RemoteSigned 以上のポリシーが設定さてれている必要があります。
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
ローカルPCで手元にあるスクリプトを実行するには、以下のコマンドで実行ポリシーを設定します。
- ポリシーは RemoteSigned を設定し、ローカルで作成したスクリプト、署名済み外部スクリプトのみを許可します。
- スコープは CurrentUser を指定し、自分だけとします。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine Unrestricted
セキュリティのため、PowerShell 実行ポリシーの緩和は必要最小限に留めることをお勧めします。
シミュレーションの実行検証¶
外部シミュレーションによる最適化を行う前に、DESIGN VERIFICATION(検証ツール)で問題設定とシミュレーションの実行を検証することができます。
用意した設計値でシミュレーションを実行し、作業ディレクトリを確認できますので、実行や障害などの診断に利用できます。
- シミュレーションなどのテストに使用できます
- 任意の設計値で結果を評価後、 OPTIMIZERの[Continue]で最適化を継続できます
利用手順¶
- DESIGN VERIFICATION を開きます
-
Value に値を入力します
- 確認したい設計値を入力します
-
[Add]で設計値を登録します
- [View points]で登録した設計値を確認できます
- 複数設定できます
-
[Output]を選択します
- [Evaluate]が有効になります
-
[Evaluate]でシミュレーションを実行します
-
VISUALIZE の RESULTS SHEET で値を確認できます
シミュレーションの終了コードと設定¶
OASIS AI から実行するシミュレーションが正常終了したときの戻り値を、Simulation Integration Configuration の Accepted Exit Codes に設定します。 Accepted Exit Codes に設定外の値が戻った場合に、OASIS AI はシミュレーションが失敗したと判断します。
設定方法¶
- Executable に実行するプログラムやバッチファイルを設定します
- Accepted Exit Codes で正常終了(非エラー)の戻り値を指定します
- 実行プログラムから戻り値を設定します
- 例えばトレーニング演習1のPowerShellスクリプトは、35行目で”0”を戻し、正常終了を OASIS AI に知らせます
Linux HPC とジョブスケジューラーの使用例¶
評価計算で Linux HPC やジョブスケジューラーを使用する一例を紹介します。
想定環境¶
- OASIS AI(Windows)の評価計算を Linux HPC でジョブスケジューラーを介して実行する
- Linux HPC は SSHで使用。ログインサーバー(ssh.server.jp)からフロントエンドサーバー(frontend.server.jp)に接続してジョブ実行する(多段接続)
- Slurm ジョブスケジューラーを使用
- 作業ディレクトリ(~/work/)で評価計算を実行
使用ツール¶
- PowerShell
- Windows 標準コマンド ssh, scp, ssh-agent(OpenSSHクライアント)
事前準備¶
- Linux 作業ディレクトリにヘルパースクリプト(run.sh, status.sh)を配置
処理の流れ¶
OASIS AI の評価計算を Linux HPC で実行する処理フローと実装方法の一例を示します。
- OASIS AI が更新した入力ファイルを Linux へ転送する
- SSH で Linux 作業ディレクトリの run.sh を実行する
- SSH で status.sh を実行し、ジョブの終了を確認する
- Linux から出力ファイルを取得する
入力ファイルの転送¶
scp -p $filePath [account]@ssh.server.jp:~/work/
ジョブ実行¶
ssh -o BatchMode=yes -J [account]@ssh.server.jp [account]@frontend.server.jp "cd ~/work && ./run.sh"
Slurm が「Submitted batch job 2093161」と出力することを利用し、文字列からジョブIDを取得して .jobid ファイルに保存する。
OUTPUT=$(sbatch << !JOB
;
# run your program
!JOB
)
echo “$OUTPUT” | awk ‘{print $4}’ > .jobid
ジョブの終了確認¶
for ($i=0; $i -lt $RETRY_STAT; $i++) {
ssh -o BatchMode=yes -J [account]@ssh.server.jp [account]@frontend.server.jp "cd ~/work && ./status.sh"
$ret = $LastExitCode
if ($ret -eq 0) {
break
}
Start-Sleep -Seconds $WAIT
}
.jobid ファイルからジョブIDを取得し、ジョブリストにジョブIDが存在しない場合に実行終了とみなし、0を戻す。
jobid=$(cat ./.jobid)
squeue | grep -q "$jobid" && echo 1 && exit 1 || echo 0 && exit 0
出力ファイルの取得¶
scp -p [account]@ssh.server.jp:~/work/ .
その他¶
- SSH接続は、認証エージェントを使用(スクリプトにパスワードなどを記述しない)