计算化学公社

标题: Lmod管理公用Anaconda的方法 [打印本页]

作者
Author:
丁越    时间: 2024-12-28 16:13
标题: Lmod管理公用Anaconda的方法
本帖最后由 丁越 于 2024-12-28 16:19 编辑

Lmod管理公用Anaconda的方法



一、前言
  Anaconda是一个开源的python包管理器,里面集成了众多的科学计算所需要的包,比如numpy, scipy, Pandas等等, 并且具有非常方便的包管理功能,可以方便地安装、更新、卸载Python包及其依赖项。此外, 它的软件环境管理功能也非常强大,能够方便创建多个独立的Python环境,使得每个环境有自己特定的包版本,避免不同项目之间的冲突。对于个人用户来说,通过执行Anaconda的后缀为.sh的安装脚本后就能直接将其安装到家目录下,并且自动将初始化命令写入到个人账户的.bashrc中。然而对于集群用户来说,个人用户的安装方式无法实现软件的公用,因此为了实现Anaconda的多人公用就需要将其安装在公共目录当中,并且需要为模块管理软件如Lmod配置相应模块文件来方便集群用户调用该软件。Lmod的模块文件采用lua语言编写,但同时也持支TCL语言。由于Lmod的灵活性、模块文件简单加上其丰富的手册文档支持,使得其在高性能计算领域非常流行。下面介绍一下如何在集群上安装并配置公用的Anaconda,并使用Lmod进行方便调用,本文中所使用的Linux系统为Rocky linux-9.5。

二、安装流程
1. 对于Rocky-linux用户来说,直接通过dnf install Lmod就可以非常方便安装Lmod。其他Linux用户需要按照实际情况安装Lmod。
2. 将Anaconda安装到公共目录里,比如/opt。 可以进入/opt目录后输入下面命令下载安装脚本,然后chmod +x Anaconda3-2024.10-1-Linux-x86_64.sh添加可执行权限,之后运行./Anaconda3-2024.10-1-Linux-x86_64.sh进入安装,注意当前默认的安装目录为/root/anaconda3,需要切换为/opt/anaconda3。安装最后询问你需不需要执行初始化,这里选择no。

  1. curl -o Anaconda3-2024.10-1-Linux-x86_64.sh https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
复制代码
3. 在/ect/modulefiles里新建一个anaconda3的目录,里面根据conda的版本(如这里为24.9.2,可通过conda --version查看conda版本)新建一个名为24.9.2.lua的Anacond配置文件,因为配置这些文件时我们习惯上使用“程序名/版本”这样的方式来区分不同程序,以及相同程序但不同版本的模块文件。
  1. whatis("Anaconda3 24.9.2 & Python 3.9.21")

  2. local base = pathJoin("/opt", myModuleName())

  3. setenv("ANACONDA_ROOT",base)
  4. prepend_path("PATH",pathJoin(base,"bin"))

  5. -- this happens at load
  6. execute{cmd="source " .. base .. "/etc/profile.d/conda."..myShellType(),modeA={"load"}}
  7. execute{cmd="conda activate base",modeA={"load"}}

  8. -- this happens at unload
  9. if (myShellType() == "csh") then
  10.   -- csh sets these environment variables and an alias for conda
  11.   cmd = "unsetenv CONDA_EXE; unsetenv _CONDA_ROOT; unsetenv _CONDA_EXE; " ..
  12.         "unsetenv CONDA_SHLVL; unalias conda"
  13.   execute{cmd="conda deactivate",modeA={"unload"}}
  14.   execute{cmd=cmd, modeA={"unload"}}
  15. end
  16. if (myShellType() == "sh") then
  17.   -- bash sets environment variables, shell functions and path to condabin
  18.   if (mode() == "unload") then
  19.     remove_path("PATH", pathJoin(base,"condabin"))
  20.   end
  21.   cmd = "unset CONDA_EXE; unset _CE_CONDA; unset _CE_M; " ..
  22.         "unset -f __conda_activate; unset -f __conda_reactivate; " ..
  23.         "unset -f __conda_hashr; unset CONDA_SHLVL; unset _CONDA_EXE; " ..
  24.         "unset _CONDA_ROOT; unset -f conda"
  25.   execute{cmd="conda deactivate",modeA={"unload"}}
  26.   execute{cmd=cmd, modeA={"unload"}}
  27. end

  28. family("python")
复制代码
在该文件中,我们仅需要修改第三行“local base = pathJoin("/opt", myModuleName())”中的“/opt”为自己的Anaconda所安装的位置。另外,当前文件中使用了“execute{cmd="conda activate base",modeA={"load"}}”,这也就是说当我们用module load anaconda3调用Anaconda时,将会自动进入base环境。假如在调用anaconda3时想直接进入其他环境,那么只需要将这里的base替换为其他的环境即可。如果不想自动进入base则直接把该行删除就行。
    当运行module unload anaconda3命令时,这里还额外使用了“execute{cmd="conda deactivate",modeA={"unload"}}”,使得Anaconda先退出当前环境(如base)之后再取消其环境变量定义。注意的一点,当module unload anaconda3时假如当前的环境不是base,而是通过比如conda activate ase进入了名为ase的环境,那么首先需要自己手动执行conda deactivate来退回到base,然后再执行module unload anaconda3,这样才能完全退出anaconda3.




