LLVM/MLIR Meet-up Recap


full

지난 8월 27일, ML2에서 LLVM과 관련 프로젝트에 관심 있는 분들과 함께하는 작은 밋업을 개최했습니다.
기술적인 인사이트를 나누고 교류하기 위해 마련한 자리였는데, 굉장히 알차고 의미 있는 시간이었습니다.

밋업은 피맥과 함께하는 네트워킹으로 시작해, 총 6분의 Lightning Talk이 이어졌습니다.
평일 저녁 시간임에도 불구하고 많은 분들이 참석해 주셔서 더욱 풍성하고 유익한 자리가 되었는데요.
앞으로 LLVM 한국 커뮤니티가 더욱 성장하기를 기대하며, 그날의 즐거운 순간들을 간단히 공유하고자 합니다.

Lightning Talk 세션

full

이번 밋업에서는 다양한 주제의 발표가 이어졌습니다.
각 발표 자료는 LLVM Discord의 Korea채널 에서 확인하실 수 있습니다.

1. 실제 LLM 모델로 IREE 프로젝트 벤치마크 실험하기 – 엄의섭 님

eighty

IREE는 MLIR 기반의 컴파일러 + 런타임 스택으로, Torch/ONNX/StableHLO 등 다양한 프론트엔드에서 가져온 모델을 여러 벤더사의 CPU⋅GPU (CUDA/ROCm/Metal/WebGP) 에서 돌아갈 수 있도록 하는 이식성(portability)을 강점으로 갖고 있습니다. 최근 딥러닝 응용이 폭발적으로 늘면서 이를 구동하는 하드웨어 역시 빠르게 다변화 되고 있는데, IREE는 이런 벡엔드 확장 국면에서 커뮤니티와 생태계 전반에 퍼지고 있는 ‘컴파일러 파편화’를 완화하려는 시도이기도 합니다.

발표에서는 IREE 프로젝트에 대한 간략한 소개와 함께 현재 진행 중인 IREE를 이용한 언어모델 추론 벤치마크 실험에 대해서 소개해 주셨습니다. IREE 프로젝트는 현재 활발히 개발 중인 프로젝트이기는 하지만 아직 개선할 여지가 많은 프로젝트로서, 튜토리얼 상의 단순한 오류부터 canonicalization, fusion, tiling/looping 과 같은 행렬 연산 최적화까지 기여할 수 있는 지점이 많은 프로젝트였습니다.

의섭님께서는 현재 진행중이신 실험 결과들을 토대로 LLVM US Developer’s Meeting에서 Quick Talks로 발표 예정이십니다. 이번 작업을 통해 “IREE 프로젝트가 현재 어디까지 왔고, 무엇을 개선하면 실제 서비스 워크로드에서 더 빨라질 수 있는지”를 구체적으로 보여주는 의미 있는 작업이 될 전망입니다.

2. 이슈 정글에서 길 찾기 – 최종명 님

eighty

LLVM은 수많은 하위 프로젝트를 포함한 대표적인 오픈소스 프로젝트로, 꾸준하고 활발한 업데이트가 이루어지고 있으며 GitHub 이슈만 해도 수만 건에 달합니다. 하지만 이슈의 난이도를 가늠하기 어렵고, 오래된 이슈와 최근 활발히 논의되는 이슈를 구분하기 힘들다는 점에서 기여의 우선순위를 정하기가 쉽지 않습니다. 이 때문에 LLVM에 기여하고 싶어도 어디서부터 시작해야 할지 막막할 수 있습니다.

발표에서는 초보 기여자들이 어떻게 ‘적합한 첫 기여’를 찾고 참여할 수 있는지 경험담을 공유해 주셨습니다
우선 Github 이슈 수집기를 이용해 조건에 맞는 이슈를 필터링하는 방법을 소개했습니다. ‘good first issue’, ‘help wanted’, ‘documentation’과 같은 레이블을 적용하고, 최근 60일 이내 업데이트·댓글 여부를 기준으로 활성화된 이슈를 선별하는 것을 추천하셨습니다.

