£200로 데이터센터 GPU를 게이밍 PC에 넣기

1 hour ago 1
  • RTX 4080 16GB만으로 부족한 로컬 LLM 환경을 보완하기 위해 중고 Tesla V100 SXM2 16GB와 어댑터를 약 £200에 추가해 총 32GB VRAM을 구성함
  • V100 SXM2는 PCIe 슬롯·디스플레이 출력·일반 전원 커넥터가 없는 서버용 GPU지만, SXM2-to-PCIe 어댑터로 게이밍 PC에 장착 가능했음
  • 서버용 팬은 기본 82dB로 실내 사용이 어려웠으나, PH2.0-2.54mm 점퍼 케이블로 메인보드 팬 헤더에 연결해 PWM 제어와 저소음 운용을 달성함
  • llama.cpp의 tensor splitting으로 RTX 4080과 V100에 Qwen3.6-27B-MTP Q5_K_M을 나눠 올려 128k 컨텍스트와 약 32 tok/s 추론 속도를 얻음
  • 단일 32GB GPU만큼 깔끔하지 않고 드라이버·CUDA·warm reboot 문제가 남지만, 중고 서버 GPU는 저렴한 로컬 LLM VRAM 확장 대안이 될 수 있음

£200로 구성한 32GB 로컬 LLM 환경

  • RTX 4080 16GB VRAM만으로는 원하는 로컬 모델 실행에 부족해, 중고 데이터센터 GPU를 어댑터로 게이밍 PC에 추가함
  • Tesla V100 SXM2 16GB와 SXM2-to-PCIe 어댑터를 합쳐 약 £200에 구매해, 두 GPU 합산 32GB VRAM 환경을 구성함
  • 27B 파라미터 모델을 두 GPU에 나눠 올려 약 32 tokens/s로 실행했고, 전체 모델과 컨텍스트가 VRAM에 들어감
  • 단일 32GB 소비자 GPU와 같은 경험은 아니지만, RTX 5090 32GB보다 훨씬 낮은 비용으로 VRAM 용량을 확보함

Tesla V100 SXM2와 어댑터

  • Tesla V100 SXM2 16GB는 NVIDIA DGX 서버와 하이퍼스케일러 랙용 GPU임
    • 일반 PCIe 슬롯, 디스플레이 출력, 일반 전원 커넥터가 없음
    • 서버 내부의 독자 보드에 장착되고 NVLink로 통신하는 구조임
    • 메인보드에 직접 꽂으려면 별도 어댑터가 필요함
  • V100은 Volta GPU이며 16GB HBM2 메모리와 5120 CUDA 코어를 갖고 있음
    • eBay 구매가는 약 £150였음
    • 2017년 GPU지만 연산 성능과 VRAM은 로컬 LLM 용도에서 여전히 유효함
  • HBM2 메모리 대역폭이 주요 장점임
    • V100은 4096-bit 메모리 버스로 900GB/s 대역폭을 제공함
    • RTX 4080의 GDDR6X 대역폭 736GB/s보다 22% 높음
    • Apple M3 Max 400GB/s, M4 Max 546GB/s, M5 Max 614GB/s보다 높음
  • AMD RX 7900 XTX는 24GB GDDR6와 960GB/s 대역폭으로 V100보다 약간 높지만 가격은 £700 이상임
    • ROCm의 LLM 추론 지원은 CUDA 대비 아직 거칠다고 평가됨
    • V100은 RX 7900 XTX 대역폭의 94%를 4분의 1 미만 가격에 제공하고 llama.cpp와 함께 동작함
  • RTX 5090은 1,792GB/s 대역폭으로 V100을 확실히 앞서지만 가격이 £2,000 이상임
    • LLM 추론에서는 메모리 대역폭이 tokens/s를 좌우하는 병목이어서 중요한 요소가 됨
  • SXM2-to-PCIe 어댑터는 NVIDIA 공식 제품이 아니며 공식 지원도 없음
    • 한쪽에는 SXM2 소켓, 다른 쪽에는 PCIe 에지 커넥터가 있는 bare PCB 형태임
    • 가격은 약 £50였고, 전체 구성 비용은 약 £200이 됨
    • 어댑터 덕분에 V100 16GB를 RTX 4080과 함께 메인보드에 꽂을 수 있었음

