
Rust 화자 분리 라이브러리 speakrs 제작자는 ONNX Runtime과 cuDNN·cuBLAS에 의존하던 GPU 실행 경로를 Rust로 작성한 자체 CUDA 커널로 바꿨다. 제작자가 측정한 RTX 4090 결과에서 VoxConverse dev 처리 시간은 1,236초에서 38초로 줄었고, pyannote보다 약 60배 빨랐다. 이 비교에서 speakrs의 DER은 7.0%, pyannote는 7.2%였다.
| 데이터셋·모드 | pyannote | cuda-oxide 적용 전 | 적용 후 | 적용 전 대비 | pyannote 대비 | DER: speakrs / pyannote |
|---|---|---|---|---|---|---|
VoxConverse dev, cuda | 2,301.3초 | 1,236.3초 | 38.2초 | 32.4배 | 60.2배 | 7.0% / 7.2% |
VoxConverse dev, cuda-fast | 2,301.3초 | 604.4초 | 20.0초 | 30.2배 | 115.1배 | 7.4% / 7.2% |
Earnings-21, cuda | 8,036.8초 | 2,692.1초 | 75.3초 | 35.8배 | 106.7배 | 9.7% / 9.7% |
Earnings-21, cuda-fast | 8,036.8초 | 1,284.1초 | 39.1초 | 32.8배 | 205.5배 | 9.2% / 9.7% |
모든 실행은 전체 데이터셋을 대상으로 했으며, RTX 4090에서 VoxConverse dev 216개 파일과 Earnings-21 44개 파일을 처리했다. 제작자는 speakrs가 cuda-oxide 적용 전후로 DER을 바꾸지 않았다고 밝혔다. 다만 cuda-fast는 1초 대신 2초 단위로 처리하며, 일부 데이터셋에서는 DER이 pyannote보다 높다. RTX 5090에서는 오디오 한 시간을 약 1.2초에 처리했다고 설명했다.
속도 개선과 적용 조건
처음 목표는 모델 가중치를 유지하면서 CUDA 빌드에서 큰 네이티브 의존성인 ONNX Runtime을 제거하는 것이었다. 초기에는 cuDNN과 cuBLAS를 사용하는 네이티브 CUDA 백엔드를 만들었고, 이 경로만으로도 FP32 기준 ONNX Runtime보다 1.81배 빨랐다. 이후 일부 계층의 속도 개선을 확인한 뒤 cuda-oxide로 모든 계층의 커널을 작성하는 방향으로 확장했다.
제작자에 따르면 GPU별로 가장 빠른 커널은 다르다. A100은 TF32 텐서 코어, T4는 FP16 경로, RTX 5090은 모델 대부분을 FP16으로 실행하는 구성이 유리했다. 따라서 측정하지 않은 GPU에서도 같은 성능 향상을 기대할 수는 없다. RTX 4090과 5090을 포함한 여덟 데이터셋의 측정에서도 GPU와 실행 모드에 따라 RTFx가 달랐다.
cuda-rtx40처럼 GPU 세대에 맞는 기능을 선택하면 NVIDIA 드라이버만 필요한 드라이버 전용 빌드를 사용할 수 있다. 이 빌드는 cuDNN이나 cuBLAS를 로드하지 않으며 드라이버 버전 570 이상이 필요하다. 특정 GPU를 모르면 cuda 기능을 선택할 수 있는데, 여기에는 지원 세대별 커널과 cuDNN 9·cuBLAS 12 대체 경로가 포함된다. GPU별 설정을 찾는 speakrs cuda tune은 제작자가 시험한 RTX 카드에서 30초 이내에 계층별 후보를 측정하며, 튜닝 파일은 이를 만든 빌드에만 적용된다.
Rust 프로젝트의 설정 예시는 다음과 같다.
speakrs = { version = "0.7", features = ["cuda-rtx40"] }
GPU가 없는 환경이나 지원 범위가 넓어야 하는 경우에는 제작자가 cuDNN·cuBLAS 경로를 유지할 것을 권했다. 자체 커널을 쓴 드라이버 전용 빌드는 제작자가 튜닝한 GPU에서는 라이브러리 경로보다 빨랐지만, 새 GPU마다 대여·측정·튜닝이 필요하다. H100은 아직 튜닝하지 않았다고 밝혔다.
개발 과정과 사용 방법
AI 코딩 에이전트가 커널 코드 대부분을 작성하고 벤치마크와 결과 정리도 도왔다. 제작자는 작업 목표와 측정 기준을 정하고, 변경을 병합할지 판단했다. 정확도 손실을 허용하지 않는 기준으로 바이트 단위로 동일한 RTTM 또는 악화되지 않은 DER, 그리고 고정 파일 집합에서 측정한 속도 개선을 사용했다고 설명했다. 엄격한 검증 도구를 만드는 데 약 5일을 쓴 뒤 점검 방식을 간소화하자, 다음 8시간 동안 더 많은 변경을 배포했다고 덧붙였다.
speakrs 0.7은 Python 바인딩도 제공한다. Linux x86_64 휠에는 CPU와 CUDA가, macOS arm64 휠에는 CPU와 CoreML이 포함된다. 제작자는 CUDA 휠의 RTTM이 Rust 파이프라인과 정확히 일치한다고 밝혔다. 설치와 사용 예시는 다음과 같다.
pip install speakrs
import speakrs
pipeline = speakrs.Pipeline.from_pretrained("cuda")
print(pipeline.diarize_file("meeting.wav").rttm())
지원 대상은 RTX 20 시리즈와 T4부터라고 안내했다. 하드웨어와 측정 방법을 포함한 벤치마크는 speakrs 저장소에서 확인할 수 있다. 프로젝트의 단계별 변경 내용은 관련 풀 리퀘스트, cuda-rust에서 볼 수 있다.
제작자는 같은 방식으로 만든 음성 인식 라이브러리 scriptrs도 소개했다. Parakeet TDT 0.6B v2·v3를 ONNX Runtime 없이 실행하는 CUDA 백엔드가 있으며, 비교에서 NVIDIA NeMo보다 약 2배, ONNX Runtime보다 3.7배 빨랐고 WER은 각각 1.93%, 1.93%, 1.92%였다고 밝혔다. 다만 이 결과와 후속 dialogrs 비교는 speakrs의 화자 분리 벤치마크와 별개의 측정이다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요