Minkowski 엔진은 드문 텐서를위한 자동 분화 라이브러리입니다. 희소 한 텐서를위한 컨볼 루션, 풀링, 풀링 및 방송 작업과 같은 모든 표준 신경망 레이어를 지원합니다. 자세한 내용은 문서 페이지를 방문하십시오.
Minkowski 엔진은 드문 텐서에 구축 할 수있는 다양한 기능을 지원합니다. 우리는 여기에 몇 가지 인기있는 네트워크 아키텍처와 응용 프로그램을 나열합니다. 예제를 실행하려면 패키지를 설치하고 패키지 루트 디렉토리에서 명령을 실행하십시오.
| 예 | 네트워크 및 명령 |
|---|---|
| 시맨틱 세분화 | python -m examples.indoor |
| 분류 | python -m examples.classification_modelnet40 |
| 재건 | python -m examples.reconstruction |
| 완성 | python -m examples.completion |
| 발각 |
신경망을 압축하여 추론 속도를 높이고 메모리 발자국을 최소화하는 것이 널리 연구되었습니다. 모델 압축을위한 인기있는 기술 중 하나는 콩품의 가중치를 잘라내 는 것입니다. 모델 압축에 사용되는 이러한 파라미터 공간 희소성은 조밀 한 텐서에서 작동하는 네트워크를 압축하고 이러한 네트워크의 모든 중간 활성화는 또한 밀도가 높은 텐서입니다.
그러나이 작업에서 우리는 공간적으로 드문 드문 데이터, 특히 공간적으로 희소 한 고차원 입력 및 3D 데이터 및 3D 객체의 표면에 대한 컨볼 루션에 중점을 두었습니다. 우리는 또한 이러한 데이터를 드문 텐서로 표현할 수 있으며, 이러한 희소 텐서는 3D 인식, 등록 및 통계 데이터와 같은 고차원 문제에서 일반적입니다. 우리는 이러한 입력에 대해 전문화 된 신경망을 희박한 텐서 네트워크 로 정의하고 이러한 희소 한 텐서 네트워크 프로세스를 프로세스하고 드문 텐서를 출력으로 생성합니다. 드문 텐서 네트워크를 구축하기 위해 MLP, 비선형성, 컨볼 루션, 정규화, 풀링 작업과 같은 모든 표준 신경망 레이어를 구축하고 밀도가 높은 텐서에서 정의하고 Minkowski 엔진에서 구현됩니다.
우리는 드문 텐서, 컨볼 루션에서 드문 텐서 네트워크 작동을 시각화했습니다. 드문 텐서의 컨볼 루션 층은 밀도가 높은 텐서에서와 유사하게 작동합니다. 그러나 드문 텐서에서는 일반화 된 컨볼 루션에서 제어 할 수있는 몇 가지 특정 지점에서 컨볼 루션 출력을 계산합니다. 자세한 내용은 Sparse Tensor Networks의 문서 페이지 및 Terminology 페이지를 방문하십시오.
| 밀도가 높은 텐서 | 드문 텐서 |
|---|---|
conda install -y -c nvidia -c pytorch pytorch=1.8.1 cudatoolkit=10.2 ) pip , Anaconda 또는 시스템에 직접 Minkowski 엔진을 설치할 수 있습니다. 패키지 설치 문제가 발생하면 설치 위키 페이지를 확인하십시오. 관련 문제를 찾을 수없는 경우 GitHub 문제 페이지에서 문제를보고하십시오.
MinkowskiEngine은 pip 에 간단히 설치할 수있는 PYPI MinkowskiEngine을 통해 배포됩니다. 먼저 지침 후 Pytorch를 설치하십시오. 다음으로 openblas 설치하십시오.
sudo apt install build-essential python3-dev libopenblas-dev
pip install torch ninja
pip install -U MinkowskiEngine --install-option="--blas=openblas" -v --no-deps
# For pip installation from the latest source
# pip install -U git+https://github.com/NVIDIA/MinkowskiEngine --no-deps
설정 스크립트에 대한 인수를 지정하려면 다음 명령을 참조하십시오.
# Uncomment some options if things don't work
# export CXX=c++; # set this if you want to use a different C++ compiler
# export CUDA_HOME=/usr/local/cuda-11.1; # or select the correct cuda version on your system.
pip install -U git+https://github.com/NVIDIA/MinkowskiEngine -v --no-deps
# # uncomment the following line if you want to force cuda installation
# --install-option="--force_cuda"
# # uncomment the following line if you want to force no cuda installation. force_cuda supercedes cpu_only
# --install-option="--cpu_only"
# # uncomment the following line to override to openblas, atlas, mkl, blas
# --install-option="--blas=openblas"
MinkowskiEngine은 Cuda 10.2와 Cuda 11.1을 모두 지원하며 대부분의 최신 Pytorch 버전에서 작동합니다.
설치하려면 python>=3.6 권장합니다. 먼저 아나콘다 문서를 따라 컴퓨터에 아나콘다를 설치하십시오.
sudo apt install g++-7 # For CUDA 10.2, must use GCC < 8
# Make sure `g++-7 --version` is at least 7.4.0
conda create -n py3-mink python=3.8
conda activate py3-mink
conda install openblas-devel -c anaconda
conda install pytorch=1.9.0 torchvision cudatoolkit=10.2 -c pytorch -c nvidia
# Install MinkowskiEngine
export CXX=g++-7
# Uncomment the following line to specify the cuda home. Make sure `$CUDA_HOME/nvcc --version` is 10.2
# export CUDA_HOME=/usr/local/cuda-10.2
pip install -U git+https://github.com/NVIDIA/MinkowskiEngine -v --no-deps --install-option="--blas_include_dirs=${CONDA_PREFIX}/include" --install-option="--blas=openblas"
# Or if you want local MinkowskiEngine
git clone https://github.com/NVIDIA/MinkowskiEngine.git
cd MinkowskiEngine
export CXX=g++-7
python setup.py install --blas_include_dirs=${CONDA_PREFIX}/include --blas=openblas
설치하려면 python>=3.6 권장합니다. 먼저 아나콘다 문서를 따라 컴퓨터에 아나콘다를 설치하십시오.
conda create -n py3-mink python=3.8
conda activate py3-mink
conda install openblas-devel -c anaconda
conda install pytorch=1.9.0 torchvision cudatoolkit=11.1 -c pytorch -c nvidia
# Install MinkowskiEngine
# Uncomment the following line to specify the cuda home. Make sure `$CUDA_HOME/nvcc --version` is 11.X
# export CUDA_HOME=/usr/local/cuda-11.1
pip install -U git+https://github.com/NVIDIA/MinkowskiEngine -v --no-deps --install-option="--blas_include_dirs=${CONDA_PREFIX}/include" --install-option="--blas=openblas"
# Or if you want local MinkowskiEngine
git clone https://github.com/NVIDIA/MinkowskiEngine.git
cd MinkowskiEngine
python setup.py install --blas_include_dirs=${CONDA_PREFIX}/include --blas=openblas
Anaconda 설치와 마찬가지로 nvcc 와 동일한 CUDA 버전으로 Pytorch를 설치해야합니다.
# install system requirements
sudo apt install build-essential python3-dev libopenblas-dev
# Skip if you already have pip installed on your python3
curl https://bootstrap.pypa.io/get-pip.py | python3
# Get pip and install python requirements
python3 -m pip install torch numpy ninja
git clone https://github.com/NVIDIA/MinkowskiEngine.git
cd MinkowskiEngine
python setup.py install
# To specify blas, CXX, CUDA_HOME and force CUDA installation, use the following command
# export CXX=c++; export CUDA_HOME=/usr/local/cuda-11.1; python setup.py install --blas=openblas --force_cuda
git clone https://github.com/NVIDIA/MinkowskiEngine
cd MinkowskiEngine
docker build -t minkowski_engine docker
Docker가 구축되면 MinkowskiEngine을 올바르게로드하십시오.
docker run MinkowskiEngine python3 -c "import MinkowskiEngine; print(MinkowskiEngine.__version__)"
Minkowski 엔진은 CPU를 지원하여 NVIDIA GPU가없는 다른 플랫폼에서만 빌드합니다. 자세한 내용은 빠른 시작을 참조하십시오.
Minkowski 엔진을 사용하려면 먼저 엔진을 가져와야합니다. 그런 다음 네트워크를 정의해야합니다. 가지고있는 데이터가 양자화되지 않은 경우 (공간) 데이터를 희소 텐서로 복사하거나 양자화해야합니다. 다행스럽게도 Minkowski 엔진은 양자화 기능 ( MinkowskiEngine.utils.sparse_quantize )을 제공합니다.
import torch . nn as nn
import MinkowskiEngine as ME
class ExampleNetwork ( ME . MinkowskiNetwork ):
def __init__ ( self , in_feat , out_feat , D ):
super ( ExampleNetwork , self ). __init__ ( D )
self . conv1 = nn . Sequential (
ME . MinkowskiConvolution (
in_channels = in_feat ,
out_channels = 64 ,
kernel_size = 3 ,
stride = 2 ,
dilation = 1 ,
bias = False ,
dimension = D ),
ME . MinkowskiBatchNorm ( 64 ),
ME . MinkowskiReLU ())
self . conv2 = nn . Sequential (
ME . MinkowskiConvolution (
in_channels = 64 ,
out_channels = 128 ,
kernel_size = 3 ,
stride = 2 ,
dimension = D ),
ME . MinkowskiBatchNorm ( 128 ),
ME . MinkowskiReLU ())
self . pooling = ME . MinkowskiGlobalPooling ()
self . linear = ME . MinkowskiLinear ( 128 , out_feat )
def forward ( self , x ):
out = self . conv1 ( x )
out = self . conv2 ( out )
out = self . pooling ( out )
return self . linear ( out ) # loss and network
criterion = nn . CrossEntropyLoss ()
net = ExampleNetwork ( in_feat = 3 , out_feat = 5 , D = 2 )
print ( net )
# a data loader must return a tuple of coords, features, and labels.
coords , feat , label = data_loader ()
input = ME . SparseTensor ( feat , coordinates = coords )
# Forward
output = net ( input )
# Loss
loss = criterion ( output . F , label ) 토론과 질문은 [email protected] 사용하십시오. API 및 일반 사용에 대해서는 MinkowskiEngine 문서 페이지를 참조하십시오.
API 및 기능 요청에 나열되지 않은 문제의 경우 GitHub 문제 페이지에서 문제를 제출하십시오.
경우에 따라 GPU가 사용하는 컴퓨팅 기능을 명시 적으로 지정해야합니다. 기본 목록에는 아키텍처가 포함되어 있지 않을 수 있습니다.
export TORCH_CUDA_ARCH_LIST= " 5.2 6.0 6.1 7.0 7.5 8.0 8.6+PTX " ; python setup.py install --force_cudaCUDA 10과의 추력에 알려진 문제가 있는데, 이는 손이없는 추력 예외로 이어집니다. 자세한 내용은 문제를 참조하십시오.
이 오류에 대한 몇 가지 원인이 있습니다.
MinkowskiEngine은 교육 중 모든 반복에서 다른 수의 포인트 또는 다른 수의 0이 아닌 요소 수를 처리 할 수있는 특수 라이브러리입니다. 이는 포인트 클라우드 데이터에서 일반적입니다. 그러나, Pytorch는 모든 반복에서 포인트 수 또는 활성화 크기가 변경되지 않는다고 가정하는 경우 구현됩니다. 따라서, Pytorch가 사용하는 GPU 메모리 캐싱은 불필요하게 큰 메모리 소비를 초래할 수 있습니다.
구체적으로, Pytorch는 모든 텐서 생성에 사용되는 할당 속도를 높이기 위해 메모리 공간의 덩어리를 캐시합니다. 메모리 공간을 찾지 못하면 요청 된 크기에 충분히 큰 캐시 메모리가없는 경우 기존 캐시 메모리를 분할하거나 새 공간을 할당합니다. 따라서 Pytorch와 함께 다른 포인트 수 (0이 아닌 요소 수)를 사용할 때마다 기존 캐시를 분할하거나 새 메모리를 예약합니다. 캐시가 너무 파편화되어 모든 GPU 공간이 할당되면 메모리 오류가 발생합니다.
이를 방지하려면 torch.cuda.empty_cache() 로 정기적으로 캐시를 지우십시오.
wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run
sudo sh cuda_11.1.1_455.32.00_linux.run --toolkit --silent --override
# Install MinkowskiEngine with CUDA 11.1
export CUDA_HOME=/usr/local/cuda-11.1; pip install MinkowskiEngine -v --no-deps
MinkowskiEngine은 OpenMP를 사용하여 커널 맵 생성을 병렬화합니다. 그러나 병렬화에 사용되는 스레드의 수가 너무 커지면 (예 : OMP_NUM_THREADS = 80), 모든 스레드가 단순히 멀티 스레드 잠금이 해제 될 때까지 효율성이 빠르게 떨어집니다. 이러한 경우 OpenMP에 사용되는 스레드 수를 설정하십시오. 일반적으로 24 미만의 숫자는 괜찮지 만 시스템에서 최적의 설정을 검색하십시오.
export OMP_NUM_THREADS=<number of threads to use>; python <your_program.py>
Minkowski 엔진을 사용하는 경우 다음을 인용하십시오.
@inproceedings{choy20194d,
title={4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks},
author={Choy, Christopher and Gwak, JunYoung and Savarese, Silvio},
booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
pages={3075--3084},
year={2019}
}
멀티 스레드 커널 맵 생성의 경우 다음을 인용하십시오.
@inproceedings{choy2019fully,
title={Fully Convolutional Geometric Features},
author={Choy, Christopher and Park, Jaesik and Koltun, Vladlen},
booktitle={Proceedings of the IEEE International Conference on Computer Vision},
pages={8958--8966},
year={2019}
}
고차원 컨볼 루션을위한 스트리트 풀링 층의 경우 다음을 인용하십시오.
@inproceedings{choy2020high,
title={High-dimensional Convolutional Networks for Geometric Pattern Recognition},
author={Choy, Christopher and Lee, Junha and Ranftl, Rene and Park, Jaesik and Koltun, Vladlen},
booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
year={2020}
}
생성 전환 컨볼 루션은 다음과 같이 인용하십시오.
@inproceedings{gwak2020gsdn,
title={Generative Sparse Detection Networks for 3D Single-shot Object Detection},
author={Gwak, JunYoung and Choy, Christopher B and Savarese, Silvio},
booktitle={European conference on computer vision},
year={2020}
}
UnitTests 및 Gradcheck의 경우 Torch> = 1.7을 사용하십시오
프로젝트를 추가하려면 Wiki 페이지를 업데이트하십시오!
MinkowskiEngine을 사용하는 프로젝트
세분화 : 3D 및 4D 시공간 시맨틱 세분화, CVPR'19
표현 학습 : 완전 컨볼 루션 기하학적 특징, ICCV'19
3D 등록 : Learning Multiview 3D Point Cloud 등록, CVPR'20
3D 등록 : Deep Global Registration, CVPR'20
패턴 인식 : 기하학적 패턴 인식을위한 고차원 컨볼 루션 네트워크, CVPR'20
탐지 : 3D 단일 샷 객체 감지 용 생성 스파 스 감지 네트워크, ECCV'20
이미지 매칭 : 희소 한 동네 합의 네트워크, ECCV'20