RAPIDS v24.10 출시는 데이터 과학자와 개발자에게 가속 컴퓨팅을 제공하며, 더욱 원활한 사용자 경험을 통해 한 단계 진보했습니다. 이 블로그 포스트에서는 다음과 같은 새로운 기능에 대해 집중적으로 다룹니다:
- 코드 변경 없이 가속화된 NetworkX: 이제 일반 공급(GA) 가능
- Polars GPU 엔진: 오픈 베타 버전 출시
- GPU 메모리보다 큰 데이터 세트에 UMAP 적용
- NumPy 및 PyArrow와의 cuDF 팬더스 호환성 개선
- GitHub 기반 CI 시스템에 GPU 통합을 위한 지침
- Python 3.12 및 NumPy 2.x에 대한 RAPIDS의 전체 지원
코드 변경 없이 가속화된 NetworkX
NetworkX 가속화를 지원하는 cuGraph는 NetworkX 3.4부터 v24.10 릴리스에서 GA로 제공됩니다. 이번 릴리스는 GPU 가속 그래프 생성, 새로운 사용자 경험, 확장된 문서를 포함하여 더욱 개선되었습니다.
그래프 구축 가속화는 NetworkX 워크플로우 전반의 속도를 높이며, 특히 CPU와 GPU 간의 전환으로 성능이 저하될 수 있는 대규모 그래프 워크플로우에서 유용합니다.
NX_CUGRAPH_AUTOCONFIG
환경 변수를 True
로 설정하여 NetworkX 가속화 환경을 활성화할 수 있습니다.
%env NX_CURGAPH_AUTOCONFIG=True
import pandas as pd
import networkx as nx
url = "https://data.rapids.ai/cugraph/datasets/cit-Patents.csv"
df = pd.read_csv(url, sep=" ", names=["src", "dst"], dtype="int32")
G = nx.from_pandas_edgelist(df, source="src", target="dst")
%time result = nx.betweenness_centrality(G, k=10)
엔드투엔드 가속화를 통해 betweenness centrality, PageRank 등과 같은 알고리즘이 더 큰 그래프에서 최대 10배, 50배, 심지어 500배까지 속도를 높일 수 있습니다.


cuGraph로 가속화된 NetworkX에 대한 더 자세한 내용은 문서에서 확인할 수 있으며, 위의 벤치마크 코드는 여기에서 제공됩니다.
코드 변경 없이 가속화된 Polars 오픈 베타
cuDF로 구동되는 Polars GPU 엔진이 9월에 오픈 베타로 출시되었습니다. 이를 통해 사용자는 코드 변경 없이도 CPU 기반 실행보다 최대 13배 더 빠른 워크플로우를 경험할 수 있습니다.

