Cloud

AWS Parallel Cluster 3으로 Slurm 환경 및 LDAP을 통한 Active Directory 통합을 테스트 (Multi Node GPU Distributed Training을 위해)

mokpolar 2022. 6. 12. 14:25
반응형

Slurm 을 통해서 Deep Learning Model의 Multi Node GPU Distributed Training 환경을 준비해야 할 일이 생겼다. 

이에 AWS Parallel Cluster 3를 통해 Slurm 환경을 구축하고 이에 대한 접근은 LDAP 을 통한 Active Directory로 한다. 

 

AWS 환경에서 이런 작업을 하는 것은 문서가 잘 되어있어서 이해하고 따라 할 수 있으면 작업에는 별로 무리가 없다.

하지만 다소 불친절하거나 순서가 이해가 가지 않는 경우도 있으므로 잘 기억할 수 있게 이렇게 글을 써두는 것도 나쁘지 않을 것 같다.

 

AWS Parallel Cluster 란?

AWS 문서에서의 AWS Parallel Cluster에 대한 소개는.. 기계 번역이다. 그래서 영어 원문을 갖고 왔다. 

AWS ParallelCluster is an AWS supported open source cluster management tool that helps you to deploy and manage high performance computing (HPC) clusters in the AWS Cloud.
Built on the open source CfnCluster project, AWS ParallelCluster enables you to quickly build an HPC compute environment in AWS.
It automatically sets up the required compute resources and shared filesystem. You can use AWS ParallelCluster with batch schedulers, such as AWS Batch and Slurm.

 

자동으로 필요한 컴퓨터 자원과 공유 파일 시스템을 세팅하고 AWS Batch나 Slurm같은 batch scheduler를 사용할 수 있다. 

Slurm 이란?

Slurm에 대한 소개도 공식 문서에서 갖고 와봤다.

Slurm is an open source, fault-tolerant, and highly scalable cluster management and job scheduling system for large and small Linux clusters. Slurm requires no kernel modifications for its operation and is relatively self-contained

 

Slurm을 사용하면 작업을 수행할 수 있도록 리소스를 할당하고, 할당된 노드 집합에서 작업을 관리하기 위한 프레임워크를 사용할 수 잇다. 대기 중인 작업 대기열을 관리해서 리소스를 조절할 수 있다.

 

LDAP을 통한 Active Directory 통합 준비

먼저 LDAP 환경을 구성해야 한다. 해당 작업은 자습서가 아주 잘 되어있다. 이 문서를 참고하였다.

Active Directory 인프라 준비

AWS에서 테스트용 Cloudformation 구성 템플릿을 제공해주기 때문에 그것을 써도 되고, 파이썬 코드로 직접 실행해서 구성해도 된다.

 

템플릿 파일은 링크처럼 생겼다. 어떤 AWS 리소스들을 구성하는지 볼 수 있다.

AWS CloudFormation에서 해당 템플릿을 로드 하면 직접 작성해주어야 하는 파라미터들은 아래와 같다. 

패스워드의 작성 규칙에 주의해야 한다. 규칙에 맞지 않게 패스워드를 작성하면 나중에 왜 안되었는지 이유도 모른 채 접근이 불가능하거나 CloudFormation 생성이 실패한다. 경고도 띄워주지 않는다. 

  • AdminPassword
  • DomainName
  • KeyPair
  • ReadOnlyPassword
  • Username
  • UserPassword

생성하는데는 20~40분 정도가 걸리고 이후 결과로 생겨난 정보들을 아래와 같이 출력 탭에서 확인할 수 있다.

 

이 정보들을 AWS Parallel Cluster를 구성할 때 입력해주어야 한다. 

 

Active Directory 사용자 및 그룹 관리

Active Directory 도메인에 속해 있는 EC2 노드가 하나 생겨난다. 해당 노드는 Stopped 상태로 생겨나서 시작해주어야 한다. 

