HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

macで(docker版の)ITAを使ってみよう

Intel Trace Analyzer (以下ITA)という、MPIの通信プログラムのTrace情報を採取&表示してくれる便利ソフトがあります。*1

去年、VTuneとかAdviserとかの単体製品が無償になってて、小躍りしながらこちらの記事を書いた時には、相変わらず有償のみでしかも単体販売が無いからParallel Studio Cluster Editionを導入しないと使えないというものでした。

hpcmemo.hatenablog.com

これ、named user licenseが実質使えなくて、商用利用だと2ユーザのフローティングライセンス(ご新規だと100万円超)以上のライセンスを購入しないと使えないという高嶺の花だったんですが、なんとoneAPIに入ってます!!

*     +     巛 ヽ
            〒 !   +    。     +    。     *     。
      +    。  |  |
   *     +   / /   イヤッッホォォォオオォオウ!
       ∧_∧ / /
      (´∀` / / +    。     +    。   *     。
      ,-     f
      / ュヘ    | *     +    。     +   。 +
     〈_} )   |
        /    ! +    。     +    +     *
       ./  ,ヘ  |
 ガタン ||| j  / |  | |||
――――――――――――

思わず懐しいAAを探してきてしまうほど嬉しいので、M1 macからdocker版のITAを使ってみましょう。*2

セットアップ&起動

事前に、XQuartzをインストールしておきましょう。

インストール方法は、dmgをダウンロードしてインストーラの指示どおりに操作するだけなので省略します。 なお、インストール後一回macからログアウトしておかないと正常に使えない(少なくとも私が数年前にインストールした時は駄目でした)ので、インストール作業を行なったら一回ログアウトして再ログインしてから以降の作業を続けてください。

www.xquartz.org

続いて、intel oneAPIの HPC kitのコンテナを立ち上げて、中身を確認してみましょう。以降のこの記事内では%はホストOS側のコマンドプロンプト#はコンテナ内のコマンドプロンプトをあらわします。

ducker runにつけている --platform linux/amd64というオプションはintelアーキテクチャ用のコンテナを使うという指定です。 今回のone API HPC kitのように、intel用しか用意されていないコンテナをM1 macから起動する時は指定していないと、コンテナが無いと言われて起動できません。

% docker run -it  --rm --name test --platform linux/amd64 intel/oneapi-hpckit /bin/bash 

# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
# ps -ef |grep sshd
root        39     1  0 09:16 pts/0    00:00:00 /usr/bin/qemu-x86_64 /bin/grep --color=auto sshd
# apt list --installed |grep ssh

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

さて、立ち上げてsshの状況を確認してみたところ、どうやらインストールすらされていないようです。

sshが無いことには始まらないのでインストールしてsshでログインできるようにしましょう。

# apt install ssh -y
# cd /etc/ssh
# sed -i '/PermitRootLogin/s/^.*$/PermitRootLogin yes/' sshd_config
# mkdir /root/.ssh
# mkdir /run/sshd
# chmod 0755 /run/sshd
# /usr/sbin/sshd -D

次に、別のターミナルを立ち上げて公開鍵をコンテナ内にコピーします。

testの部分は、docker runした時に--nameオプションで指定した名前です。

% docker cp ~/.ssh/id_rsa.pub test:/root/.ssh/authorized_keys
% docker exec test chown root:root /root/.ssh/authorized_keys

ここまで設定すると公開鍵認証でログインできるはずなので、ホストからログインできるか確認します。

% ssh root@localhost -p 10022
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.10.25-linuxkit x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Fri Apr  9 22:22:16 2021 from 172.17.0.1

続けて、X11の転送を行なうための設定をします。

コンテナ内でsshd_configを書き換えて、X11UseLocalhosts を no に設定します。

# sed -i '/X11UseLocalhost/s/^.*$/X11UseLocalhost no/' /etc/ssh/sshd_config

この後、sshdを一回終了して立ち上げ直し、-Xオプションを付けてsshでログインすればXアプリが使えます。 試しにx11-appsをインストールして、xeyesが動くか確かめてみましょう。

$ ssh -X root@localhost -p 10022
# apt install x11-apps -y
# xeyes&

f:id:n_so5:20210412224502p:plain

無事にXの転送もできるようになりました。

続けて、ITAを起動してみましょう。

# . /opt/intel/oneapi/setvars.sh 
 
:: initializing oneAPI environment ...
   bash: BASH_VERSION = 4.4.20(1)-release
:: advisor -- latest
:: ccl -- latest
:: clck -- latest
:: compiler -- latest
:: dal -- latest
:: debugger -- latest
:: dev-utilities -- latest
:: dnnl -- latest
:: dpl -- latest
:: inspector -- latest
:: intelpython -- latest
:: ipp -- latest
:: ippcp -- latest
:: itac -- latest
:: mkl -- latest
:: mpi -- latest
:: tbb -- latest
:: vpl -- latest
:: vtune -- latest
:: oneAPI environment initialized ::

# traceanalyzer &

f:id:n_so5:20210413071218p:plain

おー無事に起動しました。

これで、インストール作業(?)は無事完了です。

ここまでの作業をまとめたDockerfileをこちらに置いておきます。

gistab9eef0de1d6021289b999367e06501b

ついでに、rootのログイン時に/opt/intel/oneapi/setvars.shを読み込むように設定しているので ログインしてそのままコマンドを実行すればtraceanalyzerが起動します。 *3

なお、動作確認用にインストールしたx11-appsですが、これのインストールを行なわないとtraceanalyzerが起動しなかったので、素のhpckitのコンテナは何か依存パッケージが欠けてるのかもしれません。

このDockerファイルを適当なディレクトリにダウンロードして、そのディレクトリ内で次のコマンドを実行するとセットアップできます。

> docker build -t oneapi .
> docker run  -d -p127.0.0.1:10022:22  -v${PWD}:${PWD} --rm --name oneapi oneapi 
> docker cp ~/.ssh/id_rsa.pub oneapi:/root/.ssh/authorized_keys
> docker exec oneapi chown root:root /root/.ssh/authorized_keys
> ssh -X root@localhost -p 10022
# traceanalyzer &

この例ではイメージ名もコンテナ名もoneapiとしてます。また、-v${PWD}:${PWD}オプションを指定することでホストのカレントディレクトリ以下に、同じ絶対パスでコンテナからアクセスできるようにしています。

ITAでのリモート性能情報の採取

Intel MPIライブラリをリンクした実行ファイルで、ITA用のトレースファイルを作成するには、-traceオプションを付けてmpirunを実行するだけです。 〜.stfという名前でずらーっとファイルが生成されますので、これをコンテナにマウントしたディレクトリ以下に置きましょう。

ITAで測定結果を表示

traceanalyzerを起動したあとで表示される初期画面で、[open file]ボタンを押して適当なSTFファイルを読み込むと次のようなサマリ画面が表示されます。

f:id:n_so5:20210418134454p:plain

Ratioのところに、Serial Code、OpenMP、MPI callsという円グラフが見えますが、これは全体の実行時間を次の3つに分類したものです。

  1. OpenMP化されていない部分の実行時間
  2. OpenMP並列化された部分の実行時間
  3. 通信時間

1が多い(&ハイブリッド並列のつもり)なら、OpenMP化できるところが無いかAdvisorで見てみましょう。

2が多いならOpenMP化に問題が無いか、VTuneで見てみましょう。

3が多いなら、Trace Analyzerで通信に問題が無いか見てみましょう。

という意図のようで、Trace AnalyzerからAdvisorやVTuneが起動できるそうです(使ったことないけど)*4

とりあえずTrace Analyzerを見たいので、右上の[Continue]をクリックしてください。

f:id:n_so5:20210418134258p:plain

これがデフォルトのビューですが、まるで何も分かりませんね。

まず、Chartメニューから"MessageProfile"を表示してみましょう。

f:id:n_so5:20210418135603p:plain

これは、あるRankから別のあるRankへの通信時間を行列形式で表わしたものです。

縦に並んでいる方のラベルが、送信Rank、横に並んでいる方のRankが受信Rankなので、この例ではRank1〜7がRank0へ 軽い送信をしているのと、Rank0-1, Rank2-3, Rank4-5, Rank6-7の各ペアでそれぞれ通信している様子が分かります。

このTrace fileは、Intel MPI Benchmarkで、PingPongとPingPingを実行した時のものなので、この図のように綺麗に分かれていますが、実アプリではインバランスがあったり、特定のRankに通信の負荷が集中していたりすることがあります。 そのような場合は(相対的に)重たい通信をしているペアが赤く表示されるので、そのRankを中心に改善できないか検討すれば良いということが分かります。

あと、Gather/Scatterみたいな1対Nの通信が多いと、特定の行または列のみ赤くなるので、こちらも要検討です。

もう一つtrace analyzerで重要な図がEvent Timelineです。こちらもChartメニューから選択すると表示できます。

f:id:n_so5:20210418141006p:plain

このメニューは、見るとなんとなく想像が付くと思いますが、Rank毎にMPI関数のcall(赤い領域)とその他の関数call(水色の領域)、それからRank間の通信(青または黒の線)が行なわれた様子を表したものです。

これだけだとちょっと分かり難いので、右クリックして表示されるメニューで"Ungroup Group MPI"を選んでください。

f:id:n_so5:20210418141310p:plain

この設定を行なうと、今までMPI関数は全部"MPI"としてまとめられていたものが、関数名毎の表示に切り替わります。

f:id:n_so5:20210418141723p:plain

説明の順番が前後しましたが、グラフ上でドラッグすれば表示領域をズームインできます。*5

f:id:n_so5:20210418141950p:plain

一番上にちょろっと全体マップが表示されているので、ズームアウトしたい時はこちらでドラッグしてください。

さて、このEvent Timelineですが、プロファイルで(accumulateされた)値を見てもよく分からんけど、特定のタイミングで通信が時々おかしいなんていうのを見つけるのにも使えますし、通信が意図したとおりに行なわれているかのチェックにも使えます。

たとえば、前の例ではペアになっているRankが同時にMPI_Isendを発行して、その後のMPI_Recvで受信する(Ping-Ping)の形になっていますが、こちらの例だと偶数Rankが送信して、奇数Rankが受信した後に返信する(Ping-Pong)の形になっています。

f:id:n_so5:20210418142741p:plain

時々意図しない順番で送受信していて、オーバーラップしたつもりができていなかったり、無駄に待ち時間が発生してたりすることがありますが、そういうトラブルも簡単に見つけることができます。

もっと詳しい使い方が知りたいという方は、こちらに公式のドキュメントがあるのでこちらをご覧ください。

software.intel.com

まだ書きたいことはあるんですが、ずいぶん長くなってきたので今回はこの辺で一旦終わりにします。

*1:正確には、採取する方はIntel Trace Collectorなんですが、パッケージは一緒なので・・・

*2:macネイティブ版は無いからXを飛ばして使うしか無いとはいえ、スパコンのフロントエンドからXを飛ばすのに比べれば格段に使い易いはず

*3:iccとかも使えますし、元々makeやcmakeも入っていたのでこのコンテナを使って起動時のオプションを渡してあげれば、ログインせずにビルドすることもできます。

*4:そもそも先にプロファイルを取って、なんか通信がボトルネックになってるぞって分かってからtraceとるので・・・

*5:ビデオとかオーディオ系のアプリでよくあるパターンですね