서버용 냉각 팬 문제와 해결

  • V100 SXM2는 2U 서버의 산업용 냉각 환경에서 동작하도록 설계됨
    • 어댑터의 팬은 일반 방에서 쓰기 어려운 수준으로 시끄러움
    • Apple Watch로 측정한 소음은 82dB였고, 쓰레기 처리기와 잔디깎이 사이 수준으로 표현됨
  • 기본 상태에서는 팬 제어가 되지 않았음
    • nvidia-smi, Linux 장치 탐색, Windows Afterburner 시도가 모두 실패함
    • 어댑터의 팬은 서버 랙 내부에서 100%로 계속 도는 전제를 가진 것으로 보임
  • 9V 배터리 테스트로 팬 핀 배열을 확인함
    • VCC와 ground에 점퍼선을 꽂고 9V 배터리를 대자 팬이 회전함
    • 12V 기본 구동보다 훨씬 조용해져 팬 제어 가능성이 확인됨
  • 팬은 표준 PC 케이스 팬과 유사하게 동작했음
    • 점퍼선을 팬 커넥터에 꽂고 다른 쪽을 메인보드의 예비 팬 헤더에 연결함
    • 메인보드가 RPM을 읽고 PWM 제어도 가능했음
    • 10% 속도로 유지해도 풀로드에서 50°C를 넘지 않았고, 거의 들리지 않는 수준이 됨
  • 최종 케이블은 2.54mm male to PH2.0 female jumper cable로 구성함
    • 어댑터의 팬 커넥터는 4핀 JST PH2.0 플러그임
    • 메인보드 팬 헤더는 표준 0.1 inch, 즉 2.54mm 피치임
    • PH2.0 female 쪽은 팬의 tachometer와 PWM 핀에, 2.54mm male 쪽은 메인보드 팬 헤더에 연결함
    • £2 수준의 점퍼 케이블과 커넥터 확인으로 82dB 문제를 해결함

두 GPU로 VRAM 확장하기

  • 최종 GPU 구성은 다음과 같음
    • RTX 4080: 16GB VRAM, Ada 아키텍처
    • Tesla V100: 16GB VRAM, Volta 아키텍처
    • 합계: 두 GPU에 걸쳐 32GB VRAM
  • llama.cpp는 tensor splitting으로 모델을 두 GPU에 나눠 실행할 수 있음
    • PCIe 버스를 통해 레이어를 파이프라인 처리함
    • RTX 4080이 일부 레이어를 처리하고 V100이 나머지를 처리함
    • 단일 32GB GPU보다 빠르지는 않지만 동작하며, 32GB GPU 비용의 약 10% 수준으로 구성됨
  • V100의 전력 사용량은 최대 약 150W 수준으로 관찰됨
    • 로컬 LLM 추론용 GPU로 작지는 않지만 비정상적으로 큰 수준은 아님
  • V100 32GB 모델도 선택지로 남아 있음
    • 구매한 가격의 두 배 이상이지만, 단일 카드에서 32GB HBM2를 몇백 파운드로 확보할 수 있음
    • 32GB V100 두 장이면 64GB VRAM을 만들 수 있으며, 현재 RTX 5090 가격의 약 20% 수준으로 표현됨
  • SXM2 형식은 NVLink를 기본 지원함
    • 제대로 된 멀티 GPU 구성을 만들 경우 GPU끼리 높은 대역폭으로 통신 가능함
    • PCIe 어댑터를 통해서도 tensor split 성능은 충분히 견고했음

