2022.10.13
wandbについてはpipコマンドにてインストール可能です。
pip install wandb
wandb login "XXXX"
SQUIDでは原則計算ノードからのインターネットアクセスを許可しておりませんが、wandbに限定して許可しています。
以下のようにジョブスクリプトを記述してください。
#!/bin/bash
#PBS -q SQUID
#PBS --group=[グループ名]
#PBS -l elapstim_req=1:00:00
cd $PBS_O_WORKDIR
export http_proxy="http://ibgw1f-ib0:3128"
export https_proxy="https://ibgw1f-ib0:3128"
python test.py
requests-2.24を使用してください。2.26等のバージョンについては、SQUIDで正常に動作しません。
2021.11.26
以下のコマンドで取得可能です。ジョブスクリプトの最後で実行してください。
$ nvidia-smi --query-accounted-apps=timestamp,gpu_name,gpu_bus_id,gpu_serial,gpu_uuid,vgpu_instance,pid,time,gpu_util,mem_util,max_memory_usage --format=csv
出力例は以下のとおりです。最後に記載されている523MiBがGPUで使用した最大メモリサイズです。
2021/11/24 19:26:26.333, A100-SXM4-40GB, 00000000:27:00.0, 1564720026417, GPU-a3b25bed-7bb1-cbd8-89e3-3f14b6118874, N/A, 761279, 117202 ms, 2 %, 0 %, 523 MiB
ジョブクラス「SQUID-S」を使用している場合は、同じノード内で別の方のジョブが実行されている場合があるため、正しい値が取得されない可能性があります。予めご了承ください。
2021.05.14
SX-ACEでは標準で出力されていましたが、SX-Aurora TSUBASAではコンパイル時および実行時にオプションを設定する必要があります。
コンパイラオプションでproginfオプションを指定してください。
nfort -proginf test.f90
また、ジョブスクリプトで以下を指定してください。
export VE_PROGINF=YES
または
export VE_PROGINF=DETAIL
2019.01.10
MPI並列実行を行うプログラムで各プロセスが同名ファイルにデータを出力するよう記述していると、バイナリが書き込まれてしまう場合があります。
大規模計算機システムのような共有ファイルシステムにおいて各プロセスが同名のファイルにデータを出力することは、各プロセスが同一のファイルにデータを出力することと同じであるため、プロセス間で競合が発生した際にデータが破損してしまい、バイナリデータが書き込まれてしまうことがあります。各プロセスごとに別名のファイルに出力するか、MPI-IOというMPI用の入出力インターフェースを利用することで、プロセス間の競合を防ぐことが可能です。
MPI-IOについては下記をご覧ください。
MPIの実行結果を1つのファイルに出力したい
2017.05.29
コンパイル時に、OpenMPや自動並列化を使用するオプションを指定した場合、並列化指示行の有無に関わらず、「並列版ライブラリ」がリンクされます。「並列版ライブラリ」の関数(並列版の関数)には通常版ライブラリと比べて、排他制御のために他スレッドのリソースへのアクセスを制限する「ロック処理」が組み込まれています。
並列化指示行を挿入していない箇所で並列版の関数がコールされた場合、1スレッドで動作するので、実際にロック処理に伴う「他スレッドの処理待ち」が発生するわけではないのですが、例えば、「排他が必要かどうか」といった判定を行う都合で、わずかですが通常版ライブラリより処理時間が増えることとなります。
一回のオーバヘッドはわずかですが、大量にコールすると、処理時間に大きく影響することとなります。
ご注意ください。
2017.05.19
MPIを用いた場合、通常は各プロセスごとに出力ファイルが生成されます。しかしMPI-IOを用いて出力先を指定することで、各プロセスの出力を1つのファイルにまとめることができます。
基本的な利用方法
MPI-IOはMPIプログラミングを行うことを前提としています。MPIの基本的な利用方法やコマンドについてはこちらをご覧ください。
以下にfortranで書かれたプログラムを紹介します。こちらを参考に説明します。
ファイルへの出力(書き込み)
各プロセスごとにプロセスID(rank)を取得し、output.datの任意の位置に出力するプログラムです。
たとえば自身のプロセスIDが4の場合、output.datの16-19バイト目(INTEGER換算で5番目)に自身のプロセスIDを書き込みます。
|
program sample include 'mpif.h' !! MPI用のインクルードファイル(必ず指定) integer ierr,myrank integer (kind=mpi_offset_kind) idisp call MPI_INIT(ierr) !! MPI並列 開始 call MPI_COMM_RANK(mpi_comm_world,myrank,ierr) !!プロセスID(rank)の取得 idisp=0+4*myrank call mpi_file_open(mpi_comm_world,'output.dat',mpi_mode_rdwr+mpi_mode_create,mpi_info_null,ifh,ierr) call mpi_file_set_view(ifh,idisp,mpi_integer,mpi_integer,'native',mpi_info_null,ierr) call mpi_file_write(ifh,myrank,1,mpi_integer,mpi_status_ignore,ierr) call mpi_file_close(ifh,ierr) call MPI_FINALIZE(ierr) !! MPI並列 ここまで stop end |
プログラムのハイライト部分(8行目-11行目)が、MPI-IOプログラムになります。また7行目は直接MPI-IOに関係があるわけではないですが、9行目でコマンドに引数として渡す変数を設定している部分になりますので、必要な処理になります。
2行目、6行目-7行目、13行目はMPIでの処理を行うためのプログラムです。こちらについてはMPI利用方法(VCC)のページで解説を行っていますのでそちらを参考にしてください。
以下で8行目-11行目のコマンドについて詳しく説明していきます。
mpi_file_open
mpi_file_open(comm, filename, amode, info, fh, ierr)
MPI-IOでの入出力先のファイルをオープンするためのコマンドです。
MPI-IOを行う場合は最初にcallする必要があります。
引数 |
comm |
コミュニケータを指定します。通常はMPI全プロセスをあらわす「MPI_COMM_WORLD」を指定することが多いです。 |
filename |
入出力先のファイル名を指定します。 |
amode |
アクセスモードの設定をします。「|」をはさむことで複数同時に指定することが可能です。代表的なものをいくつか紹介します。
mpi_mode_rdonly:読み込みのみ可能
mpi_mode_wronly:書き込みのみ可能
mpi_mode_rdwr :読み書き両方可能
mpi_mode_create:filenameで指定した名前のファイルがない場合、自動で作成
mpi_mode_excl :filenameで指定した名前のファイルがすでに存在する場合、エラーを返す
これ以外にも様々なモードが存在します。
|
info |
入出力先のファイル情報を設定できますが、基本的には何も渡さない「mpi_info_null」で問題ありません。 |
fh |
ファイルハンドルです。これ以降filenameで指定したファイルは、fhで指定したファイルハンドルで指定することになります。 |
ierr |
正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます。 |
mpi_file_set_view
mpi_file_set_view(fh, disp, etype, ftype, datarep, info, ierr)
各プロセスのファイルへの入出力開始地点(ポインタ)を指定するコマンドです。
ここでうまくポインタの指定ができていないと、出力結果に変に空白ができてしまったり、上書きが発生してしまったりします。
引数 |
fh |
ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
disp |
ポインタのオフセット距離をバイト数で指定します。たとえばここで4を引数として渡した場合、5バイト目にポインタがセットされます。CHARACTER型は1文字1バイトのデータ型なので、この場合はファイルの先頭から4文字分のスペースが空いていることになります。またINTEGER型で考えると、通常は1つ4バイトのデータ型なのでINTEGER1つ分のスペースが空いていることになります。 |
etype |
ファイルの基本単位を設定します。書き込む際のデータ型もしくはmpi_byteを指定します。
|
ftype |
ファイルのひとまとまりの単位を設定します。各プロセスが複数回にわたって規則的に入出力を行う際などに利用するもので、決まった型だけでなくユーザーが独自に作ったものを設定することも可能です。各プロセスが入出力を1回しか行わない場合はetypeと同じものを設定しておきます。 |
datarep |
データの表現方法を指定します。基本的にはバイナリ表現を表す「native」で問題ありません。
※必ず小文字で指定してください。 |
info |
入出力先のファイル情報を設定できますが、基本的には何も渡さない「mpi_info_null」で問題ありません。 |
ierr |
正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
mpi_file_write
mpi_file_write(fh, buf, count, datatype, status, ierr)
実際にファイルに出力するためのコマンドです。
MPI_File_openでオープンしたファイルにMPI_File_set_viewで指定されたポインタから書き込み始めます。
引数 |
fh |
ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
buf |
実際に書き込む内容を設定します。 |
count |
書き込むデータの数(文字数ではない)を設定します。詳しくはdatatypeの欄で説明します。
|
datatype |
書き込むデータの型です。ここで設定したデータ型を、countで設定した数だけ出力します。
たとえばcharacter型で「hello」と書き込む場合はcountに5を、datatypeにmpi_characterを設定します。
またinteger型で「100」と書き込む場合はcountに1を、datatypeにmpi_integerを設定します。
これはcharacterが1つで1文字を表すデータ型であるのに対し、integerは1つで-2147483648~2147483647の範囲の整数を表すデータ型だからです。 |
status |
入出力先のファイルの通信に関する設定を行えますが、基本的には何も渡さない「mpi_status_ignore」で問題ありません。 |
ierr |
正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
mpi_file_close
MPI_File_close(fh, ierr)
MPI-IOでの入出力先のファイルをクローズするためのコマンドです。
MPI-IOを行う場合は一連の処理の最後にcallする必要があります。
fh |
ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
ierr |
正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
ファイルからの入力(読み込み)
上記で作成したoutput.datからデータを読み込み、printで画面に表示するプログラムです。
|
program sample include 'mpif.h' !! MPI用のインクルードファイル(必ず指定) integer ierr,myrank,out integer (kind=mpi_offset_kind) idisp call MPI_INIT(ierr) !! MPI並列 開始 call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) idisp=0+4*myrank call mpi_file_open(mpi_comm_world,'output.dat',mpi_mode_rdwr+mpi_mode_create,mpi_info_null,ifh,ierr) call mpi_file_set_view(ifh,idisp,mpi_integer,mpi_integer,'native',mpi_info_null,ierr) call mpi_file_read(ifh,out,1,mpi_integer,mpi_status_ignore,ierr) call mpi_file_close(ifh,ierr) print '(I2)', out call MPI_FINALIZE(ierr) !! MPI並列 ここまで stop end |
プログラムのハイライト部分(8行目-11行目)が、MPI-IOプログラムになりますが、出力用のプログラムからmpi_file_writeがmpi_file_readに変わったのみでほぼ変化がありません。以下で新たに使用しているmpi_file_readについて解説します。
mpi_file_read
mpi_file_read(fh, buf, count, datatype, status, ierr)
ファイルから読み込むためのコマンドです。
MPI_File_openでオープンしたファイルのMPI_File_set_viewで指定されたポインタからデータを読み込みます。
引数 |
fh |
ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
buf |
読み込んだデータが格納されます。 |
count |
読み込むデータの数を設定します。writeのときと同様に文字数ではないという点に注意してください。
|
datatype |
読み込むデータの型です。ここで設定した型で、countで設定した数だけ読み込みます。 |
status |
入出力先のファイルの通信に関する設定を行えますが、基本的には何も渡さない「mpi_status_ignore」で問題ありません。 |
ierr |
正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
通常のコマンドを用いた読み込み
MPI-IOを用いて出力されたファイルは通常のreadコマンドでも読み込むことができます。mpi_file_readコマンドは本来、各プロセスにファイルの別々の箇所を読み込ませ、それぞれに並列作業を行わせるためのコマンドですので、MPI-IOによる出力結果をただ読み込むだけならば通常のreadコマンドを用いてデータの読み込みを行います。
上記同様output.datからデータを読み込み、printで画面に出力するプログラムです。
|
program sample integer iwrk(20) open(10,file='output.dat',access='direct',recl=4,FORM='BINARY') read(10,rec=1) iwrk close(10) print '(I2)', iwrk end |
ご覧のとおりMPI化を行っていないシリアル実行のプログラムですので、コンパイルやスクリプトでのジョブ投入の記述に誤ってMPI用のコマンドを使わないように注意してください。
C言語の場合
上記と同じプログラムをC言語で記述したものも参考までに掲載します。関数はfortran版とほぼ同じですので、説明は省略します。
ファイルへの出力(書き込み)
|
#include <stdio.h> #include <mpi.h> main(int argc, char * argv[]) { int my_rank; MPI_File fh; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); int idisp = 4*my_rank; MPI_File_open(MPI_COMM_WORLD, "output.dat", MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fh); MPI_File_set_view(fh, idisp, MPI_INT, MPI_INT, "native", MPI_INFO_NULL); MPI_File_write(fh, &my_rank, 1, MPI_INT, MPI_STATUS_IGNORE); MPI_File_close(&fh); MPI_Finalize(); } |
ファイルからの入力(読み込み)
|
#include <stdio.h> #include <mpi.h> main(int argc, char * argv[]) { int my_rank, i, out; MPI_File fh; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); int idisp = 4*my_rank; MPI_File_open(MPI_COMM_WORLD, "output.dat", MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fh); MPI_File_set_view(fh, idisp, MPI_INT, MPI_INT, "native", MPI_INFO_NULL); MPI_File_read(fh, &out, 1, MPI_INT, MPI_STATUS_IGNORE); MPI_File_close(&fh); printf("%d\n", out); MPI_Finalize(); } |
通常の関数を用いた読み込み
|
#include <stdio.h> int main(void) { FILE *fp; char *name = "output.dat"; int c[20]; int i; fp = fopen(name, "rb"); fread(&c, sizeof(int), 20, fp); fclose(fp); for(i=0; i<20; i++) printf("%d\n", c[i]); return 0; } |
2017.01.20
SQUID ベクトルノードで実行するNEC MPIにおいて標準出力をリダイレクトする場合は、「/opt/nec/ve/bin/mpisep.sh」スクリプトをご利用ください。
MPIを実行する際、ジョブスクリプトに
|
#PBS -v MPISEPSELECT=3 mpirun -np 160 /opt/nec/ve/bin/mpisep.sh ./a.out |
と指定していただくと、標準出力はstdout.0:(MPIプロセスID)、標準エラー出力はstderr.0:(MPIプロセスID)へリアルタイムで出力されます。
これらの詳しい解説は、下記「NEC MPIユーザズガイド」の3.3 MPI プロセスの標準出力 および 標準エラー出力 に記載されております。
NEC MPIユーザズガイド
上記のスクリプトをそのまま使用した場合、stdout/stderrというファイル名になってしまいますが、ご自身でmpisep.shを修正いただくと、任意の名前に変更することも可能です。
2016.09.16
標準出力ファイル、標準エラー出力ファイルは、umaskコマンドで指定したパーミッションに従い、出力されます。フロントエンド上でumaskコマンドを実行し、指定してください。
承ください。
2016.08.24
多くの擬似乱数生成関数は指定した初期値(random seed)に対して、ある一定の規則に基づいた処理を行い、乱数を生成します。同じ初期値を与えた場合は、常に同じ乱数が生成されますので、独立した乱数を生成した場合は、その度に初期値を変更する必要があります。
2015.06.17
出力される情報はマニュアルに記載しておりますので、以下の「2.13.6 MPI プログラム実行性能情報」をご覧ください。(要認証)
MPI/SX 利用の手引き
※ご注意
ノード間をMPI、ノード内はOpenMPで並列化して実行した場合、
ユーザ時間:UserTimeやシステム時間:SysTimeとして出力される情報は、
プロセス単位のCPU時間となります。したがって、各コアの実行時間を積算した値が表示され、RealTime:経過時間よりも長い時間が出力されることがありますので、ご注意ください。
2015.02.10
(質問の補足)
計算機で下記のような処理を行ったとします。
./a.out > output.txt
a.outの実行結果はoutput.txtに書き込まれるのですが、計算中にoutput.txtを確認しても、出力結果が反映されるのが非常に遅いのではないか、という質問です。
(回答)
データ書き込みは、下記のような仕組みで行っています。
それぞれバッファやキャッシュに溜め込む形で、書き出し処理を行っているため、フロントエンドでファイルが確認できるまで時間を要します。
「1. FORTRAN側の動作」による影響は小さいと予想されるため、時間がかかる原因としては主に「2. ファイルシステム側の動作」のデータキャッシュサイズによるものです。
リアルタイムに近い出力を希望される場合、FORTRANプログラム内にて、print実行後に、call flush(6) を実行し、標準出力への内容をフラッシュしていただく必要があります。
これにより、flush実行毎にリダイレクト先ファイルへ反映されます。
※当センターのファイルシステムは、ScateFS(Scalable Technology File System)という独自のファイルシステムを搭載しております。「2.ファイルシステム側の動作」の挙動はScateFSの仕様によるものです。
※sxf03コンパイラは対応していません。
関連するFAQ
SX-ACEの標準出力で、MPIの計算結果をリアルタイムに確認したい
2014.07.14
「qwait」コマンドを使用することで、実現可能です。
このコマンドは引数で与えたリクエストID(例:12345.cmc)を待ち合わせするというものです。
指定のリクエストIDのジョブが終了するとメッセージ終了と共にコマンドが終了します。
コマンドの詳細についてはポータルで公開されておりますマニュアル
「NQS利用の手引」のリファレンス編 第1章 ユーザコマンドをご参照頂けますようお願い致します。
NQSII利用の手引き(要認証)
NQSV利用の手引き
※ man qwait でもヘルプを参照できます。
qwait については下記のような使い方が可能です。
監視スクリプトをバックグラウンド実行し、スクリプト内で qwaitを実行します。
exitコード(上記のマニュアルに記載があります)で判定し、その後の動作を分岐させています。
参考にしてください。
-----------
$ qsub job1-1
Request 12345.cmc submitted to queue: Pxx.
$ (./chkjob >& log &)
----- chkjob
#!/bin/sh
while :
do
qwait 12345.cmc #リクエストIDを任意のものに変更して下さい
case $? in
0) qsub job1-2;exit;;
1) qsub job2-1;exit;;
2) qsub job3-1;exit;;
3) echo NQS error | mail xxxx@yyyy.ac.jp;exit;;#メールアドレスを任意のものに変更してください
7) continue;;
*) ;;
esac
done
------------
以上です。
2014.07.14
I-CACHE、O-CAHCEとは、SXにてプログラムを実行後に出力される「プログラム情報※1」内の項目の一つです。
名称)
I-CACHE : 命令キャッシュ(ミス)
O-CACHE : オペランドキャッシュ(ミス)
意味)
スカラユニット用のキャッシュ(I-CACHE、O-CACHE 両方共)。
「プログラム情報」ではプログラム中でベクトル化されていない、
スカラ処理部分におけるキャッシュミス時間を表示している。
キャッシュ構成)
スカラマシンの有している L1 キャッシュと同等の機能。
SX-9 の場合は32KB(256B/キャッシュライン * 64エントリ * 2way)を有している。
チューニング方法)
1.スカラ処理部分を可能な限りベクトル化する。ベクトル化することにより
キャッシュミス時間は自動的に削減される。
2.極限までベクトル化した後もキャッシュミス時間が残る場合、
スカラマシンと同様にキャッシュのスラッシング対策を行う。
具体的には、O-CACHE値等で 2way で追い出し(スラッシング) が
発生しているかどうかを確認し、スラッシングが発生している場合は
配列をずらすことでスラッシングを回避してキャッシュヒット率を高める。
これによりキャッシュミス時間を削減する。
※1プログラム情報
ジョブスクリプトに「setenv F_PROGINF DETAIL」を指定する事で標準エラー出力に出力
出力例(英語):
****** Program Information ******
Real Time (sec) : 1.055745
User Time (sec) : 0.009741
Sys Time (sec) : 0.019627
Vector Time (sec) : 0.000047
Inst. Count : 1887787.
V. Inst. Count : 2284.
V. Element Count : 324751.
FLOP Count : 26141.
MOPS : 226.902166
MFLOPS : 2.683605
A. V. Length : 142.185201
V. Op. Ratio (%) : 14.692927
Memory Size (MB) : 192.031250
MIPS : 193.798070
I-Cache (sec) : 0.002054
O-Cache (sec) : 0.001399
Bank Conflict Time
CPU Port Conf. (sec) : 0.000010
Memory Network Conf. (sec) : 0.000007
Start Time (date) : Wed Nov 17 00:24:43 JST 2010
End Time (date) : Wed Nov 17 00:24:44 JST 2010
出力例(日本語):
(環境変数「setenv LANG japan」を指定)
****** プログラム情報 ******
経過時間 (秒) : 1.044924
ユーザ時間 (秒) : 0.010063
システム時間 (秒) : 0.020361
ベクトル命令実行時間 (秒) : 0.000050
全命令実行数 : 1891084.
ベクトル命令実行数 : 2284.
ベクトル命令実行要素数 : 324751.
浮動小数点データ実行要素数 : 26146.
MOPS 値 : 219.969293
MFLOPS 値 : 2.598231
平均ベクトル長 : 142.185201
ベクトル演算率 (%) : 14.671042
メモリ使用量 (MB) : 192.031250
MIPS 値 : 187.924476
命令キャッシュミス (秒) : 0.001853
オペランドキャッシュミス (秒) : 0.001798
バンクコンフリクト時間
CPU ポート競合 (秒) : 0.000008
メモリネットワーク競合 (秒) : 0.000007
開始時刻 (日付) : 2010年 11月 30日 火曜日 15:25:14 JST
終了時刻 (日付) : 2010年 11月 30日 火曜日 15:25:15 JST