Skip to content

Pointcept

Perceive the world with sparse points, a codebase for point cloud perception research. Latest works: Concerto (NeurIPS'25), Sonata (CVPR'25 Highlight), PTv3 (CVPR'24 Oral)

PTv3, Sonata, Concerto 등을 통합 지원하는 point cloud perception 연구 프레임워크

Categories

Implementations

It is also an official implementation of the following paper:

  • 🚀 Utonia - Toward One Encoder for All Point Clouds
  • Concerto - Joint 2D-3D Self-Supervised Learning Emerges Spatial Representations
  • Sonata - Self-Supervised Learning of Reliable Point Representations
  • Point Transformer V3 - Simpler, Faster, Stronger
  • OA-CNNs - Omni-Adaptive Sparse CNNs for 3D Semantic Segmentation
  • Towards Large-scale 3D Representation Learning with Multi-dataset Point Prompt Training
  • Masked Scene Contrast - A Scalable Framework for Unsupervised 3D Representation Learning
  • Learning Context-aware Classifier for Semantic Segmentation (3D Part)
  • Point Transformer V2 - Grouped Vector Attention and Partition-based Pooling
  • Point Transformer

Additionally, Pointcept integrates the following excellent work (contain above):

  • Backbone: MinkUNet, SpUNet, SPVCNN, OACNNs, PTv1, PTv2, PTv3, StratifiedFormer, OctFormer, Swin3D
  • Semantic Segmentation: Mix3d, CAC
  • Instance Segmentation: PointGroup
  • Pre-training: PointContrast, Contrastive Scene Contexts, Masked Scene Contrast, Point Prompt Training, Sonata, Concerto
  • Datasets: ScanNet, ScanNet200, ScanNet++, S3DIS, ArkitScene, HM3D, Matterport3D, Structured3D, SemanticKITTI, nuScenes, ModelNet40, Waymo

Requirements

  • Ubuntu: 18.04 and above.
  • CUDA: 11.3 and above.
  • PyTorch: 1.10.0 and above.

Blackwell Architecture 지원

CUDA Toolkit 은 12.8 이상을 사용해야 한다.

CUDA 툴킷 12.8 이하 버전을 사용하여 빌드된 애플리케이션

CUDA 툴킷 버전 2.1부터 12.8까지를 사용하여 빌드된 CUDA 애플리케이션은 커널의 PTX 버전을 포함하도록 빌드된 경우 Blackwell GPU와 호환됩니다. 다음 단계를 따라 애플리케이션 로드 시 PTX를 JIT 컴파일하도록 강제하여 이를 테스트할 수 있습니다.

  1. Download and install the latest driver from https://www.nvidia.com/drivers.
  2. Set the environment variable CUDA_FORCE_PTX_JIT=1
  3. Launch the application.

CUDA_FORCE_PTX_JIT=1로 설정하면 애플리케이션 바이너리에 포함된 GPU 바이너리 코드는 무시됩니다.

대신 각 커널의 PTX 코드가 JIT 컴파일되어 GPU 바이너리 코드가 생성됩니다. PTX 코드가 포함되지 않은 애플리케이션은 실행되지 않습니다. 이는 해당 애플리케이션이 Blackwell 아키텍처와 호환되지 않으므로 호환성을 위해 다시 빌드해야 함을 의미합니다.

반대로 이 환경 변수를 설정한 상태에서 애플리케이션이 정상적으로 작동하면 Blackwell 아키텍처와 호환되는 것입니다.

필수 패키지 설치

sudo apt install libsparsehash-dev gcc-13 g++-13

spconv 설치

Because spconv-cu128 was not found in the package registry and you require spconv-cu128, we can conclude that your requirements are unsatisfiable.

spconv-cu128 wheel 이 PyPI 에 아직 없는 것이 원인입니다. 최신은 spconv-cu126 (2.3.8).

3가지 대응 방법:

옵션

내용

장단점

spconv-cu126 사용

cu126 wheel 을 CUDA 12.8 런타임에서 실행

✅ 즉시 설치. CUDA ABI 호환. ⚠️ Blackwell 네이티브 커널 X → PTX JIT fallback (첫 실행 지연, 약간의 성능 손실)

spconv 소스 빌드

pip install spconv + cumm 수동

✅ 네이티브 sm_120. ❌ 빌드 시간·설정 복잡, cumm 도 같이 빌드 필요

spconv 제외

requirements 에서 삭제

✅ 간단. ❌ SparseUNet/MinkUNet 백본 사용 불가 (PTv3 는 무관)

uv 초기화

내가 conda 계열을 싫어함. 그래서 uv로 설정한다.

사용하는 Python Version 3.10 (상세 버전은 3.10.19)

requirements.cu128.txt

requirements.cu124.txt 파일을 만들고 다음과 같이 추가한다:

# Pointcept - GPU requirements (CUDA 12.8 / Blackwell sm_120)
# Usage:
#   ./uv-install-cu128.sh
# or manually:
#   uv venv --python 3.10 && source .venv/bin/activate
#   uv pip install -r requirements.cu128.txt
#   TORCH_CUDA_ARCH_LIST="12.0" uv pip install ./libs/pointops
#
# System prerequisites:
#   - CUDA 12.8 toolkit + cuDNN 9.x (nvcc must know sm_120)
#     https://developer.nvidia.com/cuda-12-8-0-download-archive
#   - gcc-13 / g++-13
#   - libsparsehash-dev (apt install libsparsehash-dev)
#   - NVIDIA driver >= 570 (Blackwell consumer cards require driver 572+)

--extra-index-url https://download.pytorch.org/whl/cu128

# PyTorch (CUDA 12.8, Blackwell officially supported from 2.7.0)
# NOTE: +cu128 local version identifier 를 명시해야 PyPI 의 CPU 빌드로 대체되지 않음.
torch==2.7.0+cu128
torchvision==0.22.0+cu128
torchaudio==2.7.0+cu128

# PyG extensions (torch 2.7 + cu128 wheels)
--find-links https://data.pyg.org/whl/torch-2.7.0+cu128.html
torch-cluster==1.6.3
torch-scatter==2.1.2
torch-sparse==0.6.18
torch-geometric==2.7.0

# spconv — SparseUNet / MinkUNet 백본용
# NOTE: spconv-cu128 wheel 은 아직 PyPI 에 미공개.
#       cu126 wheel 을 CUDA 12.8 런타임에서 사용 (CUDA major ABI 호환).
#       Blackwell 전용 cubin 이 없어 첫 실행 시 PTX JIT 지연이 발생할 수 있음.
#       PTv3 only 사용자는 이 줄을 주석 처리해도 무방.
spconv-cu126==2.3.8

# Core
ninja
h5py
pyyaml
sharedarray
tensorboard
tensorboardx
wandb
yapf
addict
einops
scipy
plyfile
termcolor
timm
peft
open3d

# CLIP
ftfy
regex
tqdm
clip @ git+https://github.com/openai/CLIP.git

# (Optional) Blackwell 대응 flash-attn — 필요 시 별도 설치 권장
# flash-attn>=2.7.4

설치 스크립트

uv-install-cu128.sh 파일을 만들어서 실행하자:

#!/bin/bash
set -euo pipefail

PYTHON_VERSION="3.10"
VENV_DIR=".venv"
MIN_CUDA_MAJOR=12
MIN_CUDA_MINOR=8

echo "=== Pointcept GPU (CUDA 12.8 / Blackwell sm_120) Installation ==="

# --- [1/6] System prerequisite checks ---
echo "[1/6] Checking system prerequisites..."

if ! command -v uv &> /dev/null; then
    echo "ERROR: 'uv' not found."
    echo "  Install: curl -LsSf https://astral.sh/uv/install.sh | sh"
    exit 1
fi

if ! command -v nvcc &> /dev/null; then
    echo "ERROR: nvcc not found."
    echo "  Blackwell (sm_120) requires CUDA >= ${MIN_CUDA_MAJOR}.${MIN_CUDA_MINOR} toolkit."
    echo "  Install: https://developer.nvidia.com/cuda-12-8-0-download-archive"
    exit 1
fi

NVCC_VER=$(nvcc --version | grep -oP 'release \K[0-9]+\.[0-9]+' | head -1)
NVCC_MAJOR=${NVCC_VER%.*}
NVCC_MINOR=${NVCC_VER#*.}
if [ "$NVCC_MAJOR" -lt "$MIN_CUDA_MAJOR" ] || \
   { [ "$NVCC_MAJOR" -eq "$MIN_CUDA_MAJOR" ] && [ "$NVCC_MINOR" -lt "$MIN_CUDA_MINOR" ]; }; then
    echo "ERROR: nvcc ${NVCC_VER} found, but Blackwell (sm_120) requires >= ${MIN_CUDA_MAJOR}.${MIN_CUDA_MINOR}."
    echo "  Current nvcc: $(which nvcc)"
    echo "  Install CUDA 12.8 toolkit and ensure it is first in PATH."
    echo "    export PATH=/usr/local/cuda-12.8/bin:\$PATH"
    echo "    export LD_LIBRARY_PATH=/usr/local/cuda-12.8/lib64:\$LD_LIBRARY_PATH"
    exit 1
fi
echo "  nvcc ${NVCC_VER} OK"

if command -v nvidia-smi &> /dev/null; then
    GPU_CC=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | head -1)
    echo "  GPU compute capability: ${GPU_CC}"
fi

if ! command -v g++-13 &> /dev/null; then
    echo "WARNING: g++-13 not found."
    echo "  CUDA 12.8 nvcc requires gcc-13/g++-13 on Ubuntu 22.04+."
    echo "  Install: sudo apt install gcc-13 g++-13"
fi

if ! dpkg -s libsparsehash-dev &> /dev/null 2>&1; then
    echo "WARNING: libsparsehash-dev not found."
    echo "  Install: sudo apt install libsparsehash-dev"
    if [[ -t 0 ]]; then
        read -p "Continue anyway? [y/N] " -r
        [[ $REPLY =~ ^[Yy]$ ]] || exit 1
    else
        echo "  Non-interactive shell — aborting."
        exit 1
    fi
fi

# --- [2/6] Create / activate venv ---
if [ ! -d "$VENV_DIR" ]; then
    echo "[2/6] Creating virtual environment (Python $PYTHON_VERSION)..."
    uv venv --python "$PYTHON_VERSION"
else
    echo "[2/6] Virtual environment already exists, reusing..."
fi
source "$VENV_DIR/bin/activate"

# --- [3/6] Install Python dependencies ---
echo "[3/6] Installing Python dependencies (PyTorch cu128 + PyG + spconv)..."
# --reinstall: 기존 venv 재사용 시 torch 등이 상위 버전으로 남아 있을 수 있으므로
#              requirements pin 으로 강제 복구.
uv pip install --reinstall -r requirements.cu128.txt

# --- [4/6] Verify PyTorch sees Blackwell ---
echo "[4/6] Verifying PyTorch / CUDA runtime..."
python - <<'PY'
import torch
print(f"  torch {torch.__version__}")
print(f"  torch.version.cuda = {torch.version.cuda}")
print(f"  cuda available     = {torch.cuda.is_available()}")
if torch.cuda.is_available():
    cc = torch.cuda.get_device_capability(0)
    print(f"  GPU                = {torch.cuda.get_device_name(0)}")
    print(f"  compute capability = sm_{cc[0]}{cc[1]}")
    arches = torch.cuda.get_arch_list()
    print(f"  supported arches   = {arches}")
    if not any(a.endswith("_120") or a.endswith("_100") for a in arches):
        print("  WARNING: this PyTorch build has no Blackwell (sm_100/sm_120) kernels.")
PY

# --- [5/6] Build C++/CUDA extensions with Blackwell arch ---
echo "[5/6] Building libs/pointops (and siblings) for sm_120..."
# Ship kernels for Ampere + Ada + Hopper + Datacenter-Blackwell + Consumer-Blackwell.
export TORCH_CUDA_ARCH_LIST="8.0;8.6;8.9;9.0;10.0;12.0"
echo "  TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST}"

EXT_LIBS=("pointops" "pointops2" "pointgroup_ops" "pointrope" "pointseg")
for lib in "${EXT_LIBS[@]}"; do
    if [ -d "libs/$lib" ] && [ -f "libs/$lib/setup.py" ]; then
        echo "  -> building libs/$lib"
        (cd "libs/$lib" && rm -rf build/ dist/ *.egg-info && uv pip install --no-build-isolation .)
    fi
done

# --- [6/6] Smoke test ---
echo "[6/6] Running smoke test..."
python - <<'PY'
import torch
assert torch.cuda.is_available(), "CUDA not available"
x = torch.randn(1024, 3, device="cuda")
y = (x @ x.T).sum()
torch.cuda.synchronize()
print(f"  CUDA matmul OK  (sum={y.item():.3f})")
try:
    import pointops
    print("  pointops import OK")
except Exception as e:
    print(f"  pointops import FAILED: {e}")
try:
    import spconv.pytorch as spconv
    print("  spconv import OK  (cu126 wheel on CUDA 12.8 runtime; PTX JIT on sm_120)")
except Exception as e:
    print(f"  spconv import FAILED: {e}")
PY

echo ""
echo "=== Installation complete ==="
echo "Activate env: source ${VENV_DIR}/bin/activate"

실행하면 대략 다음과 같이 출력된다:

$ ./uv-install-cu128.sh
=== Pointcept GPU (CUDA 12.8 / Blackwell sm_120) Installation ===
[1/6] Checking system prerequisites...
  nvcc 12.8 OK
  GPU compute capability: 12.0
[2/6] Creating virtual environment (Python 3.10)...
Using CPython 3.10.19
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
[3/6] Installing Python dependencies (PyTorch cu128 + PyG + spconv)...
Resolved 164 packages in 6.47s
Prepared 164 packages in 14ms
Installed 164 packages in 109ms
 + absl-py==2.4.0
 + accelerate==1.13.0
 + addict==2.4.0
 + aiohappyeyeballs==2.6.1
 + aiohttp==3.13.5
 + aiosignal==1.4.0
 + annotated-doc==0.0.4
 + annotated-types==0.7.0
 + anyio==4.13.0
 + asttokens==3.0.1
 + async-timeout==5.0.1
 + attrs==26.1.0
 + blinker==1.9.0
 + ccimport==0.4.4
 + certifi==2022.12.7
 + charset-normalizer==2.1.1
 + click==8.3.2
 + clip==1.0 (from git+https://github.com/openai/CLIP.git@d05afc436d78f1c48dc0dbf8e5980a9d471f35f6)
 + comm==0.2.3
 + configargparse==1.7.5
 + contourpy==1.3.2
 + cumm-cu126==0.7.11
 + cycler==0.12.1
 + dash==4.1.0
 + decorator==5.2.1
 + einops==0.8.2
 + exceptiongroup==1.3.1
 + executing==2.2.1
 + fastjsonschema==2.21.2
 + filelock==3.25.2
 + fire==0.7.1
 + flask==3.1.3
 + fonttools==4.62.1
 + frozenlist==1.8.0
 + fsspec==2026.2.0
 + ftfy==6.3.1
 + gitdb==4.0.12
 + gitpython==3.1.46
 + grpcio==1.80.0
 + h11==0.16.0
 + h5py==3.16.0
 + hf-xet==1.4.3
 + httpcore==1.0.9
 + httpx==0.28.1
 + huggingface-hub==1.11.0
 + idna==3.4
 + importlib-metadata==7.1.0
 + ipython==8.39.0
 + ipywidgets==8.1.8
 + itsdangerous==2.2.0
 + jedi==0.19.2
 + jinja2==3.1.6
 + joblib==1.5.3
 + jsonschema==4.26.0
 + jsonschema-specifications==2025.9.1
 + jupyter-core==5.9.1
 + jupyterlab-widgets==3.0.16
 + kiwisolver==1.5.0
 + lark==1.3.1
 + markdown==3.10.2
 + markdown-it-py==4.0.0
 + markupsafe==3.0.3
 + matplotlib==3.10.8
 + matplotlib-inline==0.2.1
 + mdurl==0.1.2
 + mpmath==1.3.0
 + multidict==6.7.1
 + narwhals==2.19.0
 + nbformat==5.10.4
 + nest-asyncio==1.6.0
 + networkx==3.4.2
 + ninja==1.13.0
 + numpy==2.2.6
 + nvidia-cublas-cu12==12.8.3.14
 + nvidia-cuda-cupti-cu12==12.8.57
 + nvidia-cuda-nvrtc-cu12==12.8.61
 + nvidia-cuda-runtime-cu12==12.8.57
 + nvidia-cudnn-cu12==9.7.1.26
 + nvidia-cufft-cu12==11.3.3.41
 + nvidia-cufile-cu12==1.13.0.11
 + nvidia-curand-cu12==10.3.9.55
 + nvidia-cusolver-cu12==11.7.2.55
 + nvidia-cusparse-cu12==12.5.7.53
 + nvidia-cusparselt-cu12==0.6.3
 + nvidia-nccl-cu12==2.26.2
 + nvidia-nvjitlink-cu12==12.8.61
 + nvidia-nvtx-cu12==12.8.55
 + open3d==0.19.0
 + packaging==24.1
 + pandas==2.3.3
 + parso==0.8.6
 + pccm==0.4.16
 + peft==0.19.1
 + pexpect==4.9.0
 + pillow==12.1.1
 + platformdirs==4.9.6
 + plotly==6.7.0
 + plyfile==1.1.3
 + portalocker==2.10.1
 + prompt-toolkit==3.0.52
 + propcache==0.4.1
 + protobuf==7.34.1
 + psutil==7.2.2
 + ptyprocess==0.7.0
 + pure-eval==0.2.3
 + pybind11==3.0.4
 + pydantic==2.13.2
 + pydantic-core==2.46.2
 + pygments==2.20.0
 + pyparsing==3.3.2
 + pyquaternion==0.9.9
 + python-dateutil==2.9.0.post0
 + pytz==2026.1.post1
 + pyyaml==6.0.3
 + referencing==0.37.0
 + regex==2026.4.4
 + requests==2.28.1
 + retrying==1.4.2
 + rich==15.0.0
 + rpds-py==0.30.0
 + safetensors==0.7.0
 + scikit-learn==1.7.2
 + scipy==1.15.3
 + sentry-sdk==2.58.0
 + setuptools==70.2.0
 + sharedarray==3.2.4
 + shellingham==1.5.4
 + six==1.17.0
 + smmap==5.0.3
 + spconv-cu126==2.3.8
 + stack-data==0.6.3
 + sympy==1.14.0
 + tensorboard==2.20.0
 + tensorboard-data-server==0.7.2
 + tensorboardx==2.6.5
 + termcolor==3.3.0
 + threadpoolctl==3.6.0
 + timm==1.0.26
 + tokenizers==0.22.2
 + tomli==2.4.1
 + torch==2.7.0+cu128
 + torch-cluster==1.6.3+pt27cu128
 + torch-geometric==2.7.0
 + torch-scatter==2.1.2+pt27cu128
 + torch-sparse==0.6.18+pt27cu128
 + torchaudio==2.7.0+cu128
 + torchvision==0.22.0+cu128
 + tqdm==4.66.5
 + traitlets==5.14.3
 + transformers==5.5.4
 + triton==3.3.0
 + typer==0.24.1
 + typing-extensions==4.15.0
 + typing-inspection==0.4.2
 + tzdata==2026.1
 + urllib3==1.26.13
 + wandb==0.26.0
 + wcwidth==0.6.0
 + werkzeug==3.1.8
 + widgetsnbextension==4.0.15
 + xxhash==3.6.0
 + yapf==0.43.0
 + yarl==1.23.0
 + zipp==3.19.2
[4/6] Verifying PyTorch / CUDA runtime...
  torch 2.7.0+cu128
  torch.version.cuda = 12.8
  cuda available     = True
  GPU                = NVIDIA RTX PRO 2000 Blackwell Generation Laptop GPU
  compute capability = sm_120
  supported arches   = ['sm_75', 'sm_80', 'sm_86', 'sm_90', 'sm_100', 'sm_120', 'compute_120']
[5/6] Building libs/pointops (and siblings) for sm_120...
  TORCH_CUDA_ARCH_LIST=8.0;8.6;8.9;9.0;10.0;12.0
  -> building libs/pointops
Using Python 3.10.19 environment at: /home/zer0/Projects/Pointcept/.venv
Resolved 27 packages in 1.87s
      Built pointops @ file:///home/zer0/Projects/Pointcept/libs/pointops
Prepared 1 package in 1m 33s
Installed 1 package in 0.83ms
 + pointops==1.0 (from file:///home/zer0/Projects/Pointcept/libs/pointops)
  -> building libs/pointops2
Using Python 3.10.19 environment at: /home/zer0/Projects/Pointcept/.venv
Resolved 27 packages in 1.58s
      Built pointops2 @ file:///home/zer0/Projects/Pointcept/libs/pointops2
Prepared 1 package in 1m 16s
Installed 1 package in 0.96ms
 + pointops2==1.0 (from file:///home/zer0/Projects/Pointcept/libs/pointops2)
  -> building libs/pointgroup_ops
Using Python 3.10.19 environment at: /home/zer0/Projects/Pointcept/.venv
Resolved 1 package in 1.41s
      Built pointgroup-ops @ file:///home/zer0/Projects/Pointcept/libs/pointgroup_ops
Prepared 1 package in 16.03s
Installed 1 package in 0.81ms
 + pointgroup-ops==0.0.0 (from file:///home/zer0/Projects/Pointcept/libs/pointgroup_ops)
  -> building libs/pointrope
Using Python 3.10.19 environment at: /home/zer0/Projects/Pointcept/.venv
Resolved 1 package in 2.17s
      Built pointrope @ file:///home/zer0/Projects/Pointcept/libs/pointrope
Prepared 1 package in 1m 39s
Installed 1 package in 0.69ms
 + pointrope==0.0.0 (from file:///home/zer0/Projects/Pointcept/libs/pointrope)
  -> building libs/pointseg
Using Python 3.10.19 environment at: /home/zer0/Projects/Pointcept/.venv
Resolved 26 packages in 2.29s
      Built pointseg @ file:///home/zer0/Projects/Pointcept/libs/pointseg
Prepared 1 package in 31.73s
Installed 1 package in 0.44ms
 + pointseg==1.0 (from file:///home/zer0/Projects/Pointcept/libs/pointseg)
[6/6] Running smoke test...
  CUDA matmul OK  (sum=1048.214)
  pointops import OK
  spconv import OK  (cu126 wheel on CUDA 12.8 runtime; PTX JIT on sm_120)

=== Installation complete ===
Activate env: source .venv/bin/activate

See also

Favorite site