File size: 7,474 Bytes
1416d87 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | #!/bin/bash
# -----------------------------------------------------------------------------
# MatPL DCU 一键安装脚本
# 流程:源码拉取 → 编译安装 → 安装验证
# 用法:bash matpl_install.sh
# MATPL_SRC_DIR=/path/to/src bash matpl_install.sh # 指定源码路径
# -----------------------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# 1. 环境准备
echo ">>> Step 1: 加载环境"
source "$SCRIPT_DIR/../matchem_env.sh"
# 1.5 确保 gflags/glog 运行库存在(torch cmake 的运行时依赖,pip 环境通常缺失)
echo ">>> Step 1.5: 检查 gflags/glog 运行库"
MISSING_PKGS=""
ls "$CONDA_PREFIX"/lib/libgflags.so* >/dev/null 2>&1 || MISSING_PKGS="${MISSING_PKGS} gflags"
ls "$CONDA_PREFIX"/lib/libglog.so* >/dev/null 2>&1 || MISSING_PKGS="${MISSING_PKGS} glog"
if [ -n "${MISSING_PKGS}" ]; then
echo ">>> 安装缺失的运行库:${MISSING_PKGS}(conda-forge)"
conda install -y -c conda-forge ${MISSING_PKGS}
else
echo ">>> gflags/glog 已存在,跳过"
fi
# 下载辅助:优先 curl,失败时回退 wget(部分节点 curl 存在 TLS/代理问题)
download_file() {
local url="$1" out="$2"
if command -v curl >/dev/null 2>&1 && curl -fL -o "$out" "$url"; then
return 0
fi
echo "[提示] curl 下载失败,改用 wget: $url"
if command -v wget >/dev/null 2>&1 && wget -O "$out" "$url"; then
return 0
fi
echo "[错误] 下载失败: $url"
return 1
}
# 2. 交互式配置源码路径
MATPL_SRC="${MATPL_SRC_DIR:-${SCRIPT_DIR}/matpl_dcu}"
if [ -t 0 ]; then
read -rp "请输入 MatPL 源码路径 [默认: ${MATPL_SRC}]: " input_src
MATPL_SRC="${input_src:-${MATPL_SRC}}"
fi
echo "[提示] 使用 MatPL 源码路径: ${MATPL_SRC}"
# 3. 源码准备
# 说明:
# - 开发/测试阶段:自动通过 HTTPS + 代理拉取源码
# - 生产/客户场景:建议提前上传源码到集群,通过 MATPL_SRC_DIR 指定
if [ ! -d "$MATPL_SRC/.git" ] && [ ! -f "$MATPL_SRC/main.py" ]; then
echo ">>> Step 3: 拉取 MatPL DCU 源码"
# 计算节点需通过 HTTP 代理访问外网,配置 git 代理,如代理实效,可向集群管理员重新申请
git config --global http.proxy "http://scnethpc2601:sWMtqVS@10.16.1.52:3120"
git clone --depth 1 --branch nep-dcu/2026.3 "https://gitee.com/wang-rui-sugon/matpl_dcu.git" "$MATPL_SRC"
else
echo ">>> Step 3: 源码已存在,跳过拉取"
fi
cd "$MATPL_SRC"
echo "=========================================="
echo " MatPL DCU 一键安装脚本"
echo "=========================================="
echo "工作目录: $MATPL_SRC"
# 3.5 Patch MatPL CMakeLists.txt:避免在登录节点触发 torch 动态库加载
echo ">>> Step 3.5: Patch MatPL CMakeLists.txt,避免登录节点 import torch"
OP_CMAKE="$MATPL_SRC/src/op/CMakeLists.txt"
CHEB_CMAKE="$MATPL_SRC/src/feature/chebyshev/CMakeLists.txt"
if [ -f "$OP_CMAKE" ]; then
sed -i "s|import torch; print(torch.utils.cmake_prefix_path)|import importlib.util, os; spec = importlib.util.find_spec('torch'); p = os.path.dirname(spec.origin) if spec and spec.origin else ''; print((p + '/share/cmake') if p else '')|" "$OP_CMAKE"
sed -i "s|import torch; print(torch.__path__\[0\])|import importlib.util, os; spec = importlib.util.find_spec('torch'); print(os.path.dirname(spec.origin) if spec and spec.origin else '')|" "$OP_CMAKE"
sed -i "s|import torch; print(torch.version.hip is not None)|print(True)|" "$OP_CMAKE"
echo ">>> 已 patch $OP_CMAKE"
fi
if [ -f "$CHEB_CMAKE" ]; then
sed -i "s|import torch; print(torch.utils.cmake_prefix_path)|import importlib.util, os; spec = importlib.util.find_spec('torch'); p = os.path.dirname(spec.origin) if spec and spec.origin else ''; print((p + '/share/cmake') if p else '')|" "$CHEB_CMAKE"
echo ">>> 已 patch $CHEB_CMAKE"
fi
# 4. 修复 torch cmake 中硬编码的 /opt/dtk 路径
TORCH_CMAKE="$CONDA_PREFIX/lib/python3.11/site-packages/torch/share/cmake/Caffe2/Caffe2Targets.cmake"
if [ -f "$TORCH_CMAKE" ]; then
if grep -q "/opt/dtk" "$TORCH_CMAKE"; then
echo ">>> Step 4: 修复 torch cmake 硬编码路径"
sed -i "s|/opt/dtk|$ROCM_PATH|g" "$TORCH_CMAKE"
else
echo ">>> Step 4: torch cmake 路径已正确,跳过修复"
fi
else
echo "警告: 未找到 torch Caffe2Targets.cmake,跳过修复"
fi
# 5. 确保安装兼容版 glog(0.7+ API 不兼容)
echo ">>> Step 5: 确保 glog 0.6 已安装"
if [ -f "$CONDA_PREFIX/lib/libglog.so.1" ]; then
echo "glog 0.6+ 已存在,跳过安装"
else
echo "从源码编译 glog 0.6 ..."
GLOG_BUILD_DIR=$(mktemp -d)
cd "$GLOG_BUILD_DIR"
download_file "https://github.com/google/glog/archive/refs/tags/v0.6.0.tar.gz" v0.6.0.tar.gz || exit 1
tar -xzf v0.6.0.tar.gz
cd glog-0.6.0
cmake -S . -B build \
-DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX" \
-DBUILD_SHARED_LIBS=ON \
-DWITH_GTEST=OFF
cmake --build build -j$(nproc)
cmake --install build
cd "$MATPL_SRC"
rm -rf "$GLOG_BUILD_DIR"
fi
# 6. 导出编译所需环境变量
echo ">>> Step 6: 导出编译环境变量"
export ROCM_PATH="$ROCM_PATH"
export CUDA_TOOLKIT_ROOT_DIR="${ROCM_PATH}/cuda/cuda-12"
export PATH="${ROCM_PATH}/cuda/cuda-12/bin:$PATH"
export CMAKE_PREFIX_PATH="${ROCM_PATH}/lib/cmake:${ROCM_PATH}/dcc/comgr/lib64/cmake/amd_comgr:${CMAKE_PREFIX_PATH:-}"
export LIBRARY_PATH="${ROCM_PATH}/cuda/cuda-12/targets/x86_64-linux/lib:${ROCM_PATH}/dcc/lib/clang/17.0.0/lib/linux:${LIBRARY_PATH:-}"
export CPLUS_INCLUDE_PATH="$CONDA_PREFIX/include:${CPLUS_INCLUDE_PATH:-}"
# 修复 GCC 版本:强制使用 sghpc-mpi-gcc/26.3 提供的 GCC 12.4.0
export CC=/public/software/sghpc_sdk.bak/Linux_x86_64/26.3/compilers/gcc-12.4.0/bin/gcc
export CXX=/public/software/sghpc_sdk.bak/Linux_x86_64/26.3/compilers/gcc-12.4.0/bin/g++
# 7. 清理历史编译产物并重新编译
echo ">>> Step 7: 开始编译 MatPL"
cd src
rm -rf feature/nep_find_neigh/build feature/NEP_GPU/build op/build
# 登录节点内存有限,限制并行编译数以避免 OOM
NPROC=$(nproc)
if [ "$NPROC" -gt 2 ]; then
NPROC=2
fi
echo ">>> 限制并行编译数为 ${NPROC}(避免节点 OOM)"
bash build.sh -j${NPROC}
# 8. 生成 env.sh
cd "$MATPL_SRC"
cat > env.sh <<EOF
# Load for MatPL
export PYTHONPATH=$MATPL_SRC:\${PYTHONPATH:-}
export PATH=$MATPL_SRC/src/bin:\${PATH:-}
EOF
# 9. 验证
echo ">>> Step 9: 验证安装"
source env.sh
python -c "import matpl; print('MatPL import OK')" 2>/dev/null || \
python -c "import sys; sys.path.insert(0, '$MATPL_SRC'); import matpl; print('MatPL import OK')" 2>/dev/null || \
echo "注意: MatPL Python 包导入验证跳过(不影响 C++ 算子使用)"
# 10. 将配置写回 matchem_env.sh
MATCHEM_ENV_FILE="${SCRIPT_DIR}/../matchem_env.sh"
if [ -f "${MATCHEM_ENV_FILE}" ]; then
echo "[提示] 更新 ${MATCHEM_ENV_FILE} ..."
sed -i "s|^export MATPL_SRC_DIR=.*|export MATPL_SRC_DIR=${MATPL_SRC}|" "${MATCHEM_ENV_FILE}"
else
echo "[警告] 未找到 ${MATCHEM_ENV_FILE},跳过写入配置。"
fi
echo ""
echo "=========================================="
echo " MatPL DCU 安装完成!"
echo "=========================================="
echo "源码路径: $MATPL_SRC"
echo "环境文件: $MATPL_SRC/env.sh"
echo ""
echo "每次使用前请执行:"
echo " source $SCRIPT_DIR/../matchem_env.sh"
|