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 소스 빌드를 진행해 보았다.
빌드를 진행해 보다 몇가지 이슈사항이 있었고 결국엔 항상 지나고 나면 별것 아닌 설정들... 거의 하루를 날려버리고 말았다.
그래서 다른이들의 삽질 방지를 위해서 이 또한 기록 해 둔다.
소스 빌드 시 주의사항
사실 소스로 부터 빌드 절차는 그렇게 어렵진 않다. 다큐먼트 순서데로 충실히 수행하면 된다.
제약 조건은 아래와 같고,
- 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를 소스 빌드하는 순간이 얼마나 오겠냐만은... 비슷한 상황의 분들을 위해 정리해 본다.
여하간 오늘의 나의 교훈은
- 로그는 나의 생명줄, 보고 싶은 로그만 보고 넘기지 말자
- 급할수록 천천히 차근차근 하나씩 하나씩