前回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