作者
Author:
Santz    时间: 2024-12-28 18:07
Lmod 安装好后,可以用$LMOD_DIR/sh_to_modulefile[size=1.1em] 生成各类软件的 modulefile,且支持 lua 和 tcl。以 Anaconda3-2024.06.1为例,安装位置/lustre/opt/apps/anaconda/3/2024.06.1。编写一个脚本 1.sh
  1. eval "$(/lustre/opt/apps/anaconda/3/2024.06.1/bin/conda shell.bash hook)"
复制代码
这个具体的可以在安装 Anaconda完成后的界面中看到。

1. 生成 lua modulefile
  1. $LMOD_DIR/sh_to_modulefile ./1.sh > 1.lua
复制代码

2. 生成 tcl modulefile
  1. $LMOD_DIR/sh_to_modulefile  --to TCL --output 1.tcl ./1.sh
复制代码


生成的两类 modulefile 都支持 conda activate/deactivate。

习惯 environment module 的也可以由module sh-to-mod bash 1.sh生成 tcl modulefile 统一由Lmod 管理。

作者
Author:
Daniel_Arndt    时间: 2025-1-10 15:05
之前从 https://www.blopig.com/blog/2023/03/the-ultimate-modulefile-for-conda/ 看到过一个Environment Modules配置文件,给Anaconda写的。我之前用的集群是用的Lmod,现在用的集群是用的Environment Modules。如果是自己搭建集群的话,肯定是推荐用Lmod,我个人感觉Lmod的配置文件的语法学起来较容易。现在我一般在集群上尽量用PDM( https://pdm-project.org/en/latest/ )替代Anaconda,主要是因为Anaconda这家公司在2024年的一些变化( https://www.datacamp.com/blog/navigating-anaconda-licensing )。

我给PDM写的Environment Modules配置文件如下:
  1. #%Module1.0#####################################################################
  2. ##
  3. ## modules pdm/2.22.0
  4. ##
  5. ## /home/USERNAME/modulefiles/pdm/2.22.0. Sample pdm module.
  6. ##
  7. proc ModulesHelp { } {
  8.         global version topdir

  9.         puts stderr "PDM/$version - sets the environment for PDM $version"
  10.         puts stderr "\nThe software has been installed to the following directory $topdir\n"
  11. }

  12. module-whatis   "PDM"
  13. module-whatis   "Website: https://pdm-project.org/en/latest/"
  14. module-whatis   "Version: 2.22.0"

  15. # for Tcl script use only
  16. set     version         2.22.0
  17. set     topdir          /home/USERNAME/software/pdm-2.22.0

  18. conflict pdm
  19. module load python/3.12.8

  20. prepend-path    PATH                ${topdir}/bin

  21. unsetenv        PYTHONPATH
  22. setenv          PYTHONPATH          ${topdir}/venv/lib/python3.12/site-packages

  23. unsetenv        PYTHONUSERBASE
  24. setenv          PYTHONUSERBASE      ${topdir}/venv

  25. unsetenv        PDM_PYPI_URL
  26. setenv          PDM_PYPI_URL        https://pypi.org/simple
复制代码
这里面的PDM_PYPI_URL这个环境变量可以参考 https://pdm-project.org/latest/reference/configuration/ 。如果所在局域网内有pypi的镜像的话(如一些高校),就修改这个环境变量。安装PDM前得有个python,我用的是从 https://github.com/astral-sh/python-build-standalone 下载的,里面不同版本的区别可以看 https://gregoryszorc.com/docs/python-build-standalone/main/running.html#obtaining-distributions 。相应的python的Environment Modules配置文件如下:
  1. #%Module1.0#####################################################################
  2. ##
  3. ## modules python/3.12.8
  4. ##
  5. ## /home/USERNAME/modulefiles/python/3.12.8. Sample python module.
  6. ##
  7. proc ModulesHelp { } {
  8.         global version topdir

  9.         puts stderr "python/$version - sets the environment for python $version"
  10.         puts stderr "\nThe software has been installed to the following directory $topdir\n"
  11. }

  12. module-whatis   "Python"
  13. module-whatis   "Website: https://www.python.org/"
  14. module-whatis   "Version: 3.12.8"
  15. module-whatis   "Source: https://github.com/astral-sh/python-build-standalone/releases/download/20241206/cpython-3.12.8+20241206-x86_64_v3-unknown-linux-gnu-pgo+lto-full.tar.zst"

  16. # for Tcl script use only
  17. set     version         3.12.8
  18. set     topdir          /home/USERNAME/software/python-3.12.8

  19. conflict python

  20. prepend-path    PATH                ${topdir}/bin

  21. prepend-path    LD_LIBRARY_PATH     ${topdir}/lib

  22. prepend-path    MANPATH             ${topdir}/share/man
复制代码










欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3