This commit is contained in:
2025-08-05 19:55:29 +08:00
parent 4980cd3d0b
commit 984a9c6909
2 changed files with 74 additions and 50 deletions

120
main.typ
View File

@@ -1,4 +1,5 @@
#import "@preview/minimal-presentation:0.6.0": *
#import "@preview/xarrow:0.3.1": xarrow, xarrowSquiggly, xarrowTwoHead
// 中文使用思源宋体,英文使用 Times New Roman
#set text(font: ("Times New Roman", "Source Han Serif SC"))
@@ -14,85 +15,108 @@
logo-light: image("./nix-snowflake-white.svg"),
cover: image("./DSC_0210.JPG"),
main-color: rgb("#3e5c98"),
lang: "zh",
lang: "zh"
)
// 默认的字体太小
#show raw: set text(font: "Fira Code", size: 18pt)
#show raw: set text(size: 18pt)
= 自我介绍与背景介绍
= 自我介绍
== 使用过的发行版
- 桌面用于日常工作2018年起主力使用LinuxDeepin #sym.arrow Arch #sym.arrow Gentoo #sym.arrow NixOS (2023-05-28)
- 服务器VPS用于运行个人网站/服务差不多时间OpenWRT #sym.arrow Ubuntu #sym.arrow Arch #sym.arrow Gentoo #sym.arrow NixOS
- xmurp-ua: OpenWRT上用来绕过学校多设备检测的内核模块。
- 科学计算HPC2020年硕士入组开始接触Gentoo + Ubuntu #sym.arrow NixOS (2023-09)
- 科学计算2020年硕士入组开始接触Gentoo + Ubuntu #sym.arrow NixOS (2023-09)
== 科研方向与HPC特点
== 科研方向
- 组内主要研究宽禁带半导体,我个人主要做*第一性原理计算*
- 仅利用最基础的物理原理(量子力学)计算材料物理性质,原则上不引入经验值
- 核心步骤是求解一些很大的矩阵的特征值(矩阵行列大约几万),*计算量大*
- 相比于个人电脑或个人服务器要使用的HPC高性能计算集群环境有以下特点
- 多节点*共享文件系统*我们使用NFS
- 用户不直接运行科学计算程序,而是提交任务到*队列系统*我们使用SLURM队列系统视情况在合适的时机分配计算资源CPU/GPU/内存等)并执行计算。
- 用户不懂Linux由一个人准备好环境之后的操作尽量做到*有手就行*
- 需要针对特定CPU优化`march=xxx`),自己编译不可避免。
- 组内主要研究宽禁带半导体AlGaInN/SiC 等)
- 我个人主要做第一性原理计算,兼职管理组里服务器和超算环境
- 第一性原理:从最基础的物理原理(量子力学)出发,原则上不引入经验值,计算材料的结构、物理性质、特定条件下的变化,等
== 科学计算现状(仅身边统计学)
= 科学计算在实践中面临的困难与基于Nix的解决方案
== 科学计算特点
- 相比于个人电脑的桌面环境或个人服务器,科学计算的环境有*两个特殊需求*
- 计算量大、经费有限,需要尽可能#text(red)[*高性能*]
- 使用者非CS专业或爱好者缺少相关技能需要#text(green)[*易于使用和维护*]
- 矛盾:#text(red)[*高性能*] 导致需要特殊的硬/软件配置,进一步导致难以实现 #text(green)[*易于使用和维护*]
== 科学计算现状
#columns-content(colwidths: (2.3fr, 1fr))[
#text(red)[*高性能*] #text(green)[*易于使用和维护*] 的矛盾,导致通常的实践中充满了妥协与历史遗留……
#set text(18pt)
#columns-content(colwidths: (1fr, 1.8fr))[
#figure(
image("meme.jpg", width: 100%)
)
][
- *复古*的包管理手动收集依赖手动修改Makefile指定编译器/参数/库路径。
- *随意*的编程习惯无视标准、能用就行C/C++不分Fortran只有特定编译器能编译。
- *闭源*的编译器Intel OneAPI / NVIDIA HPC SDK。
- *混乱*的用户权限:多人共用一个账户。
- *闭源*的编译器Intel (OneAPI)Nvidia (HPC SDK)
- *混乱*的用户权限:多人共用一个账户,一人负责配置环境、多人使用
#text(15pt, gray)[\*仅身边统计学没有diss别的组的意思]
][
#figure(
image("meme.jpg", width: 120%),
)
]
== 科学计算需要Nix来拯救
== 我们需要更多的可复现
// #columns-content(
// figure(image("nix-snowflake-colours.svg", width: 10%)),
// figure(image("nix-snowflake-colours.svg", width: 10%)),
// figure(image("nix-snowflake-colours.svg", width: 10%))
// )
#figure(image("更多的.png", width: 90%))
#figure(image("更多的.png", width: 120%))
如果能够一次编程、到处部署,该多好!
= Nix / NixOS解决的问题
== Nix / NixOS的优势
== 编译软件方便
- 编译软件方便
- 远超其它发行版的软件包数量Nix: 100k+, Arch: 70k+, Ubuntu: 39k+, CentOS: 2k+
- 方便打新包/打补丁,多机器、多版本,不需要手动重复构建。
- 配置服务不易错
- SLURM、NFS 等都有现成模块。
- 配置文件可跨服务/软件、跨用户、跨机器联动,不需要担心配置修改不同步。
- 远超其它发行版的软件包数量。
- Nix: 100k+, Arch: 70k+, Ubuntu: 39k+, CentOS: 2k+
- 数据来自 repology.org
- 即使没有,只要上游代码标准,也可以方便地打包。
- 需要打补丁?一句代码就行了。
```
some-package = prev.some-package.overrideAttrs (prev: patches = prev.patches or [] ++ [ ./my.patch ])
```
- 多机器、多版本,不需要手动重复构建。
== 我们的配置
== 配置环境和服务更简单(仅NixOS
- 在小组内、有完整权限的小集群上,使用 NixOS
- 使用 NFS 在多节点间共享 `/home`;下层使用 Btrfs 透明压缩/RAID1。
- 队列系统使用 SLURM。MPI 尽量使用 OpenMPI、尽量用 `srun` 启动,以正确绑定 MPI进程/OpenMP线程到CPU核心。
- 打包 Nvidia HPC SDKIntel OneAPI 编译器取自 bscpkgs 并略作修改。
- 针对特定 CPU 优化(`hostPlatform.gcc.arch`。nixpkgs 半年更新一次,期间 cherry-pick 个别提交。
- 在没有 root 权限的集群上:
- 使用特别的 store path例如`~/.nix/store`),在 NixOS 上编译好再上传。
- SLURM、NFS 等都有模块。
- 配置文件可跨服务/软件、跨用户、跨机器联动不需要担心配置修改不同步。e.g.:
- 多台机器的 SLURM 配置文件均由一个 Nix 文件生成SLURM 和其它相关程序的配置由一个模块生成。
- 多用户共用 home-manager 配置文件。
- 多台机器之间 wireguard VPN 的配置文件由一个 Nix 文件生成。
= 困难与挑战
= 开放性问题与展望
== 闭源编译器和 stdenv
- 闭源编译器是必需的,但在 nixpkgs 中没有打包。现有的打包能工作,但质量还不足以合并到 nixpkgs 中。
- Nvidia HPC SDKcc wrapper 中有许多传递给 gcc 的参数 nvfortran 不识别,报警告;与现有 CUDA 兼容性不清楚。
- Intel OneAPIbscpkgs 里只有老版本;简单替换源无法更新到新版本。
- OpenMPInixpkgs 中的打包需要略作修改才能与闭源编译器兼容。还没有提pr
- Call for help我的能力有限需要更了解 stdenv / CUDA 的同学的帮忙。
== 无root权限安装nix
- 尝试过 nix-portablebwrap 模式在老内核上不支持proot 严重影响性能。最后决定修改store路径。
- 不使用profile通过 symlink join 得到一个 package与其它机器的配置写在一个 flake 里。
- 在编译机上需要建立同样的目录作为store路径。若使用`real`参数将store路径指向`/nix/store`会导致编译机的nix数据库损坏。
```
# this will break the build machine's nix database
sudo nix build --store 'local?store=/nix/store&real=/nix/store' .#jykang
# this is safe
sudo nix build --store 'local?store=/data/gpfs01/jykang/.nix/store&state=/data/gpfs01/jykang/.nix/state&log=/data/gpfs01/jykang/.nix/log' .#jykang
```
== impermanence / home-manager 与共享文件系统
== FHSStdenv构建时FHS环境

BIN
更多的.png LFS

Binary file not shown.