NixOS에서 드라이버와 CUDA 맞추기

  • 소프트웨어 구성은 NixOS 덕분에 비교적 매끄럽게 진행됨
  • V100은 Volta 칩이고, NVIDIA는 드라이버 branch 560부터 Volta 지원을 중단함
    • RTX 4080 Ada와 V100 Volta를 동시에 지원하는 마지막 드라이버는 550.x branch임
    • NixOS에서는 nvidiaPackages.legacy_535에 해당함
  • 해당 드라이버는 CUDA 12.2까지만 지원함
    • 현재 nixpkgs는 CUDA 12.6 이상을 제공함
    • CUDA 12.2를 nixpkgs 24.05에서 가져와야 했음
  • 드라이버는 Linux kernel 6.6을 요구함
    • legacy 드라이버는 더 최신 커널을 지원하지 않음
  • 헤드리스 추론 서버인데도 services.xserver.enable = true가 필요했음
    • 이 설정 없이는 NVIDIA 커널 모듈이 로드되지 않음
  • 핵심 NixOS 설정은 커널, NVIDIA legacy 드라이버, X server NVIDIA 드라이버 지정으로 구성됨
boot.kernelPackages = pkgs.linuxPackages_6_6; hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535; services.xserver.enable = true; services.xserver.videoDrivers = [ "nvidia" ];
  • CUDA 12.2는 구버전 nixpkgs에서 overlay로 가져옴
nixpkgs.overlays = [ (final: prev: { cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2; }) ];
  • 두 GPU가 모두 표시되고 CUDA도 정상 동작함
  • 전체 머신 정의는 dotfiles repo의 이 commit에 포함됨
    • llama.cpp 서비스 정의와 올바른 버전에 고정된 커스텀 빌드도 포함됨

실행한 모델과 성능

  • 실행 모델은 Qwen3.6-27B-MTP Q5_K_M 양자화 버전임
    • 모델 크기는 약 19GB임
    • 두 GPU를 사용하면 전체 모델이 VRAM에 올라가고 컨텍스트를 위한 여유도 남음
  • 주요 실행 설정은 다음과 같음
    • Model: Qwen3.6-27B-MTP Q5_K_M, 19GB
    • Context size: 128k tokens
    • GPU layers: 99, 전부 오프로딩
    • Tensor split: -ts 1.0,1.0, 두 GPU에 균등 분배
  • 성능은 다음과 같음
    • Inference speed: 약 32 tok/s
    • Prompt processing: 약 133~160 tok/s
  • 32 tokens/s는 대화형 사용에 충분한 속도로 평가됨
    • 서로 다른 두 GPU 아키텍처를 PCIe로 연결해 tensor split하는 구성에서도 달성됨
    • 네트워크 지연까지 고려하면 대부분의 클라우드 API 엔드포인트보다 빠르다고 표현됨

MTP와 이미지 입력

  • MTP는 Multi-Token Prediction을 뜻함
    • 일반 LLM 추론은 한 번에 한 토큰을 예측하고, 이를 수락한 뒤 다음 토큰을 예측함
    • MTP는 여러 미래 토큰을 한꺼번에 예측한 뒤 맞은 토큰을 검증함
    • 수락된 토큰은 사실상 무료에 가까우며, 틀린 예측은 일반 경로로 되돌아감
  • MTP의 결과는 정확도 손실 없이 생성 속도가 약 1.5~2배 빨라지는 것임
    • 이 구성에서는 약 32 tok/s에서 MTP가 잘 맞을 때 50~60 tok/s까지 가능하다고 제시됨
    • 특히 코드처럼 예측 가능한 출력에서 효과가 큼
  • llama.cpp의 MTP 지원은 아직 새 기능임
    • nixpkgs의 llama.cpp 버전은 Qwen3.6 MTP 아키텍처를 지원하지 않음
    • 해당 지원이 추가된 특정 commit에서 llama.cpp를 소스 빌드해야 했음
    • NixOS에서는 커스텀 derivation을 해당 commit에 고정해 재현 가능하게 구성함
    • 모델이나 llama.cpp 버전 변경은 설정 한 줄을 바꾸고 nixos-rebuild switch를 실행하는 방식으로 처리됨
  • Qwen3.6-27B는 별도 multimodal projector 파일인 mmproj를 통해 이미지 입력을 지원함
    • 추가 파일 크기는 약 928MB임
    • vision encoder가 이미지 픽셀을 LLM의 토큰 임베딩 공간으로 변환하는 구조임
    • 모델이 사람처럼 이미지를 “보는” 것은 아님
    • LLM은 변환된 벡터를 또 다른 토큰 시퀀스처럼 처리함
  • llama.cpp 실행 플래그는 다음과 같음
