[DiffusionDrive][nuscenes] test script 실행

ad_official·2025년 2월 6일

diffusion planning

목록 보기
3/19

1. 명령어

입력 명령어

bash ./tools/dist_test.sh \
    projects/configs/diffusiondrive_configs/diffusiondrive_small_stage2.py \
    ckpt/diffusiondrive_nusc_stage2.pth \
    1 \
    --deterministic \
    --eval bbox

tools/dist_test.sh

# tools/dist_test.sh 
#!/usr/bin/env bash -> 이 스크립트를 bash 셸에서 실행하도록 지정

CONFIG=$1 -> projects/configs/diffusiondrive_configs/diffusiondrive_small_stage2.py
CHECKPOINT=$2 -> ckpt/diffusiondrive_stage2.pth
GPUS=$3 -> 8
PORT=${PORT:-29610}
"""
dirname $0는 이 스크립트 파일의 디렉토리 경로(tools)를 의미
여기서 /..를 붙여 상위 디렉토리를 지정하고, 
이를 기존의 PYTHONPATH 앞에 추가
 즉, 프로젝트의 최상위 디렉토리가 PYTHONPATH에 포함되어 
 파이썬 모듈들을 올바르게 임포트할 수 있도록 합니다.
"""
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
"""
python3 -m torch.distributed.launch
	파이토치의 분산 실행 모듈을 이용해서 여러 GPU를 사용할 수 있도록 테스트 스크립트를 실행
--nproc_per_node=$GPUS
	노드 당 실행할 프로세스 수를 GPUS 변수의 값(여기서는 8)으로 지정
--master_port=$PORT
	분산 실행 시 통신에 사용할 포트를 지정
--launcher pytorch 옵션
	실행 환경이 PyTorch 분산 환경임을 알림 
${@:4}는 네 번째 이후의 모든 인자를 의미
"""
python3 -m torch.distributed.launch --nproc_per_node=$GPUS 
--master_port=$PORT $(dirname "$0")/test.py 
$CONFIG $CHECKPOINT --launcher pytorch ${@:4}
  • 결론: tools/test.py를 분산 실행 모듈을 이용해서 실행. 인자로는
    • projects/configs/diffusiondrive_configs/diffusiondrive_small_stage2.py
    • ckpt/diffusiondrive_stage2.pth
    • --deterministic
    • --eval bbox

nproc_per_node

"--nproc_per_node=8": 한 노드(여기서는 당신의 컴퓨터)에 8개의 프로세스를 실행하라는 의미

  • 보통 딥러닝 분산 학습에서는 각 프로세스가 하나의 GPU를 사용하도록 설계
  • 만약 컴퓨터에 GPU가 8개라면, 각 프로세스가 서로 다른 GPU를 사용해 병렬 연산을 수행하게 됩니다.
  • 그러나 당신의 컴퓨터에는 GPU가 1개뿐이라면, 8개의 프로세스가 모두 동일한 GPU(대부분 GPU 0)를 공유하게 됩니다.
    • 이 경우 GPU 메모리와 연산 자원이 8개의 프로세스 사이에서 경쟁하게 되어, 성능 저하나 메모리 부족 에러가 발생할 수 있습니다.
  • 따라서 GPU가 1개라면 "--nproc_per_node" 값을 1로 설정하는 것이 좋습니다.



2. tools/test.py

  • tools/test.py를 분산 실행 모듈을 이용해서 실행. 인자로는
    • args.config: projects/configs/diffusiondrive_configs/diffusiondrive_small_stage2.py
    • args.checkpoint: ckpt/diffusiondrive_stage2.pth
    • --deterministic
    • --eval bbox

2.1. 일어나는 수행동작

  • 이 스크립트는
    • 구성 파일과 체크포인트를 기반으로 모델을 구성
    • 데이터셋을 로드
    • 분산 또는 단일 GPU 환경에서 테스트를 수행
    • 최종 평가 지표(예: bbox mAP 등)를 계산

