'modulefile'에 해당되는 글 1건

  1. 2010.04.17 Environment Modules (환경 모듈) 사용하기
Environment modules는 사용자로 하여금 유닉스/리눅스의 환경(environment) 설정을 쉽게 수정할 수 있도록 한다. 예를 들어 응용 프로그램을 두 개의 다른 버전으로 설치하였다고 하자. 응용 프로그램의 실행 파일이름은 runme, 버전은 1.0과 2.0 이라고 하고, 각각의 실행 파일은 아래와 같이 다른 디렉토리에 위치한다고 하자. 

/usr/local/응용프로그램-v1.0/bin/runme
/usr/local/응용프로그램-v2.0/bin/runme

일반적으로는 실행 파일(runme)이 있는 bin 디렉토리를 환경 변수인 경로(PATH)에 등록하여, 사용자가 명령어 창에서 runme만 입력하여도 자동으로 그 실행파일이 있는 디렉토리를 찾아서 해당 프로그램을 실행시키기 마련이다. 그러나, 위 경우에 다른 버전의 두 디렉토리를 모두 등록시켰다가는 항상 먼저 등록된 버전의 runme만 실행된다. 그렇다고 하나만 등록한다고 하면, 다른 버전을 사용할 때마다 매번 경로(PATH)를 수정해야 한다. 게다가 bin 디렉토리 뿐만 아니라 라이브러리 파일이 있는 lib 디렉토리마저도 버전마다 다르게 불러와야 할 경우는 상당히 골치가 아프다. 

Environment modules는 모듈 파일을 이용하여 이런 번거로움을 쉽게 해결해 준다. 예를 들어, 응용프로그램-v1.0과 관련된 설정을 하나의 모듈 파일로, 그리고 응용프로그램-v2.0과 관련된 설정을 다른 모듈 파일로 저장한다. 그리고 필요할 때마다 해당 모듈 파일을 불러오는 것으로 문제 해결이다. 이 글에서는 이미 environment modules가 설치되었다고 가정하고, 아래의 몇 가지 예를 통해서 사용법만 알아 보고자 한다. (설치하려면 소스포지 사이트에서 소스 코드를 다운받아 압축을 푼 후, 그 안에 있는 INSTALL이란 파일에서 2.2 Building and Installing Modules 부분을 참조한다.)

우선 어떤 모듈이 올라와 있는지 보자. (List loaded module files.)
[user@localhost ~]$ module list
No Modulefiles Currently Loaded.
현재로서는 올라와 있는 모듈이 없음을 알 수 있다. 

어떤 모듈들을 불러올 수 있는 확인하려면, 아래와 같다. (List available modules.)
[user@localhost ~]$ module avail
-------------------------------- /opt/modules/Modules/versions ---------------------------------
3.2.6
-------------------------------- /share/apps/modules/modulefiles --------------------------------
abinit/abinit-5.8.4p     intel/intel-9             mvapich/mvapich-1.1-intel-10   openmpi/openmpi-1.3.1-intel-11
fluent/fluent-12-beta   mvapich/mvapich-1.0-intel-10   mvapich/mvapich-1.1-intel-11   pgi/pgi-8.0
intel/intel-10              mvapich/mvapich-1.0-intel-11   mvapich/mvapich-1.1-intel-9    vasp/vasp-4.6
intel/intel-11              mvapich/mvapich-1.0-intel-9    mvapich/mvapich-1.1-pgi-8.0    vasp/vasp-5.2
위에 따르면 환경 모듈의 버전은 3.2.6이고, 그 아래에 불러올 수 있는 모듈들이 나열되어 있다. 

나열된 모듈들 중에 intel/intel-9 과 mvapich/mvapich-1.0-intel-9 를 불러오려면 module load를 이용한다.  
[user@localhost ~]$ module load intel/intel-9 mvapich/mvapich-1.0-intel-9

다음으로 intel/intel-9이란 모듈의 정보를 확인해 보자. (Show/display module information.)
[user@localhost ~]$ module show intel/intel-9       
-------------------------------------------------------------------
/share/apps/modules/modulefiles/intel/intel-9:

