[Deeplearning]Mseg3D 환경 구성 및 학습 (Docker, SemanticKITTI dataset)


lidarseg3d(Mseg3D)

 

GitHub - jialeli1/lidarseg3d: A repository for LiDAR 3D semantic segmentation in autonomous driving scenarios.  Also the officia

A repository for LiDAR 3D semantic segmentation in autonomous driving scenarios. Also the official implementations of our ECCV 2022 paper (SDSeg3D) and CVPR 2023 paper (MSeg3D). - jialeli1/lidarseg3d

github.com

Mseg3D installation을 보면 전반적으로 버전이 낮은 것들을 볼 수 있습니다. 그러나 제가 가지고 있는 GPU는 40 시리즈이기에 compute capability가 cuda11.8 이상을 지원합니다. Mseg3D는 cuda11.0의 기준으로 개발되어 있어 그대로 따라 할 수가 없었습니다.
제 나름대로 하드웨어의 스펙에 맞게 맞추어 보았습니다.

 

개발 환경

  • docker
  • 기본 이미지 : nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
  • GPU : RTX 4060 for laptop (VRAM 8GB)
  • Pytorch2.x                                                                                # cuda 11.8 기준 최소 사양
  • python3.9                                                                                 # cuda 11.8 기준 최소 사양
  • 기타 등등

  cuda11 버전을 맞추고자 최소 호환 cuda 버전인 cuda 11.8 기반의 cuda 이미지를 docker hub에서 다운로드하였습니다.  이거 외에도, PyTorch에서 cuda, PyTorch가 기본적으로 설치된 이미지도 존재하여 PyTorch 설치 수고를 줄여주긴 하지만, cuda는 nvidia에서 만들었으니 nvidia에서 만든 이미지가 더 안전성이 좋을 것 같아 nvidia 이미지로 진행하였습니다. 

docker pull nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04

 
아래 Dockerfile을 통해 먼저 빌드하였으며 pytorch는 빌드 후 컨테이너에서 설치하였습니다.

Dockerfile
0.00MB

 

아래 과정을 모두 수행한 최종 결과의 이미지(데이터셋 제외)파일은 이곳에서 확인할 수 있습니다.

 

https://hub.docker.com/repository/docker/kimkyeonghyeon/mseg3d/general

 

hub.docker.com

 

설치 ( Installation )

Pytorch

cuda 11.8에 맞는 pytorch 버전 설치

pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu118

 

Python

pytorch버전에 따른 python3.9 설치(dockerfile)
pip check를 통해 종속성을 확인하며 설정을 합니다.
 

github에서 요구하는 설치 항목들

waymo는 사용하지 않고 semantickitti dataset을 사용할 거기에 requirements.txt에서 waymo 관련한 건 주석 처리 하였습니다.
cuda 환경 변수 설정하고 bash setup.sh를 하게 되면 THC/THC.h 관련한 오류가 나올 것입니다. 해당 오류는 pytorch1.x에서 2.x로 넘어오면서 해당 헤더파일이 사라졌기 때문입니다. 이 문제는 아래와 같이 바꿔주면 해결됩니다.

# det3d/ops/pointnet2_batch/src 안의 ball_query.cpp, sampling.cpp, group_points.cpp 
# det3d/ops/pointnet2_stack/src 안의 cpp 파일들
# THC 관련 extern 주석 처리 혹은 삭제

include <THC/THC.h> 
         |
         V
include <ATen/cuda/CUDAContext.h>
include <ATen/cuda/CUDAEvent.h>

또한 GCC를 통한 컴파일을 하기 위해서는 Compute Capability를 지정해주어야 합니다.

export PYTHONPATH="${PYTHONPATH}:/root/lidarseg3d"

export PYTHONPATH="${PYTHONPATH}:/root/lidarseg3d/nuscenes-devkit/python-sdk"

export PATH=/usr/local/cuda-11.8/bin:$PATH
export CUDA_PATH=/usr/local/cuda-11.8
export CUDA_HOME=/usr/local/cuda-11.8
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

export TORCH_CUDA_ARCH_LIST="8.9"

 
mmcv 설치(cuda와 pytorch에 호환되는)

pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0/index.html

 
spconv 설치
githhub에서는 commit 주소를 언급하며 해당 주소를 통해서 설치하라고 하지만 따라 하면 설치를 할 수없습니다. 
spconv에서 cuda 버전에 따라 설치 방법을 구분해 놓았으므로 spconv에서 알려주는 대로 설치하면 정상적으로 설치하고 종속성도 잘 유지되는 것도 확인할 수 있습니다.

pip install spconv-cu118

 
 
 
 

Dataset( SemanticKITTI )

data set은 label dataset나머지(이미지, poses 등등)를 설치하고 아래의 형식에 맞게 데이터셋을 구성하면 됩니다.
인터넷이 아무리 빨라도 서버의 다운로드 속도가 빠르지 않으므로 적어도 3시간 정도는 걸린다고 생각하고 다운로드하면 됩니다.

# For semanticKITTI Dataset         
└── lidarseg3d
       └── data    
           └── SemanticKITTI
                └── dataset       
                    └── sequences     
                        ├── 00        
                            ├── calib.txt 
                            ├── poses.txt
                            ├── times.txt
                            ├── image_2   <-- front camera image files
                            ├── velodyne  <-- point cloud files
                            └── labels    <-- annotations for train set
                        ├── 01   
                        ├── 02   
                        ├── ...
                        ├── 20 
                        ├── 21

