환경모듈 사용법

최초 게시일: 2021-05-02 / 최근 수정일: 2021-05-04


공용으로 사용하는 gmunu와 같은 리눅스 서버에서 사용자에 따른 동적인 환경변수 및 버전 변경은 매우 까다롭다. 때로는 사용자가 개발한 코드는 특정 컴파일러 혹은 소프트웨어 버전에만 작동하는 경우도 있어 시스템 전체에 대한 소프트웨어 버전 변경을 할 경우에는 많은 문제점을 줄 수 있다. 이를 해결하기 위해 환경모듈(Environment Module)을 사용한다.

환경모듈은 크게 2가지 (tcl, lmod) 방식으로 나누어진다. 현재 gmunu 서버에서 지원하는 환경모듈은 lmod로 이 방식은 계층적인 모듈 작업을 지원한다. 특히 컴파일러 종류 및 버전별, MPI 종류별로 불러야 하는 모듈이 달라지므로 계층적인 환경모듈을 이용하면 이 복잡함을 상당히 개선할 수 있다.

현재 사용할 수 있는 모듈을 알아보기 위해서는 module avail 혹은 module av이라는 명령어를 사용한다. 이 명령어를 사용하면 아래와 같이 현재 부를 수 있는 모듈들이 표시된다.

$ module avail

------------------ /applications/x86_64/modulefiles/compiler -------------------
   aocc/3.0.0          gcc/8.4.0         intel-oneapi-compilers/2021.2.0
   cuda/10.2.89        gcc/9.3.0
   cuda/11.2.2  (D)    gcc/10.2.0 (D)

------------------ /applications/x86_64/modulefiles/software -------------------
   cmake/3.20.1    ffmpeg/4.2.2    gnuplot/5.2.8    maple/2021

  Where:
   D:  Default Module

모듈을 사용하기 위해서는 module load라는 명령어를 사용한다. 예를들어 gcc 컴파일러 10.2.0 버전을 사용하기 위해서는

$module load gcc/10.2.0

이라고 쓰면 10.2.0 버전의 gcc를 사용할 수 있다. 확인을 위하여 gcc 버전을 체크해보면

$ gcc -v
Using built-in specs.
(중략)
gcc version 10.2.0 

으로 표시된다.

이제 gcc 10.2.0 버전을 로드 한 상태로 다시 module avail 명령어를 써 보면

$ module avail

----------------- /applications/x86_64/modulefiles/gcc/10.2.0 ------------------
   fftw/3.3.9                   mpich/3.4.1            openmpi/4.0.5
   hdf5/1.10.7                  mvapich2/2.3.5
   intel-oneapi-mpi/2021.2.0    netlib-lapack/3.9.1

------------------ /applications/x86_64/modulefiles/compiler -------------------
   aocc/3.0.0          gcc/8.4.0           intel-oneapi-compilers/2021.2.0
   cuda/10.2.89        gcc/9.3.0
   cuda/11.2.2  (D)    gcc/10.2.0 (L,D)

------------------ /applications/x86_64/modulefiles/software -------------------
   cmake/3.20.1    ffmpeg/4.2.2    gnuplot/5.2.8    maple/2021

  Where:
   D:  Default Module
   L:  Module is loaded

gcc/10.2.0 모듈이 로드되었으므로 L로 표시가 되고 gcc/10.2.0에서 사용 가능한 (gcc 10.2.0 으로 컴파일 된) 모듈 목록이 새로 생성 된 것을 볼 수 있다.

여기서 다시 수치 코드의 병렬 계산을 위하여 openmpi를 사용하기 위하여 module load openmpi/4.0.5를 입력하고 다시 module avail 명령어를 입력하면 아래와 openmpi 버전 4.0.5에서 사용 가능한 모듈의 목록이 나타나게 된다.

$ module load openmpi/4.0.5
$ module avail

------ /applications/x86_64/modulefiles/openmpi/4.0.5-6vikzes/gcc/10.2.0 -------
   fftw/3.3.9 (D)    hdf5/1.10.7 (D)

----------------- /applications/x86_64/modulefiles/gcc/10.2.0 ------------------
   fftw/3.3.9                   mpich/3.4.1            openmpi/4.0.5 (L)
   hdf5/1.10.7                  mvapich2/2.3.5
   intel-oneapi-mpi/2021.2.0    netlib-lapack/3.9.1

------------------ /applications/x86_64/modulefiles/compiler -------------------
   aocc/3.0.0          gcc/8.4.0           intel-oneapi-compilers/2021.2.0
   cuda/10.2.89        gcc/9.3.0
   cuda/11.2.2  (D)    gcc/10.2.0 (L,D)

------------------ /applications/x86_64/modulefiles/software -------------------
   cmake/3.20.1    ffmpeg/4.2.2    gnuplot/5.2.8    maple/2021

  Where:
   D:  Default Module
   L:  Module is loaded

여기서 문제는 fftw와 hdf5의 모듈은 openmpi를 부르기 전에도 존재한다. 즉 openmpi를 부르기 전 fftw와 hdf5모듈은 순차 코드에서 사용하는 모듈이고 (병렬화를 지원하지 않는 모듈) mpi 모듈을 부른 후에 나오는 것은 병렬 계산과 (fftw) 병렬 입출력이 (hdf5) 가능한 모듈이다.

이 외에도 자주쓰는 모듈 명령어는 아래와 같다.

  • module unload gcc/10.2.0 : gcc 10.2.0 모듈을 해제 시킨다.
  • module switch gcc/10.2.0 gcc/9.3.0 : gcc 10.2.0 모듈을 해제 시키고 gcc/9.3.0 모듈을 불러온다. 이 경우 의존적인 모듈(위 예제에서는 openmpi 모듈)이 가능 할 경우 자동으로 불러지고 아닐 경우 해제된다.
  • module purge : 현재까지 로드된 모든 모듈을 해제 시킨다.
  • module list : 현재까지 로드된 모든 모듈 리스트를 보여준다.
  • module whatis gcc/10.2.0 : gcc 10.2.0 모듈에 대한 설명을 출력한다.

gmunu 서버에서 각종 모듈을 부르면 그 모듈이 설치된 위치에 대한 환경변수를 지정하였다. 이것은 버전을 제외한 모듈의 이름에 _ROOT를 붙여서 사용한다 (모두 대문자임을 주의). 즉 module load hdf5/1.10.7HDF5_ROOT를 보면 아래와 같이 출력된다.

$ echo $HDF5_ROOT
/applications/x86_64/packages/gcc-10.2.0/hdf5-1.10.7/nqdp67l