#import "@preview/minimal-presentation:0.6.0": * #import "@preview/xarrow:0.3.1": xarrow // 中文使用思源宋体,英文使用 Times New Roman #set text(font: ("Times New Roman", "Source Han Serif SC")) #show raw: set text(font: "FiraCode Nerd Font") #show: project.with( title: "在科学计算中使用Nix", sub-title: "实战经验与挑战", author: "陈浩南", date: "2025-08-09", index-title: "目录", logo: image("./nix-snowflake-colours.svg"), logo-light: image("./nix-snowflake-white.svg"), cover: image("./DSC_0210.JPG"), main-color: rgb("#3e5c98"), lang: "zh" ) // 默认的字体太小 #show raw: set text(size: 18pt) = 自我介绍 == 关于我自己 #columns-content(colwidths: (2fr, 0.8fr))[ - 现居厦门,学生,搞物理的。 - 在联邦宇宙活动。 - 希望和大家成为朋友! ][ #figure( image("qrcode.png", width: 120%), caption: "扫码看主页", numbering: none ) ] == 使用过的发行版 - 桌面:2018年起主力使用Linux,Deepin #sym.arrow Arch #sym.arrow Gentoo #sym.arrow NixOS (2023-05-28) - 个人服务器:OpenWRT #sym.arrow Ubuntu #sym.arrow Arch #sym.arrow Gentoo #sym.arrow NixOS - 著名作品:xmurp-ua - 科学计算:2020年硕士入组,Gentoo + Ubuntu #sym.arrow NixOS (2023-09) == 科研方向 - 组内:宽禁带半导体(氮化物、碳化硅等)。 - 个人:第一性原理计算,兼职管理服务器。 - *第一性原理*计算:仅依赖最基础的物理原理(量子力学),原则上不引入经验值。 #columns-content[ #figure(image("atom.png", width: 70%)) ][ #show math.equation: set text(size: 40pt) #xarrow(sym: sym.arrow, [$hat(H)phi = hat(E)phi$]) ][ 稳定结构? 电学/热学/光学性质? 缺陷/杂质? ] = 科学计算在实践中面临的困难 == 科学计算特点 #text(15pt)[(\*更专业报告见明天的《高性能计算》\@VickieGPT。)] - 相比于爱好者折腾/软件开发的环境,科学计算的环境有*两个特别需求*: - 计算量大 #sym.arrow #text(red)[*高性能*]。 - 使用者缺乏CS技能 #sym.arrow #text(green)[*易于使用和维护*]。 矛盾:#text(red)[*高性能*] #sym.arrow 复杂的软硬件配置 #sym.arrow *难以实现* #text(green)[*易于使用和维护*]。 == 科学计算现状 #columns-content(colwidths: (1.7fr, 1fr))[ #text(red)[*高性能*] 和 #text(green)[*易于使用和维护*] 的矛盾,导致充满妥协: #set text(18pt) - *不存在*的包管理:手动收集依赖、修改Makefile - *老旧*的基础环境:10+ 年前 - *随意*的编程习惯:无视标准、能用就行 - *闭源*的编译器:Intel (OneAPI),Nvidia (HPC SDK) - *混乱*的用户权限:账户多人共用 #text(15pt, gray)[(\*仅身边统计学,没有diss别的组的意思)] ][ #figure( image("meme.jpg", width: 100%), ) ] // == 我们需要更多的可复现! // // #figure(image("更多的.png", width: 90%)) // // 如果能够利用 Nix 的*可复现性*,实现*一次编程、到处部署*,该多好! = 使用Nix搭建科学计算环境 == Nix / NixOS的优势 - 编译软件超方便 - 超多软件包:Nix: 100k+, Arch: 70k+, Ubuntu: 39k+, CentOS: 2k+ - 方便打新包/打补丁。 - 配置服务不易错 - SLURM、NFS 等都有现成模块。 - 多机器/服务/用户共用配置。 Nix 的优势:将 *编译/配置过程* 抽象成 *可复现、可版本管理的代码*,从而重复使用,用*机器*的自动化运作代替*人力*的劳动。 == 用 Nix 解决问题 - *不存在*的包管理:用Nix提供依赖/打包 - *老旧*的基础环境:关我 `/nix/store` 什么事? - *随意*的编程习惯:Nix保证如果今天能用,那么一年后也能用。 - *闭源*的编译器:打包进 Nix 了 - *混乱*的用户权限:系统级环境/复用 hm 配置 == 配置细节 - 组内小集群:NixOS。 - 超算(无 root 权限):使用 Nix 安装小工具(e.g. gnuplot)。 - 编译器、MPI、VASP 等已经使用传统方式安装,下一次更新时再考虑使用 Nix。 === 编译器、MPI - Intel 编译器(OneAPI): - 必需,因为对一些软件有优化,比 gfortran 更宽容。 - 在 bscpkgs 基础上修改。 - Nvidia 编译器(HPC SDK): - 必需,提供 nvfortran、QD 库等。 - 自行打包(`nvhpcPackages.stdenv`)。 - OpenMPI: - 需要修改才能与闭源编译器兼容。(还没有提pr) - NVIDIA 需要使用修改过的源代码。 - 提供 overlay 及示例:`github:CHN-beta/nix-hpc-test`。 - 仍有需要改进的地方(详见下文)。 === NixOS上的其它软件和服务 - 文件系统: - NFS 共享 `/home`;Btrfs 透明压缩 RAID1。 - hm 和 impermanence 需要单独处理(详见下文)。 - 队列系统: - 使用 SLURM。 - MPI 尽量使用 OpenMPI、尽量用 srun 启动。 - 提供 TUI 代替 sbatch。 - native 优化: - 针对硬件优化(设置 `hostPlatform.gcc.arch`、`oneapiArch`、`nvhpcArch`)。 - nixpkgs 半年更新一次,期间仅 cherry-pick 个别提交。平衡“新”、“稳定”与编译整个系统需要的代价。 === 超算上使用 Nix - 没有 user namespace。proot 影响性能。 - 使用可读写的 store 目录。编译机上建立相同的目录,编译好再上传。 - 不能设置 `real` 参数指向 `/nix/store`,否则会破坏编译机的 Nix 数据库。 ```sh # this will break the build machine's nix database sudo nix build --store 'local?store=/data/gpfs01/jykang/.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 ``` = 一些开放性问题 == 闭源编译器打包 能工作但质量不高。 - 依赖 gcc: - 在非 FHS 环境下,用参数/环境变量指定 gcc。 - gcc/gfortran 分包/wrap,如何合并得到“完整”的gcc? - 支持参数与 gcc 不同。需要仔细调整。 #text(red)[Call for help]:很需要了解 stdenv 的同学的帮忙。 == impermanence / hm on NFS - `.bashrc` 等需禁用软连接、改为 bind mount。 - 父目录的父目录的所有者会出错(bug?) == 构建时FHS环境(FHSStdenv) - 在*构建时*提供 FHS 环境,以快速(但低质量地)打包上游提供了installer的软件? - 这不美观,但很有用! - 目前不能复用 stdenv 中 setup hook / xxxPhase。能否编写`FHSStdenv`? === 一个例子(曾经的 NVIDIA HPC SDK 打包) ```nix let builder = buildFHSEnv { extraBwrapArgs = [ "--bind" "$out" "$out" ]; }; buildScript = writeShellScript "build.sh" ''xxxxx''; in stdenvNoCC.mkDerivation { pname = "nvhpc"; installPhase = '' mkdir -p $out ${builder}/bin/builder ${buildScript} ''; } ``` = 总结 == 理想 vs 现实 - 理想: - *软件开发者*使用 Nix,我们一键安装/配置; - *论文作者*使用 Nix,我们一键复现,略作修改继续研究; - *超算管理员*使用 Nix,必要时一键回滚,方便互相参考。 - 现实: - 在现实中没有遇到除我以外的科研人员使用Nix。 - 网上有一些。Barcelona Supercomputing Center(巴塞罗那,西班牙)开源了 bscpkgs,其中包含 Intel 闭源编译器。 == 展望 我认为 Nix 在科学计算中有很大的潜力,但: - 使用不够广泛;我也不知道怎么办。 - 明天上午《如何在公司里把 Nix 安利给同事》\@Noa Virellia - 缺少一些“垫脚石”,还需要开源社区努力(包括我在内)。