데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      HPC를 여행하는 히치하이커를 위한 안내서 Part 1.

      alankim 25.10.17
      2,044 9 3
      DEVOTEE 요약
      AI 모델 개발 과정에서 GPU 자원의 비효율적인 활용 문제를 극복하기 위해 HPC(High-Performance Computing)가 필요합니다. HPC는 분산된 GPU 자원을 통합 및 효율적으로 관리하며, 스케줄러(Slurm 등)와 공유 스토리지, 컨테이너 기술을 통해 자원 활용률을 극대화하고 공정한 분배를 가능하게 합니다. 또한, 대규모 AI 모델 학습에서 필수적인 높은 통신 속도와 다양한 GPU 자원 조합 관리, TCO 절감 등의 혜택을 제공하여 AI 개발의 필수 인프라로 자리 잡았습니다.
      DEVOTEE 추천 블로그

      들어가며

      AI 모델 개발 조직이라면 흔히 겪는 문제가 있습니다.


      상황 1: 월요일 오전 9시

      • 개발팀 A: 할당받은 GPU 8개로 소규모 모델 학습 중

      • 개발팀 B: 긴급한 데모를 위해 GPU 32개가 필요하지만, 할당받은 8개로는 택도 없음

      • 개발팀 C: GPU 8개를 할당받았지만 그대로 방치 중이며, 이번 달 평균 사용률은 5%

      상황 2: 그 순간 서버실에서는

      • 긴급하게 연락받고 전체 클러스터 상황을 보니 30개 이상의 GPU가 아무 일도 하지 않고 있음

      막대한 비용을 투자한 GPU 인프라가 제대로 활용되고 못하고 있는 겁니다.

      이는 단순히 배분을 잘못해서가 아닙니다. 개발 조직별, 프로젝트별로 GPU를 개별 할당하는 방식 자체의 한계입니다.

      이러한 비효율성을 해결하기 위해 필요한 것이 바로 HPC(High-Performance Computing) 입니다.


      HPC라고 처음부터 겁먹을 필요는 없습니다. 현재의 HPC는 인공위성을 쏘아 올리는 거대한 슈퍼 컴퓨터만을 의미하지 않습니다.

      AI 모델 개발에서 HPC는 분산된 GPU 자원을 하나로 통합하고 효율적으로 분배하는 거대한 단일 컴퓨터입니다.

      몇 가지 기본 명령과 개념만 익히면, 기존 개발 환경과 크게 다르지 않게 사용할 수 있습니다.

      이번에 HPC의 핵심 개념부터 온프레미스 및 클라우드 환경에서 실제 구축과 활용에 대한 글을 연재 형식으로 다뤄보려고 합니다.


      그 첫 번째인 이 글은 다음과 같은 주제를 다룹니다.

      • AI 모델 개발과 HPC의 관계

      • HPC의 두뇌, 스케줄러 이해하기

      • 공유 스토리지와 소프트웨어 실행 환경 관리

      • HPC에서 컨테이너 기술


      1. AI 모델 개발을 위한 HPC

      1.1 HPC가 해결하는 실제 문제들

      앞서 살펴본 GPU 자원 할당 문제는 사실 GPU 클러스터를 운영할 때 발생하는 여러 문제 중 하나일 뿐입니다.

      방치되어 있는 자원을 회수하거나, 작업의 경중을 따져 급한 작업을 먼저 수행하게 하거나, 장애가 발생한 시스템을 제외시키는 등 다양한 클러스터의 문제 상황들을 HPC는 해결해 줄 수 있습니다.


      대표적인 사례를 한번 살펴볼까요?

      문제 상황

      HPC 해결책

      사용하지 않는 GPU 자원

      Job 단위로 GPU 자원을 할당하여 Job 실행이 끝나면 GPU 자원을 자동으로 회수

      급한 작업

      우선 순위 정책을 통해 중요한 작업에 자원 할당 우선 순위를 배정

      시스템 장애

      서버가 다운되면 클러스터에 제외하고 Job이 할당되지 않도록 조정

      자원 사용 제한

      그룹별/사용자별로 자원 사용 정책( Quota)을 적용하여 제한

      자원 사용 분쟁

      사용량을 정량적으로 추적하여 리포팅

      이 외에도 여러 가지 문제 상황들을 처리할 수 있지만, 우선은 이 정도로도 클러스터의 생산성을 크게 높일 수 있습니다.

      특히나 부서 간 자원을 더 많이 사용하기 위한 분쟁 등에 대해 자원 사용 제한 정책이나 정량적인 사용량 리포팅을 통해 더욱 공정한 자원 분배 및 사용을 할 수 있도록 돕습니다.


      1.2 AI 모델 개발의 필수 인프라가 된 이유

      HPC가 단순히 자원을 통합하는 것을 넘어, AI 개발에 필수적인 이유는 다음과 같은 배경을 생각해 볼 수 있습니다.

      이유 1. 초대형 모델은 한 대로 못 돌린다

      GPT와 같은 대형 LLM은 수십억에서 수조 개의 파라미터를 가집니다. 이러한 모델을 학습하려면 아래와 같이 많은 수의 GPU가 필요하게 됩니다.

      • GPU 1대: 몇 년 걸림 (사실상 불가능)

      • GPU 100대: 몇주~몇달

      • GPU 1,000대: 며칠~몇주

      문제는 이렇게 GPU를 많이 동원한다고 해도 자동으로 학습 시간이 빨라지지 않는다는 겁니다.

      학습 과정에서 GPU들이 긴밀하게 서로 협력해야 하는데, 이때 통신 속도가 생명입니다.

      예를 들어 GPU 간 통신이 조금만 느려져도 전체 학습 시간이 수십 시간 증가할 수도 있습니다.

      HPC는 InfiniBand, RoCE와 같은 초고속, 초저지연 네트워크 기술을 갖추고 있어, 이러한 문제를 해결할 수 있습니다.

      이유 2. 다양한 GPU를 효율적으로 쓰기 위해

      실제 회사나 연구소와 같이 GPU를 많이 사용하는 곳은 다양한 종류의 GPU들이 섞여 있습니다.

      신형이 나왔다고 해서 비싼 구형 GPU 장비를 폐기 처분하지 않고 일정 기간 같이 사용하는 것이죠.

      예를 들면 다음과 같습니다.

      • 구형 GPU (A100 등): 일반적인 학습용

      • 최신 GPU (H100, B200 등): FP8 학습이 필요할 때

      • 특수 가속기 (NPU): 추론 전용 등

      H100을 신형 GPU라고 분류하기가 애매하지만,

      이렇게 다양한 종류의 GPU를 하나의 클러스터로 통합해서

      스케줄러에 의해 "이 작업을 A100으로 할당하고, 저 작업은 H100에 할당해" 하고 목적에 맞게 자원을 배치할 수 있습니다.

      이유 3. 총 소유 비용(TCO) 절감

      NVIDIA B200 GPU 한 장이 4만 불인 시대입니다. 이 GPU 8장을 장착한 서버 한 대가 한화로 5억이 넘어갑니다.

      이렇게 비싼 GPU 자원을 1분이라도 더 효율적으로 사용해야 하는 것은 어쩌면 숙명일지도 모릅니다.

      개인이나 조직에게 개별 할당하는 방식은 자원 활용률을 현저히 낮춥니다.

      당연히 지능적인 자원 할당 정책이 필요하며, HPC가 가장 적절한 관리 방식이 될 수 있습니다.


      2. HPC의 두뇌 스케줄러

      AI 모델 개발 환경에서 HPC의 핵심은 단순히 많은 GPU를 물리적으로 모아 놓은 것이 아닙니다.

      핵심은 이 자원들을 ‘누가’, ‘언제’, ‘얼마나 효율적으로’ 사용할 수 있게 할지를 결정하는 스케줄러에 있습니다.

      그림1. Slurm Scheduler

      [ 그림1. Slurm Scheduler ]

      2.1 스케줄러의 역할

      스케줄러는 말 그대로 HPC 클러스터의 두뇌이자 운영 시스템과 같습니다.

      사용자가 수행하려는 작업(Job)을 요청하면, 스케줄러는 클러스터 전체의 GPU, CPU, 메모리 상태를 실시간으로 파악하여 어떤 노드에 어떤 작업을 배치 할지 결정 합니다.

      이러한 지능적인 오케스트레이션 과정을 통해 HPC는 수많은 사용자와 작업이 동시에 돌아가는 상황에서도 자원을 공정하고 효율적으로 분배하며, 자원 낭비를 최소화할 수 있습니다.

      • 자원 할당: GPU, CPU, 메모리 등 요청된 자원을 작업에 맞게 정확하게 할당하고 해제

      • 작업 관리: 등록된 작업의 순서를 정하고, 실행, 대기, 실패 상태 등을 전반적으로 관리

      • 자원 최적화: 전체 클러스터의 자원 사용률을 최적화하고, 사용자 간의 공정한 자원 분배를 책임짐

      즉, HPC가 분산된 자원을 마치 거대한 단일 컴퓨터처럼 보이게 만들고 작동시키는 것은 바로 이 스케줄러의 지능적인 역할 덕분입니다.


      2.2 HPC 스케줄러의 발전

      초기의 HPC 환경에서는 PBS, Torque, Grid Engine과 같은 전통적인 스케줄러가 주로 사용되었습니다.

      이들은 CPU 중심의 계산 환경에 초점이 맞춰져 있었기에, GPU 자원은 단순한 추가 옵션 정도로만 다뤄졌습니다.

      그러나 AI와 딥러닝이 HPC 활용의 중심으로 자리 잡으면서, GPU 자원 관리가 핵심 과제로 되었고, 이런 부분에 강점을 가지고 있던 Slurm이 새로운 표준으로 부상했습니다.

      이런 변화 속에서 Slurm 스케줄러는 GPU 자원 관리 기능 뿐만 아니라 Open Source 기반이라는 장점을 통해 학교와 연구소로 빠르게 확산되었습니다.

      이후 안정성과 확장성이 입증되면서 현재는 기업에서도 가장 널리 사용되는 스케줄러로 확고히 자리 잡았습니다.

      Slurm (Simple Linux Utility for Resource Management)

      https://github.com/SchedMD/slurm

      Slurm은 오픈소스(Open Source) 기반으로 개발 및 배포되며, 현재 SchedMD가 핵심 개발과 유지보수를 주도하고 있습니다.

      Slurm의 오픈소스 모델은 사용자가 라이선스 비용 부담 없이 Slurm을 자유롭게 사용할 수 있도록 하며,

      벤더 종속성없이 조직의 환경에 맞게 수정하고 확장할 수 있는 높은 유연성을 제공합니다.

      한편, 대규모 시스템의 안정적인 운영을 위해 엔터프라이즈 유료 지원을 선택할 수도 있습니다.

      이를 통해 전문 엔지니어로부터 성능 최적화, 장애 대응, 보안 업데이트, 그리고 SLA 기반의 기술 지원을 받을 수 있습니다.

      자, 그럼 slurm 스케줄러의 간단한 예시를 살펴볼까요?

      현재 Slurm이 설치된 환경이 없다 해도 염려 마세요.

      AWS나 Azure 같은 클라우드 서비스는 이러한 HPC 클러스터를 빠르게 구축 할 수 있는 관리형 서비스를 제공합니다.

      (자세한 내용은 이후 연재에서 다룰 예정입니다.)


      slurm 클러스터에 접속할 수 있다면, sinfo 라는 명령을 입력해봅니다.

      $ sinfo
      
      PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
      batch*       up   infinite     20    mix gpu[001-020]
      batch*       up   infinite     20   idle gpu[021-040]
      cpu          up   infinite      4   idle cpu[001-004]

      sinfo 명령은 클러스터의 전체 자원 상태를 보여주는 명령입니다.

      어떤 파티션이 있는지, 각 파티션에 노드가 몇 대나 있으며 현재 얼마나 사용 중인지(mix), 얼마나 비어 있는지(idle)를 한눈에 파악할 수 있습니다.

      위 결과를 보면 batch 파티션에 GPU 노드가 총 40대 있고, 이 중 20대는 이미 작업 중이며(mix), 나머지 20대는 사용 가능한 상태(idle)임을 알 수 있습니다.


      이번에는 제출된 Job의 상태를 볼까요?

      $ squeue
      
      JOBID PARTITION     NAME     USER  ST    TIME  NODES NODELIST(REASON)
      1655     batch     train      kim   R    30:14   20  gpu[001-020]

      squeue 명령은 현재 실행중인 Job의 상태를 보여주는 명령입니다.

      결과를 보니 20대의 GPU 노드를 사용하는 사용자는 kim 이었네요.


      Slurm 스케줄러를 효과적으로 활용하려면 이러한 기초 명령어에 익숙해지는 것이 가장 중요합니다.

      지면 관계상 두 가지만 예시로 들었지만, 아래 공식 매뉴얼을 통해 더 많은 기초 명령어들을 익혀보세요.

      3. 공유 스토리지 - 데이터와 소프트웨어 실행의 중심

      3.1 공유 저장소의 필요성

      HPC 클러스터의 각 노드는 물리적으로 독립된 서버이지만, Slurm 같은 스케줄러 덕분에 이 자원들을 하나의 거대한 서버처럼 사용할 수 있게 됩니다.

      하지만 여기서 문제가 발생합니다. 여러 노드가 동시에 하나의 작업을 수행할 때, 필요한 데이터가 수백 GB에 달한다면 어떨까요?

      작업이 시작될 때마다 이 데이터를 모든 참여 노드로 개별 복사하는 것은 심각한 관리 부담과 성능 저하를 초래합니다.

      이러한 문제를 해결하기 위해서 HPC는 공유 파일 시스템을 기본적으로 사용합니다.


      대표적인 공유 파일 시스템은 다음과 같습니다.

      • NFS (Network File System): 가장 단순하고 널리 사용되는 네트워크 파일 공유 방식

      • Lustre: 대규모 병렬 I/O를 지원하는 고성능 파일 시스템으로, AI 및 HPC 분야에서 사실상의 표준

      • BeeGFS, GPFS : 대규모 환경에서 탁월한 고성능과 확장성을 동시에 제공

      클러스터의 모든 노드는 이러한 공유 스토리지를 동일한 경로(예: /home, /data, /shared/scratch)로 마운트합니다.

      그 결과, 한 노드에서 저장한 데이터를 다른 노드에서도 즉시 접근할 수 있게 되어, 데이터의 일관성과 복제에 대한 부담이 사라집니다.


      3.2 일관된 소프트웨어 관리


      [ 그림 2. 공유스토리지와 모듈 ]


      HPC의 공유 스토리지는 단순한 데이터 저장 공간을 넘어, 소프트웨어 실행 환경의 일관성을 유지하는 핵심적인 역할을 합니다.

      좀 뜬금 없는 이야기 같이 들릴지 모르지만, 차근 차근 알아보겠습니다.


      AI 모델 학습과 같은 복잡한 작업은 다양한 소프트웨어 스택을 요구하며,

      수백 개의 노드에서 동시에 학습을 수행하려면 모든 노드가 정확히 동일한 버전의 소프트웨어와 라이브러리를 가져야 합니다.

      그렇지 않으면 버전 충돌이나 라이브러리 불일치로 인해 분산 학습이 실패하거나 디버깅이 매우 어려워집니다.

      왜 기존 방식은 통하지 않는가?

      일반적인 리눅스 환경에서 apt-get, yum, pip 같은 패키지 관리자를 통해 소프트웨어를 설치하면,

      실행 파일과 라이브러리는 /usr/bin, /usr/lib 등의 OS 지정 경로에 저장됩니다.

      하지만 이 방식으로 수십, 수백 대의 노드로 구성된 클러스터의 소프트웨어를 개별 설치하고 업데이트하는 것은 엄청난 관리 부담입니다.

      게다가 사용자마다 요구하는 소프트웨어 버전이 다르기 때문에, 하나의 OS 환경만으로는 이러한 다양한 요구를 지원하는 것은 사실상 불가능합니다.

      아이디어의 출발 : 환경 변수를 변경하자

      유닉스 계열 운영체제에서 어플리케이션을 실행 할 때, 다음과 같은 환경 변수를 참조합니다.

      변수

      역할

      PATH

      실행 가능한 바이너리 파일이 위치한 디렉토리 목록

      LD_LIBRARY_PATH

      실행 시 필요한 동적 라이브러리(.so 파일)의 검색 경로

      CPATH / INCLUDE

      C/C++ 컴파일 시 헤더 파일을 검색할 경로

      MANPATH

      매뉴얼(man page) 검색 경로

      예를 들어 python 명령을 실행하면, 셸은 PATH에 등록된 디렉터리를 순차적으로 검색하여 /usr/bin/python을 실행하게 되는 식이죠.


      여기서 Environment Module의 아이디어가 출발합니다.

      공유 스토리지에 소프트웨어와 라이브러리를 설치해 두고,

      실행 시 PATH 등의 환경 변수를 해당 경로로 설정하여 공유 스토리지 기반의 실행 환경을 동적으로 구성하는 방식입니다.

      결과적으로, 각 노드 로컬에 소프트웨어를 설치하지 않더라도 모든 노드에서 공유 스토리지에 설치된 소프트웨어를 즉시 실행할 수 있게 됩니다.

      간단히 말하면 사용자 쉘 레벨에서 실행 환경을 동적으로 제어하는 기술입니다.


      서두가 길었는데, 백문이 불여일견이라고 실제 사용을 해봅시다.

      먼저 Environment Module이 설치된 클러스터에서 Python을 실행해 봅니다.

      $ python --version
      -bash: python: command not found

      Python이 설치되지 않았네요 Environment Module을 사용해볼 기회입니다. 아래와 같이 명령을 입력합니다.

      $ module load Python/3.9.6-GCCcore-11.2.0

      이제 python 명령을 입력하면 놀랍게도 Python이 실행됩니다!

      $ python --version
      Python 3.9.6

      도대체 어떻게 실행된 것일까요? 경로를 확인해보면 답을 알 수 있습니다.

      $ which python
      /sw/software/Python/3.9.6-GCCcore-11.2.0/bin/python

      아하, Environment Module이 환경 변수를 변경하여 공유 스토리지에 위치한 Python을 실행한 것이네요.


      이번에는 아래와 같이 명령을 입력합니다.

      $ module purge
      $ module load Python/3.8.6-GCCcore-10.2.0
      $ python --version
      Python 3.8.6

      너무나도 손쉽게 Python 버전을 변경했습니다.


      이것이 Environment Module의 편리함입니다.

      내가 필요로 하는 소프트웨어를 직접 설치할 필요 없이, 간단한 명령 한 줄로 바로 실행 환경을 만들고 버전까지 손쉽게 전환할 수 있습니다.

      더불어 이는 무분별한 소프트웨어 설치를 방지하고 소프트웨어 스택을 체계적으로 관리하여 클러스터 운영 안정성을 높이는 기반 기술이기도 합니다.

      Enviroment Module은 1990년도에 Sun microsystems의 John L. Furlani가 개발한것으로 이후에 많은 컨트리뷰터들을 통해 발전해왔습니다.

      https://github.com/envmodules/modules

      Module이라는 용어는 본래 독립적으로 구성되고 조합 가능한 단위를 의미합니다. 즉, 소프트웨어 구성 요소를 개별적으로 교체하거나 결합할 수 있다는 점에서 모듈이라는 이름이 붙었습니다.

      초기 버전은 셸 스크립트 기반으로 시작했으며, 이후 Tcl 언어로 재작성되어 현재까지 유지되고 있습니다.

      최근에는 종속성 관리 기능을 강화한 Lmod(Lua 기반)가 널리 사용되고 있으며, 많은 HPC 환경에서 사실상 표준으로 자리 잡고 있습니다.


      4. HPC에서 컨테이너 사용하기

      4.1 왜 컨테이너 기술이 필요한가?

      HPC 환경에서 흔한 사용 불만 중 하나는 "어제는 되던 코드가 오늘은 안 된다"는 것입니다.

      수백 대의 노드마다 Python, CUDA, PyTorch 같은 라이브러리의 버전이 미묘하게 다르면, 대규모 분산 학습은 작은 불일치에도 쉽게 무너집니다.

      컨테이너는 이 문제를 해결하기 위해 등장했습니다.

      컨테이너는 실행에 필요한 사용자 공간(런타임, 라이브러리, 필요한 툴)을 이미지라는 하나의 덩어리로 묶어,

      어느 노드에서 실행하든 같은 환경을 정확하게 재현하도록 돕습니다.


      4.2 HPC 컨테이너는 무엇이 다른가?

      클라우드나 개인 개발 머신에서는 Docker가 컨테이너의 표준으로 널리 쓰입니다. 하지만 HPC에서는 보안과 성능상의 이유로 HPC에 특화된 컨테이너 기술을 많이 사용합니다.


      [ 그림3. Docker vs Singularity ]

      HPC는 다중 사용자 환경

      HPC 클러스터는 수십 또는 수백 명의 연구자나 개발자가 하나의 거대한 클러스터를 동시에 공유하는 환경입니다.

      따라서, 한 사용자의 실수나 악의적인 행위가 전체 클러스터의 안정성을 해치지 않도록 강력한 보안과 격리가 필수적입니다.

      문제는 Docker의 작동 방식입니다.

      Docker는 클러스터의 호스트 OS에서 루트 권한으로 실행되는 데몬 형태로 동작하며, 모든 컨테이너 실행 요청을 이 데몬이 처리합니다.

      이는 기본적으로 데몬과 통신하는 모든 사용자에게 잠재적으로 시스템의 루트 권한을 간접적으로 행사할 수 있는 경로를 열어주는 것과 같습니다.

      다중 사용자 HPC 환경에서 이는 곧 심각한 보안 취약점이 됩니다.

      만약 한 사용자가 루트 권한으로 실행된 컨테이너 내부에서 공유 스토리지(/home, /data 등)에 접근할 경우,

      다른 사용자의 파일에 접근하거나 시스템 설정을 변경하여 클러스터 전체의 안정성을 위협할 가능성이 생깁니다.


      그래서 HPC용 컨테이너 기술은 루트 권한 없이, 즉 사용자 권한(User Space)만으로 컨테이너를 실행할 수 있도록 설계되었습니다.

      이를 Rootless 실행이라고 부르며, 사용자 계정이 가진 권한 이상을 허용하지 않기 때문에 보안 위협을 방지 할 수 있습니다.

      성능과 오버헤드

      컨테이너의 본질은 프로세스를 다른 시스템 자원으로부터 격리하는 것입니다.

      일반적인 클라우드 환경에서 Docker는 가상 네트워크 인터페이스를 구성하거나 cgroup, namespace 같은 기술을 통해 장치 접근을 안전하게 격리합니다.

      하지만 HPC에서는 이 격리 방식이 성능의 발목을 잡을 수 있습니다.

      AI 모델 학습의 핵심은 GPU와 InfiniBand 또는 NVIDIA NVLink 같은 초저지연 고속 네트워크를 이용한 대규모 통신입니다.

      이러한 기술들은 커널 레벨에서 하드웨어 장치에 직접 접근해야만 그 최대 성능(거의 네이티브 속도)을 발휘할 수 있습니다.

      기존 Docker의 격리 방식은 여기서 통신 오버헤드나 접근 제한을 일으킬 수 있습니다.


      HPC 컨테이너는 이 문제를 피하기 위해 격리 보다는 통합 전략(Integration over isolation)을 채택합니다.

      커널과 하드웨어 드라이버는 호스트와 그대로 공유(통합)하고,오직 사용자 공간의 라이브러리와 애플리케이션만 이미지 안에서 격리하는 구조입니다.

      이러한 구조 덕분에 InfiniBand 등과 같은 초고속 네트워크를 호스트의 성능과 동일하게 손실 없이 사용할 수 있습니다.


      이러한 HPC 컨테이너 기술은 대표적으로 2가지가 있는데요,

      • Apptainer (구 singularity) : HPC에서 컨테이너 기술을 도입하여 사실상의 표준으로 사용되는 기술입니다.

        singularity로 많이 알려졌지만, 현재는 linux foundation에서 Appatiner라는 프로젝트로 관리되고 있습니다.

      • Enroot/Pysis : NVIDIA에서 개발한 기술로 특히 pyxis등을 통해 slurm과 긴밀한 통합이 되어 있습니다.

        특히 대규모 LLM 학습 환경등 NVIDIA GPU 중심의 클러스터에서 많이 사용됩니다.


      Module vs 컨테이너, 어떻게 선택할까?

      앞서 살펴본 Environment Module도 일관된 소프트웨어 실행 환경을 위해 제공되는 기술입니다.

      컨테이너 기술의 목적과도 일치하는데요 그렇다면 이 두 기술은 어떻게 다르고 무엇을 기준으로 선택하는게 좋을까요?

      구분

      Environment Module

      HPC 컨테이너

      원리

      환경 변수 동적 변경

      프로세스 격리 및 사용자 공간 패키징

      제어 범위

      소프트웨어 스택 (컴파일러, 라이브러리, 런타임 버전 등)

      완전한 운영체제 사용자 공간 (OS 버전, 패키지 관리자, 환경 변수, 라이브러리 전체)

      이점

      빠른 버전 전환 및 중앙 관리 용이성

      이식성 및 완전한 환경 격리 (재현성)

      사실 이 두 기술은 경쟁 관계라기보다 상호 보완적인 관계에 있습니다. 현장에서는 프로젝트의 요구사항에 따라 적절히 혼합하여 사용합니다.

      • Module이 적합한 경우 : 비교적 가볍고, Software Stack 호환성이 높은 경우. 클러스터 표준에 맞춰진 컴파일러나 공통 툴을 사용하며 버전만 빠르게 전환할 때 유리합니다.

      • 컨테이너가 적합한 경우 : 대규모 학습에서 GPU 및 InfiniBand와 같은 장치들의 드라이버와 라이브러리들의 호환성에 민감하여 환경의 완전한 격리와 재현이 필요할 때 유리합니다.


      마무리

      근래 회사에서 대형 프로젝트를 진행하고 있어서 이쪽에 시간을 쏟다 보니 추석 연휴 기간을 통해 오랜만에 포스팅을 올렸습니다.

      사실 4~5년 전만 해도 HPC는 전통적인 과학 연구 분야의 영역이었고, AI 개발자들에게는 다소 생소한 기술이었습니다.

      하지만 LLM의 등장과 함께 상황이 완전히 바뀌었습니다.

      수백억에서 수조 개의 파라미터를 가진 모델을 학습하려면 수백, 수천 개의 GPU를 단 한 순간도 낭비 없이 효율적으로 관리하고 조율해야 합니다.

      이런 대규모 자원 관리와 성능 최적화가 바로 HPC가 수십년간 다뤄온 핵심 과제였죠.

      AI 분야에서 HPC의 아키텍처와 기술들 - 스케줄러 기반의 자원 관리, 공유스토리지, 초고속 네트워크- 을 적극 채택하면서,

      값비싼 GPU 인프라를 효율적으로 활용하고, 성능을 극대화 할 수 있게 되었습니다.

      또한 AWS ParallelCluster, Azure CycleCloud와 같은 클라우드 벤더들의 관리형 서비스 덕분에

      이제는 복잡한 HPC 환경을 직접 구축하지 않아도 손쉽게 활용할 수 있게 되었습니다.

      과거에는 일부 전문가의 전유물이었던 HPC 기술을 이제는 우리 같은 개발자나 연구자도 손쉽게 경험하고 활용할 수 있는 시대가 열린 것입니다.


      다음 포스팅에서는 이렇게 중요해진 HPC의 핵심인 Slurm 스케줄러의 활용에 대해 좀 더 자세히 알아보려고 합니다.

      궁금한 점이나 좀 더 자세히 다뤄줬으면 하는 내용이 있다면 언제든 댓글로 알려주세요!

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      alankim 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기