计算化学公社

 找回密码 Forget password
 注册 Register

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

查看数: 1929 | 评论数: 6 | 收藏 Add to favorites 17
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 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

Stardust0831 发表于 Post on 5 day ago
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 1
eV +1 收起 理由
Reason
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-3-10 15:59 , Processed in 0.514866 second(s), 27 queries , Gzip On.

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