トレンドコラム

性能検証

Infinibandでの接続性確認

2018.05.09

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

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

Infinibandでの接続性確認

「Infiniband」は転送レートが高く、低レイテンシが特長のインターコネクトです。

この利点を活かしてInfiniband上では、IP転送だけでなく、サーバー間のメモリを直接読み書きできるRDMA
( Remote Direct Memory Access ) 転送が可能となっており、NVIDIAのGPUはこのダイレクトメモリアクセス技術の特性を活かして、マシン間にまたがった高速並列処理を実現 ( GPU Direct™ ) しています。

GPU Direct™

GPUベースのシステムを加速させるGPU Direct™テクノロジー

■ Infinibandがもたらす高いスループットと低レイテンシ
■ システムメモリをInfinibandとGPUで共有
■ システムメモリ内のメモリコピーが不要に

GPU-to-GPUの通信時間を短縮し、
システム全体の性能と効率性を大幅に改善

With GPU Direct™ RDMA
Using PeerDirect™
GPU Direct

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

今度は接続確認がとれました。今回はここまでとします。