使用手册

使用前请仔细阅读本手册

远程登录

登录方式

首次登录

  1. 因为需要进行两步认证绑定,故首次登录必须使用Web浏览器
  2. 在计算机上使用Web浏览器访问 https://access.nju.edu.cn
  3. 账号、密码:输入用户名、密码登录
  4. 手机安装下列等支持 RFC 6238 的 TOTP 客户端APP,扫描二维码(也可手动输入),然后点击“完成绑定”
  5. 两步认证密码:输入手机 APP 中的动态口令登录
  6. 下载安装或升级客户端插件

Web登录(图形和命令行界面)

  1. 使用Web浏览器访问 https://access.nju.edu.cn
  2. 账号、密码:输入用户名、密码登录
  3. 两步认证密码:输入手机 APP 中的动态口令登录
  4. 下载安装或升级客户端插件,需要 Java 运行环境
  5. Web 支持图形界面 xfce4/vnc、命令行界面 ssh ,Web 不支持 SFTP !
  6. 图形界面修改分辨率:Applications - Settings - Display - Resolution

SSH登录(命令行界面)

  1. 中国教育网地址:access.nju.edu.cn,端口:22(默认)
    中国移动地址:njucm.yaoge123.com,端口:5022
  2. Username: 输入用户名
  3. Password: 输入密码+空格+动态口令(如密码是YaoGe123,手机APP动态口令是123456,则输入YaoGe123 123456
  4. SSH 不支持图形(X11-Forwarding)
  5. SSH 客户端:PuttyXshellBitvise SSH ClientiTerm2Termius……

SFTP登录(文件传输)

  1. 中国教育网地址:access.nju.edu.cn,端口:22(默认)
    中国移动地址:njucm.yaoge123.com,端口:5022
  2. Username: 输入用户名
  3. Password: 输入密码+空格+动态口令(如密码是YaoGe123,手机APP动态口令是123456,则输入YaoGe123 123456
  4. SFTP 路径有特殊前缀( /hpc_login1 sftp (10.1.0.101)/self )。如家目录为/fsa/home/yaoge123,则SFTP路径为/hpc_login1 sftp (10.1.0.101)/self/fsa/home/yaoge123
  5. SFTP 客户端:FileZillaXftpWinSCPBitvise SSH ClientCyberduckSFTP DriveSSHFSLFTP
  6. FileZilla 须在站点(Site)的“传输设置 (Transfer Settings) ”中勾选“限制并发连接数 (Limit number of simultaneous connections) ”并设置“最大连接数 (Maximum number of connections) ”为 1
  7. WinSCP 不可使用 “后台传输 (Background Transfers) ”
  8. Cyberduck 须在“新建书签 (New Bookmark) ”中设置“传输文件 (Transfer Files) ”为“使用浏览器连接 (Use browser connection) ”
  9. SFTP Drive 须设置“ Authentication Type ”为“ Keyboard Interactive ”

登录注意事项

  1. 登录后用 passwd 命令更改密码,密码至少8个字符,包含小写字母、大写字母、数字和特殊字符中至少三种,不能是常见密码
  2. 连续输错5次密码(含动态口令),账号锁定5分钟
  3. 只有最新绑定的动态口令有效,为避免混淆建议在绑定前先删除老的条目,动态口令仅用于登录 access.nju.edu.cn
  4. 必须通过作业调度系统进行计算,不得在登录节点或计算节点直接运行计算程序,否则会被杀掉进程
  5. Shell命令行提示符(环境变量PS1)最后必须以$ 结尾($+空格)

VPN

南京大学 VPN

  1. 使用南京大学统一身份认证账号、密码登录南京大学VPN
  2. 登录成功后,所有访问eScience中心服务的流量均通过此VPN
  3. 南京大学VPN使用方法参考信息化建设管理服务中心网站

eScience中心 VPN

  1. 官网下载安装对应的 VPN Client
  2. 服务器填:njucm.yaoge123.com
  3. 端口:4433
  4. 用户名、密码:超算的用户名密码,注意密码不含动态口令
  5. 登录后仅能通过此VPN访问eScience中心的服务

数据传输

  1. SFTP:使用SFTP客户端浏览并传输文件,适合大文件和整个目录的上下传。
  2. ZMODEM:在登录节点上可用rz上传文件、sz下载文件,适合单个小文件的上下传。
  3. 云盘:通过云盘自动同步和备份文件。
  4. 数据拷贝:直接使用移动硬盘拷贝大量数据文件。

数据拷贝

为方便大数据传输,中心提供数据拷贝服务,用户需提供支持 USB 3.0 接口的大容量移动硬盘存储设备,存储设备应为空且文件系统格式化为 ext4/XFS/exFAT ,并告知需要拷贝数据的目录(绝对路径),保证目录的容量小于移动存储的空余空间。

  高性能计算集群和云盘已紧密集成。

存储配额

并行文件系统fsa等有存储空间配额,存储空间收费按照配额收费。

可以使用命令 myquota 查看配额,用户和组配额同时生效。用户或组占用存储空间超过配额但是<10%的,可以在7天宽限期内降低至配额以内,超期将无法写入任何数据;超过配额>10%,立刻无法写入任何数据,需要降低至配额以内才能写入数据。

登录方式entry(内测)

仅限受邀用户内部测试

登录方式

参考上述登录方式链接内容,并合并覆盖以下内容:

账号密码

  1. 账号:集群用户名
  2. 密码:集群密码

Web

  1. Web支持图形界面xfwd、命令行界面ssh,文件传输sftp

SSH

  1. Username: 输入集群用户名/10.1.0.101/self(如用户名是yaoge,则输入yaoge/10.1.0.101/self)

SFTP

  1. Username: 输入集群用户名/10.1.0.101/self(如用户名是yaoge,则输入yaoge/10.1.0.101/self)

登录注意事项

  1. 登录后用 passwd 命令更改密码,密码至少8个字符,包含小写字母、大写字母、数字和特殊字符中至少三种,不能是常见密码
  2. 必须通过作业调度系统进行计算,不得在登录节点或计算节点直接运行计算程序,否则会被杀掉进程

集成云盘

独立账号

高性能计算集群用户可以使用集群账号直接登录云盘,用户名为集群账号@hpc.nju.edu.cn,密码即集群账号密码;如集群账号为yaoge,用户名填写yaoge@hpc.nju.edu.cn。首次使用需要登录网页端激活账号,但集群账号不能使用云盘的上下传外链功能。

云盘上的集群账号与南京大学统一身份认证账号相互独立,如集群账号yaoge@hpc.nju.edu.cn和南京大学统一身份认证账号0102003是两个完全独立的账号,需要分别激活才能使用。

文件同步

通过云盘的多平台多终端同步功能,可将集群中的目录和本地计算机的目录同步,对本地目录的操作几乎立刻反应在集群的目录中,不再需要通过 SFTP 上下传文件。

客户端

登录节点已安装云盘同步客户端和挂载盘客户端

挂载盘命令行客户端

  1. 获取Token(<username>替换为集群账号,<password>替换为密码)

    curl -d 'username=<username>@hpc.nju.edu.cn' -d 'password=<password>' https://box.nju.edu.cn/api2/auth-token/
    
  2. 创建配置文件~/seadrive.conf<username>替换为集群账号,<token>替换为上一步的返回值

    [account]
    server = https://box.nju.edu.cn
    username = <username>@hpc.nju.edu.cn
    token = <token>
    is_pro = true
    [general]
    client_name = hpc-login
    [cache]
    size_limit = 10GB
    clean_cache_interval = 10
    
  3. 启动挂载盘,命令在前台运行,新开一个窗口进行其它操作

    seadrive -c ~/seadrive.conf -f -d ~/.seadrive/data -l ~/.seadrive/data/logs/seadrive.log ~/SeaDrive
    
  4. 如果报错 Transport endpoint is not connected ,执行:fusermount -u ~/SeaDrive

  5. ~/SeaDrive 目录就是云盘挂载在本地的目录,可以直接读写访问

同步命令行客户端

  1. 创建客户端本地数据目录(目录名可更改)
    mkdir ~/Seafile
    
  2. 初始化客户端并指定本地数据目录(上一步创建的目录)
    seaf-cli init -d ~/Seafile
    
  3. 启动客户端
    seaf-cli start
    
  4. 列出云盘资料库ID(<username>替换为集群账号)
    seaf-cli list-remote -s https://box.nju.edu.cn -u <username>@hpc.nju.edu.cn
    
  5. 将本地目录与云盘资料库同步(<library-id>替换为上一步列出的某个资料库ID,<folder>替换为本地目录)
    seaf-cli sync -s https://box.nju.edu.cn -u <username>@hpc.nju.edu.cn -l <library-id> -d <folder>
    
    将云盘资料库下载到本地目录
    seaf-cli download -s https://box.nju.edu.cn -u <username>@hpc.nju.edu.cn -l <library-id> -d <folder>
    
  6. 查看当前同步状态
    seaf-cli status
    
  7. 解除本地目录同步
    seaf-cli desync -d <folder>
    
  8. 停止客户端
    seaf-cli stop
    

环境变量

集群使用Environment Modules以模块的形式对环境变量进行管理。在高性能计算集群系统中,安装有多种软件及其不同版本,它们需要设置不同的环境变量,Environment Module可以将这些环境变量做成模块文件(modulefile)。模块可以被加载(load)、卸载(unload)、切换(switch)等,这些操作会改变相应的环境变量设置,让用户方便的在不同环境之间切换。相比将环境变量设置写入/etc/profile、~/.bashrc或~/.bash_profile,Environment Module操作只影响当前用户的当前登录环境;相比直接source文件,Environment Module的操作可以撤销(卸载)。普通用户还可以自己编写module,具有很好的定制性。用户不仅可以在命令行中Environment Modules,也能在作业提交脚本中使用,对编译和计算环境都能够很好的控制。

常用命令

非 Bash

使用非 Bash 作为 Login Shell 的用户,请在作业提交脚本的首行指明 Shell 或使用 bsub 选项 -L 指定作业运行时 Login Shell 为 Bash

如 Login Shell 为 tcsh,使用下面两种方法中的一种

#!/bin/tcsh #首行指明Shell
#BSUB ...
...
...
#BSUB -L /bin/bash #指定运行时Login Shell为Bash
...

模块示例

$ module avail #查看所有可用模块

------------------------------ /fs00/software/modulefiles ------------------------------
gcc/5.2.0                          impi/5.0.3.048
iccifort/15.0.3                   ips/2011sp1u3
ics/2013                           ips/2015u3
ics/2013sp1u1                  openmpi/1.10.0-gcc-5.2.0
imkl/11.2.3                      openmpi/1.10.0-iccifort-15.0.3

$ module list #显示已加载模块
No Modulefiles Currently Loaded. #没有模块被加载

$ icc --version #故icc找不到
-bash: icc: command not found

$ module whatis ips/2015u3 #查看模块说明
ips/2015u3           : Intel Parallel Studio XE 2015 Update 3 Cluster Edition

$ module load ips/2015u3 #加载模块
$ icc --version
icc (ICC) 15.0.3 20150407
Copyright (C) 1985-2015 Intel Corporation.  All rights reserved.

$ module list #显示已加载模块
Currently Loaded Modulefiles:
  1) ips/2015u3

$ module unload ips/2015u3 #卸载模块

提交作业

集群使用作业调度系统管理所有计算作业,该系统接受用户的作业请求,并将作业合理的分配到合适的节点上运行,因此所有用户均应通过作业调度系统提交计算作业,不可直接在任何节点上直接运行。用户使用bsub命令向作业调度系统提交作业,bsub选项非常繁多,可对作业进行非常细致的控制,这里简要介绍常用选项和方法。

bsub 使用方式

命令行方式

bsub [options] command [arguments]

例:提交一个作业到 e5v3ib 队列,需要24核的 MPI 并行程序

$ bsub -q e5v3ib -n 24 mpirun ./app
Job <3206000> is submitted to queue <e5v3ib>

脚本方式

bsub < jobfile

jobfile 为作业的 shell 脚本文件,文件名任意且不需要运行权限,脚本内容如下:

#BSUB [options]
command [arguments]

脚本中以#BSUB开头的行后跟bsub的选项,其它行为作业运行脚本

例:提交一个作业到 e5v3ib 队列,需要48核,需要大内存节点,作业名为 MgSiO3,标准输出文件为out,标准错误输出文件为err,Intel MPI 的并行作业0

$ cat job.lsf 
#BSUB -q e5v3ib
#BSUB -n 48
#BSUB -J MgSiO3
#BSUB -o out
#BSUB -e err
module load ips/2018u4
mpirun ./app

$ bsub < job.lsf 
Job <3207099> is submitted to queue <e5v3ib>.

等价如下命令行方式

$ bsub -q e5v3ib -n 48 -J MgSiO3 -o out -e err "module load ips/2018u4;mpirun ./app"
Job <3207099> is submitted to queue <e5v3ib>.

bsub 常用选项

资源请求
CPU绑定
自动重运行
输入输出

更多选项见官方文档

GPU 作业

提交作业时使用 -gpu 选项申请所需的 GPU 资源,计算进程只可见作业调度系统分配的 GPU。CPU 核自动按照申请节点 GPU 的比例分配,如一节点8个 GPU 和40个 CPU 核,申请2个 GPU 则分配10个 CPU 核。

-gpu 的各个选项用:分隔,默认值为num=1:mode=shared:mps=no:j_exclusive=yes,常用选项如下

MPI/OpenMP 混合作业

OpenMP (Open Multi-Processing) 是一种共享内存方式的单进程多线程并行编程技术;MPI (Message Passing Interface) 是一种多进程基于信息传递的并行编程技术。OpenMP 的特点是单节点、进程内、多线程、基于共享内存的并行运算;MPI 的特点是单或多节点、进程间、非共享内存、基于消息传递的并行运算。

混合并行编程模型构建的应用程序可以同时使用 OpenMP 和 MPI ,节点内NUMA内进程内使用 OpenMP 共享内存并行可降低内存需求,跨节点跨NUMA跨进程使用 MPI 消息传递可大规模并行。需要注意的是,并不是一个节点一个MPI进程是最优的,这往往会导致跨NUMA的内存访问,因此需要通过测试确定最佳配比。

mpirun一般会根据环境变量LSB_MCPU_HOSTS启动相应的MPI进程,因此可以通过下列方法改变此环境变量中每个节点的CPU核数,以匹配MPI/OpenMP混合作业的MPI进程分布:

  1. #BSUB -n 指定的仍然是总CPU核数
  2. 提交作业脚本中需要在计算命令前首先运行
    source /fs00/software/lsf/misc/ompthreads.sh [N]
    
  3. 每个 MPI 进程的 OpenMP 线程数量可以用环境变量OMP_NUM_THREADS指定或上述命令行参数指定,同时指定时命令行参数优先,需要保证每个节点的 CPU核数可以被线程数整除!

常用环境变量

作业运行时

LSB_DJOB_NUMPROC=6
LSB_HOSTS="node1 node1 node1 node2 node2 node2"
LSB_MCPU_HOSTS="node1 3 node2 3"
$ cat $LSB_DJOB_HOSTFILE
node1
node1
node1
node2
node2
node2

LSB_HOSTS 和 LSB_MCPU_HOSTS 以不同的格式包含相同的信息,LSB_MCPU_HOSTS 比 LSB_HOSTS 更短更精简,如果 LSB_HOSTS 超过 4096 字节,则仅有 LSB_MCPU_HOSTS。

作业脚本示例

串行作业

  提交一个串行作业到 e52660 队列,命令行方式和脚本方式分别为:

$ bsub -q e52660 ./app
Job <3279929> is submitted to queue <e52660>.
$ cat job.lsf 
#BSUB -q e52660
./app
$ bsub < job.lsf 
Job <3279930> is submitted to queue <e52660>.

MPI 并行作业

  MPI程序需要使用mpirun启动

  提交一个需要48核的 Intel MPI 并行作业到 e5v3ib,命令行方式为:

$ bsub -q e5v3ib -n 48 "module load ips/2018u4;mpirun ./app"
Job <3280120> is submitted to queue <e5v3ib>.

  提交一个需要48核的 Open MPI 并行作业到 e5v3ib,脚本方式为:

$ cat job.lsf 
#BSUB -q e5v3ib
#BSUB -n 48
module load iccifort/15.0.3 imkl/11.2.3 openmpi/1.10.0-iccifort-15.0.3
mpirun ./app

$ bsub < job.lsf 
Job <3280122> is submitted to queue <e5v3ib>.

OpenMP 并行作业

  OpenMP 不能跨节点,因此-n不能指定超过一个节点的CPU核数

  提交一个需要64核的 OpenMP 并行作业到 e7v4ib,使用程序参数 -nt 指定线程数量,命令行方式为:

$ bsub -q e7v4ib -n 64 "./app-nt \$LSB_DJOB_NUMPROC"
Job <3348175> is submitted to queue <e7v4ib>.

  提交一个需要64核的 OpenMP 并行作业到 e7v4ib,使用环境变量OMP_NUM_THREADS指定线程数量,脚本方式为:

$ cat job.lsf 
#BSUB -q e7v4ib
#BSUB -n 64
OMP_NUM_THREADS="$LSB_DJOB_NUMPROC"
./app

$ bsub < job.lsf 
Job <3348182> is submitted to queue <e7v4ib>.

MPI/OpenMP 混合作业

每个MPI进程跑6个OpenMP线程

通过环境变量OMP_NUM_THREADS指定

#BSUB -q 6140ib
#BSUB -n 72
export OMP_NUM_THREADS=6
source /fs00/software/lsf/misc/ompthreads.sh
module load ips/2018u4
mpirun ./run

通过命令行参数指定(有些计算程序需要通过命令行参数指定线程数量)

#BSUB -q 6140ib
#BSUB -n 72
source /fs00/software/lsf/misc/ompthreads.sh 6
module load ips/2018u4
mpirun ./openmx -nt 6

GPU 作业

提交一个需要1个 GPU 的作业到 e5v4p100ib 队列

bsub -q e5v4p100ib -gpu num=1 ./gpu_app

提交一个需要4个 GPU 的作业到 62v100ib 队列,进行 GPU-CPU 绑定

bsub -q 62v100ib -gpu "num=4:aff=yes" ./gpu_app

控制作业

常用控制命令

命令 功能
bjobs 查看自己未结束的作业
bjobs -l JOBID 查看某个未结束作业的详情
bhist 查看自己已结束的历史作业
bhist -l JOBID 查看某个已结束历史作业的详情
bpeek JOBID 查看正在运行某个作业的stdout/stderr
bkill JOBID 终止某个作业
btop JOBID 设置作业最先运行
bbot JOBID 设置作业最后运行

作业依赖

一个计算任务可能分成几步,而每一步对资源的需求不同,因此需要分开提交,但这些作业之间又具有依赖关系,bsub 可使用选项 -w 'dependency_expression'指定依赖关系。如果计算任务分成几步,但是每步对资源需求一样,那么请写在一个作业任务中依次执行。

更多详细信息见官方文档

作业等待

bwait -w "wait_condition" [-t timeout]

暂停并等待作业条件满足,不满足一直暂停等待,满足则执行完毕返回。

典型用法:在脚本中不要循环使用bjobs判断作业状态,而用bwait等待作业运行完成,这样更优雅且能显著降低对集群的压力。

海量作业

作业组

为了便于管理海量的作业,可以对作业定义作业组。

作业组的名字是类似于Linux的路径名的树状结构,如作业组 /test ,而 /test/1 和 /test/2 都属于 /test

需要注意的是作业组是全局的,创建者是这个作业组的拥有者,作业组拥有者可以对这个作业组及其子组内的所有作业进行控制(哪怕这个作业是其他人提交的,拥有者也能进行控制)。如果您不想作业被别人控制,请确保提交到的作业组从/开始拥有者都是自己。

创建作业组

bgadd /test		#显式创建作业组
bsub -g /test	#使用bsub提交作业时指定一个不存在的作业组,则作业组会被隐式创建

查看作业组

bjgroup /test	#最后一列就是作业组的拥有者,请注意拥有者也是层次继承的

删除作业组

bgdel /test		#集群已经配置自动清理空的隐式创建的作业组

有了作业组以后就可以对一组作业进行控制了

bjobs -g /test		#查看指定作业组的作业
bkill -g /test 0	#终止指定作业组的所有作业

作业序列

作业序列是一系列作业,这些作业执行相同的操作和资源要求,但是输入输出文件不同。这些作业共享同一个作业ID,并可以通过索引来区分每个子作业。

bsub 使用 -J "arrayName[indexList, ...]" 参数命名并创建一个作业序列,也可以理解为一个作业数组,中括号里面就是数组的下标,可以是一维数组也可以是多维数组。indexList = start[-end[:step]] 下标的起始、结束和步长均可指定。

作业调度系统提供了两个运行时变量 %I 和 %J,%I 为子作业的索引值,%J 为作业ID,一般用于输入输出文件名中;以及运行时环境变量 LSB_JOBINDEX

bsub -J "myArray[1-10]" myJob		#提交一个有10个子作业的作业
bsub -J "myArray[1-10]" -i "input.%I" -o "output.%I" myJob		#每个子作业定义不同的输入输出文件
bkill 123[1]	#杀掉 jobid 是123的第一个子作业
bkill 123		#杀掉 jobid 是123的整个作业

海量作业

提交大量的作业,将使得作业的管理将变得困难,虽然可以用上述作业组和作业序列进行批量管理,但是海量作业仍然对调度系统会造成很大的压力,特别是分钟级或秒级的短作业在调度时会浪费大量的时间,因此可以根据作业情况将多个作业合并为一个作业提交。对于不同的作业可以用两种方法来进行合并:

多作业串行执行

申请1个CPU核,顺序执行每个串行作业,前一个运行完成后再运行下一个,可以将非常多的串行作业合并成一个。对于每个串行作业运行时间都很短且运行时间不一定相同的适用这种方式提交。

4个串行作业串行执行合并为一个作业,提交到x5650队列,脚本方式为:

$ cat job.lsf
#BSUB -q x5650
./a.out >& 1.out
./a.out >& 2.out
./a.out >& 3.out
./a.out >& 4.out

$ bsub < job.lsf
Job <3366369> is submitted to queue <x5650>.

多作业并行执行

申请N个CPU核,同时执行N个串行作业,N不可大于单节点CPU核数,每个串行作业运行时间需要相同,最后需要 wait 命令等待所有作业运行完毕返回。对于每个串行作业运行时间较长且运行时间都完全相同的适用这种方式提交。

12个串行作业并行执行合并为一个作业,提交到x5650队列,脚本方式为:

$ cat job.lsf
#BSUB -q x5650
#BSUB -n 12
( ./a.out >& 1.out )&
( ./a.out >& 2.out )&
( ./a.out >& 3.out )&
( ./a.out >& 4.out )&
( ./a.out >& 5.out )&
( ./a.out >& 6.out )&
( ./a.out >& 7.out )&
( ./a.out >& 8.out )&
( ./a.out >& 9.out )&
( ./a.out >& 10.out )&
( ./a.out >& 11.out )&
( ./a.out >& 12.out )
wait

$ bsub < job.lsf
Job <3366370> is submitted to queue <x5650>.

查看信息

查看队列

查看所有队列:bqueues

$ bqueues 
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP 
x7542!           50  Open:Active       -    -    -    -    24     0    24     0
e5645!           50  Open:Active       -    -    -    -     0     0     0     0
e52643tgb!       50  Open:Active       -    -    -    -     8     0     8     0
……
6226rib          30  Open:Active       -    -    -    -     0     0     0     0
5218             30  Open:Active       -    -    -    -     0     0     0     0
6230r            30  Open:Active       -    -    -    -    32     0    32     0

查看队列详细信息:bqueues -l

$ bqueues -l e5v3ib

QUEUE: e5v3ib
  -- CPU: 2*E5-2680v3, RAM: 256GB/128GB, NET: 56Gb FDR InfiniBand

……

SCHEDULING POLICIES:  FAIRSHARE  EXCLUSIVE
FAIRSHARE_QUEUES:  e5v3ib e5v3ib! e7v4ib x5650ib 6140ib 62v100ib 722080tiib 72rtxib 7702ib ……
DISPATCH_ORDER:  QUEUE
USER_SHARES:  [root=, 999999] ……

SHARE_INFO_FOR: e5v3ib/
 USER/GROUP   SHARES  PRIORITY  STARTED  RESERVED  CPU_TIME  RUN_TIME   ADJUST  GPU_RUN_TIME
root=       999999  202255.328      0        0      8456.5     1542       0.000             0
……

USERS: all ~test/ 
HOSTS:  f01+10 f02+10 f03+10 f04+10 f05s+10 f05l/ 
RES_REQ:  span[ptile=24]
Maximum slot reservation time: 43200 seconds

查看节点


lshosts			#查看节点配置和资源

lshosts -gpu	#查看节点GPU配置和拓扑结构

lsload			#查看节点当前负载信息

lsload -gpu		#查看节点GPU整体负载

lsload -gpuload	#查看节点每个GPU负载

bhosts			#查看所有节点状态

自动关机

集群会对动力环境进行监控,遇市电中断或温度过高,将会自动终止所有作业,按照安全顺序进行关机操作。

关机时会在 /fs00/reports/bjobs/ 目录下会自动保存一份作业列表备查。如文件 /fs00/reports/bjobs/bjobs.20130728070457 表明2013年07月28日07点04分57秒时刻所有作业的状态(bjobs -uall -w 的输出),同时也说明这个时间点开始自动关机。

如果温度未触及高点,但已明显增高,为了防止温度继续增高,集群会停止派发新作业,并且关闭空闲节点。

进程监督

用户只能登录到登录节点,且可从登录节点登录到有自己正在运行作业的计算节点。

所有节点的用户进程都会被检查,如果发现如下情况,将会杀掉该节点此用户所有进程,并记录在 /fs00/reports/process 中

容器化

容器技术

容器技术能够对应用及其整个运行时环境(包括全部所需文件)一起进行打包或隔离。从而可以在不同环境(如开发、测试和生产等环境)之间轻松迁移应用,同时还可保留应用的全部功能。有了容器不再需要管理员为你安装任何东西。容器是一个独立的系统,你可以在里面做任何想做的事情。

Singularity

Singularity 是一套类似于 Docker 的容器解决方案,是HPC开发的容器技术。

制作镜像

镜像可以从 Docker Hub 直接导入,或自己做好镜像打包上传后导入

singularity build ubuntu.sif docker://ubuntu	#从 Docker Hub 导入镜像
singularity build abc.sif docker-archive://abc.tar	#导入 docker save 保存的镜像

git.nju.edu.cn 上的 CI/CD 自动调用 kaniko 构建 Docker 镜像,详见官方文档

/fs00/software/singularity-images/ 已经存放了很多镜像,可直接使用

提交作业

提交容器作业的示例脚本

#BSUB -q 62v100ib
#BSUB -gpu num=4

/fs00/software/singularity/latest/bin/singularity exec --nv cuda.sif app

相关网站

常见问题

作业运行时实际占用CPU核数过多

在作业中限定使用的CPU核数与申请核数相同,或者尝试在提交作业时添加如下参数

#BSUB -R affinity[core:cpubind=core:membind=localprefer:distribute=pack]

特别是Python,有些Python包会自动满核并行的,需要使用环境变量(如 OMP_NUM_THREADS)等方式设定线程数。如果实在不行可以 #BSUB -x 独占节点运行作业。

登录节点进行网络接入认证

集群中的登录节点进行网络接入认证后即可访问互联网,认证后登录节点所有用户均可访问互联网,请注意网络安全!。

命令行登录和登出p.nju.edu.cn的方法如下

/fs00/software/bin/pnju -u <username> -p <password> -i		#登录网络
/fs00/software/bin/pnju -o									#登出网络

curl -s "http://p.nju.edu.cn/portal_io/login?username=<username>&password=<password>"	#登录网络
curl -s http://p.nju.edu.cn/portal_io/logout											#登出网络

计算节点访问网络

所有计算节点均不能访问外网(含校园网和互联网),如需访问可以单独申请开放。

pip安装包到自己的目录下

Python的大多数包不需要root权限也能安装,只需在pip install后加-t指定安装目录即可,如:

cd scikit-opt-master
pip install -t $HOME .

这样就装到自己的家目录下。在~/.bashrc里或者作业脚本中加上环境变量

export PYTHONPATH=$HOME:$PYTHONPATH

排队作业数量上限

动态限制单个用户排队作业数量不能超过 (30000-当前用户PEND作业数量)/10

VASP6 GPU 编译

VASP6 GPU(N卡) 编译实例

王勇 (孙建课题组)

人工微结构科学与技术协同创新中心高性能计算中心

根据vasp官方给出的信息,以后vasp gpu版本会着重开发openacc标准的版本,之前老cuda版本会逐渐被废弃,因此我们以vasp6.2 的openacc版本结合官方指导进行编译。 官方指导链接

https://www.vasp.at/wiki/index.php/OpenACC_GPU_port_of_VASP

编译器:

Openacc gpu Vasp6官方给出编译器意见为使用NVIDIA HPC-SDK或者 PGI's Compilers & Tools (version >=19.10)。在此vasp官方建议使用NVIDIA HPC-SDK且版本号最好为20.9,因为之后的版本可能会有一些对于vasp的bug。

关于NVIDIA HPC-SDK 20.9的安装,见

https://developer.nvidia.com/nvidia-hpc-sdk-209-downloads 

相关主页,安装流程十分简单,使用wget下载,一键式安装,对于不连接外网的节点,可以手动下载tarball压缩包,上传后本地解压,在此不再赘述,安装前请使用nvidia-smi命令查看本地硬件驱动和兼容的cuda版本(version >=10.0),确保匹配,必要时候需升级硬件驱动。

安装HPC-SDK 20.9的过程中会询问安装路径,我们以路径为/usr/software/nv-hpcsdk为例,在安装过程中指定此路径为例以后,需要设定环境变量:

export NVARCH=`uname -s`_`uname -m`;
export NVCOMPILERS=/usr/software/nv-hpcsdk #修改此处为安装路径
export PATH=$NVCOMPILERS/$NVARCH/20.9/compilers/bin:$PATH
export MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/20.9/compilers/man
export LD_LIBRARY_PATH=$NVCOMPILERS/$NVARCH/20.9/compilers/lib/:$LD_LIBRARY_PATH
export PATH=$NVCOMPILERS/$NVARCH/20.9/comm_libs/mpi/bin/:$PATH

上述可以每次使用gpu vasp6时手动添加在任务脚本,也可直接写在bashrc,但是不建议直接写在bashrc,可能会和intel版本的 mpirun冲突,造成其他之前软件的运行问题。

依赖库:

安装完NVIDIA HPC-SDK 20.9以后,还需要将软件运行需要的依赖库整理好,主要有CUDA Toolkit, QD, NCCL, 以及FFTW, 前三项直接包含在HPC-SDK,不需要单独安装。

对于FFTW,最好不要用nvhpc-sdk的编译器进行安装,如果设置了上面安装完hpc-sdk的环境变量,请先用GNU或者intel的编译器环境变量进行覆盖,不然可能会导致计算效率问题,可以自己编译,也可以直接使用集群内已经安装好的版本,路径为/fs00/software/fftw/3.3.8-ips2019u5

编译:

准备好编译器和依赖库以后,就可以进行编译了,进入vasp6.2根目录,

cp arch/makefile.include.linux_nv_acc makefile.include`

可以使用

which nvfortran | awk -F /compilers/bin/nvfortran '{ print $$1 }'`

查看nvfortran是否为nv-hpc-sdk的路径,如有问题,可以重新添加一遍环境变量。

(注:最近vasp官方又在官网添加了新的openacc+openmp混编版本的makefile.include.linux_nv_acc+omp+mkl来解决nccl库限制openacc版本只能单进程运行的问题,通过openmp来提升单进程多线程的运算效率,但目前没有太多相关测试的数据来支撑openmp混编会提升很多并行速度,所以在此我仍以旧版本的makefile.include.linux_nv_acc为例,同时官方也在积极改进这个问题,后续应该也可以多进程运行)

makefile.include的内容需要修改几处,包括确认编译器的位置,明确依赖库的路径等。修改后的makefile.include如下(需要注意和修改的位置后面有注释):

#Precompiler options

CPP_OPTIONS= -DHOST=\"LinuxPGI\" \
         -DMPI -DMPI_BLOCK=8000 -DMPI_INPLACE -Duse_collective \
         -DscaLAPACK \
         -DCACHE_SIZE=4000 \
         -Davoidalloc \
         -Dvasp6 \
         -Duse_bse_te \
         -Dtbdyn \
         -Dqd_emulate \
         -Dfock_dblbuf \
         -D_OPENACC \
         -DUSENCCL -DUSENCCLP2P

CPP        = nvfortran -Mpreprocess -Mfree -Mextend -E $(CPP_OPTIONS) $*$(FUFFIX)  > $*$(SUFFIX)

FC         = mpif90 -acc -gpu=cc60,cc70,cc80,cuda11.0
FCL        = mpif90 -acc -gpu=cc60,cc70,cc80,cuda11.0 -c++libs

FREE       = -Mfree

FFLAGS     = -Mbackslash -Mlarge_arrays

OFLAG      = -fast

DEBUG      = -Mfree -O0 -traceback

#Specify your NV HPC-SDK installation, try to set NVROOT automatically
NVROOT     =$(shell which nvfortran | awk -F /compilers/bin/nvfortran '{ print $$1 }')
#or set NVROOT manually
#NVHPC      ?= /opt/nvidia/hpc_sdk
#NVVERSION  = 20.9
#NVROOT     = $(NVHPC)/Linux_x86_64/$(NVVERSION)

#Use NV HPC-SDK provided BLAS and LAPACK libraries
BLAS       = -lblas
LAPACK     = -llapack

BLACS      =
SCALAPACK  = -Mscalapack

CUDA       = -cudalib=cublas,cusolver,cufft,nccl -cuda

LLIBS      = $(SCALAPACK) $(LAPACK) $(BLAS) $(CUDA)

#Software emulation of quadruple precsion
QD         = $(NVROOT)/compilers/extras/qd                    #注意并修改这里
LLIBS      += -L$(QD)/lib -lqdmod -lqd
INCS       += -I$(QD)/include/qd

#Use the FFTs from fftw
FFTW       = /fs00/software/fftw/3.3.8-ips2019u5              #修改fftw路径至本地安装路径
LLIBS      += -L$(FFTW)/lib -lfftw3
INCS       += -I$(FFTW)/include

OBJECTS    = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o

#Redefine the standard list of O1 and O2 objects
SOURCE_O1  := pade_fit.o
SOURCE_O2  := pead.o

#For what used to be vasp.5.lib
CPP_LIB    = $(CPP)
FC_LIB     = nvfortran
CC_LIB     = nvc
CFLAGS_LIB = -O
FFLAGS_LIB = -O1 -Mfixed
FREE_LIB   = $(FREE)

OBJECTS_LIB= linpack_double.o getshmem.o

#For the parser library
CXX_PARS   = nvc++ --no_warnings

#Normally no need to change this
SRCDIR     = ../../src
BINDIR     = ../../bin

此外编译前和每次提交任务前请清除其他环境并重新设置一遍环境变量:

module load ips/2019u5  #这是为了我们使用集群安装好的fftw找到依赖的路径
export NVARCH=`uname -s`_`uname -m`;
export NVCOMPILERS=/usr/software/nv-hpcsdk
export PATH=$NVCOMPILERS/$NVARCH/20.9/compilers/bin:$PATH
export MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/20.9/compilers/man
export LD_LIBRARY_PATH=$NVCOMPILERS/$NVARCH/20.9/compilers/lib/:$LD_LIBRARY_PATH
export PATH=$NVCOMPILERS/$NVARCH/20.9/comm_libs/mpi/bin/:$PATH

/usr/software/nv-hpcsdk为nv-hpc-sdk的安装路径 确认好以上所有设置后,就可以使用

make std gam ncl

进行编译了,注意,由于openacc版本的原因,直接取消了编译make gpu的方式,编译得到的vasp_std之类的版本直接可以使用GPU进行计算。

其他注意事项:

1.由于nccl库的限制,openacc的gpu版本只能单进程运行.

2.INCAR中NCORE在openacc版本中只能设为1.

3.INCAR中NSIM和KPAR参数需要对不同体系进行测试来达到效率最大化,一般来说,KPAR和所使用的GPU也就是进程数一致,NSIM需要设置的比在cpu上更大,具体请自行测试.

更多相关问题可以见GPU官方指导

也可以去VASP论坛提问