여기엔 AD관리에 필요한 라이브러리들이 미리 설치되어있다. 

 

adcli로 사용자를 관리할 수 있다. 사용자 관리 예제코드들도 문서에 안내가 되어있다. 

# 사용자 생성
adcli create-user "clusteruser" --domain "corp.pcluster.com" -U "Admin"

# 사용자 암호 재설정
aws --region "region-id" ds reset-user-password --directory-id "d-abcdef01234567890" --user-name "clusteruser" --new-password "new-p@ssw0rd"

# 그룹 생성
adcli create-group "clusterteam" --domain "corp.pcluster.com" -U "Admin"

# 그룹에 사용자 추가 
adcli add-member "clusterteam" "clusteruser" --domain "corp.pcluster.com" -U "Admin"

 

AWS Parallel Cluster 환경 준비

AWS Parallel Cluster 3버전을 사용했다.

로컬 환경에 AWS Parallel Cluster 도구 설치

AWS Parallel Cluster 도구는 Python 패키지로 배포되어있다. 문서에서는 따로 가상환경을 생성하여 설치하는 것을 권장하고 있다. 

# 가상환경 생성
python3 -m pip install --upgrade pip
python3 -m pip install --user --upgrade virtualenv
python3 -m virtualenv ~/apc-ve

# 가상환경 활성화
source ~/apc-ve/bin/activate

# AWS Parallel Cluster 설치
python3 -m pip install --upgrade "aws-parallelcluster"

# Node.js 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
chmod ug+x ~/.nvm/nvm.sh
source ~/.nvm/nvm.sh
nvm install --lts
node --version

# AWS Parallel Cluster 설치 여부 확인
pcluster version
 

AWS Parallel Cluster Config 준비

이제 아래 코드를 실행하여 cluster config를 준비한다. 

pcluster configure --config cluster-config.yaml

몇 가지 선택지를 통해 자동으로 클러스터 환경 설정을 준비할 수 있도록 도와주는데, 

Region, Key pair, Scheduler(Slurm, AWS Batch), OS, Instance type을 선택해야 한다. 

 

그리고 VPC Auto creation 선택이 뜨는데, 따로 준비한 VPC가 없다면 이 옵션을 선택해서 AWS Parallel Cluster용 VPC를 자동으로 생성해준다. 

이미 있는 VPC를 선택한다면 Public Subnet, 인터넷 게이트웨이 라우팅이 되어있어야 한다.

 

그 결과로 생성된 Configuration 파일은 아래와 같다. 

Region: ####
Image:
  Os: ####
HeadNode:
  InstanceType: ####
  Networking:
    SubnetId: ####
  Ssh:
    KeyName: ####
Scheduling:
  Scheduler: ####
  SlurmQueues:
    - Name: ####
      ComputeResources:
      - Name: ####
        InstanceType: ####
        MinCount: ####
        MaxCount: ####
      Networking:
        SubnetIds:
        - ####

HeadNode라는 건 사용자가 접근해서 Slurm job을 던지게되는 인스턴스를 의미한다. 

Scheduling은 실제로 작업을 수행하는 인스턴스들이다. Scheduler는 이전 선택에 따라 Slurm 아니면 AWS Batch이다. 

Min이 0으로 되어있다면 항상 떠 있는 정적 노드들은 하나도 없이 실행된 Slurm job에 따라 노드들이 생성되게 된다. 

 

Min이 0이면 자원 관리에 좋을 수도 있으나, 인스턴스가 생성되는 시간, 작업이 준비되는 시간 같은건 생각해야 한다. 

Active Directory와 연결

이제 작성된 AWS Parallel Cluster Configuration에 이미 만들어둔 Active Directory를 연결해야 한다. 

Configuration에 아래와 같이 정보를 추가해주면 된다. 

Region: ####
Image:
  Os: ####
HeadNode:
  InstanceType: ####
  Networking:
    SubnetId: ####
  Ssh:
    KeyName: ####
