スーパーコンピュータ「不老」の利用に関するFAQ/Tips

このページでは、利用者様からの良くある質問とその回答や、 スーパーコンピュータ「不老」を利用する上で知っておいた方が良い情報などを紹介します。 ある程度まとまった情報や、図などで説明した方が良い情報は 基本マニュアルや利用手引書に掲載される予定ですので、あわせてご活用ください。

旧システムとのバッチジョブシステムの違いに関すること

システムの更新に伴い、旧システムとはバッチジョブシステムの挙動に細かな違いが生じています。 特に間違いやすい点や問い合わせがあった点などを記しておきます。

-X オプション(環境変数の引き継ぎ)の廃止

旧システムではpjsub実行時に-Xオプションをつけるとログインノード上の環境変数が引き継がれましたが、 Environment modulesは環境変数で動作を制御している為、実行時の環境変数を 引き継ぐと、うまく動作しない場合がります。 また、LD_LIBRARY_PATHなど一部引き継げない環境変数もあるため、本システムではこの機能は提供されていません。

インタラクティブジョブ実行時のオプション追加

旧システムではリソースグループにインタラクティブキューを指定すればインタラクティブジョブが実行できましたが、 本システムでは pjsub --interact -L rscgrp=fx-interactive のように --interact を明示する必要があります。

旧システム(他のシステム)でコンパイルできていたプログラムがコンパイルできない時に確認すべきこと

メモリモデルの指定

プログラム中で用いているメモリの量が多い場合にコンパイルエラーすることがあります。

  • Type Iサブシステム(富士通コンパイラ)の例
relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
  • Type IIサブシステム(Intelコンパイラ)の例
