计算化学公社

 找回密码 Forget password
 注册 Register

私用小电脑WSL2装RockyLinux10虚拟机,及LMod管理OpenMPI-4.1.8, ORCA-6.1.1等的笔记

查看数: 2320 | 评论数: 12 | 收藏 Add to favorites 19
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2026-1-16 16:04

正文摘要:

本帖最后由 Uus/pMeC6H4-/キ 于 2026-2-13 11:48 编辑 私用小电脑WSL2装RockyLinux10虚拟机,及LMod管理OpenMPI-4.1.8, ORCA-6.1.1等的笔记Uus_pMeC6H4- (\ Init post 2026-01-16 /) Last edit 2026-02-13 一 ...

回复 Reply

UW_0728. 发表于 Post on 2026-3-24 02:56:58
本帖最后由 UW_0728. 于 2026-3-24 03:18 编辑
Uus/pMeC6H4-/キ 发表于 2026-3-23 16:50
现在 toolchain 生成的 setup 文件的环境变量应该还是有点问题。比如,我用 --with-elpa=install 等选项 ...

因为INCLUDE_PATHS这个变量集不包含每个程序各自的include路径。通常这些路径会被包含在CPATH中,但我刚简单尝试了一下,从toolchain.env载入相应的CPATH环境变量后相应命令仍然无效,原因我不清楚。

可以效仿fftw3/openblas/scalapack里面的做法,先根据库文件位置(库文件可以被正确找到)定位到安装目录,到这里基本可以解决--with-elpa=system的问题。然后可以进一步,往INCLUDE_PATHS里面添加相应路径之后再进行后续操作,以添加其他程序可能需要的CFLAGS;但是一个问题在于ELPA的安装后文件架构挺复杂的,目录一套嵌一套(很烦人),还把头文件和module文件的目录分开,编译别的程序要用到的话还得把两个目录都写到include检查范围里面。
Stardust0831 发表于 Post on 2026-3-23 17:07:51
Uus/pMeC6H4-/キ 发表于 2026-3-21 15:06
你好,之前我说“预计 setup 文件拆分与 modulefile 编写会比较复杂”是因为我不太清楚 setup 文件里哪些 ...

可以直接ldd看cp2k的可执行文件,只要ldd的结果一样那就没问题。
Uus/pMeC6H4-/キ 发表于 Post on 2026-3-23 16:50:02
UW_0728. 发表于 2026-3-21 21:41
这些变量大多数主要是toolchain中编译后面的一些依赖库时需要,但对于编译CP2K本身应该用不到。至于是否 ...

现在 toolchain 生成的 setup 文件的环境变量应该还是有点问题。比如,我用 --with-elpa=install 等选项跑了一次 toolchain ,产生的 setup 文件包含下述内容,此后编译 CP2K 及运行都很成功。
  1. prepend_path PATH "cp2k/tools/toolchain/install/elpa-2026.02.001/cpu/bin"
  2. prepend_path LD_LIBRARY_PATH "cp2k/tools/toolchain/install/elpa-2026.02.001/cpu/lib"
  3. prepend_path LD_RUN_PATH "cp2k/tools/toolchain/install/elpa-2026.02.001/cpu/lib"
  4. prepend_path LIBRARY_PATH "cp2k/tools/toolchain/install/elpa-2026.02.001/cpu/lib"
  5. prepend_path PKG_CONFIG_PATH "cp2k/tools/toolchain/install/elpa-2026.02.001/cpu/lib/pkgconfig"
  6. prepend_path CMAKE_PREFIX_PATH "cp2k/tools/toolchain/install/elpa-2026.02.001/cpu"
  7. export ELPA_VER="2026.02.001"
  8. export ELPA_ROOT="cp2k/tools/toolchain/install/elpa-2026.02.001"
  9. export ELPA_LIBS="-lelpa_openmp"
复制代码

但若还想装另一个版本的 CP2K ,在 source 上述 setup 文件后跑第二次 toolchain 时,用 --with-elpa=system 选项并不能成功找到已经安装的 ELPA 的路径,
  1. ==================== Finding ELPA from system paths ====================
  2. libelpa_openmp is found in ld search path
  3. Cannot find elpa_openmp-2026.02.001 from paths CPATH SYS_INCLUDE_PATH
复制代码
必须要改成指定路径的写法 --with-elpa=cp2k/tools/toolchain/install/elpa-2026.02.001/cpu 才能找到。
UW_0728. 发表于 Post on 2026-3-21 21:41:35
Uus/pMeC6H4-/キ 发表于 2026-3-21 15:06
你好,之前我说“预计 setup 文件拆分与 modulefile 编写会比较复杂”是因为我不太清楚 setup 文件里哪些 ...

