nixos/devices/xmupc1
2024-03-15 13:23:21 +08:00
..
secrets reset user password 2024-03-10 21:50:45 +08:00
default.nix services.xray.client: add noproxyUsers option 2024-03-15 13:23:21 +08:00
README.md localPackages.vasp: fix 2024-03-13 17:21:02 +08:00

硬件

  • CPU16 核 32 线程。
  • 内存96 G。
  • 显卡:
    • 409024 G 显存。
    • 309024 G 显存。
  • 硬盘2 T。

更详细的硬件如果需要的话,自己去看吧。

队列系统SLURM

基本概念

队列系统使用 slurm。这是个在集群上广泛使用的队列系统可靠性应该会比之前好很多。 学校的 hpc 上用的是 LFS和这个不一样但很多概念是相通的例如队列、节点等当然这里只有一个队列和一个节点。 这里只简单记录一下如何使用。更多内容,网上随便搜一下 slurm 的教程就可以找到很多介绍,也可以看官网文档。

提交任务时, sbatch 命令中的 cpu 或者 core (它俩是同义词)都是指虚拟的 CPU 核数,也就是实际执行时的线程数。

一些软件(例如 VASP支持两个层面的并行一个叫 MPI一个叫 OpenMP实际运行的线程数是两者的乘积。 MPI 并行的数量就是提交任务时指定的 task 的数量, OpenMP 并行的数量就是提交任务时指定的分配给每个 task 的 CPU 的数量, 最终的线程数等于两者的乘积。 此外对于 VASP 还有一个限制:当使用 GPU 时MPI 并行的数量必须等于 GPU 的数量,否则 VASP 会在开头报个警告然后只用 CPU 计算(但不会报错)。 其它大多使用 MPI 并行的软件没有这个限制。

常用命令

提交一个 VASP GPU 任务的例子:

sbatch --gpus=1 --ntasks-per-gpu=1 --job-name="my great job" vasp-nvidia-6.4.0 mpirun vasp-std
  • --gpus=1 指定使用一个 GPU排到这个任务时哪个空闲就使用哪个。 可以指定具体使用哪个GPU例如 --gpus=4090:1。2080 Ti 需要写为 2080_ti。 这个选项可以简写为 -G。 这个选项实际上是 --gres 选项的一种简便写法,当需求更复杂时(例如,指定使用一个 3090 和一个 4090就需要用 --gres。 例如:--gres=gpu:3090:1,gpu:4090:1。 “gre” 是 “generic resource” 的缩写。
  • --ntasks-per-gpu=1 是一定要写的。
  • --job-name= 指定任务的名字。可以简写为 -J。也可以不指定。
  • 默认情况下,一个 task 会搭配分配一个 CPU 核(一个线程),一般已经够用,不用修改。如果一定要修改,用 --cpus-per-task

提交一个 VASP CPU 任务的例子:

sbatch --ntasks=2 --cpus-per-task=2 --job-name="my great job" vasp-gnu-6.4.0 mpirun vasp-std
sbatch --ntasks=2 --cpus-per-task=2 --job-name="my great job" vasp-intel-6.4.0 srun --mpi=pmi2 vasp-intel-6.4.0-std
  • --ntasks=2 指定在 MPI 层面上并行的数量。 可以简写为 -n
  • --cpus-per-task=2 指定每个 task 使用的 CPU 核的数量,也就是 OpenMP 并行的数量。

要把其它程序提交到队列里,也是类似的写法。请自行举一反三。

唯二可能要注意的是(使用 VASP 时不需要注意这些,我已经设置好了):

  • 使用 CUDA 时,要设置环境变量 CUDA_DEVICE_ORDER=PCI_BUS_ID,否则可能会分配错 GPU。
  • slurm 不会设置 OMP_NUM_THREADS,要根据 SLURM_CPUS_PER_TASKSLURM_THREADS_PER_CPU 来手动设置。

要列出已经提交(包括已经完成、取消、失败)的任务:

squeue -t all -l

取消一个任务:

# 按任务的 id 取消
scancel 114514
# 按任务的名字取消
scancel -n my_great_job
# 取消一个用户的所有任务
scancel -u chn

要将自己已经提交的一个任务优先级提到最高(只是自己已经提交任务的最高,不影响别人的任务):

scontrol top 114514

要显示一个任务的详细信息(不包括服务器重启之前算过的任务):

scontrol show job 114514

要显示一个任务的详细信息(包括服务器重启之前算过的任务):

sacct --units M --format=ALL -j 114514 | bat -S

sbatch 的更多参数

# 提交一个新任务,但是礼让后面的任务(推迟到指定时间再开始排队)
--begin=16:00 --begin=now+1hour
# 指定工作目录
--chdir=/path/to/your/workdir
# 指定备注
--comment="my great job"
# 指定任务的 ddl算不完就杀掉
--deadline=now+1hour
# 标准错误输出写到别的文件里
--error=error.log
# 将一些环境变量传递给任务(=ALL是默认行为
--export=ALL,MY_ENV_VAR=my_value
# 不传递现在的环境变量
--export=NONE
# 打开一个文件作为标准输入
--input=
# 发生一些事件(任务完成等)时发邮件
--mail-type=NONE,BEGIN,END,FAIL,REQUEUE,ALL --mail-user=chn@chn.moe
# 要求分配内存(不会真的限制内存使用,只是在分配资源时会考虑)
--mem=20G --mem-per-cpu --mem-per-gpu
# 输出文件是否覆盖
--open-mode={append|truncate}
# 指定输出文件
-o, --output=<filename_pattern>
# 不排队,直接跑(超额分配)
-s, --oversubscribe
# 包裹一个二进制程序
--wrap=

支持的连接协议

SSH

ssh 就是 putty winscp 之类的工具使用的那个协议。

  • 地址xmupc1.chn.moe
  • 端口6007
  • 用户名:自己名字的拼音首字母
  • 可以用密码登陆,也可以用证书登陆。

从一台服务器登陆到其它服务器,只需要使用 `ssh`` 命令:

ssh jykang
ssh xmupc1
ssh xmupc2
ssh user@host

直接从另外一台服务器下载文件,可以使用 rsync 命令:

rsync -avzP jykang:/path/to/remote/directory_or_file /path/to/local/directory

将另外一个服务器的某个目录挂载到这个服务器,可以使用 sshfs 命令:

sshfs jykang:/path/to/remote/directory /path/to/local/directory

用完之后记得卸载(不卸载也不会有什么后果,只是怕之后忘记了以为这是本地的目录,以及如果网络不稳定的话,运行在这里的软件可能会卡住):

umount /path/to/local/directory

如果不喜欢敲命令来挂载/卸载远程目录,也可以 RDP 登陆后用 dolphin。

RDP

就是 windows 那个远程桌面。

  • 地址xmupc1.chn.moe
  • 用户名:自己名字的拼音首字母
  • 密码和 ssh 一样(使用同样的验证机制)。

RDP 暂时没有硬件加速(主要是毛玻璃之类的特效会有点卡)。

记得在连接时点击“显示选项”将“体验”中的连接速度改为“LAN10 Mbps 或更高)”,不然会很卡。

samba

samba 就是 windows 共享文件夹的那个协议。

  • 地址xmupc1.chn.moe
  • 用户名:自己名字的拼音首字母
  • 初始密码和 ssh 一样,你可以自己修改密码(使用 smbpasswd 命令。samba 的密码和 ssh/rdp 的密码是分开的,它们使用不同的验证机制。

在 windows 上,可以直接在资源管理器中输入 \\xmupc1.chn.moe 访问。 也可以将它作为一个网络驱动器添加(地址同样是 \\xmupc1.chn.moe)。

计算软件

VASP

VASP 有很多很多个版本,具体来说:

  • VASP 多个版本可以共存。目前安装了两个版本6.3.1 和 6.4.0。
  • VASP 可以用不同的编译器编译。目前安装的有nvidia、gnu 和 intel。nvidia 使用 GPU 计算,其它两个只能用 CPU 计算。
  • VASP 的 std/gam/ncl 版本有一点区别,一般用 std只有一个 gamma 点的时候用 gam 会快一点,系统中存在方向不平行的磁矩时必须用 ncl。
  • 无论哪个版本,都集成了下面这些补丁:
    • HDF5用于生成 hdf5 格式的输出文件。
    • wannier90我也不知道干啥的随手加上的。
    • OPTCELL如果存在一个 OPTCELL 文件VASP 会据此决定弛豫时仅优化哪几个晶胞参数。
    • MPI shared memory用来减小内存占用。

如何提交 VASP 到队列系统已经在上面介绍过了。下面的例子是,如果要直接运行一个任务的写法:

vasp-nvidia-6.4.0 mpirun -np 1 -x CUDA_DEVICE_ORDER=PCI_BUS_ID -x CUDA_VISIBLE_DEVICES=0 -x OMP_NUM_THREADS=4 vasp-std
vasp-gnu-6.4.0 mpirun -np 2 -x OMP_NUM_THREADS=4 vasp-std
vasp-intel-6.4.0 mpirun -n 2 -genv OMP_NUM_THREADS=4 vasp-std

其中 CUDA_VISIBLE_DEVICES 用于指定用哪几个显卡计算(多个显卡用逗号分隔)。 要查看显卡的编号,可以用 CUDA_DEVICE_ORDER=PCI_BUS_ID vasp-nvidia-6.4.0 nvaccelinfo 命令。

mumax

问龚斌,我没用过。

lammps

除了我应该没人用,就不写了。

quantum espresso

我也只用过一次。大规模用到了再说吧。

其它软件

我自己电脑上有的软件,服务器都有装,用于科研的比如 VESTA 什么的。可以自己去菜单里翻一翻。

操作系统

操作系统是 NixOS是一个相对来说比较小众的系统。 它是一个所谓“函数式”的系统。 也就说,理想情况下,系统的状态(包括装了什么软件、每个软件和服务的设置等等)是由一组配置文件唯一决定的(这组配置文件放在 /etc/nixos 中)。 要修改系统的状态(新增软件、修改设置等等),只需要修改这组配置文件,然后要求系统应用这组配置文件就可以了, 系统会自动计算出应该怎么做(增加、删除、修改哪些文件,重启哪些服务等等)。 这样设计有许多好处,例如可以方便地回滚到之前任意一个时刻的状态(方便在调试时试错); 一份配置文件可以描述多台机器的系统,在一台上调试好后在其它机器上直接部署; 以及适合抄或者引用别人写好的配置文件。

以上都是对于管理员来说的好处。对于用户来说的好处不是太多,但是也有一些。 举个例子,如果用户需要使用一个没有安装的软件(例如 phonopy,当然实际上这个已经装了),只需要在要执行的命令前加一个逗号:

, phonopy --dim 2 2 2

系统就会帮你下载所有的依赖,并在一个隔离的环境中运行这个命令(不会影响这之后系统的状态)。

还有一个命令可能也有用,叫 try。 它会在当前的文件系统上添加一个 overlay之后执行的命令对文件的修改只会发生在这个 overlay 上; 命令执行完成后,它会告诉你哪些文件发生了改变,然后可以选择实际应用这些改变还是丢弃这些改变。 例如:

try phonopy --dim 2 2 2

这个命令和 NixOS 无关,只是突然想起来了。

文件系统

文件系统是 BtrFS。它的好处有

  • 同样的内容只占用一份空间;以及内容会被压缩存储(在读取时自动解压)。这样大致可以节省一半左右的空间。 例如现在 xll 目录里放了 213 G 文件,但只占用了 137 G 空间。
  • 每小时自动备份,放置在 /nix/persistent/.snapshots 中,大致上会保留最近一周的备份。如果你误删了什么文件,可以去里面找回。

ZSH

所谓 “shell” 就是将敲击的一行行命令转换成操作系统能理解的系统调用C 语言的函数)的那个东西,也就是负责解释敲进去的命令的意思的那个程序。

大多情况下默认的 shell 是 bash但我装的服务器上用 zsh。 zsh 几乎完全兼容 bash 的语法,除此以外有一些顺手的功能:

  • 如果忘记了曾经输入过的一个命令,输入其中的几个连续的字母或者单词(不一定是开头的几个字母),然后按 键,就会自动在历史命令中依次搜索。 例如我输入 install 按几下 键,就可以找到 sudo nixos-rebuild boot --flake . --install-bootloader --option substituters https://nix-store.chn.moe 这个东西。
  • 如果从头开始输入一个曾经输入过的命令,会用浅灰色提示这个命令。要直接补全全部命令,按 键。要补全一个单词,按 Ctrl + 键。
  • 常用的命令,以及常用命令的常用选项,按几下 tab 键,会自动补全或者弹出提示。