# hpcrunner
**Repository Path**: liulixin1982/hpcrunner
## Basic Information
- **Project Name**: hpcrunner
- **Description**: openEuler High Performance Computing(HPC) Runner, provides universal portal for hpc users and developers.
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 83
- **Created**: 2024-03-19
- **Last Updated**: 2024-03-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HPCRunner : 贾维斯智能助手
## ***愿景:自动容器化助力极简部署,一站式调优HPC应用***

### 项目背景
        HPC被喻为是IT行业“金字塔上的明珠”,其部署、编译、运行、性能采集分析的门槛非常高,不同的机器上部署HPC应用耗费大量精力,而且很多情况下需要同时部署ARM/X86两套环境进行验证,增加了很多的重复性工作,无法聚焦核心算法优化。

### 项目特色
- 支持ARM/X86,一键部署,采用业界权威依赖目录结构管理海量依赖,自动生成module file
- 根据HPC配置实现一键编译运行、一键CPU/GPU性能采集、一键Benchmark.
- 所有配置仅用一个文件记录,HPC应用部署到不同的机器仅需修改配置文件.
- 日志管理系统自动记录HPC应用部署过程中的所有信息.
- 软件本身无需编译开箱即用,仅依赖Python环境.
- HPC应用容器化-目前QE已经实现,参考container目录.
- (未来) 集成HPC领域常用性能调优手段、核心算法.
- (未来) 集群性能分析工具.
- (未来) 智能调优.
### 目录结构
| 目录/文件 | 说明                               | 备注     |
| --------- | ---------------------------------- | -------- |
| benchmark | 矩阵运算、OpenMP、MPI、P2P性能测试 |          |
| doc       | 文档                               |          |
| downloads | 存放依赖库源码包/压缩包            |          |
| examples  | 性能小实验                         |          |
| package   | 存放安装脚本和FAQ                  |          |
| software  | 依赖库二进制仓库(内置精度分析工具)         | 自动生成 |
| src       | 贾维斯源码                         |          |
| templates | 常用HPC应用的配置模板              |          |
| test      | 贾维斯测试用例                     |          |
| workloads  | 常用HPC应用的算例合集              |          |
| init.sh   | 贾维斯初始化文件                   |          |
| jarvis    | 贾维斯启动入口                     |          |
### 支持安装的依赖列表
| 软件名   | 软件信息        | 类别      |
| ------- | -------------- | --------- |
| antlr   | 代码生成器,用于构建编译器和解释器          | 开发工具  |
| cairo   | 2D图形库,支持多种输出设备和格式           | 图像处理  |
| fftw    | 快速傅里叶变换库,支持多种算法和精度         | 数学库    |
| go      | 编程语言,具有高效的垃圾回收和并发特性       | 开发工具  |
| htslib  | 高通量测序数据处理库,支持多种常见格式的文件操作 | 数据库    |
| kfft    | 快速傅里叶变换库鲲鹏版本                  | 数学库    |
| libxml2 | 轻量级、可移植的XML解析库                 | 开发工具  |
| nvhpc   | NVIDIA HPC SDK,包含CUDA和Fortran编译器     | 开发工具  |
| osu     | 基准测试套件,用于衡量系统性能              | 性能评估  |
| Porting | HPC应用迁移工具,支持将应用迁移到鲲鹏           | 应用迁移  |
| scotch  | 科学计算软件包,包括图划分、矩阵操作等模块   | 科学计算  |
| vis5dplus | 五维数据可视化软件,支持多种数据格式和渲染方式 | 可视化    |
| arpack       | 稀疏矩阵特征值计算库                       | 数学库    |
| automake     | GNU Autotools工具集的一部分,用于生成Makefile   | 开发工具  |
| cmake        | 用于管理C/C++软件构建和依赖关系的跨平台工具     | 开发工具  |
| freetype     | TrueType字体渲染引擎                       | 图像处理  |
| g2clib       | 处理GRIB和GRIB2格式气象数据的库              | 数据库    |
| grads        | 可视化气象数据的软件                        | 可视化    |
| grib_api     | 处理GRIB和BUFR格式气象数据的库               | 数据库    |
| Hyper-tuner  | 高性能计算任务调优工具                | 性能优化  |
| hypre        | 大规模稀疏线性系统求解器                     | 数学库    |
| kgcc         | 基于鲲鹏平台极致优化的GCC编译器          | 开发工具  |
| kml          | 基于鲲鹏平台极致优化的数学库              | 数学库  |
| mesa         | 开源3D图形库                                | 图像处理  |
| metis        | 图划分和重排列库                            | 科学计算  |
| oneapi       | Intel开发的工具包,支持各种体系结构的HPC应用  | 开发工具  |
| openblas     | 线性代数库,实现BLAS接口                    | 数学库    |
| parmetis     | 划分大型稀疏图形的高性能库                   | 科学计算  |
| petsc        | 大规模科学计算软件包                        | 科学计算  |
| precice      | 进程耦合库,用于将不同物理学模型耦合起来     | 应用部署  |
| proj         | 地理空间数据处理库                          | 地理信息  |
| singularity  | 容器化解决方案                              | 应用部署  |
| slepc        | 大规模特征值计算库                           | 数学库    |
| wxWidgets    | 跨平台窗口工具包                            | 开发工具  |
| yaml-cpp     | C++ YAML解析器和生成器                      | 开发工具  |
| bedtools     | 用于基因组特征分析的软件                  | 数据库    |
| ctffind      | 基于图像处理的电子显微镜聚焦软件           | 图像处理  |
| gatk         | 基因组变异分析工具                        | 序列分析  |
| gsl          | GNU科学库,提供多种数学函数和数据结构         | 数学库    |
| ImageMagick  | 处理图像的开源软件                        | 图像处理  |
| lapack       | 线性代数库,主要实现了BLAS接口              | 数学库    |
| mfem         | 可扩展有限元方法库                        | 数学库    |
| opencoarrays | 并行编程库                                | 开发工具  |
| picard       | 处理生物信息数据的Java库                  | 序列分析  |
| python3      | Python编程语言的最新版本                  | 开发工具  |
| spglib       | 空间群处理库                              | 科学计算  |
| zlib         | 压缩库                                    | 工具库    |
| bisheng     | 基于鲲鹏极致优化的毕晟编译器,基于LLVM体系         | 开发工具  |
| blas        | 基本线性代数子程序                          | 数学库    |
| curl        | 数据传输工具                                | 工具库    |
| cuda        | NVIDIA的并行计算平台                        | 并行编程  |
| gcc         | GNU C和C++编译器                            | 开发工具  |
| gdal        | 用于地理空间数据转换和处理的开源库           | 地理信息  |
| hdf4        | HDF4数据文件格式处理库                     | 科学计算  |
| hdf5        | HDF5数据文件格式处理库                     | 科学计算  |
| ioapi       | 常见大气化学模型输出和输入预处理库          | 数据库    |
| IPM         | 描述HPC应用程序的性能测量的套件             | 性能优化  |
| libint      | 提供高精度库令积分的C库                     | 数学库    |
| libjpeg     | JPEG图像压缩/解压缩库                      | 图像处理  |
| mpich       | 高性能消息传递接口库                       | 并行编程  |
| mumps       | 大规模稀疏线性系统求解器                    | 数学库    |
| opencv      | 开源计算机视觉和机器学习软件库              | 图像处理  |
| openjpeg    | 用于压缩JPEG2000数据的开源库                | 图像处理  |
| pio         | 访问并行IO的工具                            | 数据库    |
| pixman      | 图像处理和绘图库                           | 图像处理  |
| R           | 开源统计计算和绘图软件                      | 开发工具  |
| spooles     | 大规模稀疏线性代数Solver                     | 数学库    |
| szip        | 压缩库                                     | 工具库    |
| boost       | 十多年来一直是C++开发人员不可或缺的库        | 开发工具  |
| bowtie2     | 测序匹配工具                                | 序列分析  |
| darshan     | HPC应用程序性能分析工具,IO性能分析          | 性能优化  |
| eigen3      | C++模版实现的线性代数库                     | 数学库    |
| glibc       | GNU C语言库                                 | 工具库    |
| git         | 分布式版本控制系统                          | 开发工具  |
| hdf-eos2    | HDF-EOS2数据集处理库                        | 科学计算  |
| hdf-eos5    | HDF-EOS5数据集处理库                        | 科学计算  |
| jasper      | 图像压缩/解压缩库                          | 图像处理  |
| jellyfish   | 海星组装工具                                | 序列分析  |
| libpng      | PNG图像格式处理库                           | 图像处理  |
| libvori     | 计算相邻格点之间夹角,适用于大尺寸网格      | 科学计算  |
| ncl         | NCAR命令语言                               | 开发工具  |
| ncview      | 可视化海洋和气象数据                        | 可视化    |
| openlb      | 模拟流体现象的软件                          | 科学计算  |
| openmpi     | 高性能消息传递接口库                       | 并行编程  |
| pkg-config  | 安装GNU和Unix的编译器等工具所需的参数      | 工具库    |
| plumed      | 对构象变化进行统计物理和化学分析的软件包     | 序列分析  |
| samtools    | 处理NGS数据的磁盘和内存带索引文件的命令列表 | 数据库    |
| salmon      | 快速准确地从RNA-seq读数估计转录本表达水平  | 数据库    |
| tau         | HPC应用程序性能分析工具                      | 性能优化  |
| udunits     | 单位标准化的C程序中用于解释单位             | 开发工具  |
| bwa                    | 测序匹配工具                              | 序列分析  |
| elpa                   | 提供多种实现和算法的Eigenvalue求解器      | 数学库    |
| gmp                    | 高精度计算库                              | 数学库    |
| hmpi                   | 高性能消息传递接口库                     | 并行编程  |
| kahip                  | 图划分库                                  | 图形计算  |
| libxc                  | C语言库,可用于从交换关联功能获得DFT近似  | 数学库    |
| netcdf                 | 处理气象和海洋科学等领域大型科学数据的C库 | 科学计算  |
| optimized-routines     | BLAS,LAPACK和这些程序中相关库的优化版本 | 数学库    |
| pnetcdf                | 访问并行I/O的工具库                         | 数据库    |
| scalapack              | 大规模稠密线性代数求解器                   | 数学库    |
| valgrind               | 内存调试和性能分析工具                     | 开发工具  |
### 支持安装的HPC应用列表
| 应用名           | 应用信息                                      | 领域      |
| ---------------- | --------------------------------------------- | --------- |
| abinit           | 第一个完全自主实现密度泛函理论的程序         | 科学计算  |
| agcm             | 气象局自主研发的全球大气环流谱模式          | 大气科学  |
| amber            | 分子动力学模拟软件                           | 生命科学  |
| bowtie2          | 测序匹配工具                                  | 序列分析  |
| bwa              | 分析二代测序数据                              | 序列分析  |
| calculix         | 有限元分析代码                                | 工程      |
| duns             | 模拟大气化学反应                              | 大气科学  |
| elmer            | 多物理场模拟系统                              | 数学库    |
| grapes           | 气象预报应用                    | 大气科学  |
| gromacs          | 生物分子动力学软件                            | 生命科学  |
| imb              | Intel MPI Benchmarks                          | 性能优化  |
| ImageMagick      | 图像处理命令行工具                            | 图像处理  |
| ioapi            | I/O API支持emission和achimie模型              | 大气科学  |
| mg-cfd           | 并行计算流体力学软件                          | 科学计算  |
| mfem             | 软件库,解决非线性问题和超大规模的并行问题    | 数学库    |
| nco              | 并行化Unix / Linux命令行工具,可用于处理NetCDF文件 | 科学计算  |
| nwchem           | 高性能计算量子化学模拟软件                    | 化学      |
| ncview           | 可视化海洋和气象数据                          | 可视化    |
| openfoam         | 开源的CFD软件                                | 科学计算  |
| openjpeg         | 图像格式处理库                               | 图像处理  |
| openlb           | 模拟流体现象的软件                            | 科学计算  |
| opencv           | 开源计算机视觉库                              | 计算机视觉 |
| pytorch          | Python语言驱动的深度学习框架                 | 机器学习  |
| qe               | 第一个基于密度泛函理论的自由软件             | 科学计算  |
| qmcpack          | 基于Monte Carlo方法的量子物理仿真程序        | 物理学    |
| samtools         | 处理NGS数据的磁盘和内存带索引文件的命令列表   | 数据库    |
| scotch           | 图划分库                                      | 图形计算  |
| siesta           | 第一性原理计算软件                              | 物理学    |
| SU2              | 开源大规模CFD程序                             | 科学计算  |
| trinity          | RNA-seq transcriptome拼装器                   | 序列分析  |
| udunits          | C程序中用于解释单位的库                       | 开发工具  |
| bcc-esm          | 全球气候系统模型                    | 大气科学  |
| bedtools         | 常见的基因组工具                              | 生命科学  |
| blast            | 序列匹配软件                                  | 序列分析  |
| CMAQ             | 使用化学传输模型的空气质量建模工具            | 大气科学  |
| CP2K             | 高精度物理和化学模拟                         | 科学计算  |
| CESM             | 全球气候模型                                  | 大气科学  |
| ctffind          | 粒子旋转平均程序,用于酶成像等领域            | 生命科学  |
| fvcom            | 具有海洋生态动力学和水质应用的三维浪涌模型      | 海洋科学  |
| gatk             | 基因组变异检测框架                            | 生命科学  |
| grads            | 可视化大气-土壤系统模型                       | 数据可视化 |
| hpcg             | 并行HPC线性求解器性能基准                      | 性能优化  |
| hpl              | HPL CheckRecd性能基准                         | 性能优化  |
| htslib           | 用于高通量序列数据处理的C库                   | 生命科学  |
| jasper           | JPEG-2000图像压缩库                           | 图像处理  |
| lammps           | 大型分子动力学软件                            | 生命科学  |
| libjpeg          | 压缩和解压缩JPEG影象                          | 图像处理  |
| miniFE           | 有限元求解器                                  | 工程      |
| mumps            | 并行稠密和稀疏直接线性求解器                  | 数学库    |
| namd             | 大规模分子动力学仿真软件                      | 生命科学  |
| ncl              | NCAR Command Language,用于气象和大气科学     | 大气科学  |
| octave           | 数值计算软件包                                | 数学库    |
| octopus          | 有限成键密度泛函理论程序                      | 科学计算  |
| OpenCoarrays     | 使用Fortran COARRAYS的并行编程模式            | 并行编程  |
| op2              | 一种快速GPU加速的稠密矩阵操作库               | 数学库    |
| picard           | 工具套件,用于操纵大规模数据集                | 生命科学  |
| petsc            | 并行线性代数工具                              | 数学库    |
| rmaps-now        | 短时预报应用                     | 大气科学  |
| relion           | 单粒子冷冻电镜图像处理软件                    | 生命科学  |
| roms             | 海洋环境建模工具                              | 海洋科学  |
| SPECFEM3D_GLOBE | 全球弹性波地震模拟                           | 地球物理  |
| slepc            | 大型特征值问题求解器                          | 数学库    |
| stream           | 用于衡量计算机系统内存带宽的性能,为数据读写的不同操作提供独立的评估 | 性能优化  |
| wannier90        | 转换Bloch波函数为Wannier函数的程序            | 物理学    |
| wrf              | 天气预报和研究模型                           | 大气科学  |
| wxWidgets        | 用于创建跨平台GUI应用程序的开发工具          | 开发工具  |
### 使用说明
1.下载包解压之后初始化
```
source ./init.sh
```
2.修改data.config或者套用现有模板,各配置项说明如下所示:
|    配置项    | 说明                                                         | 示例                                                         |
| :----------: | :----------------------------------------------------------- | :----------------------------------------------------------- |
|   [SERVER]   | 服务器节点列表,多节点时用于自动生成hostfile,每行一个节点   | 11.11.11.11                                                  |
|  [DOWNLOAD]  | 每行一个软件的版本和下载链接,默认下载到downloads目录(可设置别名) | cp2k/8.2 https://xxx cp2k.8.2.tar.gz                         |
| [DEPENDENCY] | HPC应用依赖安装脚本                                          | ./jarvis -install gcc/9.3.1 com
module use ./software/modulefiles
module load gcc9 |
|    [ENV]     | HPC应用编译运行环境配置                                      | source env.sh                                                |
|    [APP]     | HPC应用信息,包括应用名、构建路径、二进制路径、算例路径      | app_name = CP2K
build_dir = /home/cp2k-8.2/
binary_dir = /home/CP2K/cp2k-8.2/bin/
case_dir = /home/CP2K/cp2k-8.2/benchmarks/QS/ |
|   [BUILD]    | HPC应用构建脚本                                              | make -j 128                                                  |
|   [CLEAN]    | HPC应用编译清理脚本                                          | make -j 128 clean                                            |
|    [RUN]     | HPC应用运行配置,包括前置命令、应用命令和节点个数            | run = mpirun -np 2 
binary = cp2k.psmp H2O-256.inp
nodes = 1 |
|    [JOB]     | HPC应用作业调度运行配置            | 多瑙作业调度脚本 |
|   [BATCH]    | HPC应用批量运行命令                                          | #!/bin/bash
nvidia-smi -pm 1
nvidia-smi -ac 1215,1410 |
|   [LOOP]    | HPC循环优化工具                                          | 将循环代码自动生成可进行性能分析和精度对比的程序 |
|    [PERF]    | 性能工具额外参数                                             | perf= -o
nsys=
ncu=--target-processes all --launch-skip 71434 --launch-count 1 |
3.贾维斯命令大全
| 功能 | 命令 | 示例/说明 |
| --- | --- | --- |
| 一键下载HPC应用 | ./jarvis -d | 应用将自动下载[DOWNLOAD]中地址到downloads目录 |
| 安装依赖 | ./jarvis -install [package/][name/version/other] [option] | ./jarvis -install bisheng/2.1.0 com |
| 一键卸载依赖 | ./jarvis -remove xxx | 支持模糊查询 ./jarvis -remove openblas/0.3.18 |
| 一键下载并安装所有依赖 | ./jarvis -dp |读取配置文件中的[DEPENDENCY]字段内容并按顺序执行 |
| 输出已安装的软件清单 | ./jarvis -l | 输出清单以相对路径列出 |
| 查询已安装的软件 | ./jarvis -f xxx | 查询openblas安装路径 ./jarvis -f openblas |
| 一键生成环境变量| ./jarvis -e | 读取配置文件中的[ENV]字段内容并生成env.sh脚本执行,执行-b/-r会自动生成 |
| 一键编译 | ./jarvis -b | 自动进入[APP]字段中的build_dir目录,读取配置文件中的[BUILD]字段内容并生成build.sh脚本执行 |
| 一键运行 | ./jarvis -r | 自动进入[APP]字段中的case_dir目录,读取配置文件中的[RUN]字段内容并生成run.sh脚本执行 |
| 一键CPU性能采集 | ./jarvis -p | 读取配置文件中的[PERF]字段内容的perf选项 |
| 一键GPU性能采集 | ./jarvis -gp | 需安装CUDA驱动 |
| 一键输出服务器信息 | ./jarvis -i | 输出CPU、网卡、OS、内存等信息|
| 一键服务器性能评测 | ./jarvis -bench all 
 ./jarvis -bench mpi 
 ./jarvis -bench omp 
 ./jarvis -bench gemm  | 包括MPI、OMP、P2P等评测 |