这些变量大多数主要是toolchain中编译后面的一些依赖库时需要,但对于编译CP2K本身应该用不到。至于是否可以跟CP_LIBS之类的一起排除掉,我不好说。
Uus/pMeC6H4-/キ 发表于 Post on 2026-3-21 15:06:46
UW_0728. 发表于 2026-2-25 22:38
ORCA 6结合OpenMPI 5一起用其实完全没有问题(起码结合5.0.6~5.0.10都正常),但是必须是自己编译的,系统 ...

你好,之前我说“预计 setup 文件拆分与 modulefile 编写会比较复杂”是因为我不太清楚 setup 文件里哪些设置是必须写到 modulefile 的,现在有个 filter_setup 函数从零散的 setup_{package} 汇总到最终的 setup 文件里就好多了。但目前 setup 文件里除了各种 PATH 的添加,还有一些环境变量的设置如:
  1. export OPENBLAS_LIBS="-l:libopenblas.a"
  2. export MATH_LIBS="${MATH_LIBS} -l:libopenblas.a"
  3. export FFTW3_LIBS="IF_MPI(-lfftw3_mpi|) -lfftw3 -lfftw3_omp"
  4. export FFTW_LIBS="IF_MPI(-lfftw3_mpi|) -lfftw3 -lfftw3_omp"
  5. export COSMA_LIBS="-lcosma_prefixed_pxgemm -lcosma -lcosta IF_CUDA(-lTiled-MM|)"
复制代码
这些 cmake configure 的设置在编译 CP2K 及实际运行时还有没有必要生效?如果不用的话,能否考虑在 filter_setup 里与 CP_LIBS 之类的一起排除掉,进一步简化最终的 setup 文件呢?
ChrisZheng 发表于 Post on 2026-3-11 18:32:44
UW_0728. 发表于 2026-2-25 22:38
ORCA 6结合OpenMPI 5一起用其实完全没有问题(起码结合5.0.6~5.0.10都正常),但是必须是自己编译的,系统 ...

感谢指出 根据您的解读 用
  1. export OMPI_MCA_osc=^ucx
复制代码

完美克服了烦人的提示

评分 Rate

参与人数
Participants 1
eV +2 收起 理由
Reason
UW_0728. + 2

查看全部评分 View all ratings

Stardust0831 发表于 Post on 2026-3-5 14:05:32
conda部分,我专门关注过反激活问题,尽力避免了conda被取消激活时的环境残留。
这个是lmod用的lua文件:
  1. -- -*- lua -*-
  2. local conda_root = "/opt/devtools/anaconda3"
  3. local env_script = "/opt/envs/anaconda3.env"

  4. source_sh("bash", env_script)
  5. prepend_path("PATH", conda_root .. "/bin")
  6. prepend_path("PATH", conda_root .. "/condabin")

  7. if (mode() == "remove") then
  8.     local cleanup_list = {
  9.         "CONDA_EXE", "CONDA_PYTHON_EXE", "CONDA_SHLVL", "CONDA_PREFIX",
  10.         "CONDA_DEFAULT_ENV", "CONDA_PROMPT_MODIFIER", "CONDA_PREFIX_1",
  11.         "_CE_M", "_CE_CONDA"
  12.     }
  13.     for _, var in ipairs(cleanup_list) do
  14.         unsetenv(var)
  15.     end

  16.     LmodMessage("Cleaning up Conda environment...")
  17.     execute{cmd="export PATH=$(echo $PATH | tr ':' '\\n' | grep -v -E 'anaconda3/bin|anaconda3/condabin|/.conda/envs/' | paste -sd ':' -)", modeA={"remove"}}
  18.     execute{cmd="while [ ${CONDA_SHLVL:-0} -gt 0 ]; do conda deactivate; done; unset -f conda __conda_activate __conda_reactivate; hash -r", modeA={"remove"}}
  19. end