PDS-H 벤치마크 스케일 팩터 80 | GPU: NVIDIA H100 | CPU: Intel Xeon W9-3495X (Sapphire Rapids) | 스토리지: 로컬 NVMe. 참고: PDS-H는 TPC-H에서 파생되었지만, 이 결과는 TPC-H 결과와 비교할 수 없습니다.
Polars Lazy API에 직접 구축되어, 사용자는 계산이 시작될 때 `engine
` 키워드를 사용하여 GPU를 `collect
`하도록 Polars를 구성할 수 있습니다.
import polars as pl
df = pl.LazyFrame({"a": [1.242, 1.535]})
q = df.select(pl.col("a").round(1))
result = q.collect(engine="gpu")
자세한 내용은 NVIDIA와 Polars 발표 블로그와 Polars GPU 지원 문서를 참조하거나 Google Colab 노트북에서 바로 테스트해 보세요.
GPU 메모리보다 큰 데이터 세트에 UMAP 적용
v24.10 버전부터는 cuML의 UMAP 알고리즘이 이전 버전에서 메모리 부족 오류를 발생시켰을 GPU 메모리보다 큰 데이터 세트 처리를 지원합니다. 새로운 배치 근사 근접 이웃 알고리즘을 사용하고 선택적으로 전체 데이터 세트를 CPU 메모리에 저장함으로써, 주어진 시간에 GPU에서 데이터의 하위 집합만 처리하면서 근사 KNN 그래프를 구축할 수 있습니다.
사용자는 새로운 `nnd_n_clusters
` 키워드를 1보다 큰 값(기본값)으로 설정하고 (필요한 경우) `data_on_host=True
` 키워드를 `fit
` 또는 `fit_transform
`에 전달하여 이 새로운 선택적 기능을 활용할 수 있습니다.
from cuml.manifold import UMAP
import numpy as np
# Generate synthetic data using numpy (random float32 matrix)
X = np.random.rand(n_samples, n_features).astype(np.float32)
# UMAP parameters
num_clusters = 4 # Number of clusters for NN Descent batching, 1 means no clustering
data_on_host = True # Whether the data is stored on the host (CPU)
# UMAP model configuration
reducer = UMAP(
n_neighbors=10,
min_dist=0.01,
build_algo="nn_descent",
build_kwds={"nnd_n_clusters": num_clusters},
)
# Fit and transform the data
embeddings = reducer.fit_transform(X, data_on_host=data_on_host)
사용자는 n_clusters의 초기값(예: 4)으로 시작하여 GPU 메모리 사용량을 관리하는 데 필요한 만큼 늘릴 수 있습니다. 값을 너무 높게 설정하면 그래프 구축의 여러 반복으로 인해 성능 오버헤드가 발생할 수 있으므로, 데이터 세트 크기와 사용 가능한 GPU 메모리를 기준으로 균형을 찾는 것이 좋습니다.
cuDF 개선 pandas 생태계 호환성 개선
코드 호환성 개선
cuDF의 pandas 가속 모드는 이제 NumPy 배열과 완벽하게 호환됩니다. 이전에는 Python isinstance
검사를 실행하면 cuDF pandas를 사용할 때는 NumPy 배열에 대해 False를 반환했지만 표준 pandas를 사용할 때는 True를 반환했습니다. 이것은 일반적인 코드 디자인 패턴이기 때문에 일부 사용자 워크플로우는 원활하게 실행하기 위해 해결 방법이 필요합니다.
v24.10부터, 가속기 모드가 활성화되어 있고 사용자가 DataFrame 또는 열을 배열로 변환하려고 할 때, cudf.pandas가 이제 기능적으로 진정한 NumPy 배열을 생성하여 이 문제를 해결합니다. 예를 들면 다음과 같습니다.
%load_ext cudf.pandas
import pandas as pd
import numpy as np
arr = pd.Series([1, 2, 3]).values # now returns a true numpy array
isinstance(arr, np.ndarray) # returns True
이 변경으로 인해 NumPy C API에 의존하는 코드가 cuDF pandas와 원활하게 작동할 수 있게 되었습니다.
Arrow 호환성 개선
cuDF는 이제 다양한 PyArrow 버전도 지원합니다. Arrow 호환성은 cuDF 사용자에게 오랫동안 골칫거리였습니다. 지금까지 cuDF의 모든 릴리즈는 Arrow C++ API 사용과 사용에 따른 바이너리 호환성 요구 사항 때문에 매우 특정한 Arrow 릴리즈와 연결되어 있었습니다.
이번 릴리즈에서는 이러한 기능을 Arrow C 데이터 인터페이스 전용으로 다시 작성하여 Arrow C++ 사용을 완전히 중단할 수 있었습니다. 이러한 변화로 인해, cuDF Python은 이제 PyArrow 14 이후의 모든 PyArrow 버전을 지원할 수 있게 되었습니다.
GitHub 기반 CI 시스템에 GPU를 통합하기 위한 방법
커뮤니티에서 GPU를 GitHub 기반 CI 시스템에 통합하는 간단하고 효과적인 방법을 찾는 것이 어렵다는 의견을 들었습니다. scikit-learn 팀의 경험을 바탕으로 이를 효과적으로 수행하기 위한 새로운 지침이 RAPIDS Deployment 문서에 추가되었습니다.
GitHub Actions는 이제 호스팅된 GPU 러너를 지원합니다. 이것은 GitHub의 모든 프로젝트가 테스트를 위해 CI 작업 부하에서 NVIDIA GPU를 활용할 수 있다는 것을 의미합니다. 이로써 프로젝트가 RAPIDS 라이브러리와 통합하고 변경 사항이 로컬 GPU 하드웨어 없이 호환되는지 테스트하는 것이 훨씬 쉬워졌습니다.
GPU 호스팅 러너는 GitHub Action 무료 티어에 포함되어 있지 않습니다. GPU를 사용하는 러너는 일반적으로 분당 몇 센트의 비용이 들며, 프로젝트는 비용을 통제하기 위해 월별 지출 한도를 추가할 수 있습니다.
GPU 러너를 설정하려면 조직 설정의 GitHub Actions 섹션으로 이동하여 새 러너를 추가하세요. 그런 다음 NVIDIA 파트너 이미지를 선택하고 크기를 GPU 기반 VM으로 변경하여 러너에 GPU를 제공하세요.