relocation truncated to fit: R_X86_64_PC32 against `message_catalog'
additional relocation overflows omitted from the output

このようなエラーが出る場合、プログラム領域と静的データ領域の合計がデフォルト値 (Type Iサブシステムでは4GB、Type IIサブシステム、Type IIIサブシステムおよびクラウドシステムでは2GB)を越えている可能性があります。 コンパイル時に以下のオプションを試してみてください。

  • Fujitsu コンパイラの場合: -Kcmodel=large
    • GNU互換オプションを指定する場合: -mcmodel=large
  • Intel コンパイラの場合: -mcmodel=medium または -mcmodel=large
  • GNU コンパイラの場合: -mcmodel=medium または -mcmodel=large
  • PGI コンパイラの場合: -mcmodel=medium

「京」コンピュータとの違いに関すること

同じ富士通のスパコンシステムということで、「京」コンピュータで利用していたプログラムを「不老」Type Iサブシステムで利用したいユーザも多いと思います。 その際に気を付けた方が良い点について記しておきます。

rank-map-hostfile 利用上の注意

「京」ではバッチジョブ実行時にrank-map-hostfileを指定するだけでプロセスの割り当てを指定できました。 Type Iサブシステムでも同様にrank-map-hostfileを用いた利用ノードの指定が可能ですが、 これを行う際にはrank-map-bychipまたはrank-map-bynodeの指定も必要です。 以下に例を示します。

#PJM --mpi "rank-map-bynode"   <== 追加が必要
#PJM --mpi "rank-map-hostfile=rankmapfile.dat"

まとめて一行で指定することもできます。

#PJM --mpi "rank-map-bychip,rank-map-hostfile=rankmapfile.dat"

詳細はHPCポータルから入手できる「エンドユーザー向けガイド」(ジョブ運用ソフトウェアエンドユーザ向けガイド)の 「2.3.5 MPIジョブの投入」をご確認ください。

Type Iサブシステムのエンディアンについて

Type Iサブシステムは旧FXシステムと同様に富士通製のシステムですが、 CPUのエンディアンが異なります。 そのため旧FXシステムで使用していたバイナリ形式の入力ファイルを Type Iサブシステムで利用しようとすると問題が生じることがあります。

詳細と解決法についてはFortran使用手引書をご確認ください。

ディレクトリの使い分け方について

各利用者は、/home以下にホームディレクトリを有するのに加えて、 /data/group1/ユーザID というディレクトリも利用可能です。 (一部の利用者はgroup1ではなくgroup2になります。) /homeよりも/dataの方が性能が高い構成になっていますので、 バッチジョブを実行する際には/data側から実行するようにしてください。 なお、/homeも/dataも、ログインノードと計算ノードの両方から読み書き可能です。

ユーザ間のデータ共有方法について

利用制度を問わず、「不老」にはユーザ間でデータを共有するためのディレクトリは特に用意されていません。 各ユーザの/homeや/dataのディレクトリ内に任意のディレクトリを作成してパーミッションを調整してご利用ください。

例えば以下のように設定することで、 /home/a49999a/share/project/という共有パスを知っているユーザは誰でも /home/a49999a/share/project/にアクセスできるようになります。 一方、上位ディレクトリである /home/a49999a/share//home/a49999a//home/a49999a/の下にある/home/a49999a/private/については、 他のユーザがlsコマンドで覗こうとしても覗けません。

パーミッション    ディレクトリ
711    /home/a49999a/
711    /home/a49999a/private/
711    /home/a49999a/share/
755    /home/a49999a/share/project/

使用中ファイル容量の確認方法について

現在使用中のファイル容量を確認するにはlfsコマンドを利用してください。

$ lfs quota -u xxxxxx /home
Disk quotas for usr xxxxxx (uid xxxx):
     Filesystem  kbytes   quota   limit   grace   files   quota   limit   grace
          /home 66737048       0 1073741824       -  501774       0 10000000       -
$ lfs quota -u xxxxxxa /data
Disk quotas for usr xxxxxx (uid xxxx):
     Filesystem  kbytes   quota   limit   grace   files   quota   limit   grace
          /data 109958548       0       0       -   10617       0 50000000       -

xxxxxxの部分にはユーザIDを指定してください。

アカウントポータルからも確認できます。各月の利用実績ページをご確認ください。

同時に実行可能なジョブ数と受付可能なジョブ数の制限値について

同時に実行可能なジョブ数はリソースグループ(キュー)ごとに決まっています。 また、受付可能なジョブ数(同時にキューに入った状態にできるジョブ数)はリソースユニットごとに決まっています。

具体的な値は各サブシステムの利用手引書をご確認ください。

インストール済みアプリケーションの使い方 1(modulefileの活用)

インストール済みのアプリケーションの多くはmodulefileによって提供されています。

module availコマンドで利用可能なmoduleの一覧を確認できます。

module loadコマンドでmoduleを読み込むことで、対応するコマンドが利用可能になります。

一部のmoduleは特定のmoduleをloadした状態でないと利用できません。 これは特定のコンパイラやMPIに依存するものがあるためです。

特に、Type IIサブシステムではintelかgccをloadすることでより多くのmoduleを利用可能になります。

以下に例を示します。(Type IIサブシステム用ログインノード上で実際に実行した出力結果を加工していますが、 今後のソフトウェアのバージョンアップによって表示内容が変わる点に注意してください。)

初期状態でmodule listを実行しても、何も読み込まれていません。

$ module list
No Modulefiles Currently Loaded.

初期状態でmodule availを実行すると、/home/center/opt/x86_64/modulefiles/CX/coreにあるmodulefileが見えます。

$ module avail

---- /home/center/opt/x86_64/modulefiles/CX/core ----
3d_avs_player/3.3(default)         cuda/10.2.89_440.33.01(default)
以下省略

module load gccでgccのmoduleを読み込み、module listで確認してみると、OpenMPIのmoduleも読み込まれてMPIも使えるようになります。

$ module load gcc
$ module list
Currently Loaded Modulefiles:
  1) openmpi/4.0.3   2) gcc/4.8.5

この状態でmodule availを実行すると、OpenMPIに依存するmodulefileが利用可能になっています。 (機械学習関係のアプリケーションは主にここに含まれています。)

bash@flow-cx02 ~ $ module avail

---- /home/center/opt/x86_64/modulefiles/CX/compiler/gcc/4.8.5 ----
chainer/7.4.0(default)       impi/2019.5.281(default)
以下省略

---- /home/center/opt/x86_64/modulefiles/CX/core ----
3d_avs_player/3.3(default)         cuda/10.2.89_440.33.01(default)
以下省略

module purgeでload済みのmoduleを全て破棄できます。

$ module purge
$ module list
No Modulefiles Currently Loaded.

改めてintelをloadすると、今度はIntelコンパイラやIntel MPIに依存するmodulefileが利用可能になっています。

$ module load intel
$ module list
Currently Loaded Modulefiles:
  1) impi/2019.5.281    2) intel/2019.5.281
$ module avail

---- /home/center/opt/x86_64/modulefiles/CX/mpi/intel/2019.5.281/impi/2019.5.281 ----
frontflow_blue/8.1(default)            parallel-netcdf/1.12.1(default)
以下省略

---- /home/center/opt/x86_64/modulefiles/CX/compiler/intel/2019.5.281 ----
R/3.6.3(default)              metis/5.1.0(default)
以下省略

---- /home/center/opt/x86_64/modulefiles/CX/core ----
3d_avs_player/3.3(default)         cuda/10.2.89_440.33.01(default)
以下省略

インストール済みアプリケーションの使い方 2(提供ツールについて)

富士通社や情報基盤センターが提供する幾つかのツール群が /home/center/local/bin に配置してあります。 必要に応じて環境変数PATHを設定してご利用ください。

また、/home/center/local/sample/xxxx にはsampleコマンドで閲覧可能なサンプル集も提供されています。

/home/center/local/bin/sampleコマンドで 利用可能なサンプルの一覧が表示されます。 一覧に挙げられたものを引数として追加すると、 該当のサンプルがカレントディレクトリにコピーされます。 (サンプル名と同じディレクトリが作られ、その中にファイルがコピーされます。)

プロセスとスレッドの適切な配置方法について

並列化されたプログラムの実行において、 プロセスやスレッドの適切な配置は性能に大きく影響します。

各サブシステムにてプロセスやスレッドを思い通りに配置してプログラムを実行するための資料を 関連資料のページにて公開していますので参考にしてください。

CUDA-Aware MPIに対応したMPIライブラリについて

利用手引書及び 基本マニュアルおよび関連資料Type IIサブシステム向けのプロセス・スレッド配置方法をご確認ください。

singularityの使い方

singularityの使い方は関連資料のページでも紹介しています。あわせてご確認ください。

Type IIサブシステムにはsingularityがインストールされているため、 Dockerコンテナを持ち込んで利用することができます。 dockerリポジトリからのファイルダウンロードもできます。

Singularityを使う際は、システム側で幾つかの環境設定が必要なため、 ジョブ実行時に-L jobenv=singularityを設定してください。 インタラクティブジョブで指定する場合の例はこのようになります。 (例: pjsub --interact -L rscgrp=cx-extra,jobenv=singularity)

singularityコマンドに–nvオプションを付ければGPUも利用できます。

singularityではコンテナ内からコンテナ外のファイルが容易に見えてしまう点にも注意してください。 (コンテナ内のファイルを参照するはずであったがコンテナ外のファイルを参照してしまっていた、というミスが起きやすいです。)

ジョブ実行例(dockerhubからdockerイメージを拾ってきて、TensorFlowのチュートリアルを実行)

#!/bin/bash
#PJM -L rscunit=cx
#PJM -L rscgrp=cx-extra
#PJM -L node=1
#PJM -L elapse=1:00:00
#PJM -L jobenv=singularity
#PJM -j
#PJM -S


module load singularity
singularity exec --nv docker://tensorflow/tensorflow:latest-gpu python -c "import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)"

実行結果(チュートリアル実行結果の末尾)

Epoch 1/5
1875/1875 [==============================] - 2s 992us/step - loss: 0.2202 - accuracy: 0.9360
Epoch 2/5
1875/1875 [==============================] - 2s 962us/step - loss: 0.0970 - accuracy: 0.9712
Epoch 3/5
1875/1875 [==============================] - 2s 990us/step - loss: 0.0681 - accuracy: 0.9783
Epoch 4/5
1875/1875 [==============================] - 2s 999us/step - loss: 0.0542 - accuracy: 0.9829
Epoch 5/5
1875/1875 [==============================] - 2s 999us/step - loss: 0.0430 - accuracy: 0.9859
313/313 [==============================] - 0s 1ms/step - loss: 0.0623 - accuracy: 0.9806

JupyterLab (Jupyter Notebook) を使う方法

Type IIサブシステムとクラウドシステムではmoduleでJupyterLabが使えます。 Type IIではGPUも利用できるため高い性能を得られる可能性があります。 消費ポイントを節約したい場合はUNCAIを使うのもおすすめです。

Type IIサブシステムとクラウドシステムでJupyterLabを使う方法

Type IIサブシステムとクラウドシステムでは以下のとおりmoduleをloadすればJupyterLabが使えます。 Type IIサブシステムではGPUに対応したPythonモジュールを使えばGPUを利用することも可能です。

以下ではType IIサブシステムでJupyterLabを利用する例を示しますが、ノード名などを読み替えればクラウドシステムでも同様に利用可能です。

module load gcc/4.8.5 python/3.7.6 jupyterlab/2.1.5
または
module load gcc/8.4.0 python/3.9.2 jupyterlab/3.0.9

実際に計算ノードでJupyterLabを利用する例を紹介します。 始めにインタラクティブジョブで起動手順を確認したうえで、その後はバッチジョブとして実行するのがおすすめです。

まずインタラクティブジョブを起動し、上記のloadを行います。 JupyterLabを起動するには、

jupyter notebook --notebook-dir=${HOME} --ip='*' --port=8888 --no-browser --allow-root

というコマンドを実行します。 (ブラウザ上からホームディレクトリではなく/data/group1/側を参照したい場合は--noteboook-dir/data/group1/${USER}を指定してください。 ポート番号も8888から9000の間で自由に変更して構いません。特にcx-shareで同じノードに複数ユーザが立ち上げると衝突するため、適当な数に変更して起動を試してください。8888以外のポートを使う場合は次のステップでsshポート転送の際に指定する番号も同様に変更してください。 )

起動すると以下のようなメッセージが出るため、 http://cx064:8888/~ の部分をみてSSHポート転送を設定し、ブラウザでアクセスすればJupyterLabが使えます。 この例であれば、例えば ssh -L 8888:cx064:8888 flow-cx.cc.nagoya-u.ac.jp とすればローカルの8888番ポートがcx064の8888番ポートに転送されるため、 手元のPCのブラウザ上で最後のURL(この場合は http://127.0.0.1:8888/?token=f935c6bb79b91d1c951c179c1a6b084aa1dba255cb4acee5 )にアクセスすればJupyter Notebookが使えます。

To access the notebook, open this file in a browser:
     file:///home/center/a49979a/.local/share/jupyter/runtime/nbserver-932-open.html
 Or copy and paste one of these URLs:
     http://cx064:8888/?token=f935c6bb79b91d1c951c179c1a6b084aa1dba255cb4acee5
  or http://127.0.0.1:8888/?token=f935c6bb79b91d1c951c179c1a6b084aa1dba255cb4acee5

ちなみにパスワード設定を行いたい場合は

jupyter notebook password

コマンドを実行してください。 パスワードが設定されている場合、JupyterLab実行時にtokenの表示がなくなり、代わりにブラウザ上でパスワード入力が必要になります。

バッチジョブとして実行する場合は、例えば以下のようなジョブスクリプトを用意して実行し、 結果出力ファイルを見てSSHポート転送をすると良いでしょう。 elapse指定をしていないと打ち切り時間で強制終了してしまう点には注意してください。 途中で終了したい場合は、ジョブをpjdelする、またはブラウザ上でQuitボタンを押してください。 (Quitを押すとjupyterコマンドが終了するため、バッチジョブスクリプトが次の行に進んで終了します。)

#!/bin/bash
#PJM -L rscgrp=cx-share
module load gcc/8.4.0 python/3.9.2 jupyterlab/3.0.9
jupyter notebook --notebook-dir=${HOME} --ip='*' --port=8888 --no-browser --allow-root

Minicondaを利用し、JupyterLabをインストールして使う方法

バージョンの異なるJupyterLabを使いたいなどの場合はこちらの方法をお試しください。

手順としては、ログインノードまたはインタラクティブジョブでMinicondaをインストールし、その上でJupyterLlabをインストールします。

Minicondaのインストール方法はインストーラをWebから拾ってきて実行するだけです。 インストール時にインストール先ディレクトリを聞かれるため、必要に応じて変更してください。

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh ./Miniconda3-latest-Linux-x86_64.sh

インストールされたMinicondaを使うには、

eval "$(インスト-ル先ディレクトリ/bin/conda shell.bash hook)"

を実行する必要があります。 これでcondaコマンドが使えるようになるため、 適当な環境を構築してconda-forgeチャンネルからjupyterlabをインストールします。 コマンド例は以下のとおりです。 (この例ではPythonバージョンとして3.7を指定しているが、異なるバージョンでも良い。 testというのはユーザが任意で決められる環境の名前であり、好きな名前を付けて良い。)

conda create -n test pip python=3.7
conda activate test
conda install -c conda-forge jupyterlab

これでjupyterコマンドが利用可能になります。 あとはシステムにインストール済みのmoduleを使う場合と同様です。 上記のeval "$(インスト-ル先ディレクトリ/bin/conda shell.bash hook)"コマンドとconda activate testコマンドは 新しくシェルを開くたび(ログインし直したあと、インタラクティブジョブ開始後、バッチジョブの冒頭など)に行う必要がある点に注意してください。 例えばバッチジョブスクリプトはこのような感じになります。

#!/bin/bash
#PJM -L rscgrp=cx-share
eval "$(インスト-ル先ディレクトリ/bin/conda shell.bash hook)"
conda activate test
jupyter notebook --notebook-dir=${HOME} --ip='*' --port=8888 --no-browser --allow-root

上記の例ではcx-shareを使っていますが、cx-singleなどを利用すれば複数のGPUを使うことも可能です。

UNCAIでJupyterLabを使う方法

UNCAIでもバッチジョブ実行とほぼ同様の方法でJupyterLabが利用可能です。

接続手順:以下の内容のファイルを~/.batch/以下にstart_scriptから始まる名前で保存し、 UNCAIで予約する際に「時刻指定バッチスクリプト」からそのファイルを指定する。 仮想ノードが利用可能になると~/.batch/以下にログファイルが生成されるため、 ファイルを開いて接続先情報 (http://127.0.0.1:8888/?token=トークン情報) 情報を確認する。 仮にUNCAIで起動したホストのIPアドレスが172.24.2.11、「不老」のユーザIDがw49999aだとした場合、 ローカルPCから ssh -L 8888:172.24.2.11:8888 w49999a@flow-cloud.cc.nagoya-u.ac.jp のようにSSH接続とポート転送の設定を行う。 あとはローカルPC上でWebブラウザから (http://127.0.0.1:8888/?token=トークン情報) にアクセスすればJupyterLabが利用できる。

#!/bin/bash
module load gcc/8.4.0 python/3.9.2 jupyterlab/3.0.9
jupyter notebook --notebook-dir=${HOME} --ip='*' --port=8888 --no-browser --allow-root

1つの仮想マシンで1ノードを占有しない使い方(テンプレートVS, VM, VL)の場合は他のユーザが同じポート番号8888を使っている可能性があり、 その場合は起動時にエラーメッセージが出てjupyterの起動に失敗します。 そのような場合は --port=8888 の部分の数字を変更(8888から9000の間の数字に増やす)してjupyterコマンドを手動実行してみてください。 sshポート転送時も例えば ssh -L 8888:172.24.2.11:8889 w49999a@flow-cloud.cc.nagoya-u.ac.jp のようにコロンのあとの数字を変更する必要があります。

Type II サブシステムの消費ポイント算出方法について

Type IIサブシステムの消費ポイントは「実際にプログラムを実行したGPUの数」ではなく、 「確保したGPU数」に基づいて算出されています。

cx-shareリソースグループでは、「確保したGPU数」は常に1です。(cx-shareは1/4ノード実行専用のリソースグループであり、束ねて使うことができません。)

cx-share以外のリソースグループでは、「確保したGPU数」はノード数×4です。

利用ポイントを節約するには?

cx-shareやcl-shareは1/4ノード分ずつの利用ポイント消費になるため、うまく使えば利用ポイントの節約になります。

逆にいえば、1GPUしか使わない場合にcx-share以外のリソースグループを使ったり、 80コアまで性能がスケールしないのにcl-share以外のリソースグループを使うと、 利用ポイントの利用効率が低下する(もったいない)ことになります。 cx-singleやcl-singleはsingleの名前が付いていますが1ノードという意味でのsingleですので気を付けてご利用ください。

(本件については、わかりにくいというご意見もいただいています。 しかし、1GPUや1ソケットをsingleにしてしまうと、 今度はノード数を基準に考えたときにわかりにくくなります。 万人が勘違いしない名前を付けることは難しいということをご理解いただければ幸いです。)

クラウドシステムではUNCAIを使えば10コア、すなわち1/8ノード単位での実行も可能です。 もちろん利用ポイントの消費も10コア分だけになります。

出力したはずの文字列が出力されていない?

実行時間が指定時間を超過してジョブが終了してしまった場合などに、 printf関数やwrite関数などで文字列を出力しているはずなのに結果ファイルに書かれていない、 ということが起こる場合があります。 これはバッファに書き込まれた状態(バッファから出力先に吐き出されていない状態)でジョブが終了してしまっているために起きる問題です。 C言語であればfflush関数、Fortranであればflush関数を実行することで、 バッファに格納されているデータが吐き出されます。お試しください。

また、各MPIライブラリにはプロセス実行時に標準出力などへの出力を指定のファイルへの書き出しに変更する機能を有することが多いため、 これを用いることでトラブルの追及に役立つこともあるかもしれません。

IOに多くの時間がかかる場合は?

Type Iで1ノードから大量のIOを実行してしまったケース

Type Iサブシステムにおいて、1ノードに多数(例:40 MPIプロセス以上)の MPIを起動して同時のIO(同時のファイルオープンやファイルへの書き込み)を行うと、 IO性能が劇的に劣化する(例:100倍ほど遅くなる)ことがあります。

これを回避するためには、 1ノードから大量の同時IOを行わないことが重要です。 例えば、1ノードあたりのMPI起動数を減らし(例:20 MPIプロセス以下など)、 OpenMP等によるスレッド並列化を併用してプログラムを実行してください。

なお、Type Iサブシステムのハードウェアの観点からの推奨の実行形態は、 1ノード当たり4 MPI(1ソケット相当あたり1 MPI)、1 MPI当たり12 OpenMPスレッド 実行となります。

Type IIのSSDの活用

Type IIサブシステムにはSSDが搭載されており、 これを活用することでIOにかかる時間を短縮できる可能性があります。 多数のファイルを操作する場合やランダムなファイルアクセスをする場合などに 試してみてください。

SSDの使い方については利用手引書を参照してください。

利用成果等を発表する際の謝辞の記載のお願い

スーパーコンピュータ「不老」を利用した成果を公表する際には、 利用した旨を明記していただけますようよろしくお願いいたします。 以下に文例を示しますが、実際の状況に合わせて調整していただいて構いません。

文例1

本研究は名古屋大学のスーパーコンピュータ「不老」を利用して実施した。

The computation was carried out using the supercomputer "Flow" at Information Technologcy Center, Nagoya University.

文例2

本研究は名古屋大学のスーパーコンピュータ「不老」の##利用制度##を利用して実施した。

The computation was carried out using the ##category## on supercomputer "Flow" at Information Technologcy Center, Nagoya University.

利用制度/categoryには例えば以下をご利用ください。

  • 名大HPCプロジェクト / Nagoya Univ. HPC Peoject
  • HPCI利用制度 / HPCI Research Projects
  • JHPCN利用制度 / JHPCN Joint Reasearch Projects
  • トライアルユース / Trial Use Projects
  • 民間利用制度 / Industory Use Projects