conflict         intel 
module-whatis    Provides Intel 9 C and Fortran Compilers 
prepend-path     PATH /opt/intel/cce/9.1.053/bin:/opt/intel/fce/9.1.052/bin:/opt/intel/idbe/9.1.053/bin 
prepend-path     LD_LIBRARY_PATH /opt/intel/fce/9.1.052/lib:/opt/intel/cce/9.1.053/lib 
-------------------------------------------------------------------
위에서 "module-whiatis"를 보면 intel/intel-9 모듈은 인텔 C와 포트란 컴파일러 (버전9)를 위한 환경 설정과 관련되어 있음을 알 수 있다. 그리고, 이 intel/intel-9 모듈 파일이 /share/apps/modules/modulefiles 디렉토리에 위치함을 알 수 있다. 이 모듈은 환경 변수인 PATH와 LD_LIBRARY_PATH에 추가적으로 관련 디렉토리들을 등록함을 알 수 있다. conflict에 대해서는 조금 있다가 설명하겠다.  


인텔 컴파일러 버전 9 대신에 버전 10 모듈을 불러올려면 module switch를 이용한다. (Switch modules.)
[user@localhost ~]$ which icc
/opt/intel/cce/9.1.053/bin/icc
[user@localhost ~]$ module switch intel/intel-9 intel/intel-10
[user@localhost ~]$ which icc
/opt/intel/cce/10.1.022/bin/icc
"module switch 모듈파일1 모듈파일2"라고 입력하면, 올라와 있는 모듈 1을 모듈 2로 바꾼다. 위의 예에서 보듯이 module switch 전후로 인텔 컴파일러 실행 파일인 icc가 다른 버전으로 변환되었음을 알 수 있다. 

만약 switch 대신에 unload/load를 사용할 수도 있다. (Load/unload modulefiles.)
[user@localhost ~]$ module unload intel/intel-10
[user@localhost ~]$ module load intel/intel-9
위 예에서는 intel-9을 불러 오기 전에 intel-10을 먼저 내렸음을 알 수 있다. 

만약 unload를 하지 않으면 어떤 문제가 생기는지 보자. 
[user@localhost ~]$ module load intel/intel-10
intel/intel-10(12):ERROR:150: Module 'intel/intel-10' conflicts with the currently loaded module(s) 'intel/intel-9'
intel/intel-10(12):ERROR:102: Tcl command execution failed: conflict intel
모듈간에 충돌이 생기면서 에러가 생기는데, 이는 intel/intel-9 모듈파일에서 지정한 conflict intel과 연관이 있다. conflict 다음에 하나 또는 그 이상의 모듈파일이 지정되어 있다면, 그 중에 어느 파일과도 동시에 불러올 수 없게 한다. 상기의 예에서는 conflict 다음에 intel이라는 디렉토리를 지정하여 그 디렉토리 안에 있는 모듈 파일들은 동시에 볼러올 수 없도록 한 것이다. 모듈파일 명령어 중에서 conflct처럼 불러오는 모듈파일 사이의 관계를 지정하는 또 다른 명령어로는 prereq이 있다. prereq에 대한 상세한 내용은 

불러온 다수의 모듈파일을 모두 다 내릴려면 purge를 이용한다. (Unload all loaded module files.)
[user@localhost ~]$ module purge
[user@localhost ~]$ module list
No Modulefiles Currently Loaded.

매번 로그인할 때마다 특정 모듈을 불러오기 귀찮다면, 쉘 초기화 파일에 module load를 추가한다. 본인의 경우에는 bash_profile 파일을 아래와 같이 편집하였다.
[user@localhost ~]$ cat >> ~/.bash_profile
module load intel/intel-9 mvapich/mvapich-1.0-intel-9
Ctrl + D
[user@localhost ~]$ source ~/.bash_profile


참조 사이트 1. http://modules.sourceforge.net/
                 2. module manual page
                 3. modulefile manual page
                 4. http://www.cpd.wm.edu/modules.php
Posted by 참향그늘
,