pytorch 소스 빌드 시 주의사항

회사에서 사용 중인 H100*8ea 머신에서 pytorch로 llama3 80b 모델을 양자화하고 파인튜닝하는 내부 PoC 진행 중에 이쪽 세계에서 꽤 유명한(?) 오류를 지속적으로 만나게 됐다.

unhandled cuda error (run with NCCL_DEBUG=INFO for details), NCCL version 2.xx.x

진짜 불친절하게도 NCCL_DEBUG=INFO 를 주고 로그 레벨을 더 내리고 해봐도 로그상 별다른 문제(결국 답은 로그에 있었지만..)를 찾을수는 없었고, nccl 문제인건가 버전을 내렸다 올렸다. cuda 문제인가 버전을 내렸다 올렸다. 열심히 삽질 하던 중 pytorch github issue 이잡듯 뒤지다가 cuda12.4에서 pytorch를 소스 빌드해서 해결했다는 메세지를 보고 한번 시도해 볼까 해서 pytorch 소스 빌드를 진행해 보았다.

😀
여담이지만, 사실 위 오류는 nccl이나 pytorch, cuda 문제는 아니였고, lora 옵션을 잘못줘서... 단순히 메모리가 부족해서 나던 휴먼 에러였긴 했다. 근데 로그도 너무 불친절하긴 하다. pytorch/nvidia 반성하라..

빌드를 진행해 보다 몇가지 이슈사항이 있었고 결국엔 항상 지나고 나면 별것 아닌 설정들... 거의 하루를 날려버리고 말았다.

그래서 다른이들의 삽질 방지를 위해서 이 또한 기록 해 둔다.

소스 빌드 시 주의사항

사실 소스로 부터 빌드 절차는 그렇게 어렵진 않다. 다큐먼트 순서데로 충실히 수행하면 된다.

GitHub - pytorch/pytorch: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Tensors and Dynamic neural networks in Python with strong GPU acceleration - pytorch/pytorch

build from source

제약 조건은 아래와 같고,

  • Python 3.8 or later (for Linux, Python 3.8.1+ is needed)
  • A compiler that fully supports C++17, such as clang or gcc (gcc 9.4.0 or newer is required)

나머지 의존성 설치는 conda 환경 기준으로 되어 있어서 나처럼 pip 만 사용할 수 있는 환경이면 약간 애로사항이 꽃 필 수 있다.

최종적으로는 컨테이너 기반에서 작업을 해야 하고 DDP(Distributed Data parallel)OpenMPI 를 통한 분산 기능을 사용해야 해서 먼저 base 이미지는 ubuntu 22.04에 OpenMPI를 먼저 설치 했었다.

FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04

# 기타 내가 필요한 라이브러리들 설치...

# Install Open MPI
RUN \
    echo "Install Open MPI 4.1.6" \
    && mkdir /tmp/openmpi \
    && cd /tmp/openmpi \
    && wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.6.tar.gz \
    && tar zxf openmpi-4.1.6.tar.gz \
    && cd openmpi-4.1.6 \
    && ./configure --prefix=/usr  --enable-orterun-prefix-by-default  --with-cuda=$CUDA_HOME --with-cuda-libdir=$CUDA_HOME/lib64/stubs --with-slurm  > /dev/null \
    && make -j $(nproc) all \
    && make -s install \
    && ldconfig \
    && rm -rf /tmp/openmpi \
    && ompi_info | grep "MPI extensions"

그리고 pytorch 소스를 클론 받고 아래와 같은 스크립트를 통해 실제 빌드 작업을 진행했다.

python -m pip install mkl-include mkl-static ninja scikit-build
python -m pip install -r requirements.txt

export CMAKE_PREFIX_PATH="/usr/include/openmpi;/usr/lib/openmpi;/usr/lib"

USE_CUDA=1 \
USE_CUDNN=1 \
USE_MPI=1 \
USE_SYSTEM_NCCL=1 \
USE_ROCM=0 \
NCCL_INCLUDE_DIR=/usr/include \
python setup.py develop

여기서 주의 할점은 2가지 정도이고, 나머지는 빌드 옵션에 따라 약간 차이가 있다.

  • CMAKE_PREFIX_PATH에서 openmpi 의 헤더 파일 위치와 공유라이브러리(so)파일 있는 위치를 정확하게 지정하지 않으면 MPI 가 활성화 되지 않은채 빌드된다.
  • NCCL_INCLUDE_DIR 도 정확하게 지정해야 한다. NCCL 활성화 실패...

이 별거 아닌 설정 2개 찾느라 거의 하루를 날린 듯 하다.

정리

pytorch를 소스 빌드하는 순간이 얼마나 오겠냐만은... 비슷한 상황의 분들을 위해 정리해 본다.

여하간 오늘의 나의 교훈은

  • 로그는 나의 생명줄, 보고 싶은 로그만 보고 넘기지 말자
  • 급할수록 천천히 차근차근 하나씩 하나씩