--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload
  • --mmproj-offload는 vision encoder를 모델과 함께 GPU에 올림
    • 이미지 입력에서도 빠른 추론을 유지할 수 있음

로컬 사용 방식

  • 이 구성은 OpenCode와 함께 사용됨
    • OpenCode는 로컬 모델을 대상으로 실행할 수 있는 AI 코딩 어시스턴트임
  • LLM 서버는 데스크톱에서 실행되지만, 사용은 다른 기기에서 이뤄짐
    • 집 안의 다른 머신에서 네트워크로 접속함
    • 외부에서는 Tailscale을 통해 접속함
  • OpenCode에서 llama.cpp 서버를 쓰는 과정은 API URL 설정으로 처리됨
    • 모델은 로컬에서 실행됨
    • 응답은 빠르고 데이터는 네트워크 밖으로 나가지 않음

남은 문제와 한계

  • V100이 warm reboot 후 사라지는 문제가 가끔 발생함
    • OS만 재시작되고 메인보드는 계속 전원이 들어와 있는 재부팅 뒤 lspci와 nvidia-smi에서 V100이 보이지 않을 때가 있음
    • PCIe 슬롯의 ACPI enumeration 문제로 보임
    • 물리적으로 전원을 끄고 몇 초 기다린 뒤 다시 켜는 cold reboot를 하면 항상 복구됨
  • V100이 없으면 llama.cpp가 시작되지 않음
    • 16GB GPU 한 장에는 모델이 들어가지 않기 때문임
    • GPU가 돌아올 때까지 서비스가 crash loop를 반복함
    • 보통 재부팅할 때 근처에 있으므로 실사용에서는 큰 문제로 보지 않음
  • 서로 다른 아키텍처 두 GPU를 tensor split하는 구성은 단일 GPU만큼 깔끔하지 않음
    • V100은 추론용으로 가장 빠른 GPU도 아님
    • 하지만 가격 대비 가치는 매우 높다고 평가됨

선택지와 결론

  • 약 £200로 확보한 결과는 다음과 같음
    • 게이밍 GPU와 함께 동작하는 16GB 데이터센터 GPU
    • 로컬 LLM 추론용 총 32GB VRAM
    • 27B 파라미터 모델에서 32 tokens/s
    • 128k token 컨텍스트 창
    • 이미지 입력용 vision 지원
    • 클라우드와 토큰당 비용 없이 완전히 로컬에서 실행되는 모델
  • 실질적인 비용은 팬 소음이었고, 점퍼 케이블과 커넥터 확인으로 해결됨
  • 제대로 된 로컬 모델을 돌리고 싶다면 중고 서버 GPU 시장이 대안이 될 수 있음
    • 기존 GPU가 없어도 단일 V100을 저렴한 서버 박스에 넣으면 16GB VRAM과 사용 가능한 로컬 LLM 환경을 만들 수 있음
    • V100 SXM2만 선택지는 아님
    • P40은 비슷한 비용으로 24GB를 제공하지만 더 느리고 Tensor Cores가 없음
    • V100 32GB 모델은 더 비싸지만 같은 VRAM 용량의 소비자 GPU보다 여전히 저렴함
  • 단, 팬 문제에 대비해야 함
Read Entire Article