M4 맥 미니를 위한 OpenGL ES 3.0 리눅스 GPU 드라이버를 한 달 만에 구축하기

TL;DR

코디 후와 니클라스는 약 한 달 만에 M4 맥 미니와 맥북 뉴를 위한 작동 가능한 OpenGL ES 3.0 리눅스 드라이버를 구축했으며, 이는 대규모 언어 모델을 활용한 역공학이 수년에 걸친 수동 작업을 대체할 수 있음을 입증한다.


프로젝트 개요

  • 목표: 애플 실리콘 GPU(M4, A18 Pro, M5)용으로 호환성 있는 OpenGL ES 3.0 드라이버(향후 Vulkan)를 리눅스에서 구현.
  • 일정: 일반적으로 수년이 걸리는 새로운 GPU 드라이버 개발보다 훨씬 짧은 약 4주간의 집중 작업.
  • 주요 성과: 크롬/파이어폭스 WebGL 데모 실행, 마인크래프트는 200fps까지 도달하며, 완전한 리눅스 커널 드라이버와 사용자 공간 스택을 제작함.
  • 방법론: 하이퍼바이저를 사용해 하드웨어 추적을 캡처하고, LLM(Codex, GPT-5.6 Sol, GPT-6 Astra)을 활용해 ABI 탐색, 코드 생성, 체계적인 디버깅을 수행하는 클린룸 역공학.

펌웨어 ABI 역공학 (커널 공간)

  • 애플의 모델: GPU는 직접 하드웨어 레지스터 대신 공유 메모리 ABI를 노출하는 커스텀 RTOS(RTKit)를 실행.
  • 복잡성: A18 Pro ABI는 M1/M2 ABI보다 구조체 수가 약 1.5배, 포인터 수가 두 배에 달해 해독하기 훨씬 더 어렵다.
  • 접근 방식:
    1. 실시간 탐색: 하이퍼바이저를 사용해 macOS GPU 활동을 관찰하고, 펌웨어 시작 후 첫 번째 "킥" 직후 GPU 메모리 상태 전체를 캡처.
    2. 재생 및 축소: 반복적으로 캡처된 상태를 최소한의 필수 데이터만 남기도록 줄여, LLM이 구조체 레이아웃을 추론하도록 유도.
    3. 대상 캡처: 컴퓨팅 작업을 위해 싱글 유저 모드로 부팅하고, 작은 Metal 컴퓨팅 프로그램을 조기에 실행한 후 추적을 캡처.
    4. 부분 렌더링: TVB(Tiled Vertex Buffer) 오버플로우를 유도하는 합성 워크로드를 생성한 후 재생하고, 저장 및 재개 프로토콜을 학습.
  • 결과: AGX 펌웨어 ABI에 대한 완전한 설명을 agx-re 저장소에 공개하여 RTKit와 통신하는 리눅스 커널 드라이버를 가능하게 했다.

리눅스 커널 드라이버 구축

  • 프로토타입에서 생산형으로: Python 프로토타입을 drm-shim 설계를 따르며 3일 만에 루스트로 재작성.
  • 핵심 단계:
    1. 동기 드라이버를 위해 drm-shim을 루스트로 포트.
    2. GPU 제출은 동기로 유지하면서 프론트엔드를 비동기로 전환.
    3. 펌웨어 알림과 연결된 이벤트 기반의 펜스로 폴링을 대체.
    4. 배치 제출과 같은 저수준 최적화 추가.
  • LLM의 역할: Codex가 대부분의 루스트 스크래핑을 생성하고, 하이퍼바이저 스냅샷을 적극적으로 활용해 불일치를 디버깅하여 개발 속도를 극적으로 향상시켰다.

사용자 공간 스택 (Mesa 통합)

  • 하드웨어 vs Mesa 우선: 두 가지 전략을 탐색:
    • 하드웨어 우선 (코디): 지시어 의미를 철저히 역공학한 후, LLM이 구현할 수 있는 사양을 작성.
    • Mesa 우선 (니클라스): Mesa 드라이버를 점진적으로 구축하고, 누락된 기능이 필요할 때만 역공학을 활용.
  • 결과: 니클라스의 Mesa 우선 접근 방식이 더 빠르게 진행되었으며, LLM이 구체적인 드라이버 목표에 집중할 수 있도록 했다.
  • 핵심 구성 요소:
    • IR/셰이더 컴파일러: Mesa의 NIR에서 AGX ISA로의 커스텀 컴파일러로, Vulkan에도 재사용 가능.
    • 명령 스트림 빌더: 펌웨어가 소비하는 버퍼를 구성.
    • 기능 탐지: 문서화되지 않은 하드웨어 기능을 발견, 예: 64비트 덧셈, 128× 이방향성, 새로운 행렬 유닛 모드, uniform_mov용 7비트 즉시값.
  • 호환성: OpenGL ES 3.0 CTS는 선택적 확장만 누락하고 통과.