复制代码
这个是给module用的tcl文件:
  1. #%Module1.0
  2. conflict conda
  3. set conda_root "/opt/devtools/anaconda3"
  4. set env_script "/opt/envs/anaconda3.env"

  5. if { [module-info mode load] } {
  6.     if { [file exists $env_script] } {
  7.         source-sh bash $env_script
  8.     }
  9.     prepend-path PATH "$conda_root/bin"
  10.     prepend-path PATH "$conda_root/condabin"
  11. }

  12. if { [module-info mode remove] } {
  13.     # 1. 环境退栈
  14.     puts stdout "while \[ \${CONDA_SHLVL:-0} -gt 0 \]; do conda deactivate; done;"

  15.     # 2. 精准变量清理 (增加了对模块系统内部变量的清理)
  16.     set cleanup_list {
  17.         CONDA_EXE CONDA_PYTHON_EXE CONDA_SHLVL CONDA_PREFIX
  18.         CONDA_DEFAULT_ENV CONDA_PROMPT_MODIFIER CONDA_PREFIX_1
  19.         _CE_M _CE_CONDA __MODULES_SHARE_PATH
  20.     }

  21.     foreach var $cleanup_list {
  22.         unsetenv $var
  23.         puts stdout "unset $var;"
  24.     }

  25.     # 3. 彻底抹除 Conda 导出的 Bash 函数
  26.     # 这一步通过 shell 强制清除被 export 的函数定义
  27.     puts stdout "unset -f conda __conda_activate __conda_reactivate __conda_hashr __add_sys_prefix_to_path __conda_exe __conda_s_rc;"

  28.     # 4. 强制物理清理 PATH
  29.     puts stdout "export PATH=\$(echo \$PATH | tr ':' '\\n' | grep -v -E '/.conda/envs/|/anaconda3/bin|/anaconda3/condabin' | paste -sd ':' -);"

  30.     # 5. 刷新 Shell 状态
  31.     puts stdout "unalias conda 2>/dev/null; hash -r;"
  32. }
复制代码


评分 Rate

参与人数
Participants 1
eV +3 收起 理由
Reason
Uus/pMeC6H4-/キ + 3 牛!

查看全部评分 View all ratings

UW_0728. 发表于 Post on 2026-2-25 22:38:11
本帖最后由 UW_0728. 于 2026-3-5 01:04 编辑

ORCA 6结合OpenMPI 5一起用其实完全没有问题(起码结合5.0.6~5.0.10都正常),但是必须是自己编译的,系统包管理器自带的那个OpenMPI 5.0.2没法用

(补充原因:OpenMPI 5.0.x支持了更先进的UCX功能,这一功能在检测到已安装的ucx-devel包时会自动启用并成为默认选项,但是ORCA目前主要适配OpenMPI 4.1.x,因此与这一功能不兼容。系统dnf自带的5.0.2版本是包含了这一功能的,所以用它来运行ORCA会弹出一大堆所谓的报错提示,尽管这些提示并不会真的导致计算任务报错停止,只是计算速度会略慢一点;如果不安装系统自带的OpenMPI而选择自行编译,此时由于系统默认不装着ucx-devel,OpenMPI在配置和编译的时候就不会检测到和启用这个功能,因此也就不存在这一问题)

未来可以挑战把 CP2K 2026.1 的工具链做成 modulefiles 形式,以让其中的 OpenMPI 5 能与 ORCA 6.1.1 用的 OpenMPI 4.1.8 共存,预计 setup 文件拆分与 modulefile 编写会比较复杂。

其实你的文章已经提到了$LMOD_DIR/sh_to_modulefile这个命令(经典module中命令是module sh-to-mod bash),就可以用来处理这个:把source /path/to/cp2k/tools/toolchain/install/setup和几个针对CP2K的export PATH还有LD_LIBRARY_PATH指令放在一个bash脚本中,然后利用上述命令,就可以很方便地实现这个目的了


评分 Rate

参与人数
Participants 2
eV +6 收起 理由
Reason
ChrisZheng + 5 谢谢
Uus/pMeC6H4-/キ + 1 谢谢

查看全部评分 View all ratings

Uus/pMeC6H4-/キ 发表于 Post on 2026-2-13 12:07:47
今天更新了一下正文第四节 ORCA 6.1.1 的 modulefile 的写法。旧版的 modulefile 长这样:
  1. whatis("ORCA-6.1.1")
  2. family("orca")
  3. help([[
  4. ORCA 6.1.1 dynamically linked against OpenMPI 4.1.8
  5. ]])

  6. load("openmpi/4.1.8-gnu14.3.1")
  7. prepend_path("PATH","/opt/orca_6_1_1_linux_x86-64_shared_openmpi418_avx2" )
  8. prepend_path("LD_LIBRARY_PATH","/opt/orca_6_1_1_linux_x86-64_shared_openmpi418_avx2")
  9. execute {cmd="alias orca6=$(which orca)", modeA={"load"}}
  10. execute {cmd="unalias orca6", modeA={"unload"}}
复制代码

