• 비-엔비디아 GPU에 CUDA를 도입하려는 프로젝트가 상당한 진전을 이루고 있습니다. ZLUDA 업데이트는 현재 전일제 개발자 두 명을 확보했으며, 이들은 32비트 PhysX 지원 및 LLM 등 다양한 작업을 진행

    32비트 PhysX를 재도입합니다.

    article image

    작년 거의 폐쇄될 뻔했으나 미상의 주체에 의해 지켜진 CUDA 트랜슬레이션 레이어 ZLUDA가 지난 분기 동안의 꾸준한 기술적 진전과 팀 확장에 대한 업데이트를 이번 주 Phoronix를 통해 공개했습니다. 이 프로젝트는 비(non)-Nvidia GPU에서 CUDA 워크로드를 구동할 수 있는 역량을 지속적으로 구축하고 있으며, 현재 다른 작업보다는 인공지능(AI) 영역에 주력하고 있습니다. 그럼에도 불구하고, 구형 CUDA 기반 게임과의 호환성에 필수적인 32비트 PhysX 지원 기능 활성화 작업도 착수되었습니다.

    ZLUDA 프로젝트의 가장 주목할 만한 부분은 개발팀이 1명에서 풀타임 개발자 2명으로 성장했다는 점입니다. 업데이트에 따르면, 두 번째 개발자인 Violet은 한 달도 채 되지 않아 합류했으며, 이미 중요한 개선 사항들을 제공했습니다. 특히 llm.c 프로젝트를 통해 대규모 언어 모델(LLM) 워크로드 지원을 진전시킨 것이 주요 성과입니다.

    32비트 PhysX 지원

    커뮤니티 기여자 @Groowy가 상세한 CUDA 로그를 수집하며 ZLUDA에서 32비트 PhysX 지원을 가능하게 하는 초기 작업을 시작했고, 이 과정에서 여러 버그가 빠르게 발견되었습니다. 이 문제들 중 일부는 64비트 CUDA 기능에도 영향을 미칠 수 있었기 때문에, 해당 수정 작업이 공식 로드맵에 추가되었습니다. 다만, 완벽한 32비트 PhysX 지원을 완료하기 위해서는 여전히 오픈 소스 기여자들의 추가적인 도움이 필요합니다.

    LLM.c와의 호환성

    ZLUDA 개발팀은 llm.c라는 테스트 프로젝트를 진행하고 있습니다. 이는 CUDA를 활용하여 GPT-2 모델을 구동하려는 간단한 예제 프로그램입니다. 비록 이 테스트 규모가 크지는 않지만, ZLUDA가 일반 CUDA 기능과 cuBLAS(빠른 수학 연산) 같은 특수 라이브러리 두 가지를 모두 처리하려 시도했다는 점에서 매우 중요합니다.

    이 테스트 프로그램은 44개의 다른 API에 걸쳐 총 8,186개의 독립적인 CUDA 함수 호출을 수행합니다. 초기에는 ZLUDA가 첫 호출에서 바로 충돌하는 문제가 있었습니다. 하지만 Violet이 기여한 다수의 업데이트 덕분에, 이제는 실패하기 전 552번째 호출까지 도달하는 것이 가능해졌습니다. 팀이 필요한 44개 함수 중 이미 16개에 대한 지원을 완료함에 따라, 테스트 전체를 성공적으로 실행하는 것에 점차 가까워지고 있습니다. 이 부분이 성공적으로 구현되면, 향후 ZLUDA가 PyTorch와 같은 대규모 소프트웨어 생태계를 지원하는 데 큰 도움이 될 것입니다.

    ZLUDA의 정확성 향상

    ZLUDA의 핵심 목표는 표준 CUDA 프로그램이 Nvidia 하드웨어의 동작을 최대한 정확하게 재현하면서 비-Nvidia GPU에서 구동되는 것입니다. 이는 각 명령어가 마지막 비트 단위까지 동일한 결과를 내거나, Nvidia 하드웨어 대비 엄격한 수치적 오차 범위 내에 존재해야 함을 의미합니다. 대규모 코드 재설정(reset) 이전의 ZLUDA 구 버전들은 특정 명령어 수정자(modifier)를 생략하거나 완전한 정밀도를 유지하지 못하면서 정확성을 희생하는 경우가 많았습니다.

    현재 구현체는 이 문제를 해결하는 데 상당한 진전을 이루었습니다. 정확성을 보장하기 위해, Nvidia의 중간 GPU 언어를 이용한 체계적인 검사인 PTX '스윕(sweep)' 테스트가 실행되는데, 이는 모든 명령어와 수정자 조합이 모든 입력에서 올바른 결과를 도출하는지 확인하는 방법으로 이전에 사용되지 않은 방식입니다. 이러한 검사를 거치면서 여러 컴파일러 결함이 발견되었고, 이에 대한 수정이 이루어졌습니다. ZLUDA 측은 모든 명령어가 아직 이러한 엄격한 검증을 완료하지는 못했다고 인정하면서도, cvt 명령어처럼 가장 복잡한 일부 사례는 현재 비트 단위의 정확성이 확인되었음을 강조했습니다.

    로깅 기능 개선

    게임, 3D 애플리케이션, ML 프레임워크 등 CUDA 기반 소프트웨어를 ZLUDA에서 구동하는 전제 조건은, 해당 프로그램이 CUDA와 어떻게 상호 작용하는지에 대한 상세 로그를 확보하는 것입니다. 여기에는 직접적인 API 호출뿐만 아니라 CUDA 런타임(또는 드라이버)의 문서화되지 않은 부분, 그리고 특수 성능 라이브러리 사용 추적 등 모든 활동이 포함됩니다.

    최근 업데이트를 통해 ZLUDA의 로깅 시스템이 대폭 업그레이드되었습니다. 새로운 구현은 이전에 파악할 수 없었던 더 광범위한 활동 범위를 포착하며, cuBLAS가 cuBLASLt에 의존하는 경우나 cuDNN이 하위 레벨 드라이버 API와 상호 작용하는 경우와 같은 내부 동작에 대한 상세 추적 정보까지 포함합니다.

    런타임 컴파일러 호환성

    CUDA, ROCm/HIP, ZLUDA, OpenCL 같은 최신 GPU 프레임워크는 구형 GPU 프로그램이 원본 코드 변경 없이 신규 하드웨어 세대에서도 여전히 빌드 및 실행될 수 있도록, 애플리케이션 구동 중에 장치 코드를 동적으로 컴파일해야 합니다.

    AMD의 ROCm/HIP 생태계에서 이러한 온더플라이(on-the-fly) 컴파일은 comgr 라이브러리(ROCm-CompilerSupport의 약자)에 의존합니다. 이 라이브러리는 컴파일, 링크, 디스어셈블과 같은 작업을 처리할 수 있는 포괄적인 기능을 갖춘 소형 라이브러리이며, Linux와 Windows 모두에서 사용 가능합니다.

    ROCm/HIP 버전 6.4에서는 중요한 애플리케이션 바이너리 인터페이스(ABI) 변경이 있었습니다. 이로 인해 호환성 문제가 발생했습니다. 라이브러리에서 이러한 문제가 보고되었습니다.

    [출처:] https://www.tomshardware.com/software/a-project-to-bring-cuda-to-non-nvidia-gpus-is-making-major-progress-zluda-update-now-has-two-full-time-developers-working-on-32-bit-physx-support-and-llms-amongst-other-things