TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

AWS inf1 インスタンスで推論を行う その2

前回AWS inf1 インスタンスでdlshogiのモデルの推論ができることを確認したが、今回はマルチGPUで推論できるかを確かめてみた。

マルチGPUにするには、Inferentia チップが複数あるAWS inf1 インスタンス(inf1.6xlargeとか)が必要と思っていたが、よく調べるとInferentia チップには、4つのNeuronコアが搭載されていて、4並列で推論ができることがわかった。

inf1.xlargeで、/opt/aws/neuron/bin/neuron-lsを実行すると4コアあることが確かめられる。

$ /opt/aws/neuron/bin/neuron-ls
+--------+--------+--------+-----------+--------------+---------+---------+---------+
| NEURON | NEURON | NEURON | CONNECTED |     PCI      | RUNTIME | RUNTIME | RUNTIME |
| DEVICE | CORES  | MEMORY |  DEVICES  |     BDF      | ADDRESS |   PID   | VERSION |
+--------+--------+--------+-----------+--------------+---------+---------+---------+
| 0      | 4      | 8 GB   |           | 0000:00:1f.0 | NA      | 1062    | NA      |
+--------+--------+--------+-----------+--------------+---------+---------+---------+

マルチコアの使い方

マルチコアの使い方は、単にモデルを複数回loadするだけである。

models = []
for i in range(4):
    model = torch.jit.load('model-pre5_resnet15_swish_b4096lr004-008.neuron.pt')
    model.eval()
    models.append(model)

のようにして、4回ロードすればよい。
それぞれのモデルが別のNeronCoreに割り当てられる。

環境変数NEURONCORE_GROUP_SIZESで、NeuronCoreをグループ化できるが、特にその必要はない。
デフォルトで1コアが1グループになっている。

並列で推論

以下のようなコードで並列で推論を試した。

from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=4)

def infer(model):
    for i in range(10000):
        y1, y2 = model(x1, x2)

futures = []
for i in range(4):
    futures.append(executor.submit(infer, models[i]))

for i in range(4):
    futures[i].result()


/opt/aws/neuron/bin/neuron-topで、4つのNeuronコアが使用されていることが確認できた。

$/opt/aws/neuron/bin/neuron-top
neuron-top - 12:34:51
Models: 4 loaded, 4 running. NeuronCores: 4 used.
0000:00:1f.0 Utilizations: NC0 67.13%, NC1 67.41%, NC2 67.32%, NC3 67.30%,
Model ID   Device    NeuronCore%   Device Mem   Host Mem   Model Name
10004      nd0:nc3   67.30           29 MB       151 KB    1.5.5.0+3cc38c60b-/tmp/tmpmwpges2q
10003      nd0:nc2   67.32           29 MB       151 KB    1.5.5.0+3cc38c60b-/tmp/tmpmwpges2q
10001      nd0:nc0   67.13           29 MB       151 KB    1.5.5.0+3cc38c60b-/tmp/tmpmwpges2q
10002      nd0:nc1   67.41           29 MB       151 KB    1.5.5.0+3cc38c60b-/tmp/tmpmwpges2q

まとめ

AWS inf1 インスタンスでマルチコアでの推論をためした。
一番安いインスタンスでも4コアが搭載されているので、これで1コアの推論性能が良ければNvidiaGPUインスタンよりかなりお得である。
推論性能は別途検証したい。