最后两行的 execute {} 要求在完成所有变量设定后执行 shell 命令,此处在加载时用 alias 设定 orca6 为 which 查到的可执行文件的完整路径、卸载时用 unalias 取消之。但是:
1. LMod 已经有原生的设置 alias 的指令 set_alias() 可用来定义 alias 因而不需要 execute 的命令;
2. 定义 alias 即要求输入命令后运行前扩展字符串,只适合于 interactive shell 而不会在 non-interactive shell 里生效(如使用 nohup & 把进程放到后台运行且忽略 SIGHUP 的场合)。更好的替代方案是定义 shell function 并用 bash 语法的 "$@" 传入所有选项,在 LMod 里用 set_shell_function() 来设置(见官方文档 Setting alias and shell functions 一节),正文按字符串连缀来写。

想在(无作业排队系统的)私有电脑上批量用 nohup 跑一批 ORCA 任务时,给每个输入文件写一个 run_orca.sh 脚本加载 modulefile 并启动 ORCA 程序,如
  1. #!/bin/bash
  2. inpname="ch2o"
  3. module load orca/6.1.1-openmpi4.1.8
  4. orca6 ${inpname}.inp > ${inpname}.out
复制代码
再在命令行里交给 nohup 即可。
  1. chmod +x run_orca.sh
  2. nohup ./run_orca.sh &
复制代码
Uus/pMeC6H4-/キ 发表于 Post on 2026-1-23 10:01:41
好奇一下,最近几天这帖的浏览量增加得出乎意料地快,是有谁在其他地方转了个指向这帖的链接吗?

有关 Gaussian/GaussView 再说一点,比如装到 /opt 下平时配备环境的习惯大概会编辑 ~/.bashrc 添加这样的指令
  1. export g16root=/opt
  2. export GAUSS_SCRDIR=/opt/g16/scratch
  3. export GAUSS_MEMDEF=25600MB
  4. source /opt/g16/bsd/g16.profile
复制代码
其中最后一行 source 的 g16.profile 文件也是一个 shell 脚本。但在写 modulefile 用 LMod 做版本管理时不能简单改成 modulefile 里的 execute {cmd="source /opt/g16/bsd/g16.profile", modeA={"load"}} 指令,因为这样加载完再卸载会残留设置;实测用上面提到的 sh_to_modulefile 外部工具或者 modulefile 里的 source_sh 指令都会报错。这种情况下,有必要 less /opt/g16/bsd/g16.profile 查看文件,综合考虑所有设置对环境变量的影响,再自行翻译成 lua 语法的 modulefile 指令。

比如,看到 g16.profile 前面几行是这样的
  1. gr=$HOME
  2. if [ "$g16root" ]
  3.   then gr=$g16root
  4.   fi
  5. export GAUSS_EXEDIR="$gr/g16/bsd:$gr/g16"
  6. ...
复制代码
那么对应的 modulefile 里,包括上面几个设置的语句为
  1. local gr = "/opt"
  2. setenv("g16root", gr)
  3. setenv("GAUSS_SCRDIR", pathJoin(gr, "g16/scratch"))
  4. setenv("GAUSS_MEMDEF", "25600MB")
  5. local gauss_exedir = pathJoin(gr, "g16/bsd") .. ":" .. pathJoin(gr, "g16")
  6. setenv("GAUSS_EXEDIR", gauss_exedir)
  7. ...
复制代码
此处利用了 lua 语法中定义局部字符串变量和用 .. 表示 concatenation 的特性,以及 LMod 的 pathJoin 函数拼凑路径。

又比如, g16.profile 里有这样的分支语句
  1. if [ "$PATH" ]; then
  2.   export PATH="$PATH:$gr/gauopen:$GAUSS_EXEDIR"
  3. else
  4.   export PATH="$gr/gauopen:$GAUSS_EXEDIR"
  5.   fi
复制代码
显然这就是添加 PATH 的过程,在 LMod 里只需要一行
  1. append_path("PATH", pathJoin(gr, "gauopen") .. ":" .. gauss_exedir)
复制代码

特别注意,append_path 把新的路径加到变量末尾, prepend_path 把新的路径加到变量前头,在执行程序从 $PATH 搜索路径时是从前到后找、优先按前面找到的用,所以必须结合新路径的优先度考虑该用哪个。对于 WSL 的虚拟机而言,由于 $PATH 末尾包含了 Windows 系统的路径,所以应当改用 prepend_path 的写法。
  1. prepend_path("PATH", pathJoin(gr, "gauopen") .. ":" .. gauss_exedir)
复制代码

Daniel_Arndt 发表于 Post on 2026-1-17 10:16:32
我一般不用C:\Users\{username}\.wslconfig,而是通过WSL里面/etc/wsl.conf文件来设置一些东西。

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-4-24 20:14 , Processed in 0.231368 second(s), 28 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list