TL;DR
- Vx는 CPU, GPU, NPU와 가속기 메모리를 타입 시스템에 포함해 이기종 컴퓨팅을 다루며, 잘못된 메모리 접근과 배치 등을 런타임이 아닌 컴파일 단계에서 검사하는 시스템 프로그래밍 언어임.
- 데이터가 위치한 메모리 공간을 타입에 명시하고, 공간 간 이동은 하드웨어 경계가 없어도 명시적
transfer()로 표현함. - 주소 공간, 용량, 비동기 전송, 선형 타입, 토폴로지 연결 가능성, 자동 미분 규칙과 관련된 오류를 컴파일 단계에서 차단함.
- 실제 하드웨어의 메모리 계층과 연결 구조를 기술한 머신 파일을 바탕으로 배치 가능성을 검사하며, H100·H200·B200·A100·MI300X·Apple M4와 멀티 GPU 노드 정보를 제공함.
- 프런트엔드는 병렬 컴파일에서도 바이트 단위로 동일한 MLIR을 생성하며, CPU·NVIDIA GPU·Apple AMX/ANE·분산 백엔드를 지원함.
시작하기
- 설치 명령은
curl -fsSL https://vxlang.org/install.sh | sh이며, Apple Silicon 기반 macOS와 Linux x86_64를 대상으로 함. - 매니페스토, GitHub 소스, 기타 설치 방법을 제공함.
이기종 컴퓨팅은 런타임이 아닌 타입 시스템에 속함
데이터 위치는 타입의 일부임
- 많은 언어는 가속기를 기반 시설로 취급해 개발자가 수학 연산을 작성하면 불투명한 런타임이 데이터 전송을 결정함. Vx는 가속기 위치를 언어 의미론에 포함함.
- NPU 고대역폭 메모리에 고정된 텐서는 호스트 DRAM에 있는 텐서와 다른 타입이며, 두 공간 사이의 이동은 명시적인
transfer()를 거침. - Apple 통합 메모리에서는 해당 전송이 거의 아무 동작도 하지 않는 코드로 컴파일되지만, 데이터 지역성을 바이너리 프로파일링이 아니라 소스 코드만 읽어 증명할 수 있도록 전송을 명시함.
- 예시 행렬 곱셈 함수는 NPU 메모리에 이미 상주하는 두 행렬을 입력으로 받고,
spawn on(Topology::NPU[0])을 통해 계산을 가속기에 전달한 뒤 NPU 고대역폭 메모리의 결과를 검증된 값으로 반환함.
컴파일러가 배제하는 오류
- Vx는 보통 런타임 충돌, 조용한 데이터 손상 또는 학습 1200단계에서 발생하는 메모리 부족으로 드러나는 오류 유형을 타입 검사 단계로 앞당김.
- 주소 공간 타입 검사: 호스트에서 디바이스 포인터를 역참조하거나
Pinned<T, NPU_SRAM>이 호스트 표현식으로 빠져나가는 경우를 검사함. - 용량 적합성 검사: 대상 메모리 공간의 용량에 작업 집합이 들어가지 않는 배치를 바이너리 생성 전에 선언된 머신 사양과 대조해 검사함.
- 경계 계약 검사: 비동기 전송 결과가 가시화되기 전에 버퍼를 읽는 일을 SMT 증명기가 처리함.
- 선형 타입: 소비된 버퍼의 이동 후 사용을 검사하며, 분산 및 영역 추적 기능을 갖춘 빌림 검사기도 제공함.
- 토폴로지 도달 가능성 검사: 선언된 경로가 없는 두 메모리 공간 사이의 전송을 검사함.
- 자동 미분 검사: 수반 연산이 정의되지 않은 영역을 미분하는 일을 검사함.
머신을 가정하지 않고 선언함
- 많은 컴파일러는 비용 모델을 코드에 고정하지만, Vx는 실제 하드웨어의 메모리 계층과 상호 연결 구조를 기술하는 머신 파일을 읽고 해당 정보를 바탕으로 배치를 허용하거나 거부함.
- 단위는 부동소수점이 아닌 정확한 정수 변환을 사용함. SI 접두사는 십진수(GB = 10⁹), IEC 접두사는 이진수(GiB = 2³⁰)이며, 제조사 사양서의 수치는 사양서와 같은 의미를 유지함.
- 저장소에는 H100, H200, B200, A100, MI300X, Apple M4와 멀티 GPU 노드의 머신 파일이 포함되며, 각 파일은 출처를 인용하고 검증되지 않은 수치를 미검증으로 표시함.
- 예시 머신 구성은 HBM 용량 80 GiB와 대역폭 3.35 TB/s, L2 용량 50 MiB와 대역폭 12 TB/s, SMEM 용량 228 KiB와 대역폭 128 B/cyc를 기술함. SMEM의 클럭은 1.98 GHz, 복제 수는 132, 최소 단위는 1 KiB이며 범위는 SM임.
- 예시 토폴로지는
nvptx64아키텍처와 HBM을 장치 메모리로 선언하고, CPU DRAM에서 HBM으로의 전송 대역폭을 63 GB/s로 지정함.
컴파일 방식
데이터 지향 병렬 프런트엔드
- 모든 심볼, 명목 타입과 모노모픽화된 변형은 평탄한 256비트 식별자로 표현됨.
- 명목 타입 시스템과 재귀 타입의 필수 박싱을 통해 모듈을 분리하므로, 쿼리 엔진이나 잠금 경합 없이 여러 코어에서 파이프라인을 병렬 실행함.
- 컴파일 과정은 포인터를 따라가는 트리 대신 평탄한 배열을 순회함.
- 같은 소스는 직렬 및 병렬 빌드에서 바이트 단위로 동일한 MLIR을 생성함. 테스트 스위트는 벤치마크 규모에서 단일 스레드, 네 스레드, 스레드 풀을 사용하지 않는 경우를 검증하며, 각 실행에 별도 해시 시드가 적용되도록 새 프로세스에서 다시 컴파일한 코드 모음도 검사함.
- 이 보장은 프런트엔드가 출력하는 MLIR에 관한 것이며, 그 이후 단계는 LLVM의 영역임.
백엔드
- CPU(x86-64, arm64): MLIR → LLVM IR → 네이티브 코드, AOT 또는 JIT
- NVIDIA GPU: MLIR → NVVM → PTX → SASS
- Apple AMX / ANE: 플러그인을 통한 CoreML 기본 연산 디스패치
- 분산: 매니페스트 기반 원격 영역과 와이어 프로토콜
- 벤더는 컴파일러를 직접 수정하는 대신 MLIR 패스 플러그인으로 확장함.
Vx가 적합하지 않은 경우
- PyTorch 사용자는 반복문 도중 아키텍처를 바꾸고, 텐서 모양을 출력하고, 그 값에 따라 분기한 뒤 계속 작업함. AOT·데이터 지향·정적 영역 방식인 Vx에서 같은 동적 동작을 구현하려면 상당한 작업이 필요함.
- Vx는 열 가지 종류의 실리콘에서 정확하고 빠르게 동작해야 하는 대상에 적합하며, 아직 탐색 중인 대상을 다루기에는 적합하지 않음.
여기서 시작하기
- 시작 안내: 도구 체인을 설치하고 첫 프로그램을 실행함.
- Vx 둘러보기: 타입, 제네릭, 소유권을 한 번에 살펴봄.
- 토폴로지와 메모리: 배치, 전송, 검사기가 강제하는 규칙을 다룸.
- 머신 파일: 실제 하드웨어를 기술하고 그 한계에 맞춰 컴파일함.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요