pytorch 소스 빌드 시 주의사항

pytorch 소스 빌드 시 주의사항
Photo by Kevin Jarrett / Unsplash

회사에서 사용 중인 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를 소스 빌드하는 순간이 얼마나 오겠냐만은... 비슷한 상황의 분들을 위해 정리해 본다.

여하간 오늘의 나의 교훈은

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

Read more

나의 프로그래밍 폰트 사용 일대기

나의 프로그래밍 폰트 사용 일대기

시작은 2003년 이제 막 프로그래머로써 첫발을 내딛을 때부터 나는 프로그래밍 폰트에 대해서 관심이 많은 편이었다. 화면 붙잡고 매일 글자들과 씨름하는 직업이다보니 당연하게도 좀더 눈에 잘 보이고, 보기에 좀더 미려하고 조화스러운 폰트를 찾는 것이 어찌보면 약간 본능(?)적으로 관심을 가졌던게 아닌가 싶기도 하고 말이다. 최근까지도 이 주체할 수 없는 본능에 따라

By Kevin H. Kwon
Istio 를 통한 path(url) 기반 Local Rate Limit 적용

Istio 를 통한 path(url) 기반 Local Rate Limit 적용

몇 년 전인지는 기억나진 않지만 Rate Limit 적용은 항상 애플리케이션 쪽에서 처리하는 것이 당연하다는 것이 주된 의견이었다. 그래서 그때 당시 Bucket4J 를 통해서 Spring 쪽에서 처리하고 했던 기억이 있다. 이제는 당연하게도 Istio와 같은 Service Mesh쪽에서 처리하는 것이 응당 맞다고 생각되는 것이 개발 세상이 이제 점점 더 클라우드향으로 이동된다는 느낌이다. 강력한

By Kevin H. Kwon
Istio를 통한 header기반 API 라우팅/호출 시 cors preflight request 이슈 트러블슈팅 기록

Istio를 통한 header기반 API 라우팅/호출 시 cors preflight request 이슈 트러블슈팅 기록

현재 개발하고 있는 일부 컨테이너 기반의 서비스들을 Istio를 통해 서비스들을 구성하고 트래픽을 관리하고 있다. 이때 컨테이너 서비스가 같은 규격이 여러개가 같은 url과 port를 할당 받아서 사용해야는 애로 사항이 있어 Istio에서 header 기반으로 특별한 헤더가 있는 경우에만 라우팅이 될 수 있도록 구성하고 테스트를 진행했었다. Istio Request Routing 예제와 같이 header

By Kevin H. Kwon
Kubernetes cluster에 Feature gates 활성화 방법

Kubernetes cluster에 Feature gates 활성화 방법

최근에 nvidia a100 gpu를 mig로 나눠서 사용 하는 노드에서 cadvisor가 gpu metric을 수집을 잘 못해서 kubulet에서 계속 오류가 떨어져서 트러블슈팅을 진행했었다. dcgm-exporter로 prometheus로 metric을 수집하고 있어서 굳이 cadvisor에서 nvidia accelerator meric을 수집할 이유가 없어져서 이것저것 자료를 찾아보니 1.19 버전부터는 DisableAcceleratorUsageMetrics feature gates로 해당 수집 옵션을 비활성화 시킬 수 있는

By Kevin H. Kwon