# 多机训练报错：import torch\_npu.\_C ImportError: libascend\_hal.so: cannot open shared object file: No such file or directory

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): Ascend

软件环境: MindSpore 版本: 2.3.0

执行模式（静态图/动态图）： 不限

Python 版本: 3.7.6

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

行多机训练报错，单机执行相同命令可正常启动训练。

2.2 报错信息

```
Traceback (most recent call last):
File "/work/share/lcy/audio/CosyVoice/examples/libritts/cosyvoice/cosyvoice/bin/train.py", line 15, in <module>
  import torch_npu
File "/usr/local/lib/python3.10/dist-packages/torch_npu/__init__.py", line 17, in <module>
  import torch_npu.npu
File "/usr/local/lib/python3.10/dist-packages/torch_npu/npu/__init__.py", line 122, in <module>
  from torch_npu.utils import should_print_warning
File "/usr/local/lib/python3.10/dist-packages/torch_npu/utils/__init__.py", line 2, in <module>
  from ._module import _apply_module_patch
File "/usr/local/lib/python3.10/dist-packages/torch_npu/utils/_module.py", line 26, in <module>
  from torch_npu.npu.amp.autocast_mode import autocast
File "/usr/local/lib/python3.10/dist-packages/torch_npu/npu/amp/__init__.py", line 7, in <module>
  from .sharded_grad_scaler import ShardedGradScaler
File "/usr/local/lib/python3.10/dist-packages/torch_npu/npu/amp/sharded_grad_scaler.py", line 9, in <module>
  from torch_npu.npu.utils import npu_check_overflow
File "/usr/local/lib/python3.10/dist-packages/torch_npu/npu/utils.py", line 12, in <module>
  import torch_npu._C
ImportError: libascend_hal.so: cannot open shared object file: No such file or directory
```

2.3 脚本信息

```
import torch_npu._C
ImportError: libascend_hal.so: cannot open shared object file: No such file or directory
```

**3. 根因分析**

多机执行命令如下：

```
sudo docker exec {$docker_id} /bin/bash -c 'source /usr/local/Ascend/ascend-toolkit/set_env.sh; pkill -9 python; pkill -9 torchrun; cd /xxx1; bash train_multinode.sh llm /xxx2/hostfile 60009;'
```

拉起训练任务失败，单机执行命令如下：

```
# 先执行docker exec -it {$docker_id} bash手动进入容器
bash train_multinode.sh llm /xxx2/hostfile 60009
```

拉起训练任务成功。

1）登录到物理机上，手动进入容器，执行训练命令，能拉起训练任务

2）登录到物理机上，不进入容器，在容器外通过docker exec执行命令，报错，但在命令中加上环境变量之后也不报错了

3）不登录物理机，通过HJ平台拉起任务，报错，加上环境变量还是报错

从报错日志看，找不到libascend\_hal.so文件，通过find / -name 'libascend\_hal.so'命令找到该文件在/usr/local/Ascend/driver/lib64/driver目录下，需要将该路径加到$LD\_LIBRARY\_PATH系统环境变量下。

```
export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/driver:$LD_LIBRARY_PATH
```

将环境变量加入到训练脚本中后，HJ平台可正常拉起多机训练任务。

手动执行不报错，因为该环境变量在容器镜像中已加入到了/root/.bashrc中，手动登录容器会自动加载。但在容器外执行或者通过HJ平台调用时，不会加载。

在HJ平台加上环境变量还是报错：因为HJ平台加环境变量时，source的setenv.sh实际未执行成功（因为容器内没挂载对应的脚本）。

总结：碰到libascend\_hal.so库文件找不到的问题时，检查环境变量 env | grep LD\_LIBRARY\_PATH ，查看LD\_LIBRARY\_PATH环境变量中是否包含/usr/local/Ascend/driver/lib64/driver路径，无论通过哪种方式加载，最终确保LD\_LIBRARY\_PATH环境变量中包含/usr/local/Ascend/driver/lib64/driver路径即可。

**4. 解决方案**

LD\_LIBRARY\_PATH环境变量未包含/usr/local/Ascend/driver/lib64/driver路径，将/usr/local/Ascend/driver/lib64/driver路径添加到LD\_LIBRARY\_PATH环境变量中。

