性能検証
Infinibandでの接続性確認
2018.05.09

サービスクリエーション本部
GPUアーキテクト
山崎 智行

「Infiniband」は転送レートが高く、低レイテンシが特長のインターコネクトです。
この利点を活かしてInfiniband上では、IP転送だけでなく、サーバー間のメモリを直接読み書きできるRDMA
( Remote Direct Memory Access ) 転送が可能となっており、NVIDIAのGPUはこのダイレクトメモリアクセス技術の特性を活かして、マシン間にまたがった高速並列処理を実現 ( GPU Direct™ ) しています。
GPU Direct™
GPUベースのシステムを加速させるGPU Direct™テクノロジー
■ Infinibandがもたらす高いスループットと低レイテンシ
■ システムメモリをInfinibandとGPUで共有
■ システムメモリ内のメモリコピーが不要に
GPU-to-GPUの通信時間を短縮し、
システム全体の性能と効率性を大幅に改善
Using PeerDirect™

GPU Direct™転送しか使わない環境ではIPリーチャブルである必要がなく、また「スイッチに繋げば使える」ため、初期導入の作業は簡単です。
しかしながら、実際に設計通りにスイッチと接続できているか、サーバー同士の接続ができているかを確認するためには、IPとは違った確認方法が必要です。
今回は、IP設定なしに接続確認をしてみましょう。
機器構成は次のとおりです。
検証構成

