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
- Pointcept:Examples:Weld - 배관 원주 용접(C-seam) Point Cloud 데이터의 Semantic Segmentation 훈련 가이드 - claude code로 생성함. [WARNING] 검증 꼭 필요!!
- Pointcept:Examples:Weld:LVS - LVS 로 취득한 데이터로 훈련하는 샘플
- Pointcept:Examples:Weld:LVS:SetupAndOOM - 학습 환경 구축 및 OOM (Out Of Memory) 해결 과정 정리.
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 컴파일하도록 강제하여 이를 테스트할 수 있습니다.
- Download and install the latest driver from https://www.nvidia.com/drivers.
- Set the environment variable
CUDA_FORCE_PTX_JIT=1 - Launch the application.
CUDA_FORCE_PTX_JIT=1로 설정하면 애플리케이션 바이너리에 포함된 GPU 바이너리 코드는 무시됩니다.
대신 각 커널의 PTX 코드가 JIT 컴파일되어 GPU 바이너리 코드가 생성됩니다. PTX 코드가 포함되지 않은 애플리케이션은 실행되지 않습니다. 이는 해당 애플리케이션이 Blackwell 아키텍처와 호환되지 않으므로 호환성을 위해 다시 빌드해야 함을 의미합니다.
반대로 이 환경 변수를 설정한 상태에서 애플리케이션이 정상적으로 작동하면 Blackwell 아키텍처와 호환되는 것입니다.
필수 패키지 설치
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
- Point Cloud
- PTv3
- Sonata
- Concerto
- point cloud perception
- 3d-vision
- AIWeldingRobot:Basic
- SpConv - Spatially Sparse Convolution Library
- PyG
- libsparsehash-dev
- CloudCompare