| 切换配置| ./jarvis -use XXX.config | 优先读取环境变量中的JARVIS_CONFIG,否则读取XXX.config,配置文件路径会保存到.meta文件中 |
| 根据当前配置生成Singularity容器定义文件 | ./jarvis -container docker-hub-address | ./jarvis -container openeuler:openeuler |
| 更新依赖库的路径 | ./jarvis -u | 如果移动了贾维斯的路径,将自动更新software/modulefiles的路径 |
| 生成Fortran循环优化代码 | ./jarvis -loop | |
| 帮助信息 | ./jarvis -h | |
安装依赖的option支持列表如下所示
| 选项值      | 解释                          | 安装目录                  |
| ----------- | ----------------------------- | ------------------------- |
| gcc         | 使用当前gcc进行编译           | software/libs/gcc         |
| gcc+mpi     | 使用当前gcc+当前mpi进行编译   | software/libs/gcc/mpi     |
| clang       | 使用当前clang进行编译         | software/libs/clang       |
| clang+mpi   | 使用当前clang+当前mpi进行编译 | software/libs/clang/mpi   |
| bisheng     | 使用毕晟进行编译              | software/libs/bisheng     |
| bisheng+mpi | 使用毕晟+当前mpi进行编译      | software/libs/bisheng/mpi |
| nvc         | 使用当前nvc进行编译           | software/libs/nvc         |
| nvc+mpi     | 使用当前nvc+当前mpi进行编译   | software/libs/nvc/mpi     |
| icc         | 使用当前icc进行编译           | software/libs/icc         |
| icc+mpi     | 使用当前icc+当前mpi进行编译   | software/libs/icc/mpi     |
| com         | 安装编译器                    | software/compiler         |
| any         | 安装工具软件                  | software/utils   |
### 路标

### 欢迎贡献
贾维斯项目欢迎您的专业技能和热情参与!
小的改进或修复总是值得赞赏的;先从文档开始可能是一个很好的起点。如果您正在考虑做出更大贡献,请提交一个issue或者在hpc.openeuler.org进行讨论。
编写代码并不是为贾维斯做出贡献的唯一方法。您还可以:
- 贡献安装脚本
- 帮助我们测试新的HPC应用
- 开发教程、演示
- 为我们宣传
- 帮助新的贡献者加入
请添加openEuler HPC SIG微信群了解更多HPC部署调优知识

### 技术文章
揭开HPC应用的神秘面纱:https://zhuanlan.zhihu.com/p/489828346
我和容器有个约会:https://zhuanlan.zhihu.com/p/499544308
贾维斯:完美而凛然HPC应用管家 https://zhuanlan.zhihu.com/p/518460349