소프트웨어 수치해석 마지막 수정: 2026-08-08 04:08:17

1. 개요[편집]

METIS
Serial Graph Partitioning and Fill-reducing Matrix Ordering
개발George Karypis, Vipin Kumar (미네소타대)
첫 공개1995년경 (현행 5.x)
핵심 기법다단계(multilevel) 그래프 분할
목적함수edge-cut 최소화 + 부하 균형 제약
주력 기능k-way 분할 · 메시 분할 · 중첩 분할 순서화
라이선스Apache 2.0 (5.2.0부터)
형제 프로젝트ParMETIS, hMETIS

코어 512개를 샀는데 한 코어만 죽어라 일하고 511개가 논다면, 그건 하드웨어 문제가 아니라 분할 문제다.

METIS미네소타대의 George Karypis와 Vipin Kumar가 만든 그래프·메시 분할 및 희소행렬 순서화 라이브러리로, 대규모 병렬 해석에서 계산 영역을 프로세스마다 나눠 주는 사실상의 표준 도구다. 격자 수백만 셀짜리 유한체적법 케이스를 128 랭크로 돌릴 때, “어느 셀이 어느 랭크로 가는가”를 결정하는 그 한 번의 호출이 대부분 METIS다.

분할 문제 자체는 NP-난해다. 정점 집합을 균형 있게 kk개로 나누면서 잘리는 간선 가중치 합을 최소화하는 문제는 k=2k=2에서도 이미 NP-완전이라, 최적해를 노리는 순간 게임이 끝난다. METIS의 존재 이유는 최적해가 아니라, 실무에서 쓸 만한 해를 그래프 크기에 거의 선형인 시간에 뽑아 준다는 것이다.1

2. 무엇을 최소화하는가[편집]

METIS가 푸는 표준 문제는 이렇다. 가중 그래프 G=(V,E)G=(V,E)를 서로소인 V1,,VkV_1,\dots,V_k로 나눌 때

min  cut(P)=(u,v)EP(u)P(v)w(u,v)s.t.maxiw(Vi)w(V)/k1+ε\min \; \mathrm{cut}(P) = \sum_{\substack{(u,v)\in E \\ P(u)\neq P(v)}} w(u,v) \quad \text{s.t.} \quad \max_i \frac{w(V_i)}{w(V)/k} \le 1+\varepsilon

정점 가중치는 셀당 계산량, 간선 가중치는 두 셀 사이에 오갈 데이터량에 대응시킨다. 불균형 허용치 ε\varepsilon은 API에서 ufactor로 준다(5.x에서 ufactor=30이면 1.03배까지 허용). 균형 제약을 조이면 cut이 나빠지고, 풀면 특정 랭크가 늦게 끝나 전체가 기다린다 — 이 트레이드오프를 다이얼 하나로 노출한 게 ufactor다.

그런데 edge-cut은 통신량의 대리지표일 뿐 통신량 그 자체가 아니다. 한 정점이 이웃 3개를 다른 파티션에 두고 있으면 잘린 간선은 3개지만, 실제로는 자기 값 하나를 3곳에 보내면 되므로 통신 볼륨은 1(×수신처 수)이다. 진짜 목적함수는 총 통신 볼륨 v(λ(v)1)\sum_v (\lambda(v)-1) — 정점 vv와 그 이웃이 걸친 서로 다른 파티션 수 λ(v)\lambda(v)로 세는 값 — 이거나, 더 현실적으로는 최대 랭크 통신량이다. 이걸 정확히 다루려면 그래프가 아니라 하이퍼그래프 분할이 필요하고, 그게 hMETIS·PaToH·Zoltan-PHG의 영역이다.2 다만 격자처럼 정점 차수가 낮고 균질한 그래프에서는 edge-cut과 통신량이 거의 비례해서, CFD/FEM 실무에서는 METIS로 충분한 경우가 압도적이다.

3. 다단계 기법 — 세 국면[편집]

METIS의 알고리즘 전부는 “큰 그래프에서 좋은 분할을 직접 찾지 말고, 작게 줄여서 찾은 다음 되돌리며 다듬자”는 한 문장으로 요약된다. 다중격자법이 저주파 오차를 조대 격자에서 잡는 것과 발상이 똑같다.

3.1. 1) 코스닝 (coarsening)[편집]

원 그래프에서 정점들을 짝지어(matching) 하나의 초정점으로 합친다. 합쳐진 간선 가중치는 더해지고, 정점 가중치도 더해진다. 기본 전략은 HEM(heavy edge matching) — 정점을 임의 순서로 방문하며, 아직 짝이 없는 이웃 중 가장 무거운 간선으로 연결된 쪽과 짝을 짓는다. 무거운 간선을 미리 초정점 내부로 삼켜 버리면 그 간선은 애초에 잘릴 수 없으므로, 조대 그래프의 cut 자체가 작아진다. 매칭 한 번에 정점 수는 대략 절반씩 줄고, 이 과정을 정점 수가 수백 개(보통 kk의 상수배) 수준이 될 때까지 반복해 그래프 계층 G0G1GmG_0 \to G_1 \to \cdots \to G_m을 쌓는다.

