Azure Batch MPI任务环境配置失败,无法加载libmpi.so.12求助
Azure Batch MPI任务环境配置问题
背景
我正尝试使用Azure Batch Python SDK执行基于MPI的任务,操作步骤如下:
- 从JSON模板创建Batch池;
- 创建SAS URL并将可执行文件及支持文件作为公共资源文件上传;
- 创建任务对象:
- 使用
azure.batch.models.EnvironmentSetting添加环境设置; - 添加协调脚本(coordination script)和运行脚本(run_script)。
- 使用
协调脚本内容
#!/usr/bin/bash export MPI_HOME="/usr/local/openmpi4.0/openmpi-4.0.0/build" export CUDA_HOME="/usr/local/cuda-11.0" export LD_LIBRARY_PATH="$MPI_HOME/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH" export PATH="$MPI_HOME/bin:$CUDA_HOME/bin:$PATH" export PYTHONPATH="/usr/local/lib64/python3.6/site-packages:$PYTHONPATH"
运行脚本内容
#!/usr/bin/bash export MPI_HOME="/usr/local/openmpi4.0/openmpi-4.0.0/build" export CUDA_HOME="/usr/local/cuda-11.0" export LD_LIBRARY_PATH="$MPI_HOME/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH" export PATH="$MPI_HOME/bin:$CUDA_HOME/bin:$PATH" export PYTHONPATH="/usr/local/lib64/python3.6/site-packages:$PYTHONPATH" mpirun -np 3 --prefix /usr/local/openmpi4.0/openmpi-4.0.0/build --map-by ppr:4:node --oversubscribe --mca btl_openib_allow_ib 1 -host $AZ_BATCH_HOST_LIST $AZ_BATCH_TASK_SHARED_DIR/EXECUTABLE_FILE $AZ_BATCH_TASK_SHARED_DIR/INPUT_FILE_WITH_PARAMS
错误信息
/path/to/my/executable: error while loading shared libraries: libmpi.so.12: cannot open shared object file: No such file or directory
Primary job terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
核心问题:环境设置未生效,导致MPI共享库无法被找到,求正确的任务环境配置方法。
解决方案
问题根源
脚本中手动导出的环境变量仅在当前shell会话有效,但mpirun启动的子进程可能无法继承这些变量;同时Azure Batch任务的执行上下文可能未正确加载脚本中的配置,且LD_LIBRARY_PATH这类关键变量未被显式传递给所有MPI进程。
正确配置步骤
1. 全局配置环境变量(通过Task的EnvironmentSetting)
不要仅在脚本中手动导出,直接在任务对象中配置全局环境变量,确保所有进程都能获取:
from azure.batch import models as batch_models # 定义全局环境变量 environment_settings = [ batch_models.EnvironmentSetting( name="MPI_HOME", value="/usr/local/openmpi4.0/openmpi-4.0.0/build" ), batch_models.EnvironmentSetting( name="CUDA_HOME", value="/usr/local/cuda-11.0" ), batch_models.EnvironmentSetting( name="LD_LIBRARY_PATH", value="$MPI_HOME/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH" ), batch_models.EnvironmentSetting( name="PATH", value="$MPI_HOME/bin:$CUDA_HOME/bin:$PATH" ), batch_models.EnvironmentSetting( name="PYTHONPATH", value="/usr/local/lib64/python3.6/site-packages:$PYTHONPATH" ) ] # 创建任务时传入环境变量 task = batch_models.TaskAddParameter( id="mpi-task-1", command_line="bash run_script.sh", environment_settings=environment_settings, # 补充其他必要配置:资源文件、任务依赖等 )
2. 修改运行脚本,强制传递环境变量给MPI进程
在mpirun命令中添加-x参数,显式传递关键环境变量,确保所有子进程都能获取:
#!/usr/bin/bash mpirun -np 3 \ --prefix /usr/local/openmpi4.0/openmpi-4.0.0/build \ --map-by ppr:4:node \ --oversubscribe \ --mca btl_openib_allow_ib 1 \ -x LD_LIBRARY_PATH \ -x PATH \ -x MPI_HOME \ -x CUDA_HOME \ -host $AZ_BATCH_HOST_LIST \ $AZ_BATCH_TASK_SHARED_DIR/EXECUTABLE_FILE $AZ_BATCH_TASK_SHARED_DIR/INPUT_FILE_WITH_PARAMS
说明:
-x VAR_NAME会将当前shell的对应变量传递给所有MPI启动的进程,确保可执行文件能定位到libmpi.so.12。
3. 验证MPI库路径的有效性
先在Batch节点上手动检查目标路径下是否存在libmpi.so.12,若路径错误或文件缺失,需修正MPI_HOME配置:
ls /usr/local/openmpi4.0/openmpi-4.0.0/build/lib/libmpi.so.12
4. 简化脚本,避免冗余配置
既然已通过EnvironmentSetting设置全局环境变量,协调脚本和运行脚本中无需重复执行export操作,减少冲突和冗余。
额外注意事项
- 确保Batch池的所有节点已正确安装OpenMPI 4.0.0和CUDA 11.0,否则即使环境变量配置正确,也会出现库文件缺失问题;
- 多节点MPI任务需保证所有节点的MPI安装路径完全一致,否则
AZ_BATCH_HOST_LIST中的节点会因路径不匹配报错。
内容的提问来源于stack exchange,提问作者DOOM
相关产品推荐
相关产品推荐