그런 다음 runs-on
옵션을 사용하여 새로운 러너를 사용하도록 워크플로우를 구성할 수 있습니다.
name: GitHub Actions GPU Demo
run-name: ${{ github.actor }} is testing out GPU GitHub Actions
on: [push]
jobs:
gpu-workflow:
runs-on: linux-nvidia-gpu
steps:
- name: Check GPU is available
run: nvidia-smi
GitHub Actions GPU 기반 워크플로우 설정에 대한 자세한 정보는 RAPIDS 배포 문서를 참조하세요. 이 문서에는 GPU CI를 실행할 때의 모범 사례도 포함되어 있습니다.
scikit-learn 프로젝트는 최근 GitHub Actions에 GPU 러너를 설정하여 레이블을 사용하여 선택한 PR에서 GPU 워크플로우를 수동으로 트리거했습니다. 블로그 게시물을 확인하여 자세한 내용을 알아보세요.
RAPIDS 플랫폼 업데이트
2024년 10월, RAPIDS 패키지는 다른 과학 컴퓨팅 소프트웨어의 최신 버전과 함께 사용할 수 있도록 몇 가지 중요한 업데이트를 적용했습니다. 이 패키지는 이제 Python 3.10-3.12와 NumPy 1.x 및 2.x를 지원합니다. 또한, 이제 fmt 11과 spdlog 1.14도 지원합니다. 이 라이브러리 버전은 현재 conda-forge의 대부분에서 사용되고 있습니다. 이러한 개선의 일환으로, 이번 릴리스에서는 Python 3.9 또는 NCCL 2.19 이전 버전에 대한 지원도 중단됩니다.
결론
RAPIDS 24.10 릴리스로 데이터 과학자와 엔지니어가 가속 컴퓨팅을 보다 쉽게 이용할 수 있도록 하는 NVIDIA의 사명에 한 걸음 더 다가갈 수 있게 되었습니다.
RAPIDS를 처음 사용하시는 분들은 이 자료들을 확인하고 시작해 보세요.
관련 자료
- DLI 강좌: RAPIDS cuDF를 이용한 데이터프레임 작업 속도 향상
- GTC 세션: RAPIDS cuDF를 이용한 제로 코드 변경으로 판다스 가속화
- GTC 세션: NetworkX 가속화: 간편한 그래프 분석의 미래
- NGC 컨테이너: NVIDIA RAPIDS PB 2024년 10월(PB 24h2)
- NGC 컨테이너: NVIDIA RAPIDS PB 2024년 5월(PB 24h1)
- SDK: RAPIDS