3.2. 2) 초기 분할 (initial partitioning)[편집]

최거친 그래프 GmG_m은 정점이 수백 개뿐이라 아무 방법이나 써도 싸다. METIS는 GGGP(greedy graph growing partitioning) 계열 — 임의 정점에서 시작해 이득이 가장 큰 이웃을 계속 흡수하며 절반을 채우는 방식 — 을 여러 무작위 시드로 반복하고 가장 좋은 것만 남긴다. 여기서 시드를 여러 개 굴리는 비용이 전체에서 무시할 수준이라는 게 다단계의 큰 이점이다.

3.3. 3) 비코스닝 + FM 정련 (uncoarsening + refinement)[편집]

초정점을 원래 정점들로 되돌리며 각 레벨에서 분할을 다듬는다. 다듬는 도구가 FM(Fiduccia–Mattheyses) 정련이다. 커니핸-린(KL)의 쌍 교환을 단일 정점 이동으로 바꾸고, 각 정점의 이득(gain, 옮겼을 때 줄어드는 cut) 값을 버킷 배열의 이중 연결 리스트에 담아 최대 이득 정점을 O(1)O(1)에 뽑는 자료구조가 핵심이다.

FM 패스의 성격은 이렇다.

  • 한 패스에서 각 정점은 최대 한 번만 이동하고, 이동한 정점은 잠긴다(lock). 무한 진동 방지.
  • 이득이 음수여도 일단 옮긴다. 지금 손해를 보고 넘어가야 국소최적을 탈출할 수 있다. 그리디만 하면 경계 하나 넘기고 끝난다.
  • 이동 시퀀스의 누적 이득이 최대가 되는 접두사를 기억해 두었다가, 패스가 끝나면 그 지점 이후 이동을 전부 롤백한다. 즉 패스 전체는 “탐색해 보고 제일 좋았던 지점으로 되감기”다.

METIS는 여기에 경계 정련(boundary refinement) 을 얹는다. 이득이 0이 아닐 수 있는 정점은 어차피 파티션 경계에 있는 것들뿐이므로, 경계 정점만 우선순위 큐에 넣는다. 이 최적화 덕에 정련 비용이 그래프 크기가 아니라 경계 크기에 비례하게 된다. 조대 레벨에서 이미 좋은 분할을 잡아 놨기 때문에, 세밀한 레벨에서는 국소 수선만 하면 되고 — 그래서 전체가 빠르다.

정점 996개 비구조 메시(노치와 구멍이 있어 최적 절단이 자명하지 않다)를 HEM 코스닝 → GGGP 초기분할 → 경계 FM 정련의 다단계 파이프라인으로 이분할한다. 오른쪽 계단 그래프의 세로 구간은 레벨 투영, 가로 구간은 그 레벨에서 FM 이 벌어들인 절단 감소분이다 — 가장 거친 레벨(|V|=45)에서 정점 하나를 옮기는 것만으로 절단이 66에서 58로 떨어지는 것이 코스닝을 하는 이유다. 같은 그래프·시드 30회에서 평면 FM 의 절단 중앙값 107.5 대 다단계 48 로 2.24배 벌어지고, 평면 FM 은 최선의 시드조차 다단계 중앙값보다 나쁘다. 불균형 허용치를 0 → 0.01 로만 풀어도 절단 중앙값이 64 → 51 로 떨어진다. 재귀 이분할 한 단계까지만 돌리며 METIS 의 k-way 정련·다중제약은 넣지 않았다.

4. k-way, 다중 제약, 그리고 순서화[편집]

kk개로 나누는 방법은 두 갈래다. 재귀 이분할(METIS_PartGraphRecursive)은 2분할을 log2k\log_2 k번 되풀이한다. 구현이 단순하지만 각 이분할이 자기 지역만 보므로 전역적으로 손해가 나고, 균형 제약도 층층이 곱해진다. 직접 k-way(METIS_PartGraphKway)는 최거친 그래프에서 바로 kk조각을 만들고 비코스닝 내내 k-way FM으로 다듬는다. 큰 kk에서 더 빠르고 대개 cut도 낫기 때문에 요즘 기본값은 이쪽이다.

다중 제약(multi-constraint) 분할은 정점에 가중치 벡터를 달아, 예컨대 “셀 수도 균형, 벽면 셀 수도 균형, 화학종 소스항 셀 수도 균형”을 동시에 맞춘다. 다물리 연성이나 적응 격자 세분화 후처럼 계산량 프로파일이 불균질한 문제에서 필수다.