제공물


남은 작업 및 업스트림화 도전 과제

  • 기능 로드맵: Vulkan 1.4, OpenGL 4.6, OpenGL ES 3.2, OpenCL 3.1, Direct3D 12(Proton을 통해), 레이 트레이싱.
  • 업스트림 장벽: Asahi Linux 프로젝트는 엄격한 AI 사용 금지 정책을 시행 중이며, M1/M2 드라이버가 아직 업스트림되지 않았기 때문에 M4 드라이버도 그 전례를 기다려야 함.
  • 법적 및 커뮤니티 우려: 일부 댓글은 LLM이 기밀 바이너리로 훈련되었을 경우 클린룸 역공학의 합법성에 의문을 제기하며, 저자의 전 애플 근무 경력도 언급.
  • 인간 검토 필요: 업스트림 제출 전에 광범위한 테스트, 코드 리뷰 및 리팩터링이 필요.

커뮤니티 반응 (허커 뉴스 요약)

"그들이 이렇게 빠르게 작동 가능한 드라이버를 만들었다는 점이 매우 인상적입니다. 저는 이것이 LLM의 가장 좋은 활용 사례 중 하나라고 생각합니다." – ndiddy

"이 모든 작업은 게시자가 전 애플 직원이기 때문에 흠이 있습니다. 리눅스는 그 코드를 받아들일 수 없습니다..." – thrwy19940314

"Asahi Linux의 가장 큰 고통은 M3 이상에서 GPU 가속이 부족한 것입니다. Asahi의 AI 금지 정책 때문에 이 작업은 업스트림화될 수 없습니다." – porphyra

"누군가가 걱정된다면, 이제 화이트박스로 이 작업을 재구현할 수 있습니다." – getcrunk

"이전에 드라이버 개발자가 아니었던 사람이 몇 주 만에 이런 성과를 이룬다는 사실은 순전히 놀라움입니다. 법적 문제는 리눅스 재단 변호사들이 해결하도록 하세요." – SXX


배운 교훈

  1. LLM 기반 역공학은 작동한다: 대규모 언어 모델은 캡처된 GPU 상태를 자율적으로 재생하고, 구조체 레이아웃을 추론하며 드라이버 코드를 생성할 수 있어 역공학 주기를 극적으로 단축시킨다.
  2. 조기 캡처, 최소화 유지: 가장 신뢰할 수 있는 캡처는 펌웨어 시작 직후에 이루어지며, 최소한의 워크로드(예: 작은 컴퓨팅 커널)만 포함해야 한다.
  3. 작업 우선순위가 중요하다: 더 어려운 작업(부분 렌더링)보다 간단한 기능(컴퓨팅)부터 LLM에 지시하면 전반적인 진행 속도가 빨라진다.
  4. 클린룸 규율: 팀은 애플 바이너리를 피하고, 필요한 블롭은 투명한 것으로 간주하며 모든 추적을 공개하여 검증 가능한 클린룸 프로세스를 유지했다.
  5. 커뮤니티 정책이 채택에 영향을 준다: 엄격한 AI 반대 정책을 가진 프로젝트(예: Asahi Linux)는 LLM 생성 코드를 거부할 수 있어 기술적 우수성에도 불구하고 업스트림 가능성이 제한된다.

미래 방향성

  • 더 넓은 하드웨어 지원: 동일한 방법론을 M5 및 향후 애플 실리콘 세대에 적용; 사용자 공간 코드는 대부분 호환 가능해 보임.
  • Vulkan 프론트엔드: 기존의 NIR-to-AGX 컴파일러를 활용해 Vulkan 드라이버를 구현하여 리눅스에서 최신 그래픽 API를 가능하게 함.
  • 머신러닝 워크로드: PyTorch 또는 Metal Performance Shaders와의 통합을 조사해 GPU를 AI 워크로드에 노출.
  • 오픈소스 거버넌스: 리눅스 재단 및 Asahi 유지보수자들과 협력해 LLM 지원 드라이버 기여에 대한 정책 수립.

이 기사는 코디 후의 블로그 포스트 "I Came, I Prompted, I Left Part 2: Building a GPU Driver From Scratch in One Month"과 허커 뉴스에서 최고의 추천을 받은 댓글을 기반으로 작성되었습니다.

Sources

관련

  • Dispatch
  • Dispatch
  • Dispatch
  • Dispatch
  • 프로젝트