개요

업무를 하다가 Retinaface 프로젝트를 다뤄 볼 일이 있어서 해당 프로젝트의 개발 프레임워크인 mxnet을 셋팅하였다. 다른 여타 딥러닝 프레임워크 처럼 설치는 어렵지 않았다. 목적은 GPU 하드웨어를 사용하는 mxnet 최신버전을 설치하는 것이다. 설치 환경은 다음과 같았다.

  • Ubuntu 18.04
  • python 3.8.15
  • conda 환경 사용

CUDA & cuDNN

  • NVIDIA Driver 는 이미 설치되어있다고 가정한다.
  • CUDA 11.X 버전 설치: CUDA Archive Link
    • 프로덕션 용으로 설치 할 때. 즉, 환경이 특정 버전만 존재하면 될 때는 데비안(deb) 파일로 런타임만 설치하는 것이 빠를 수도 있다. 하지만 본인은 개발 용으로 설치하는 것이기에 범용 리눅스용인 .run 파일을 통해 설치한다. 테스트 버전은 11.6 버전으로 설치하였다.
      $ wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux.run
      $ sudo sh cuda_11.6.2_510.47.03_linux.run
      
    • CUDA 설치는 공식 설치문서들이 잘되어 있기에 자세한 설치내용을 언급하진 않는다.
  • cuDNN 8.x 설치: cuDNN Archive Link
    • 테스트 버전은 8.4.1 버전을 Linux x86 아키텍쳐에 맞게 tar 파일로 설치하였다. 이 또한 개발용 데비안 파일로 설치하는 것은 지양하였다. 앞서 cuDNN을 위한 사전 설치 패키지가 필요할 수 있다.
      $ sudo apt install zlib1g
      
    • cuDNN 설치 또한 공식 설치 문서를 참고하여 설치하자.

NCCL

NCCL은 NVIDIA Collective Communications Library 의 약자로 멀티 GPU 환경 및 멀티 노드 환경에서 NVIDIA GPU가 최적화된 동작을 할 수 있게해주는 라이브러리. mxnet 프레임워크는 사용 시 해당 라이브러리를 필요로 한다.​ NCCL 설치링크

  • CUDA 11.x를 사용하므로 Download NCCL 2.17.1, for CUDA 11.0, February 28th, 2023 클릭
    • O/S agnostic local installer 를 통해 압축된 파일을 받음: nccl_2.17.1-1+cuda11.0_x86_64.txz
    • 다운로드 파일을 압축해제한 디렉토리를 적당히 /usr/local 같은 경로에 넣고 nccl의 lib 디렉토리 경로를 LD_LIBRARY_PATH에 추가한다. 아래의 예시는 압축해제한 디렉토리 이름을 nccl_2.17.1-1+cuda11.0로 간결하게 바꿔주었다.
      # Add LD_LIBRARY_PATH
      export LD_LIBRARY_PATH=/usr/local/nccl_2.17.1-1+cuda11.0/lib:$LD_LIBRARY_PATH
      

MXNET INSTALL

GPU 하드웨어용 mxnet python 휠 파일은 mxnet-cuXXX 포맷의 이름으로 제공하고 있다. 예를 들면 CUDA 11.4에 맞게 빌드 된 mxnet 휠 파일은 mxnet-cu114 이다.

  • 23년 4월 기준 CUDA 11.0, 11.2 버전에 대해선 1.8.x,1.9.x, 2.0.x` 버전 제공한다.
  • 23년 4월 기준 CUDA 11.1, 11.3 ~ 11.7 버전에 대해선 1.0.0, `1.9.1 버전 제공한다.
  • 본인의 테스트 환경은 CUDA 11.6 버전을 사용했기에 mxnet-cu116에 대해 1.9.1 버전 설치
# create env
$ conda create --name mxnet python==3.8.15
$ conda activate mxnet

$ pip install -U pip
$ pip install mxnet-cu116=1.9.1

설치확인

mxnet이 제대로 설치되었는지, GPU를 제대로 인식하는지 다음과 같이 확인할 수 있다. mxnet을 사용하는 환경에서 python 콘솔을 통해 확인한다.

import mxnet as mx
mx.__version__
>>> 1.9.1

mx.gpu()
>>> gpu(0)

mx.context.num_gpus()
>>> 1

MXNET 네트워크 모델 구조

하나의 네트워크 모델은 심볼(symbol)과 파라미터(params)로 나눠진다. 심볼은 우리가 일반적으로 이야기하는 네트워크 구조를 담고 있는 아키텍쳐, 파라미터는 네트워크의 가중치로 생각하면 된다. 심볼의 파일 포맷은 {네트워크이름}-symbol.json과 같다. 또한 파라미터의 파일 포맷은 {네트워크이름}-{epoch:%04d}.params.과 같다. 예를 들어 네트워크 이름이 resnet50이고 학습 된 에폭이 10인 모델의 심볼과 파라미터는 resnet50-symbol.jsonresnet50-0010.params로 볼 수 있다.

모델 Load

mxnet 상에서 모델을 로드하기 위해 위 내용에서 언급한 네트워크 이름에폭이 필요하다. 네트워크 모델 로드는 다음 API 를 참고한다. mxnet.model.load_checkpoint

# mxnet model load
# network name - resnet50, epoch = 10
sym, arg_params, aux_params = mx.model.load_checkpoint('resnet50', 10)

댓글남기기