메시는 그래프가 아니므로 변환이 필요하다. METIS_PartMeshDual은 셀을 정점, 면 공유를 간선으로 하는 쌍대 그래프를 만들고(FVM에 자연스럽다), METIS_PartMeshNodal은 절점 그래프를 만든다(유한요소법 쪽에서 쓴다).

그리고 METIS의 또 다른 주력은 분할이 아니라 순서화다. METIS_NodeND는 다단계 중첩 분할(nested dissection) 로 희소행렬의 채움 감소(fill-reducing) 순서를 만든다. 분리자(separator)를 찾아 행렬을 두 블록으로 가르고 분리자를 맨 뒤로 미는 것을 재귀적으로 반복하면, 촐레스키 분해·LU 분해의 채움이 극적으로 줄어든다. 3D 유한요소 행렬에서 AMD 같은 국소 휴리스틱보다 중첩 분할이 확실히 유리해서, 직접법 솔버(MUMPS, PARDISO, CHOLMOD 등)는 거의 다 METIS 순서화를 옵션으로 들고 있다. 사실 많은 사용자가 희소행렬 분해 때문에 METIS를 링크해 놓고도 자기가 METIS를 쓰는 줄 모른다.

5. 실무 접점과 대안[편집]

  • OpenFOAMdecomposeParDictmethodscotch, metis, kahip, hierarchical, simple 등이 있다. 기본 배포판이 Scotch를 들고 다니는 것은 과거 METIS 라이선스가 상용에 걸림돌이었기 때문인데, 5.2.0에서 Apache 2.0으로 바뀌면서 그 이유는 사라졌다.
  • 영역 분할법 — DDM의 조대 공간·부분영역 정의를 METIS 분할로 만든다. 슈바르츠 중첩은 분할 후 층을 넓혀 얻는다.
  • MPI 기반 솔버 — 분할 결과가 그대로 랭크별 소유 셀 목록과 halo 교환 패턴이 된다. 병렬 컴퓨팅에서 부하 분산의 출발점.
  • ParMETIS — METIS의 MPI 병렬판. 그래프 자체가 이미 분산돼 있어 직렬로 모을 수 없을 때, 그리고 AMR로 격자가 바뀐 뒤 적응형 재분할을 할 때 쓴다. 재분할은 목적함수가 다르다 — cut만 줄이면 되는 게 아니라 데이터를 옮기는 비용(migration cost) 까지 같이 재야 해서, ITR 파라미터로 둘의 상대 가중을 준다.
  • 대안 — Scotch/PT-Scotch(INRIA), KaHIP(카를스루에, 품질 지향), Zoltan(Sandia, 하이퍼그래프·공간충전곡선 포함), 원조 Chaco. 스펙트럴 분할(피들러 벡터 기반)은 품질이 좋지만 고유값 계산 비용 때문에 대형 문제에서는 다단계에 밀렸다.3

실무 팁 하나. 분할 품질을 cut 숫자만 보고 판단하지 말 것. 랭크별 셀 수, 랭크별 경계면 수, 이웃 랭크 개수를 같이 봐야 한다. cut이 같아도 이웃이 4개인 분할과 30개인 분할은 실제 스케일링이 전혀 다르다.4

6. 관련 문서[편집]

7. Footnotes[편집]

  1. 다단계 분할의 총 비용은 코스닝·초기분할·정련을 다 합쳐도 대략 O(V+E)O(|V|+|E|) 수준이다. 백만 셀 격자를 수백 개로 쪼개는 데 몇 초면 끝나는 이유. 그 몇 초를 아끼겠다고 균등 인덱스 분할(simple)을 쓰면, 이후 며칠간 halo 통신으로 갚게 된다.

  2. 그래프에서는 간선이 정점 두 개를 잇지만 하이퍼그래프에서는 하나의 하이퍼에지가 임의 개수의 정점을 묶는다. “이 셀의 값이 필요한 모든 랭크”를 하이퍼에지 하나로 표현할 수 있어서 통신 볼륨을 정확히 센다. 정확한 대신 비싸다 — 세상은 공평하다.

  3. 스펙트럴 분할은 라플라시안의 두 번째로 작은 고유벡터(피들러 벡터) 부호로 자르는 우아한 방법이지만, 다단계 FM이 등장하자 “느린데 더 좋지도 않다”는 평가를 받으며 주류에서 밀려났다. 우아함은 논문에서만 통용되는 화폐다.

  4. METIS는 이웃 랭크 수(neighbor degree)를 직접 최소화하지 않는다. 지연시간(latency)이 대역폭보다 아픈 인터커넥트에서는 이게 실제 병목이 되기도 해서, 계층적 분할(노드 내부 먼저, 노드 간 나중)로 우회하는 게 정석이다.