【问题描述】
在客户HJ平台执行多机训练报错,单机执行相同命令可正常启动训练
【告警信息】
import torch_npu._C
ImportError: libascend_hal.so: cannot open shared object file: No such file or directory
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
【产品及版本】
产品型号、固件驱动CANN版本等
【分析过程】
多机执行命令如下:
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路径即可。
【问题原因】
LD_LIBRARY_PATH环境变量未包含/usr/local/Ascend/driver/lib64/driver路径。
【解决方案】
将/usr/local/Ascend/driver/lib64/driver路径添加到LD_LIBRARY_PATH环境变量中。