(首发地址:学习日记 Linux 上非 root 用户 Conda 编译安装 ISCE2(含 RelaxIV 、GPU 加速等全部可选项) – 学习日记 )
今天演示一下 Linux 上非 root 用户 Conda 编译安装 ISCE2(含 RelaxIV、GPU 加速等全部可选项)。本文的演示环境是 Nvidia A100 GPU 云服务器、Ubuntu 18.04 Linux、Miniconda3 版本 4.13.0、ISCE2 git 仓库最新版本。视频演示地址:https://www.bilibili.com/video/BV1La411o785?share_source=copy_web&vd_source=d1925b070926f23b2b6676137251e9ea
提示:本演示视频分为“编译安装”和“简单测试”如下两部分:
编译安装
简单测试
一、安装方法概览
实际上,现在可以在 Conda 的 conda-forge 频道直接安装 isce2。用命令:conda create -n isce2 -c conda-forge isce2 即可。但是,仓库里的版本是没有 RelaxIV、GPU 加速等可选项的。因此,本文采用编译安装的方法,安装上 ISCE2 主页上列出的全部可选项,着重介绍 RelaxIV、GPU 加速编译安装的细节。
在当前(2022.08.06),在 ISCE2 的项目主页上( GitHub - isce-framework/isce2: InSAR Scientific Computing Environment version 2 ),有 SCons、CMake 两种编译安装方法。这里使用 SCons。
本文的方法可以无需 root 权限,理论上适用于各种 Linux 发行版本。当然,Nvidia 的显卡私有驱动必须事先安装好。本文给出每一步的具体命令,并配合视频演示。
二、安装步骤
1、Miniconda 安装
wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh # 每步都选“yes”
. ~/.bashrc
conda config --set auto_activate_base false
conda deactivate
conda update -n base -c defaults conda
2、创建 conda 环境并安装所有包
conda create -n isce2
conda activate isce2
for p in python=3.8 sysroot_linux-64=2.17 gcc=9.4 gxx=9.4 gfortran=9.4 git scons cython gdal h5py libgdal pytest numpy fftw scipy basemap opencv pybind11 shapely openmotif openmotif-dev xorg-libx11 xorg-libxt xorg-libxmu xorg-libxft libiconv xorg-libxrender xorg-libxau xorg-libxdmcp imagemagick binutils cudatoolkit-dev; do conda install -c conda-forge ${p} -y; done
conda install -c ehmoussi grace
conda list | grep "python\|sysroot_linux-64\|gcc\|gxx\|gfortran" # 可以看到前面指定版本的包的版本如指定的一致。
创建相关源码、安装、编译、配置文件夹:
mkdir ~/tools/{src,isce} -pv
mkdir ~/{build,.isce} -v
下载 RelaxIV 源码:
cd ~/tools/src
git clone https://github.com/frangio68/Min-Cost-Flow-Class
安装 PULP:
pip install pulp -i https://pypi.tuna.tsinghua.edu.cn/simple
创建 cython3 符号链接:
cd $CONDA_PREFIX/bin
ln -sfv cython cython3
下载 isce2 源码:
cd ~/tools/src
git clone https://github.com/isce-framework/isce2
复制需要的 RelaxIV 源码到 isce2 源码文件夹中并修改编译配置文件:
cd isce2
cp ../Min-Cost-Flow-Class/RelaxIV contrib/UnwrapComp/src/ -rv
cp ../Min-Cost-Flow-Class/MCFClass/MCFClass.h contrib/UnwrapComp/src/RelaxIV/ -v
cp ../Min-Cost-Flow-Class/OPTUtils/OPTUtils.h contrib/UnwrapComp/src/RelaxIV/ -v
对比了相关的 CMakeList.txt ,修改了 src 下面的文件,去掉了 listFiles 中的 RelaxIV/Main.C,如下:
vim contrib/UnwrapComp/src/SConscript
listFiles = ['RelaxIV/RelaxIV.C', 'relaxIVdriver.cpp']
主要编译配置文件的内容:
vim ~/.isce/SConfigISCE
PRJ_SCONS_BUILD=$HOME/build/isce_build
PRJ_SCONS_INSTALL=$ISCE_HOME
LIBPATH=$CONDA_PREFIX/lib
CPPPATH=$CONDA_PREFIX/include $CONDA_PREFIX/include/python3.8 $CONDA_PREFIX/lib/python3.8/site-packages/numpy/core/include $CONDA_PREFIX/include/opencv4
FORTRAN=$CONDA_PREFIX/bin/gfortran
CC=$CONDA_PREFIX/bin/gcc
CXX=$CONDA_PREFIX/bin/g++
FORTRANPATH=$CONDA_PREFIX/include
MOTIFLIBPATH=$CONDA_PREFIX/lib
X11LIBPATH=$CONDA_PREFIX/lib
MOTIFINCPATH=$CONDA_PREFIX/include
X11INCPATH=$CONDA_PREFIX/include
RPATH=$CONDA_PREFIX/lib
ENABLE_CUDA=True
CUDA_TOOLKIT_PATH=$CONDA_PREFIX # use 'which nvcc' to verify
从 “Your GPU Compute Capability”(https://developer.nvidia.com/cuda-gpus)处查出 NVIDIA A100 显卡的 “Compute Capability” 是 “8.0”,在 env['ENABLESHAREDNVCCFLAG'] 中添加 “-arch=sm_80”。这一步不是必要的,主要是优化 CUDA 代码编译。
vim scons_tools/cuda.py
env['ENABLESHAREDNVCCFLAG'] = '-std=c++11 -shared -Xcompiler -fPIC -arch=sm_80'
设置编译时环境变量:
export ISCE_HOME=${HOME}/tools/isce
export SCONS_CONFIG_DIR=${HOME}/.isce
开始编译:
scons install
激活环境即自动设置环境变量的脚本:
vim $CONDA_PREFIX/etc/conda/activate.d/env_var.sh
# isce2.rc
export ISCE_HOME=$HOME/tools/isce
export PATH=$ISCE_HOME/bin:$ISCE_HOME/applications:$PATH
export LD_LIBRARY_PATH=$ISCE_HOME/lib:$LD_LIBRARY_PATH
export PYTHONPATH=$ISCE_HOME:$ISCE_HOME/applications:$ISCE_HOME/components:$ISCE_HOME/library:$HOME/tools:$PYTHONPATH
三、退出并重新进入环境并简单测试
conda deactivate
conda activate isce2
cd
主要程序测试:
stripmapApp.py --help
可选项 "unwrap 2 stage" 测试:
(isce2) learndiary@gpuserver:~$ ls /home/learndiary/tools/isce/components/contrib/UnwrapComp/
__init__.py phaseUnwrap.py unwcomp.so unwrapComponents.py
与 Conda 仓库中的 isce2 相比,自己编译的多了 unwcomp.so 这个文件。
/home/learndiary/tools/isce/components/contrib/UnwrapComp/phaseUnwrap.py --help
/home/learndiary/tools/isce/components/contrib/UnwrapComp/phaseUnwrap.py # 在当前目录中正常产生一个 png 文件
/home/learndiary/tools/isce/components/contrib/UnwrapComp/phaseUnwrap.py -MCF # 报告 RelaxIV 相关错误,应该跟里面 “from . import unwcomp” 有关。用下面 python 交互界面测试就正常了。
# 在 python 交互界面重新测试:
python
import sys
from contrib.UnwrapComp import phaseUnwrap
sys.argv = ['/home/learndiary/tools/isce/components/contrib/UnwrapComp/phaseUnwrap.py', '-MCF']
phaseUnwrap.main() # 在当前目录正常产生一个 png 和 network.dmx
cuda 相关检测:
(isce2) learndiary@gpuserver:~$ ls /home/learndiary/tools/isce/components/zerodop/
baseline bistaticgeo2rdr geo2rdr geozero GPUgeo2rdr GPUresampslc GPUtopozero __init__.py __pycache__ topozero
与 Conda 仓库中的 isce2 相比,自己编译的多了 GPUgeo2rdr、GPUresampslc、GPUtopozero 三个 GPU 相关的文件夹。
(isce2) learndiary@gpuserver:~/tools/isce/components/zerodop/GPUgeo2rdr$ ls
GPUgeo2rdr.abi3.so __init__.py
(isce2) learndiary@gpuserver:~/tools/isce/components/zerodop/GPUgeo2rdr$ ldd GPUgeo2rdr.abi3.so
# 其中有包含 cuda 的动态链接库如下:
libcudart.so.11.0 => /home/learndiary/miniconda3/envs/isce2/lib/libcudart.so.11.0 (0x00007f13d71d6000)
# 另外两个 GPU 相关的文件夹中的动态链接库 *.so 文件也是同样的情况。
关于 ISCE2 的编译安装就此完成。因为本人并非使用这种软件的专业人士,各位在安装、使用的过程中有任何问题欢迎交流、批评与指正。
四、参考网址
1、ISCE2 GitHub - isce-framework/isce2: InSAR Scientific Computing Environment version 2
2、ISCE2 installation guide GitHub - lijun99/isce2-install
3、How to call a function from the interactive interpreter and pass arguments for argparse? python - How to call a function from the interactive interpreter and pass arguments for argparse? - Stack Overflow