Scheduling:
  Scheduler: ####
  SlurmQueues:
    - Name: ####
      ComputeResources:
      - Name: ####
        InstanceType: ####
        MinCount: ####
        MaxCount: ####
      Networking:
        SubnetIds:
        - ####
DirectoryService:
  DomainName: dc=####,dc=####,dc=####
  DomainAddr: ldap://####,ldap://####
  PasswordSecretArn: ####
  DomainReadOnlyUser: cn=ReadOnlyUser,ou=####,ou=####,dc=####,dc=####,dc=####
  AdditionalSssdConfigs:
    ldap_auth_disable_tls_never_use_in_production: True

앞서 CloudFormation 으로 생성 후 출력 탭에 나와있던 정보들을 입력해준다. 

DomainAddr은 AWS Directory Service에서 Public Subnet에서의 DNS 주소이다. 

PasswordSecretArn은 AWS Secret Manager에 자동 생성된 컴포넌트의 ARN이다.

 

AWS Parallel Cluster 생성 및 접근

이제 실제로 AWS Parallel Cluster를 생성할 준비가 다 되었다. 

아래 코드를 실행하자. 

# 생성
pcluster create-cluster --cluster-name YOURCLUSTERNAME --cluster-configuration cluster-config.yaml

# 생성 여부 확인
pcluster describe-cluster --cluster-name YOURCLUSTERNAME

생성이 완료되면 접근을 해보자. 

pcluster ssh --cluster-name YOURCLUSTERNAME -i YOURKEYFILE

여기가 HeadNode이다. 만약에 Min값을 0으로 하지 않아서 정적 Scheduling 노드가 생성되어 있다면 HeadNode에서 접근할 수 있다.

EC2 콘솔화면에서 보면 HeadNode, Compute 이런 식으로 라벨이 달려있는 것을 볼 수 있는데 HeadNode에서 ComputeNode의 Private IP로 접근해보자. 

$ssh USER@YOURCOMPUTENODE-PRIVATEIP

$hostname
queue1-st-###

 

Slurm 테스트

Slurm job이 잘 실행되고 Scheduling 인스턴스에서 잘 실행이 되는지를 확인해보자. 

sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
queue1       up   infinite      *  idle~ ****

# hello.sh 생성
#!/bin/bash
sleep 30
echo "Hello World from $(hostname)"

# hello.sh 실행
sbatch hello.sh
Submitted batch job 13

# sjob 확인
squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
13       queue1 hello.sh   ******  R       0:01      1 ****

# 결과 파일 확인
cat slurm-13.out
Hello World from queue1-st-#### # 위에 Scheduling 인스턴스에서 확인한 hostname

잘 되는 것 같다. 

 

Active Directory 통합 테스트

이제 아이디와 패스워드를 이용해 이미 생성된 pcluster에 접근이 가능한지 테스트해보자. 

# HeadNode의 IP 획득
HEAD_NODE_IP=$(pcluster describe-cluster -n YOURCLUSTERNAME --region YOURREGION --query headNode.publicIpAddress | xargs echo)

# ID로 접근
ssh USER@$HEAD_NODE_IP

# 패스워드를 입력하고 나오는데 입력하면 된다.

key없이 아이디와 패스워드만으로 접근이 잘 된다.

 

마무리

각 노드들은 서로 root volume을 공유한다. 

HeadNode에서 파일을 생성하거나 환경을 구성하면 ComputeNode에서 바로 사용이 가능하다. 

 

이 점을 이용해서 다소 쉽게(?) Deep learning model의 Multi Node GPU Distributed Training을 준비할 수 있다.

또한 bootstrap 코드를 S3에 올린 후, pcluster 생성시 configure에 물려서 노드에 미리 필요한 라이브러리들을 설치해둘 수 있다. 

그 내용은 분량이 제법 많으므로, 다른 글로 작성해야겠다.

 

 

Reference

 

 

반응형