- 특이사항
image_2는 왼쪽, image_3는 오른쪽 카메라
calib.txt는 data_odometry_calib 폴더에 있는 자료가 Tr 데이터를 가지고 있어 해당 폴더에서 가지고 오도록 합니다.
( Tr: LiDAR 좌표계와 카메라 좌표계 간의 변환 행렬 )
11번 디렉토리부터 test dataset 이므로 label 데이터가 없습니다.
 
work_dir에 사전 학습된 모델 파라미터 저장
 
 
 
 

학습

#학습
python -m torch.distributed.launch --nproc_per_node=1 ./tools/train.py configs/semantickitti/MSeg3D/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12.py
                                           #  GPU 개수              학습 모드                   CONFIGPATH      
                                    
# 테스트
python -m torch.distributed.launch --nproc_per_node=4 ./tools/dist_test.py configs/semantickitti/MSeg3D/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12.py --work_dir work_dirs/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12 --checkpoint work_dirs/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12/latest.pth
 
# 단일 GPU 및 추론 시간 측정
python ./tools/dist_test.py CONFIG_PATH --work_dir work_dirs/CONFIG_NAME --checkpoint work_dirs/CONFIG_NAME/latest.pth --speed_test

 
위 실행 방법은 pytorch 1.10부터 권장되지 않는 방법으로 실행이 되지 않습니다. 그 대신 torchrun을 통한 학습을 수행합니다. 그리고 waymo와 관련해서 오류가 발생하는데, 오류 경로를 따라 들어가 waymo 관련 코드를 주석 처리하면 해결됩니다. 그러나 버전이 코드 작성자와 같은 것이 없기 때문에 오류가 멈추지 않습니다. spconv 또한 1.x 기준이기에 2.x 기준으로 바꿔주어야 합니다.

torchrun --nproc_per_node=1 ./tools/train.py configs/semantickitti/MSeg3D/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12.py

 

spconv

2.x 버전부터 API가 변경되어 아래와 같이 사용 방식이 변경되었다. 
/usr/local/lib/python3.9/dist-packages/spconv/pytorch/__init__.py를 보면 어떻게 변경을 하면 좋을지 확인할 수 있습니다.

# /usr/local/lib/python3.9/dist-packages/spconv/pytorch/__init__.py
 
import platform
from pathlib import Path
from typing import Union

import numpy as np
import torch
from spconv.pytorch.core import SparseConvTensor
from spconv.pytorch import functional, ops
from spconv.pytorch.conv import (SparseConv1d, SparseConv2d, SparseConv3d,
                                 SparseConv4d, SparseConvTranspose1d,
                                 SparseConvTranspose2d, SparseConvTranspose3d,
                                 SparseConvTranspose4d, SparseInverseConv1d,
                                 SparseInverseConv2d, SparseInverseConv3d,
                                 SparseInverseConv4d, SubMConv1d, SubMConv2d,
                                 SubMConv3d, SubMConv4d)
from spconv.pytorch.identity import Identity
from spconv.pytorch.modules import (SparseModule, SparseSequential,
                                    assign_name_for_sparse_modules, SparseBatchNorm,
                                    SparseReLU, SparseIdentity)
from spconv.pytorch.ops import ConvAlgo
from spconv.pytorch.pool import (SparseMaxPool1d, SparseMaxPool2d,
                                 SparseMaxPool3d, SparseMaxPool4d,
                                 SparseAvgPool1d, SparseAvgPool2d,
                                 SparseAvgPool3d, SparseGlobalMaxPool,
                                 SparseGlobalAvgPool)
from spconv.pytorch.tables import AddTable, ConcatTable, JoinTable

 
scn_unet.py 변수 설정
spconv 버전을 2.x를 사용하다 보니 이전 버전에서는 허용되는 것이 안 되는 문제가 생겨  forward 함수에서 x 와 out 설정을 바꾸었습니다. github에 업로드해두도록 하겠습니다.
 

최종 학습

spconv2.x 에 맞게 코드까지 변경을 하였다면 학습을 진행할 수 있습니다. 그러나 docker를 이용하다 보니, memory가 부족, 임시 저장공간(/tmp) 부족, 공유메모리 부족으로 인해 학습이 불가하였습니다. 

# 먼저 /tmp 디렉토리를 비운다.
rm -rf /tmp/*
# 공유 메모리 증가법
# 컨테이너 실행 전
docker run --mount type=tmpfs,target=/tmp,tmpfs-size=4096M my_image
 
# 컨테이너 실행 후
docker exec -it <container_id> mount -o remount,size=4G /tmp
# 공유메모리 증가법
# 컨테이너 실행 할때
docker run --shm-size=16g <다른 옵션들>  <이미지 이름>
# 실행 중인 컨테이너에게
docker exec -it <container_id> mount -o remount,size=16g /dev/shm

설정을 하여도 메모리 오버가 나게 됩니다. 이때 batch size를 줄이면 메모리 사용량이 줄어들기 때문에 batch size를 줄이면 학습이 진행이 됩니다.

#/lidarseg3d/configs/semantickitti/MSeg3D/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12.py
samples_per_gpu=1,  #메모리 사용량 줄이기 
workers_per_gpu=1,  #메모리 사용량 줄이기

 
최종적으로 학습을 돌리면 아래 사진과 같이 2일이 걸리게 됩니다....... 나중에 메모리가 적어도 12gb 정도 되는 gpu로 실행을 해야 할 것 같습니다.

torchrun --nproc_per_node=1 ./tools/train.py configs/semantickitti/MSeg3D/semkitti_avgvfe_unetscn3d_hrnetw18_lr1en2_e12.py

 

학습

 

반응형

'Robotics > Decision Making' 카테고리의 다른 글

시뮬레이션 활용하기  (0) 2025.05.10