[Share Experiences] Linux 上非 root 用户 Conda 编译安装 ISCE2(含 RelaxIV 、GPU 加速等)
Tofloor
poster avatar
littlebat
deepin
2022-08-11 01:22
Author

(首发地址:学习日记 https://www.learndiary.com/2022/08/linux-conda-isce2/ ,2023年4月8日更新)

今天演示一下 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

Reply Favorite View the author
All Replies
xuqi
deepin testing team
2022-08-11 01:36
#1

kissing_heart

Reply View the author