■ OS: | Ubuntu 16.04.4 LTS |
---|---|
Infiniband HCA(Host Channel Adapter) | |
Mellanox MCX353A-FCBT(Connect X-3 VPI) | |
■ Infinibandドライバ: | MLNX_OFED 4.3-1.0.1.0 |
■ Infinibandスイッチ: | Mellanox MSX6012F |
■ ネットワーク環境: | FDR ( 56Gbps ) |
将来的にInfinibandでGPU Direct™を使いたいので、ディストリビューションに含まれているドライバーではなく、Mellanoxのサイトからダウンロードしたものに差し替えました。
このドライバーにはInfinibandの確認コマンドも含まれています。「ib~」で始まるコマンドがInfiniband関連のものと想像がつきます。
GPU101:~$ ib<tabキー> ib2ib_setup ibcheckportstate ibdmchk ibping ibsrpdm ibv_dctgt ibacm ibcheckportwidth ibdmtr ibportstate ibstat ibv_devices ib_acme ibcheckstate ibdump ibprintca.pl ibstatus ibv_devinfo ibaddr ibcheckwidth ibfindnodesusing.pl ibprintrt.pl ibswitches ibv_intf ib_atomic_bw ibclearcounters ibgenperm ibprintswitch.pl ibswportwatch.pl ibv_polldcinfo ib_atomic_lat ibclearerrors ibhosts ibqueryerrors ibsysstat ibv_rc_pingpong ibcacheedit ibcongest ibidsverify.pl ibqueryerrors.pl ibtopodiff ibv_srq_pingpong ibccconfig ibdatacounters iblinkinfo ib_read_bw ibtracert ibv_task_pingpong ibccquery ibdatacounts iblinkinfo.pl ib_read_lat ibus ibv_uc_pingpong ibcheckerrors ibdev2netdev ibmirror ibroute ibus-daemon ibv_ud_pingpong ibcheckerrs ibdiagnet ibnetdiscover ibrouters ibus-setup ibv_umr ibchecknet ibdiagnet_csv2xml.py ibnetsplit ib_send_bw ibv_asyncwatch ibv_xsrq_pingpong ibchecknode ibdiagpath ibnlparse ib_send_lat ibv_cc_pingpong ib_write_bw ibcheckport ibdiscover.pl ibnodes ibsim ibv_dcini ib_write_lat
ざっと見てみると「ibping」「ibnodes」「ibv_devinfo」を使えば確認できそうです。
この中でまずはibpingコマンドを実行してみます。検証環境なのでいきなりコマンド実行してみます。
$ ibping Usage: ibping [options] <dest lid|guid> Options: --count, -c <num> stop after count packets --flood, -f flood destination --oui, -o <val> use specified OUI number --Server, -S start in server mode --dgid <val> remote gid (IPv6 format) --config, -z <config> use config file, default: /etc/infiniband-diags/ibdiag.conf --Ca, -C <ca> Ca name to use --Port, -P <port> Ca port number to use --Lid, -L use LID address argument --Guid, -G use GUID address argument --timeout, -t <ms> timeout in ms --sm_port, -s <lid> SM port lid --errors, -e show send and receive errors --verbose, -v increase verbosity level --debug, -d raise debug level --help, -h help message --version, -V show version
「Usage:」の引数に「<dest lid|guid>」とあります。LIDかGUIDを指定する必要がありそうです。
「LID」は Local Identifier の略で、接続される度サブネットを管理しているサブネットマネージャーから割り当てられる16ビットのアドレスです。今回はこちらを指定して接続確認します。
「ibnodes」コマンドは、スイッチに接続されているノードの一覧が確認でき、「ibv_devinfo」コマンドではコマンドを実行したサーバーに搭載されているHCAの情報を確認できます。
ibnodesの出力 $ sudo ibnodes Ca : 0xec0d9a030000d540 ports 1 "GPU102 HCA-1" Ca : 0xec0d9a030000d6c0 ports 1 "GPU102 HCA-2" Ca : 0xec0d9a0300026000 ports 1 "GPU101 HCA-2" Ca : 0xec0d9a0300025dc0 ports 1 "GPU101 HCA-1" Switch : 0x248a070300c94440 ports 12 "MF0;ibsw02:SX6012/U1" enhanced port 0 lid 2 lmc 0 Switch : 0x248a070300c95ac0 ports 12 "MF0;ibsw01:SX6012/U1" enhanced port 0 lid 1 lmc 0
接続されているHCAとスイッチの一覧の情報が得られました。0xで始まるのがGUIDですが、LIDは表示されていません。
ibv_devinfoの出力 $ ibv_devinfo hca_id: mlx4_1 transport: InfiniBand (0) fw_ver: 2.42.5000 node_guid: ec0d:9a03:0002:6000 sys_image_guid: ec0d:9a03:0002:6003 vendor_id: 0x02c9 vendor_part_id: 4099 hw_ver: 0x1 board_id: MT_1100120019 phys_port_cnt: 1 Device ports: port: 1 state: PORT_ACTIVE (4) max_mtu: 4096 (5) active_mtu: 4096 (5) sm_lid: 1 port_lid: 5 ・・・・・・・① port_lmc: 0x00 link_layer: InfiniBand hca_id: mlx4_0 transport: InfiniBand (0) fw_ver: 2.42.5000 node_guid: ec0d:9a03:0002:5dc0 sys_image_guid: ec0d:9a03:0002:5dc3 vendor_id: 0x02c9 vendor_part_id: 4099 hw_ver: 0x1 board_id: MT_1100120019 phys_port_cnt: 1 Device ports: port: 1 state: PORT_ACTIVE (4) max_mtu: 4096 (5) active_mtu: 4096 (5) sm_lid: 1 port_lid: 6 ・・・・・・・② port_lmc: 0x00 link_layer: InfiniBand
検証環境のマシンにはHCAが2枚刺さっているので、「mlx4_0」と「mlx4_1」が存在することが確認できます。
また、それぞれのカードにはポートが一つずつあることも確認できます。「port_lid(①と②)」がそれぞれのHCAに割り当てられたLIDです。
これらのLIDに対してibpingを打って確認することにしましょう。
ibpingコマンドはIPのpingとは異なり、通信確認をするサーバーの両端でコマンドを実行する必要があります。
具体的には一方のサーバーで ibping -S を実行することで待ち受け状態にした後、他方のサーバーからibping <dest lid>を実行して通信確認します。
受信側(GPU101) $ sudo ibping -S (受信待ち状態に入ります。Ctrl-Cで中断)
LID「6」から確認します。
送信側(GPU102) $ sudo ibping 6 Pong from GPU101.(none) (Lid 6): time 0.182 ms Pong from GPU101.(none) (Lid 6): time 0.150 ms Pong from GPU101.(none) (Lid 6): time 0.148 ms Pong from GPU101.(none) (Lid 6): time 0.150 ms Pong from GPU101.(none) (Lid 6): time 0.149 ms Pong from GPU101.(none) (Lid 6): time 0.146 ms Pong from GPU101.(none) (Lid 6): time 0.149 ms ^C --- GPU101.(none) (Lid 6) ibping statistics --- 21 packets transmitted, 7 received, 66% packet loss, time 20733 ms rtt min/avg/max = 0.146/0.153/0.182 ms
ちゃんと接続できていることが確認できます。「Ping」をうつと「Pong」と返してくるのがかわいいですね笑
次にLID「5」を確認します。
送信側(GPU102) $ sudo ibping 5 ^C --- (Lid 5) ibping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4902 ms rtt min/avg/max = 0.000/0.000/0.000 ms
LID 5には ibping が飛びませんね。実は「ibping -S」ではデフォルトでは一つのHCAしか対応しないため、今回のように複数のHCAがある場合、「-C」 オプションで HCAを指定する必要があります。
受信側(GPU101)。2つめのHCA(mlx4_1)を指定。 $ sudo ibping -S -C mlx4_1
これで再度 LID 5 に対してibpingを実行してみます。
送信側(GPU102) $ sudo ibping 5 Pong from GPU101.(none) (Lid 5): time 0.303 ms Pong from GPU101.(none) (Lid 5): time 0.113 ms Pong from GPU101.(none) (Lid 5): time 0.181 ms Pong from GPU101.(none) (Lid 5): time 0.081 ms ^C --- GPU101.(none) (Lid 5) ibping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3132 ms rtt min/avg/max = 0.081/0.169/0.303 ms
今度は接続確認がとれました。今回はここまでとします。