이렇게 필터링된 결과는 기여하기 좋은 이슈 기준과 이슈 리스트를 포함한 프롬프트로 생성되며, 이를 Google AI Studio에 입력하면 적합한 기여 이슈나 도전해볼 만한 이슈가 표 형태로 정리됩니다.
이 과정을 통해 실제 문제를 탐색하고 해결하는 과정에서 학습과 경험을 동시에 쌓을 수 있으며, 자연스럽게 오픈소스 기여로 이어질 수 있습니다.

3. Nadya: On-Device AI PL with MLIR – 김재호 님

eighty

ENERZAi에서는 다양한 하드웨어와 on-Device 환경에서의 AI 모델 추론 최적화를 목표로 하고 있습니다. 이를 위해 에너자이에서 자체 개발한 AI 모델 최적화 언어 ‘Nadya’와 MLIR 기반의 'Nadya 컴파일러'에 대해 소개해 주셨습니다

Nadya는 하드웨어 최적화를 지향하는 메타프로그래밍 언어로, 특정 장치에 맞는 코드를 효과적으로 생성(Device-Aware Code Generation)하는 것을 목표로 합니다.특히 Nadya는 다양한 종류의 하드웨어 특성을 내부적으로 인식해 최적화된 계산을 자동으로 선택할 수 있습니다.
Nadya 컴파일러는 이러한 과정을 자동화해 대상 하드웨어에 최적화된 코드를 손쉽게 얻을 수 있도록 지원합니다. 그 결과, 대표적인 추론 엔진인 XNNPACK 대비 최소 1.11배에서 최대 21.09배에 달하는 추론 속도 향상을 달성했다고 합니다.

아울러 ENERZAi의 AI 추론 최적화 엔진 'Optimium'의 GPU 지원을 위한 컴파일 패스를 구현하는 과정에서, MLIR의 conversion pass를 개선하여 LLVM에 직접 기여하신 경험도 공유해 주셨습니다.이처럼 자체 기술 개발을 넘어 오픈소스 생태계에도 기여하고 있다는 점이 인상 깊었습니다.

4. What’s a φ (phi) node, and why MLIR doesn’t need it – 정민우 님

eighty

컴파일러가 코드를 최적화 하는 과정에는 SSA(Static Single Assignment)라는 규칙이 있습니다. 모든 변수는 단 한번만 선언되어야 한다는 원칙입니다. 하지만 간단한 반복문만 하더라도, 반복문 안에서 변수의 값이 계속 바뀌기 때문에 SSA를 지키기 어려워 집니다.

컴파일러는 이 문제를 해결하기 위해 Phi(φ) 노드 라는 특별한 개념을 사용합니다.
Phi노드는 프로그램의 흐름이 합쳐지는 지점에서 어떤 경로에서 온 값 중 무엇을 선택할지를 알려주는 역할을 합니다. 하지만 Phi노드는 몇가지 단점을 가지고 있습니다. 항상 코드 블록 맨 위에 위치해야하고, 모든 파이 노드는 동시에 실행되는 것처럼 작동하여 오용하기 쉽고, 코드 블록으로 들어오는 경로가 많아질 수록 Phi노드가 길어져 스캔 비용이 증가합니다.

MLIR에서는 이러한 Phi노드 사용의 문제점을 ‘Block Arguments’를 사용함으로써 해결했습니다.
Phi노드 대신, 코드 블록을 함수처럼 취급하는 것인데요, 다른 코드 블록으로 이동할때 필요한 값들을 함수의 인자처럼 명시적으로 전달하는 방식을 사용합니다.
덕분에 특별한 위치 제약이 없고, 값이 어떻게 전달되는지 명확해 졌으며, 인자는 한 번만 선언되므로 길게 작성해야 할 필요도 없어졌습니다. 복잡하고 오용하기 쉬웠던 Phi노드가 MLIR에서는 Block Arguments라는 더 직관적이고 효율적인 방법으로 발전했음을 확인할 수 있었습니다.

5. uftrace Function Tracing Tool for Clang/LLVM – 김홍규 님

eighty


오픈소스 프로젝트 uftrace 의 주요 컨트리뷰이신 김홍규님께서 직접 uftrace에 대해 소개해 주셨습니다.

