Files
2025-08-09 14:11:30 +08:00

233 lines
7.5 KiB
Typst
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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年起主力使用LinuxDeepin #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
- 缺少一些“垫脚石”,还需要开源社区努力(包括我在内)。