[LLM] RTX4000 시리즈 Multi-GPU P2P 이슈 대응
앞서 RTX4090이 2개 설치된 워크스테이션을 설치해 개발을 시작했다. 대용량 LLM을 사용하려면 2개의 GPU에 샤딩된 모델을 업로드해야 한다. 그런데, PyTorch의 to 함수가 정상적으로 동작하지 않았다. 1개의 GPU만 사용하면 물리 메모리가 충분하지 않아 큰 LLM을 사용할 수 없다는 문제에 직면하게 된다. LLM은 덩어리가 클 수록 친절해지기 때문에 최소 10B이상을 사용하고 있다.
결국 TensorFlow framework에 문제가 발생했는데, NCCL all_recude를 비활성화하면 동작한다는 것을 확인했다. 확인 결과 이 문제는 nVIDIA Driver의 문제이며, RTX 4000 시리즈에서 폭넓게 발생하고 있는데, Driver Version 545.x.x 까지 공통적으로 발생한다고 한다. 앞선 포스트에서 설치한 드라이가 535.171.04이기 때문에 동작하지 않는 건 당연한 결과였다.
ubuntu-drivers를 통해 가장 최신 버전을 확인해보면 현 시점에서 추천 드라이버 버전은 535 이며, 가장 최신의 버전은 545였다. 이 문제를 해결하려면 550 을 설치해야 한다.
root@OneLabsMLA:/opt/LLM/hub# ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0 == modalias : pci:v000010DEd00002684sv00001043sd000088E2bc03sc00i00 vendor : NVIDIA Corporation driver : nvidia-driver-535 - distro non-free recommended driver : nvidia-driver-545-open - distro non-free driver : nvidia-driver-535-server - distro non-free driver : nvidia-driver-535-open - distro non-free driver : nvidia-driver-535-server-open - distro non-free driver : nvidia-driver-545 - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin
현재 설치되어 있는 nVIDIA 드라이버 및 모든 라이브러리를 삭제해야 한다. 깨끗하게.
# nVIDIA 관련 자료를 모두 삭제한다. nVIDIA 를 먼저 삭제해야 관련 라이브러리들을 삭제할 수 있다. onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*nvidia*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cuda*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cudnn*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cublas*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cufft*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cufile*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*curand*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cusolver*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*cusparse*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*gds-tools*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*npp*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*nvjpeg*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "nsight*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*nvvm*" onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get --purge remove "*libnccl*" # 찌꺼기를 삭제하자 onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get autoremove onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get autoclean # 완벽하게 삭제되었는지 확인하자 onelabs@OneLabsMLA:/opt/LLM/hub# apt list --installed | grep cuda onelabs@OneLabsMLA:/opt/LLM/hub# apt list --installed | grep cudnn onelabs@OneLabsMLA:/opt/LLM/hub# apt list --installed | grep nvidia # 그리고 리부팅 onelabs@OneLabsMLA:/opt/LLM/hub# sync onelabs@OneLabsMLA:/opt/LLM/hub# sudo reboot
550 버전의 드라이버를 설치하자.
# nVIDIA repo 를 추가하자 onelabs@OneLabsMLA:/opt/LLM/hub# sudo add-apt-repository ppa:graphics-drivers/ppa onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get update # 가장 최신 드라이버를 찾아보면 550이 보인다. onelabs@OneLabsMLA:/opt/LLM/hub# apt search --names-only nvidia-driver ... nvidia-driver-550/jammy-updates,jammy-security 550.67-0ubuntu1.22.04.2 amd64 NVIDIA driver metapackage nvidia-driver-550-open/jammy-updates,jammy-security 550.67-0ubuntu1.22.04.2 amd64 NVIDIA driver (open kernel) metapackage ... # 드라이버를 설치하자 onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt install nvidia-driver-550 # 리부팅 onelabs@OneLabsMLA:/opt/LLM/hub# sync onelabs@OneLabsMLA:/opt/LLM/hub# sudo reboot드
드라이버가 성공적으로 설치 됐는지 확인해보자. 필요한 CUDA 버전은 12.4다.
개발에 필요한 라이브러리(CUDA Toolkit, cuDNN)을 설치하자.
- https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local
- https://developer.nvidia.com/cudnn-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local
NCCL설치를 위해서는 nVIDIA 가입이 필요하다
- https://developer.nvidia.com/nccl
# 멀티-GPU를 위한 NCCL 과 GPUDirect를 설치하자 onelabs@OneLabsMLA:/opt/LLM/hub# wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb onelabs@OneLabsMLA:/opt/LLM/hub# sudo dpkg -i cuda-keyring_1.0-1_all.deb onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get update onelabs@OneLabsMLA:/opt/LLM/hub# sudo apt-get install libnccl2 nvidia-gds
이제 모델을 GPU에 올려보면 2대의 GPU 에 균등 분배가 되는 모습을 확인할 수 있다. 10B 모델은 대략 27GBytes의 GPU메모리를 사용한다.