요약

  • 설정 및 초기화:

    • 명령행 인자를 파싱해 구성 파일체크포인트 등 설정 정보를 읽고,
    • 플러그인 모듈을 임포트한 후,
    • 분산 환경(NCCL 등)과 랜덤 시드, 작업 디렉토리를 초기화
  • 데이터와 모델 구성:

    • 테스트 데이터셋과 데이터로더를 구축하고,
    • 구성 파일의 모델 설정에 따라 모델을 생성한 후, 체크포인트에서 가중치를 로드
cfg.model.train_cfg = None
model = build_detector(cfg.model, test_cfg=cfg.get("test_cfg"))
checkpoint = load_checkpoint(model, args.checkpoint, map_location="cpu")
  • 모델은 분산(또는 단일 GPU) 처리를 위해 적절히 래핑

  • 테스트 및 평가:

    • 테스트 함수(single_gpu_test 또는 custom_multi_gpu_test)를 이용해 모델 추론 결과를 수집
    • 결과를 파일로 저장하거나
    • 평가 지표(예: bbox mAP)를 계산하여 출력

본문 (상세하게)

  • 분산 환경을 이용하여 모델 테스트 및 평가가 진행
  • 개념적으로 어떤 일이 일어나는지 단계별로 설명하면 다음과 같습니다.
  1. 명령행 인자 파싱

    • 스크립트가 시작되면 parse_args() 함수가 호출되어,
      • 첫 번째 인자로 전달된 구성 파일(여기서는 projects/configs/diffusiondrive_configs/diffusiondrive_small_stage2.py)
      • 두 번째 인자로 전달된 체크포인트 파일(ckpt/diffusiondrive_stage2.pth)
      • 그리고 추가 옵션(예: --deterministic, --eval bbox) 등이 파싱되어 변수에 저장됩니다.
  2. 구성 파일 로드 및 플러그인 임포트

    • Config.fromfile()를 사용해 구성 파일을 읽어
      • 모델, 데이터, 학습/평가 설정 등 모든 설정 정보를 딕셔너리 형태로 불러옮
    • 만약 구성 파일에 plugin: True가 설정되어 있으면,
      • **지정된 plugin_dir에 있는 사용자 정의 모듈들이 자동으로 임포트되어
      • mmcv의 레지스트리(예: PLUGIN_LAYERS)에 등록**
  3. 분산 환경 초기화

    • 명령행 인자 중 --launcher 옵션을 확인하여 -> 분산 실행 여부를 결정
    • 만약 분산 실행이 활성화되면, init_dist() 함수를 호출하여
      • NCCL(혹은 지정된 backend)를 사용한 분산 환경을 초기화
  4. 랜덤 시드 및 작업 디렉토리 설정

    • 주어진 seed 값을 통해 난수 생성기를 초기화하고, deterministic 옵션에 따라 CUDNN 설정을 조정
    • 구성 파일에서 지정된 work_dir가 없다면, 기본적으로 config 파일 이름을 기반으로 작업 디렉토리를 생성
  5. 데이터셋 및 데이터로더 구성

    • 테스트 데이터셋을 구성하기 위해 build_dataset() 함수를 호출하여 데이터셋 객체를 만듭니다.
    • 분산 여부에 따라 build_dataloader() (분산용) 또는 원래의 build_dataloader_origin() (싱글 GPU용) 함수를 이용하여 데이터 로더를 구성
  6. 모델 생성 및 체크포인트 로드

    • 구성 파일의 model 변수를 기반으로, build_detector() 함수를 호출하여 모델 인스턴스를 생성
    • FP16 설정이 있다면 모델을 wrap하고, 지정한 체크포인트 파일에서 모델 가중치를 로드
    • 만약 checkpoint 메타 정보에 클래스 정보가 있다면 모델에 반영
  7. 모델의 병렬 처리 래핑

    • 분산 실행 모드라면 MMDistributedDataParallel로 모델을 감싸고,
    • 싱글 GPU 모드라면 MMDataParallel로 감싸서
    • 모델을 여러 프로세스(또는 GPU)에서 병렬로 추론할 수 있도록 합니다.
  8. 테스트 수행 및 결과 수집

    • 분산 실행 모드: custom_multi_gpu_test() 함수를 호출해, 모든 프로세스가 테스트를 수행하고 결과를 모음
    • 싱글 GPU 모드: single_gpu_test() 함수로 테스트를 진행
    • 테스트 결과(예: 예측 bounding box 정보 등): 변수 outputs에 저장
  9. 결과 저장 및 평가

    • 만약 --out 옵션이 있다면,
      • 테스트 결과를 pickle 파일로 저장
    • --eval bbox 옵션에 따라,
      • 구성 파일 내 평가 설정추가 평가 옵션을 합쳐서
      • 데이터셋의 evaluate() 함수를 호출,
        • 예측 결과를 평가하고 그 결과를 출력


