今天演示一下 Linux 上非 root 用户 Conda 编译安装 ISCE2(含 RelaxIV、GPU 加速等全部可选项)。本文的演示环境是 Nvidia A100 GPU 云服务器、Ubuntu 18.04 Linux、Miniconda3 版本 conda 23.3.1、ISCE2 2.6.1。分为 ISCE2 编译安装和简单测试两部分。
重要提示:isce2 这款软件对各组件的版本特别敏感,conda 默认会安装有效的最新版本,导致 isce2 安装失败。本文已于 2023年4月8日更新了 isce2 编译运行所需要的 Conda 环境安装方法,所以视频中的Conda 环境安装部分已经过时。本文的首发网址为:学习日记 https://www.learndiary.com/2022/08/linux-conda-isce2/ 。若有更新会第一时间发布在首发网址中。
视频演示地址: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 的项目主页上( https://github.com/isce-framework/isce2 ),有 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 环境安装方法是直接从配置文件中导入安装,理论上固定了各软件包的版本。
首先从百度网盘下载 conda 环境配置文件 isce2261_gpu_env.yml : https://pan.baidu.com/s/1flWEWR8Ls8pOyl0ad5gQlw?pwd=me2s
然后,在下载的配置文件当前目录执行命令导入安装并激活环境,如需要创建的 conda 环境名称为 isce2 :
conda env create -n isce2 -f isce2261_gpu_env.yml
conda activate isce2
创建相关源码、安装、编译、配置文件夹:
mkdir ~/tools/{src,isce} -pv
mkdir ~/{build,.isce} -v
下载 RelaxIV 源码:
cd ~/tools/src
git clone https://github.com/frangio68/Min-Cost-Flow-Class
创建 cython3 符号链接:
cd $CONDA_PREFIX/bin
ln -sfv cython cython3
下载 isce2 2.6.1 源码:
cd ~/tools/src
wget https://github.com/isce-framework/isce2/archive/refs/tags/v2.6.1.tar.gz
tar -xf v2.6.1.tar.gz
mv isce2-2.6.1 isce2 -v
(后面的内容暂无需更新,于2023年4月8日未更新)
复制需要的 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 https://github.com/isce-framework/isce2
2、ISCE2 installation guide https://github.com/lijun99/isce2-install
3、How to call a function from the interactive interpreter and pass arguments for argparse? https://stackoverflow.com/questions/55543747/how-to-call-a-function-from-the-interactive-interpreter-and-pass-arguments-for-a