update content

This commit is contained in:
2024-10-28 14:57:47 +08:00
parent a32aee313d
commit b36c408c16
4 changed files with 265 additions and 63 deletions

View File

@@ -5,6 +5,10 @@ draft: false
summary: 一些群表示论的魔法罢了。 summary: 一些群表示论的魔法罢了。
--- ---
{{< callout type="warning" >}}
本文有已知的错误,尽管整体思路仍然有价值。
{{< /callout >}}
每一个声子模式都属于某个群的某个表示。 每一个声子模式都属于某个群的某个表示。
只要知道表示,不需要知道这个声子具体是怎么振的,就可以知道这个声子是否是拉曼活性的 只要知道表示,不需要知道这个声子具体是怎么振的,就可以知道这个声子是否是拉曼活性的
(当然,是否强到实验中可以看到,那是另外一回事)。 (当然,是否强到实验中可以看到,那是另外一回事)。

View File

@@ -0,0 +1,152 @@
---
weight: 4
title: "使用队列系统"
---
## 队列系统的作用
简而言之:排队。你告诉队列系统使用什么资源(例如多少核的 CPU运行某个程序轮到你的任务执行时队列系统会按照你的要求执行任务。
队列系统会考虑服务器的负载能力(不可以同时运行太多任务把服务器挤垮)、有多人使用服务器时公平分配资源,以及记录任务执行过程中的开销。
队列系统不与某个特定的计算软件(例如 VASP绑定。
也就是说,你可以脱离队列系统直接运行 VASP也可以把别的软件也放到队列系统里运行它们虽然经常在一起使用但本质上是两个分离的概念。[^1]
## 使用队列系统
不同的服务器使用不同的队列系统。
* 厦大超算jykang使用 LSF。
* srv1使用 Slurm。
* srv1Windows没有队列系统但请阅读 [Windows](#windows) 章节,了解相关注意事项。
* xmupc1 和 xmupc2也使用 Slurm但有一些不同见 [Slurm](#slurm旧)。
{{< cards >}}
{{< card link="lsf" title="LSF" subtitle="IBM Spectrum LSF适用于厦大超算jykang" >}}
{{< card link="slurm" title="Slurm" subtitle="Slurm适用于 srv1" >}}
{{< /cards >}}
### Windows
Windows 没有通用的免费的队列系统程序,通常手动控制任务依次执行。
~~我曾经在2024年暑假答应鹏岗帮他写一个但事实是我把他鸽了有空一定写咕咕咕。~~
你可以使用 FDTD Solutions 自带的一个单用户的队列系统。
在 FDTD Solutions 内的控制台使用 `addjob` 命令将要模拟的文件加入队列,然后它就会依次运行。
文档见[这里](https://optics.ansys.com/hc/en-us/articles/360034410714-addjob-Script-command)。
{{< callout type="warning" >}}
不要同时启动过多的计算任务。
<br/>
例如,如果一个任务需要一个小时跑完,那么按顺序运行两个任务需要两个小时,但是同时运行两个任务需要的时间往往远大于两个小时。
若同时运行 10 个任务,可能连系统都没有反应了。
{{< /callout >}}
{{% details title="一个简易的队列系统的实现" closed="true" %}}
下面是我做 FDTD 计算时写的一个小玩意儿,
通过判断当前目录(包括子目录)下面的各个 fsp 是否存在对应的 `xxx_p0.log` 文件来判断每个 fsp 是否已经被模拟过,如果没有就依次模拟。
每一次模拟完成后都会再扫描一遍整个目录路,因此可以动态地把需要模拟的 fsp 在多台服务器之间转移(负载均衡)。
代码兼容 Linux 和 Windows模拟完一个 fsp 之后还会给我发个消息(这样我可以知道进度)。
你可以根据自己的需求修改使用,或者用 Python 之类你更熟悉的语言重写。
```cpp
# define FMT_HEADER_ONLY
#include <fmt/format.h>
#include <fmt/ranges.h>
#include <filesystem>
#include <iostream>
#include <cstdlib>
#include <regex>
#include <string>
#include <thread>
#include <set>
#include <fstream>
# define CPPHTTPLIB_OPENSSL_SUPPORT
#include <httplib.h>
using namespace std::literals;
int main()
{
while (true)
{
std::set<std::string> fsp, log;
std::string job;
// std::string hostname;
for (const auto& entry : std::filesystem::recursive_directory_iterator("."))
{
std::string file = entry.path().string();
if (std::regex_match(file, std::regex(R"(^(.*)\.fsp$)")))
fsp.insert(file);
else if (std::regex_match(file, std::regex(R"(^(.*)_p0\.log$)")))
log.insert(file);
}
for (const auto& f : fsp)
if (!log.contains(std::regex_replace(f, std::regex(R"(^(.*)\.fsp$)"), "$1_p0.log")))
{
job = f;
break;
}
if (job == "")
break;
// {
// std::ifstream hostname_ifs("hostname.txt");
// hostname_ifs >> hostname;
// }
auto current_path = std::filesystem::current_path();
std::filesystem::current_path(std::filesystem::path(job).parent_path());
auto filename = std::filesystem::path(job).filename().string();
// if windows
# ifdef _WIN32
std::string command = "fdtd-solutions -run run.lsf -exit -trust-script";
# else
std::string command = "DISPLAY=:0 /opt/lumerical/fdtd/bin/fdtd-solutions -nw -run run.lsf -exit";
# endif
std::cout << fmt::format
(
"\r{}/{} running {} from {}\n command {}",
log.size(),
fsp.size(),
filename,
std::filesystem::current_path().string(),
command
)
<< std::flush;
// {
// // https://api.chn.moe/notify_silent.php?message={hostname} {}/{}
// httplib::SSLClient client("api.chn.moe");
// std::string path = fmt::format("/notify_silent.php?message={}%20{}%2F{}", hostname, log.size(), fsp.size());
// client.Get(path.c_str());
// }
{
std::ofstream os("run.lsf");
os << fmt::format(R"(
load("{}");
switchtolayout;
run;
)", filename);
os.close();
}
system(command.c_str());
std::this_thread::sleep_for(5s);
std::filesystem::remove("run.lsf");
std::filesystem::current_path(current_path);
}
}
```
{{% /details %}}
### Slurm
与 Slurm基本相同只是 VASPCPU的打包方式不同使得提交任务的命令略有不同。
下一次服务器维护时xmupc1 和 xmupc2 计划合并为一个集群,并且应用新的打包方式。
提交 VASPCPU任务的例子
```bash
sbatch --ntasks=2 --cpus-per-task=4 --hint=nomultithread --job-name="my great job" --output=output.txt vasp-intel-std
```
[^1]: 实际上队列系统与要运行的软件还是有许多耦合的,尤其是使用 MPI 并行的程序(包括绝大多数成熟的大型科学计算软件)。
如何让队列系统与这些软件对接好有时会很麻烦,只是普通用户不需要关心(我替你们搞定了)。

View File

@@ -0,0 +1,101 @@
---
weight: 1
title: "LSF"
---
## 使用图形界面快速开始
使用命令 `chn_bsub` 不带任何参数,就可以看到一个图形界面[^1]。
按照提示,鼠标点选对应按钮,即可提交任务。这可以满足绝大多数的需求。
以下用一些例子来进一步介绍如何使用 LSF。
更多细节请参考[官方文档](https://www.ibm.com/docs/en/spectrum-lsf/10.1.0?topic=overview-lsf-introduction)。
例子中一些选项是可选的、一些是必写的,会详细说明。
## 提交任务
使用 `bsub` 命令提交任务[^2]。提交一个 VASPCPU任务的例子
```bash
bsub -n 28 -J 'my-great-job' -q normal_1day -o 'output.txt' -R 'span[hosts=1]' chn_vasp.sh 640_std
```
* `-n 28`:指定使用多少 CPU 核[^3],必写。每个队列中,单个节点有多少核,可以参考[服务器配置](../config)。
* `-J 'my-great-job'` 指定任务的名字,可以不写。
* `-q normal_1day` 指定队列的名字,不写时使用默认队列。
* `-o 'output.txt'` 指定输出的文件名,可以不写。
* `-R 'xxxx'` 用于对执行任务的节点施加一些限制,可以不写。可以施加的限制包括:
* `span[hosts=1]`:强制所有任务分配到一个节点上(即不跨节点运行),推荐在大多情况下使用。
* `select[hname!=nxt064 && hname!=nxt009]`:在分配任务时排除一些节点。如果一些节点有问题,可以使用这个选项。
* `select[hname=nxt064]`:只在某个节点上运行。
* `rusage[mem=32GB]`:只在内存大于等于 32 GB 的节点上运行。
* `span[ptile=28]`:在每个节点上分配 28 个核。
这个选项可以用来控制跨节点运行,例如要使用 8 个节点,每个节点 28 个核,写为 `-n 226 -R 'span[ptile=28]'`
多种限制可以同时使用,例如 `-R 'span[hosts=1] select[hname!=nxt064 && hname!=nxt009]'`
* `chn_vasp.sh 640_std` 要运行的程序。
要把其它程序提交到队列里,也是类似的写法。请自行举一反三。
## 查看节点状态
要查看各个节点目前被占用了多少 CPU 核、还有多少空闲的 CPU 核:
```bash
bhosts
```
`MAX` 列即为节点的 CPU 核数,`NJOBS``RUN` 列即为被占用的 CPU 核数。
被标记为 `ok` 的节点是还有空闲核的节点,被标记为 `closed` 的节点是被占满了。
## 查看任务状态
列出任务:
```bash
# 列出正在等待和正在运行的任务:
bjobs -w
# 要列出正在等待和正在运行,以及最近一个小时内完成的任务:
bjobs -w -a
# 要列出所有用户的任务:
bjobs -u all
```
要显示还没有完成的任务的详细信息,或刚刚完成的任务的详细信息:
```bash
bjobs -l 114514
```
要打印尚未完成的任务的输出:
```bash
# 按照任务 id
bpeek 114514
# 按任务名
bpeek -J 'my-great-job'
# 持续监视输出
bpeek -f 114514
```
## 调整和取消任务
取消一个任务:
```bash
bkill 114514
```
调整任务的优先级:
<p><a style="color: grey; background: currentColor;">
怕被滥用,我还是不写了,好奇的自己去看官方文档吧。
</a></p>
[^1]: 其实这个不能叫“图形用户界面gui应该叫“文本用户界面tui”。但后者会让不熟悉的人误解所以这里还是叫“图形界面”。
[^2]: 平时使用的 `bsub` 其实是原本的 `bsub` 的一个包装,为的是追踪每个任务是由谁(按照 SSH Agent 区分)投递的,
说白了就是为了给多人共用一个账户还要区分不同用户这种奇怪设计擦屁股而不得不做的。
比起原本的 `bsub`,这个包装只支持较少的选项,但应该足够平时使用了。这里列出的选项它都支持。如果你的确需要用到它不支持的选项,可以联系我添加。
[^3]: 你可能注意到了LSF 在这里的设置比 Slurm 简洁许多。实际上就像 Slurm 那样,这里指定的仅仅是 task 的数量,不一定等于 CPU 的数量。
因为在我接手维护服务器之前,所有的设置都是仅使用 MPI 并行(也就是设置 `OMP_NUM_THREADS=1`),我也就继续这样做了;
后来在别的服务器上才发现两个并行都使用时效率更高,但也还没有改超算上的处理方式。

View File

@@ -1,28 +1,9 @@
--- ---
weight: 4 weight: 2
title: "使用队列系统" title: "Slurm"
--- ---
## 队列系统的作用 ## 使用图形界面快速开始
简而言之:排队。你告诉队列系统使用什么资源(例如多少核的 CPU运行某个程序轮到你的任务执行时队列系统会按照你的要求执行任务。
队列系统会考虑服务器的负载能力(不可以同时运行太多任务把服务器挤垮)、有多人使用服务器时公平分配资源,以及记录任务执行过程中的开销。
队列系统不与某个特定的计算软件(例如 VASP绑定。
也就是说,你可以脱离队列系统直接运行 VASP也可以把别的软件也放到队列系统里运行它们虽然经常在一起使用但本质上是两个分离的概念。[^1]
## 使用队列系统
队列系统与操作系统绑定很深。
* srv1使用 [Slurm](#slurm新)。
* srv1Windows请阅读 [Windows](#windows) 章节,了解相关注意事项。
* xmupc1 和 xmupc2使用 [Slurm](#slurm旧)。
* 厦大超算jykang使用 [LSF](#lsf)。
### Slurm
#### 使用图形界面快速开始
使用命令 `sbatch-tui` 或者 `sbatch` 不带任何参数,就可以看到一个图形界面[^3]。 使用命令 `sbatch-tui` 或者 `sbatch` 不带任何参数,就可以看到一个图形界面[^3]。
按照提示,鼠标点选对应按钮,即可提交任务。这可以满足一多半的需求。 按照提示,鼠标点选对应按钮,即可提交任务。这可以满足一多半的需求。
@@ -30,9 +11,9 @@ title: "使用队列系统"
以下用一些例子来进一步介绍如何使用 Slurm。更多细节请参考[官方文档](https://slurm.schedmd.com/)。 以下用一些例子来进一步介绍如何使用 Slurm。更多细节请参考[官方文档](https://slurm.schedmd.com/)。
例子中一些选项是可选的、一些是必写的,会详细说明。 例子中一些选项是可选的、一些是必写的,会详细说明。
#### 提交任务 ## 提交任务
使用 `sbatch` 提交任务。当加上参数时,会直接提交任务;当不加任何参数时,会调用 `sbatch-tui` 让你选。 使用 `sbatch` 命令提交任务。当加上参数时,会直接提交任务;当不加任何参数时,会调用 `sbatch-tui` 让你选。
提交一个 VASPCPU任务的例子 提交一个 VASPCPU任务的例子
@@ -83,7 +64,7 @@ sbatch --gpus=1 --ntasks-per-gpu=1 --nodes=1-1 --job-name="my great job" --outpu
要把其它程序提交到队列里,也是类似的写法。请自行举一反三。 要把其它程序提交到队列里,也是类似的写法。请自行举一反三。
#### 查看任务 ## 查看任务
要列出正在等待和正在运行的任务: 要列出正在等待和正在运行的任务:
@@ -109,7 +90,7 @@ scontrol show job 114514
sacct --units M --format=ALL --starttime 2024-08-01T00:00:00 --endtime 2024-09-01T00:00:00 | bat -S sacct --units M --format=ALL --starttime 2024-08-01T00:00:00 --endtime 2024-09-01T00:00:00 | bat -S
``` ```
#### 调整和取消任务 ## 调整和取消任务
取消一个任务: 取消一个任务:
@@ -137,42 +118,6 @@ sudo scontrol update JobId=3337 Nice=-2147483645
sudo scontrol update JobId=3337 Nice=2147483645 sudo scontrol update JobId=3337 Nice=2147483645
``` ```
### Slurm
与 Slurm基本相同只是 VASPCPU的打包方式不同使得提交任务的命令略有不同。
下一次服务器维护时xmupc1 和 xmupc2 计划合并为一个集群,并且应用新的打包方式。
提交 VASPCPU任务的例子
```bash
sbatch --ntasks=2 --cpus-per-task=4 --hint=nomultithread --job-name="my great job" --output=output.txt vasp-intel-std
```
### LSF
待补充。
### Windows
Windows 没有通用的队列系统程序,通常手动控制任务依次执行。~~我曾经在2024年暑假答应鹏岗帮他写一个但事实是我把他鸽了有空一定写咕咕咕。~~
你可以使用 FDTD Solutions 自带的一个单用户的队列系统。
在 FDTD Solutions 内的控制台使用 `addjob` 命令将要模拟的文件加入队列,然后它就会依次运行。
文档见[这里](https://optics.ansys.com/hc/en-us/articles/360034410714-addjob-Script-command)。
{{< callout type="warning" >}}
不要同时启动过多的计算任务。
<br/>
例如,如果一个任务需要一个小时跑完,那么按顺序运行两个任务需要两个小时,但是同时运行两个任务需要的时间往往远大于两个小时。
若同时运行 10 个任务,可能连系统都没有反应了。
{{< /callout >}}
{{% details title="一个简易的队列系统的实现" closed="true" %}}
待补充
{{% /details %}}
[^1]: 实际上队列系统与要运行的软件还是有许多耦合的,尤其是使用 MPI 并行的程序(包括绝大多数成熟的大型科学计算软件)。
如何让队列系统与这些软件对接好有时会很麻烦,只是普通用户不需要关心(我替你们搞定了)。
[^3]: 其实这个不能叫“图形用户界面gui应该叫“文本用户界面tui”。但后者会让不熟悉的人误解所以这里还是叫“图形界面”。 [^3]: 其实这个不能叫“图形用户界面gui应该叫“文本用户界面tui”。但后者会让不熟悉的人误解所以这里还是叫“图形界面”。
[^4]: 这个参数指定的通常是 MPI 进程数(为这个参数指定的数值乘以 GPU 数量),其实就是 `--ntasks` 的另外一种写法。 [^4]: 这个参数指定的通常是 MPI 进程数(为这个参数指定的数值乘以 GPU 数量),其实就是 `--ntasks` 的另外一种写法。
VASPGPU限制每个 GPU 必须对应且只能对应一个 MPI 进程,不满足这个条件就会报错或者只使用 CPU 计算,因此只能用一个。 VASPGPU限制每个 GPU 必须对应且只能对应一个 MPI 进程,不满足这个条件就会报错或者只使用 CPU 计算,因此只能用一个。
@@ -190,4 +135,4 @@ Windows 没有通用的队列系统程序,通常手动控制任务依次执行
少数情况下增加可能会有用例如运行机器学习时VASP 的机器学习使用纯 CPU 实现)。 少数情况下增加可能会有用例如运行机器学习时VASP 的机器学习使用纯 CPU 实现)。
[^14]: 实际上是在 Slurm 的配置文件中手动指定的。具体每个节点指定了多少,见[系统配置文件](https://github.com/CHN-beta/nixos)。 [^14]: 实际上是在 Slurm 的配置文件中手动指定的。具体每个节点指定了多少,见[系统配置文件](https://github.com/CHN-beta/nixos)。
[^15]: 按照经验OpenMP 线程数等于单个 CPU 或单个 ccx 的核心数或者核心数的一半时,性能最好。 [^15]: 按照经验OpenMP 线程数等于单个 CPU 或单个 ccx 的核心数或者核心数的一半时,性能最好。
```