From 984a9c6909d2ac5fe15ae11789e54e14d028f830 Mon Sep 17 00:00:00 2001 From: chn Date: Tue, 5 Aug 2025 19:55:29 +0800 Subject: [PATCH] --- main.typ | 120 ++++++++++++++++++++++++++++++++--------------------- 更多的.png | 4 +- 2 files changed, 74 insertions(+), 50 deletions(-) diff --git a/main.typ b/main.typ index 1e6e195..4ea2485 100644 --- a/main.typ +++ b/main.typ @@ -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年起主力使用Linux,Deepin #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上用来绕过学校多设备检测的内核模块。 -- 科学计算(HPC):2020年硕士入组开始接触,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 SDK,Intel 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 SDK:cc wrapper 中有许多传递给 gcc 的参数 nvfortran 不识别,报警告;与现有 CUDA 兼容性不清楚。 + - Intel OneAPI:bscpkgs 里只有老版本;简单替换源无法更新到新版本。 + - OpenMPI:nixpkgs 中的打包需要略作修改才能与闭源编译器兼容。(还没有提pr) +- Call for help:我的能力有限,需要更了解 stdenv / CUDA 的同学的帮忙。 == 无root权限安装nix +- 尝试过 nix-portable,bwrap 模式在老内核上不支持,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环境) + + diff --git a/更多的.png b/更多的.png index 56830e0..19dabfb 100644 --- a/更多的.png +++ b/更多的.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2837acf58cfe32e9606c8c15f3c84f1288854accfd6eac291a770a9705c53dfc -size 403720 +oid sha256:a6dd749330b2612d384cf6d651fdf6998bf8ce68519fa3e6f9f03ad0cf3d3581 +size 684611