Linux 上非 root 用户 Conda 编译安装 ISCE2(含 RelaxIV 、GPU 加速等全部可选项,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

发表评论

电子邮件地址不会被公开。 必填项已用*标注