[LoadTask] タスクの配布失敗のエラー解決

[LoadTask] タスクの配布に失敗しました

  1. システム環境
Hardware Environment(Ascend/GPU/CPU): Ascend
Software Environment:
MindSpore version (source or binary): 1.6.1
Python version (e.g., Python 3.7.5): 3.7.6
OS platform and distribution (e.g., Linux Ubuntu 16.04):
GCC/Compiler version (if compiled from source):
コピー
  1. 脚本

分散オペレーティング環境では、次のように bash 起動スクリプトと Python ファイルが必要です。

次の bash スクリプトを run.sh として保存します。

#!/bin/bash
set -e
EXEC_PATH=$(pwd)
export HCCL_CONNECT_TIMEOUT=120 # 避免复现需要很长时间,设置超时为120s
export RANK_SIZE=8
export RANK_TABLE_FILE=${EXEC_PATH}/rank_table_8pcs.json

for((i=0;i<4;i++))
do
    rm -rf device$i
    mkdir device$i
    cp ./train.py ./device$i
    cd ./device$i
    export DEVICE_ID=$i
    export RANK_ID=$i
    echo "start training for device $i"
    env > env$i.log
    python ./train.py > train.log$i 2>&1 &
    cd ../
done
echo "The program launch succeed, the log is under device0/train.log0."
コピー

次のスクリプトに run.py という名前を付けます。

"""Operator Parallel Example"""
import numpy as np

from mindspore import context, Parameter
from mindspore.nn import Cell, Momentum
from mindspore.ops import operations as P
from mindspore.train import Model
from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits
import mindspore.dataset as ds
import mindspore.communication.management as D
from mindspore.train.callback import LossMonitor
from mindspore.train.callback import ModelCheckpoint
from mindspore.common.initializer import initializer

step_per_epoch = 4

def get_dataset(*inputs):
    def generate():
        for _ in range(step_per_epoch):
            yield inputs
    return generate


class Net(Cell):
    """define net"""
    def __init__(self):
        super().__init__()
        self.matmul = P.MatMul().shard(((2, 4), (4, 1)))
        self.weight = Parameter(initializer("normal", [32, 16]), "w1")
        self.relu = P.ReLU().shard(((8, 1),))

    def construct(self, x):
        out = self.matmul(x, self.weight)
        out = self.relu(out)
        return out


if __name__ == "__main__":
    context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", save_graphs=True)
    D.init()
    rank = D.get_rank()
    context.set_auto_parallel_context(parallel_mode="semi_auto_parallel", device_num=8, full_batch=True)

    np.random.seed(1)
    input_data = np.random.rand(16, 32).astype(np.float32)
    label_data = np.random.rand(16, 16).astype(np.float32)
    fake_dataset = get_dataset(input_data, label_data)

    net = Net()

    callback = [LossMonitor(), ModelCheckpoint(directory="{}".format(rank))]
    dataset = ds.GeneratorDataset(fake_dataset, ["input", "label"])
    loss = SoftmaxCrossEntropyWithLogits()

    learning_rate = 0.001
    momentum = 0.1
    epoch_size = 1
    opt = Momentum(net.trainable_params(), learning_rate, momentum)

    model = Model(net, loss_fn=loss, optimizer=opt)
    model.train(epoch_size, dataset, callbacks=callback, dataset_sink_mode=False)
コピー

対応するrank_tableは次のとおりです。rank_table_8pcs.jsonという名前です。

{
    "version": "1.0",
    "server_count": "1",
    "server_list": [
        {
            "server_id": "10.90.41.205",
            "device": [
                {
                    "device_id": "0",
                    "device_ip": "192.98.92.107",
                    "rank_id": "0"
                },
                {
                    "device_id": "1",
                    "device_ip": "192.98.93.107",
                    "rank_id": "1"
                },
                {
                    "device_id": "2",
                    "device_ip": "192.98.94.107",
                    "rank_id": "2"
                },
                {
                    "device_id": "3",
                    "device_ip": "192.98.95.107",
                    "rank_id": "3"
                },
                {
                    "device_id": "4",
                    "device_ip": "192.98.92.108",
                    "rank_id": "4"
                },
                {
                    "device_id": "5",
                    "device_ip": "192.98.93.108",
                    "rank_id": "5"
                },
                {
                    "device_id": "6",
                    "device_ip": "192.98.94.108",
                    "rank_id": "6"
                },
                {
                    "device_id": "7",
                    "device_ip": "192.98.95.108",
                    "rank_id": "7"
                }
            ],
            "host_nic_ip": "reserve"
        }
    ],
    "status": "completed"
}
コピー

ローカルに 8 台の Ascend 910 デバイスがあると仮定すると、次のように起動コマンドを設定できます。

bash run.sh 8
コピー

ログ ファイルは現在の実行ディレクトリに出力されます。device0/train.log0

  1. エラーメッセージは次のとおりです。
