관리형 고성능 클러스터에서 Mathematica를 사용하는 방법
배경 정보
대형 컴퓨팅 클러스터는 여러 개의 노드로 구성되어 있으며, 각 노드는 여러 개의 CPU 코어로 이루어져 있습니다. 또한, Mathematica와 같은 특수 소프트웨어는 종종 클러스터에 설치되어 있습니다. 사용자는 헤드 노드에 로그인하여 클러스터 관리자를 통해 배치 작업을 제출함으로써 이러한 리소스를 요청합니다. 작업은 리소스가 사용 가능해지면 실행됩니다. 두 가지 일반적인 클러스터 관리자에는 TORQUE와 Slurm이 있습니다.
Mathematica에서의 병렬화는 허브-스포크 모델을 사용하며, 여기서 제어 커널이 여러 개의 하위 커널(서브커널)을 관리합니다. 클러스터 환경에서는 클라이언트가 제어 커널을 실행하고 호스트는 서브커널을 제공합니다. 클러스터 관리자는 어떤 노드가 클라이언트 역할을 하고, 어떤 노드가 호스트 역할을 할지 결정합니다.
클러스터에서 Mathematica를 실행하면 다음과 같은 두 가지 이점이 있습니다. 첫째, 단일 노드에서도 사용할 수 있는 CPU 코어의 수가 일반적으로 데스크톱 컴퓨터보다 많고, 둘째, 각 CPU 코어의 속도가 데스크톱 컴퓨터의 CPU 코어보다 빠릅니다.
원격 Mathematica 프론트 엔드 실행
원격 프론트 엔드는 사용자가 작업의 리소스를 계속 제어할 수 있어야 합니다. 이를 대화형 세션이라고 합니다.
대화형 세션을 사용할 때 CPU 속도에서 데스크톱 컴퓨터를 사용하는 것보다 이점이 있지만, 원격 사용자 컴퓨터로 인터페이스가 전달되기 때문에 대화형 세션을 통한 프론트 엔드는 로컬 버전의 프론트 엔드보다 느립니다.
대화형 세션은 CPU 집약적인 계산을 실행하기 위한 것이 아닌 대신 코드 테스트 및 진단에 사용됩니다. 일반적으로 단일 노드의 리소스만 요청합니다.
- X Windows 포워딩이 활성화된 상태로 SSH를 통해 헤드 노드에 로그인합니다.
- 단일 노드에서 모든 리소스를 요청하여 대화형 세션을 시작합니다.
- Mathematica 세션을 시작합니다.
Mathematica 노트북에서 LaunchKernels[] 명령어를 사용하거나 다른 병렬 기능을 사용하면, 이제 클러스터에서 실행되는 서브커널이 포함됩니다.
원격 Mathematica 스크립트 실행
다음이 충족된다고 가정합니다:
- 원격 서브커널 실행에 익숙하고,
- 클러스터는 Linux 환경이며,
- 클러스터는 복제된 파일 시스템을 사용하여 모든 노드에서 동일한 실행 파일로 Mathematica가 실행됩니다
위의 가정 중 하나라도 맞지 않으면, 아래 과정은 수정이 필요할 수 있지만, 일반적인 개요는 유지됩니다.
- 시스템에 질의하여 작업에 할당된 노드의 이름을 찾습니다
- 시스템에 질의하여 각 노드당 사용 가능한 코어 수를 찾습니다
- 원격 커널을 수동으로 실행합니다
Slurm
Slurm에서 Mathematica 또는 Wolfram 언어 스크립트를 작성할 때, 다음과 같은 내용이 포함될 수 있습니다:
(* get host names *)
hosts = ReadList["!scontrol show hostname $SLURM_JOB_NODELIST", String]
masternode = Environment["SLURM_NODENAME"]
njobs = ToExpression[Environment["SLURM_CPUS_ON_NODE"]]
hosts = DeleteCases[hosts, masternode]; Length[hosts]
(* launch kernels on each host *)
kernels =
KernelConfiguration[#, "KernelCount" -> njobs] & /@ hosts;
LaunchKernels[kernels]
노드 이름을 가져올 때, 이전 버전과의 호환성을 위해 SLURM_JOB_NODELIST
대신 SLURM_NODELIST
를 사용할 수도 있습니다.
반환된 노드당 작업 수의 형식은 Wolfram 언어에서 해석하기에 적합하지 않습니다. 따라서 이 표현식은 수동으로 파싱하여 목록 표현식으로 변환됩니다.
TORQUE
TORQUE 환경에서 Mathematica 또는 Wolfram 언어 스크립트에서 사용할 수 있는 것은 다음과 같습니다:
(* get association of resources *)
hosts = Counts[ReadList[Environment["PBS_NODEFILE"], "String"]];
(* launch subkernels and connect them to the controlling Wolfram Kernel *)
kernels=
Map[KernelConfiguration[#,"KernelCount" -> hosts[#]] &, Keys[hosts]]
LaunchKernels[kernels]
PBS_NODEFILE
은 사용 가능한 각 CPU 코어에 대해 각 노드 이름을 한 번씩 나열하는 시스템 변수입니다. Counts는 이 목록을 Association의 인스턴스로 변환하여, 노드 이름을 키로 하고 CPU 코어 수를 값으로 사용합니다. 단순화를 위해 모든 서브커널은 로컬 Mathematica 인스턴스와 동일한 노드에서 실행되는 경우라도 원격 커널로 처리됩니다.
계산 후 정리
병렬 코드가 완료되면, Wolfram 커널을 종료하는 것이 좋은 습관입니다.
CloseKernels[];
[English]
1-800-WOLFRAM (국제 전화는 +1-217-398-0700)
고객 지원
월요일 - 금요일
8am–5pm 중부 표준시
- 제품 등록 및 동기화
- 구매 전 정보 및 주문
- 설치 및 동작
고급 기술지원 (해당 고객을 대상으로)
월요일 - 목요일
8am–7pm 중부 표준시
금요일
8:30–10am & 11am–5pm 중부 표준시
- 우선적 기술지원
- Wolfram 전문가들의 제품 지원
- Wolfram 프로그래밍
- 고급 설치 지원