2.2. diffusiondrive_small_stage2.py

  • 아래는 제공한 구성 파일(프로젝트의 diffusiondrive_small_stage2.py)과 tools/test.py 스크립트를 기반으로,
    • 아래 명령어를 실행했을 때 내부에서 벌어지는 일들을 단계별로 자세하게 설명한 내용
bash ./tools/dist_test.sh \
    projects/configs/diffusiondrive_configs/diffusiondrive_small_stage2.py \
    ckpt/diffusiondrive_stage2.pth \
    8 \
    --deterministic \
    --eval bbox
  • 제공된 구성 파일에 정의된 모델 구조데이터셋, 학습/평가 설정을 기반으로,
    • tools/test.py 스크립트는 분산 환경에서 모델을 생성하고, 체크포인트 가중치를 로드한 후, 테스트 데이터셋에 대해 추론을 실행하고, 그 결과를 평가하는 전 과정을 자동화하여 수행

구성 파일 로드 및 플러그인 임포트

  • 플러그인 활성화
    • 구성 파일 내에 plugin = Trueplugin_dir = "projects/mmdet3d_plugin/"가 설정되어 있으므로,
      • test.py는 importlib를 사용해 해당 디렉토리(즉, 커스텀 모듈들이 위치한 디렉토리)를 임포트
    • 이 과정에서 사용자 정의 클래스들(예를 들어, 커스텀 레이어나 헤드 모듈들)이 mmcv의 레지스트리(예: PLUGIN_LAYERS, HEADS 등)에 등록

데이터셋 및 데이터로더 구축

  • 데이터셋 생성
    • 구성 파일의 data.test 설정에 따라 NuScenes3DDataset 형태의 테스트 데이터셋 객체가 생성
    • 이때, 테스트 파이프라인(이미지 로딩, 전처리, 정규화, Collect 등)이 적용
  • 데이터로더 구성
    • 분산 모드인 경우, 각 프로세스는 DistributedSampler를 사용하여 데이터를 나눠서 로드합니다.
    • 이렇게 만들어진 데이터로더는 모델 추론 시 배치 단위로 데이터를 공급합니다.

모델 생성 및 체크포인트 로드

  • 모델 빌드
    • 구성 파일 내의 model 딕셔너리를 바탕으로, build_detector() 함수를 호출하여 모델 인스턴스가 생성
    • 이 모델에는 이미지 백본(ResNet50 기반), neck (FPN), depth branch, 그리고 핵심인 head 모듈(여기서는 V1SparseDriveHead)이 포함
    • 특히, head 모듈 내부에는
      • motion_plan_head가 구성되어 있으며,
        • 이 안에 refine_layer가 "V11MotionPlanningRefinementModule"으로 설정되어 있습니다.
  • 가중치 로드 및 FP16 적용
    • 지정된 체크포인트 파일(ckpt/diffusiondrive_stage2.pth)에서 모델의 가중치가 로드됩니다.
    • 구성 파일에 fp16 설정이 있으므로, 필요하다면 모델을 FP16 모드로 wrap합니다.


3. 실행


profile
ad_official

0개의 댓글