[CRITICAL] GE(88778,7f440899a740,python):2022-03-10-18:22:59.846.306 [mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100] Distribute] davinci_model : load task fail, return ret: 1343225860
[CRITICAL] DEVICE(88778,7f440899a740,python):2022-03-10-18:22:59.846.792 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:560] LoadTask] Distribute Task Failed,
error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100 Distribute] davinci_model : load task fail, return ret: 1343225860
[ERROR] DEVICE(88778,7f440899a740,python):2022-03-10-18:22:59.846.859 [mindspore/ccsrc/plugin/device/ascend/hal/hardware/ascend_device_context.cc:641] ReportErrorMessage] Ascend error occurred, error message:
EI9999: Inner Error!
EI9999  connected p2p timeout, timeout:120 s.local logicDevid:0,remote physic id:4 The possible causes are as follows:1.the connectionbetween this device and the target device is abnormal 2.an exception occurredat the target devices 3.The ranktable is not matched.[FUNC:WaitP2PConnected][FILE:p2p_mgmt.cc][LINE:228]

[CRITICAL] DEVICE(88778,7f440899a740,python):2022-03-10-18:22:59.846.878 [mindspore/ccsrc/plugin/device/ascend/hal/hardware/ascend_device_context.cc:413] PreprocessBeforeRunGraph] Preprocess failed before run graph 1,
error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:560 LoadTask] Distribute Task Failed,
error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100 Distribute] davinci_model : load task fail, return ret: 1343225860

Traceback (most recent call last):
  File "/rootmodels/test_matmul_net.py", line 91, in <module>
    run_net(args.shape)
  File "/rootmodels/test_matmul_net.py", line 81, in run_net
    model.train(1, ds_train2, callbacks=[LossMonitor()], dataset_sink_mode=True)
  File "/rootmindspore/build/package/mindspore/train/model.py", line 777, in train
    sink_size=sink_size)
  File "/rootmindspore/build/package/mindspore/train/model.py", line 86, in wrapper
    func(self, *args, **kwargs)
  File "/rootmindspore/build/package/mindspore/train/model.py", line 543, in _train
    self._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size)
  File "/rootmindspore/build/package/mindspore/train/model.py", line 611, in _train_dataset_sink_process
    outputs = train_network(*inputs)
  File "/rootmindspore/build/package/mindspore/nn/cell.py", line 542, in __call__
    out = self.compile_and_run(*args)
  File "/rootmindspore/build/package/mindspore/nn/cell.py", line 872, in compile_and_run
    self.compile(*inputs)
  File "/rootmindspore/build/package/mindspore/nn/cell.py", line 857, in compile
    _cell_graph_executor.compile(self, *inputs, phase=self.phase, auto_parallel_mode=self._auto_parallel_mode)
  File "/rootmindspore/build/package/mindspore/common/api.py", line 712, in compile
    result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode())
RuntimeError: mindspore/ccsrc/plugin/device/ascend/hal/hardware/ascend_device_context.cc:413 PreprocessBeforeRunGraph] Preprocess failed before run graph 1,
error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:560 LoadTask] Distribute Task Failed,
error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100 Distribute] davinci_model : load task fail, return ret: 1343225860
コピー

原因分析

まずログを観察してください。 

図に示すように、上から、MindSpore のエラー メッセージとしての LoadTask のログ、ReportErrorMessage出力されたもの内の特定のエラー メッセージ、MindSpore の特定のエラー メッセージです。重要な情報は次のとおりです

EI9999  connected p2p timeout, timeout:120 s.local logicDevid:0,remote physic id:4 The possible causes are as follows:1.the connectionbetween this device and the target device is abnormal 2.an exception occurredat the target devices 3.The ranktable is not matched.[FUNC:WaitP2PConnected][FILE:p2p_mgmt.cc][LINE:228]
コピー

このログ情報は、p2p 接続が 120 秒を超えていることを示しています。ローカルはカード 0 (ローカルlogicDevid:0)、接続先のターゲットはカード 4 (リモート物理 ID:4) です。したがって、2つのカード間のネットワーク接続が正常であるかどうか、およびカード4のプログラムが正常であるかどうかを判断することができる。

戻ってきてカード4のログを確認しようと思ったのですが、ログが無いことが分かりました。そして、プログラムが正常に起動していないかどうかを判断しますか? 

起動スクリプトを確認すると、その中で実行されているプロセスは 4 つだけですが、構成した Rank_table には 8 枚のカードがあることがわかります。したがって、03 カードのみがプログラムを開始し、48 カードはプロセスを開始しません。カード 0 はカード 4 に接続できないため、上記のエラーが報告されます。解決策: 以下に示すように、bash 起動スクリプトの 4 を 8 に変更します。

#!/bin/bash
set -e
EXEC_PATH=$(pwd)

export RANK_SIZE=8

test_dist_${RANK_SIZE}pcs

for((i=0;i<8;i++))
do
    rm -rf device$i
    mkdir device$i
    cp ./train.py ./device$i
    cd ./device$i
    export DEVICE_ID=$i
    export RANK_ID=$i
    echo "start training for device $i"
    env > env$i.log
    python ./train.py > train.log$i 2>&1 &
    cd ../
done
echo "The program launch succeed, the log is under device0/train.log0."
コピー

後ろに書いてある

LoadTask タイプのエラーには多くの理由がありますが、この記事ではエラーの理由の 1 つだけを書きます。

おすすめ

転載: blog.csdn.net/beauty0220/article/details/129155101
おすすめ