uftrace는 C, C++, Rust, Python으로 작성된 프로그램을 함수 단위로 성능을 측정하고 실행흐름을 추적할 수 있는 분석 도구입니다. 기존의 컴파일러 옵션을 활용하여 코드 수정 없이도 프로젝트 내부 동작을 분석하고 디버깅할 수 있습니다. 또한 실행 중인 함수 호출을 기록하고 이를 시간 순서대로 분석할 수 있도록 시각화 기능도 제공하고 있습니다.

함수 진입 및 종료 시점, 호출 계층 구조, 실행 시간 등의 정보를 제공하며, 커널과 사용자 공간 모두를 아우르는 점이 큰 장점입니다. 이러한 특성 덕분에 복잡한 소프트웨어 시스템의 성능 병목 지점을 파악하는 데 매우 효과적입니다.

uftrace 프로젝트는 국내외 다수 컨퍼런스에서도 소개되어 사용자층을 넓혀가고 있을 뿐 아니라, 꾸준한 멘토링 활동으로 컨트리뷰터를 양성하고 있습니다. 유용한 툴을 넘어 오픈소스 생태계가 어떻게 성장하고 건강하게 확산될 수 있는지 배울 수 있는 소중한 발표였습니다.

6. 난독화와 검증 – 이영준 님

eighty

NSHC 모바일 보안을 위해 LLVM을 활용하고 있습니다. 다양한 난독화 기법과 이를 LLVM 기반에서 어떻게 구현하고 검증할 수 있는지 설명해 주셨습니다.

난독화는 마치 복잡한 미로를 만들듯, 공격자의 분석 비용과 시간을 크게 늘려 실질적인 방어 효과를 얻는 방법입니다. 발표에서는 대표적인 난독화 기법 3가지를 소개해 주셨는데요, 실행되지 않는 경로를 삽입하는 Bogus Control FLow, 제어 흐름을 평면화하여 원래 구조를 숨기는 Control Flow Flattening, 그리고 단순 연산을 복잡한 형태로 치환하는 Instruction Substitution이 그것입니다.

하지만 난독화에서 보안 효과만큼 중요한 것이 바로 정확한 동작 보장입니다. 난독화 과정이 프로그램의 본래 기능을 해치지 않는지 반드시 검증해야 합니다. 이를 위해 LLVM 커뮤니티에서 널리 사용되는 오픈소스 검증 도구가 바로 Alive2입니다.
Alive2는 SMT(Satisfiability Modulo Theories) Solver를 기반으로 동작합니다. LLVM IR 코드를 수학적으로 인코딩하여 의미적 동등성을 증명하고, 반례가 존재하는지 확인할 수 있습니다.
예를 들어, “두 함수의 결과가 다른 경우가 하나라도 있을까?”라는 질문을 던지면, Alive2는 SAT라면 “있어, 이런 경우야”라고 구체적인 반례를 제시하고, UNSAT라면 “없어, 두 함수는 항상 같아”라고 답해줍니다. 이를 통해 난독화가 보안성을 강화하면서도 코드의 기능적 안정성을 유지한다는 것을 확인할 수 있습니다.

퀴즈와 경품 이벤트

밋업의 마지막은 간단한 퀴즈와 경품 증정으로 마무리했습니다. 포스팅을 읽으시는 분들도 함께 풀어보시면 재미있을 것 같습니다 : )
정답은 블로그 맨 마지막에 추가했습니다.

  • 문제 1) LLVM 로고는 어떤 신화 속 동물을 모티프로 만들어졌을까요?
  • 문제 2) MLIR은 몇 년도에 공개되었을까요?

마치며

좋은 분들과 함께한 즐거운 시간이었고, 앞으로 정기적인 LLVM/MLIR 밋업으로 이어져 더 많은 교류와 협력이 이루어지길 바랍니다.
ML2는 앞으로도 커뮤니티와 함께 성장할 수 있는 자리를 꾸준히 만들어 나가겠습니다.

full


마지막으로 퀴즈의 정답을 공개합니다 :

  • 정답 1) 와이번 (Wyvern)
  • 정답 2) 2019년
cc
members

박찬연

Chan. Y. PARK

Principal Research Scientist

github   github
members

이진명

Jinmyoung LEE

Research Engineer

github   github
members

엄의섭

Uiseop EOM

Research Resident

github   github