본문으로 건너뛰기

© 2026 Molayo

Lobste.rs헤드라인2026. 05. 31. 18:49

200파운드로 게이밍 PC에 데이터센터 GPU를 장착해 보았다

요약

저렴한 비용으로 데이터센터용 GPU인 Tesla V100 SXM2를 구매하여 일반 게이밍 PC에 장착하는 방법을 소개합니다. 어댑터를 통해 PCIe 슬롯이 없는 SXM2 폼 팩터를 연결함으로써, 고가의 소비자용 GPU보다 뛰어난 메모리 대역폭을 확보하고 LLM 추론 성능을 높였습니다.

핵심 포인트

  • 200파운드 미만으로 VRAM 32GB 환경 구축
  • V100의 HBM2 메모리는 최신 Mac보다 높은 대역폭 제공
  • SXM2-to-PCIe 어댑터를 활용한 하드웨어 개조
  • LLM 추론 시 메모리 대역폭의 중요성 강조

저는 이미 RTX 4080을 가지고 있었습니다. 16GB의 VRAM (비디오 램)을 갖춘 모델이죠. 게이밍에는 충분했지만, 제가 로컬 (locally)에서 실행하고 싶었던 모델들을 돌리기에는 충분하지 않았습니다. GPU 세계에서 다음 단계로 넘어가려면, 더 많은 VRAM을 가진 카드에 거금을 들여 투자하거나 다른 방법을 찾아야 합니다.

저는 다른 방법을 찾아냈습니다.

일반적인 PCIe 커넥터조차 없는 데이터센터 GPU를 구매하여, 어댑터를 이용해 제 게이밍 PC에 끼워 넣었습니다. 이제 저는 두 개의 GPU를 통해 총 32GB의 VRAM을 확보했으며, 270억 개의 파라미터 (parameter)를 가진 모델을 초당 32 토큰 (tokens per second)의 속도로 실행하고 있습니다. 이 모든 과정에 든 비용은 단돈 200파운드였습니다.

GPU

Front of the V100 SXM2

이것은 Tesla V100 SXM2 16GB입니다. NVIDIA의 DGX 서버와 하이퍼스케일러 (hyperscaler) 랙을 위해 설계되었습니다. SXM2 폼 팩터 (form factor)라는 것은 PCIe 슬롯이 없다는 것을 의미합니다. 디스플레이 출력 포트도 없습니다. 일반적인 전원 커넥터도 없습니다. 서버 랙 내부의 독자적인 보드 위에 장착되어 NVLink를 통해 통신합니다.

Back of the V100 SXM2

도움 없이는 이것을 메인보드에 직접 꽂을 수 없습니다.

하지만 중요한 점은 이것입니다. 이것은 16GB의 HBM2 메모리, 5120개의 CUDA 코어를 갖춘 Volta GPU이며, 저는 eBay에서 약 150파운드에 구매했습니다. 연산 능력 (compute)은 여전히 강력합니다. VRAM 역시 실재하며, 메모리 대역폭 (memory bandwidth)은 진정으로 놀라운 수준입니다.

HBM2는 차원이 다른 메모리입니다. V100은 4096비트 메모리 버스 (memory bus)를 통해 900 GB/s의 대역폭을 제공합니다. 비교를 위해 말씀드리자면, 화려한 GDDR6X를 사용하는 제 RTX 4080은 736 GB/s를 구현합니다. 2017년에 출시된 V100이 2022년에 출시된 GPU보다 메모리 대역폭이 22% 더 높습니다.

손해를 보는 것은 NVIDIA의 소비자용 카드뿐만이 아닙니다. Apple의 M3 Max는 400 GB/s를 기록합니다. M4 Max는 546 GB/s입니다. 노트북으로 구매하려면 3,000파운드 이상을 지불해야 하는 최신 M5 Max조차 614 GB/s를 구현합니다. 2017년의 GPU가 시장에 있는 모든 Mac을 압도합니다.

제 4080에 가장 근접한 AMD 경쟁 모델은 RX 7900 XTX로, 24GB의 GDDR6 메모리에서 960 GB/s를 구현합니다. 기술적으로는 이것이 V100을 근소하게 앞서지만, 7900 XTX는 700파운드 이상이며 LLM 추론 (LLM inference)을 위한 ROCm 지원은 CUDA에 비해 여전히 열악합니다. V100은 가격이 4분의 1도 안 되는 비용으로 그 대역폭의 94%를 제공하며, llama.cpp에서 그냥 바로 작동합니다.

이를 여유롭게 능가하는 유일한 소비자용 GPU는 1,792 GB/s를 구현하는 RTX 5090뿐이며, 이 카드는 2,000파운드가 넘습니다. 메모리 대역폭 (memory bandwidth)이 초당 토큰 수 (tokens per second)를 결정하는 병목 현상 (bottleneck)이 되는 LLM 추론에서는, 이것이 그 어떤 것보다 중요합니다.

유일한 문제는 커넥터입니다.

어댑터 (The adapter)

알고 보니, 누군가 SXM2-to-PCIe 어댑터를 만들고 있었습니다. NVIDIA가 만든 것이 아닙니다. 그 누구에 의해서도 공식적으로 지원되지 않습니다. 한쪽에는 SXM2 소켓이 있고 다른 한쪽에는 PCIe 에지 커넥터 (PCIe edge connector)가 있는 순수한 PCB일 뿐입니다. 저는 이것에 약 50파운드를 지불했습니다. 그중 절반은 그냥 구리 값일지도 모릅니다.

Heatsink on the V100 adapter

그래서 총 약 200파운드로, 제 RTX 4080과 함께 메인보드에 장착할 수 있는 16GB VRAM GPU를 갖게 되었습니다. 이는 총 32GB의 VRAM입니다. 32GB를 가진 단일 RTX 5090은 2,000파운드가 넘습니다. 제가 이 두 가지가 동일한 경험이라고 말하는 것은 아닙니다. VRAM 용량이 같다는 뜻입니다.

지옥에서 온 팬 (The fan from hell)

V100으로 유용한 일을 하기 전에, 저는 팬 문제를 해결해야 했습니다.

V100 SXM2는 산업용 냉각 장치가 갖춰진 2U 서버 내부에서 작동하도록 설계되었습니다. 어댑터에 달린 팬은 결코 미미하지 않습니다. 조용하지도 않습니다. 당신이 잠을 자는 방에 두고 싶은 물건이 아닙니다.

제 Apple Watch로 측정해 보았습니다:

82dB measurement on Apple Watch

82 데시벨 (decibels)입니다. 이는 음식물 분쇄기와 잔디깎이 사이 어딘가의 소음으로, "시끄러운 PC" 수준을 훨씬 넘어 "내 집에서 귀마개를 써야 하나"라는 영역에 속합니다.

그리고 최악인 점은, 이를 제어할 수 없다는 것입니다. 저는 nvidia-smi를 시도해 보았습니다

, Linux에서 스캔도 시도해 보았고, Windows에서 Afterburner도 사용해 보았습니다 (이에 대해서는 나중에 더 자세히 다루겠지만, 전체 설정이 Windows에서는 간신히 돌아가는 수준입니다). 아무것도 나오지 않았습니다. 이 어댑터의 팬은 제어되도록 설계되지 않았습니다. 이 팬은 아무도 소리를 들을 필요가 없는 서버 랙 내부에서 영원히 100%로 작동하도록 설계되었습니다.

여기 제가 팬 핀아웃 (pinout)을 파악하려고 시도하는 모습이 있습니다. 이상한 커넥터에 달린 표준 케이스 팬 핀아웃일 것이라고 추측하여, VCC와 접지 (ground)에 점퍼 와이어 (jumper wire) 두 개를 꽂고 9V 배터리를 갖다 대 보았습니다. 팬이 돌았습니다. 그리고 평소에 받는 12V보다 훨씬 조용했습니다:

이것으로 핀아웃을 확인했고, 팬을 실제로 길들일 수 있다는 희망을 얻었습니다.

팬을 이성적으로 만들기 (Making the fan listen to reason)

9V 배터리 테스트를 통해 핀아웃이 표준 케이스 팬 영역이며, 단지 커넥터만 이상할 뿐이라는 것을 알게 되었습니다. 다음 질문은 타코미터 (tachometer) 핀과 PWM 핀을 메인보드에 연결했을 때 팬이 실제로 PWM 제어에 반응할 것인가 하는 점이었습니다.

그래서 커넥터에 점퍼 와이어를 밀어 넣고 반대쪽 끝을 여분의 팬 헤더 (fan header)에 꽂았습니다 (볼륨을 높이세요):

작동합니다. 메인보드가 RPM을 읽을 수 있고 팬이 PWM에 반응합니다. 저는 10%로 유지하고 있습니다. 풀 로드 (full load) 상태에서도 온도가 50도 이상 올라가지 않으며, 소리도 거의 들리지 않습니다.

이제 희망에 의지해 붙잡고 있는 점퍼 와이어 대신 제대로 된 케이블이 필요했습니다.

PCI adapter fan plug

어댑터의 팬 커넥터는 4개의 핀이 있는 작은 JST PH2.0 플러그입니다. 메인보드 팬 헤더는 표준 0.1인치 (2.54mm) 피치 (pitch)를 사용합니다. GPU 팬은 2.0mm JST PH 커넥터를 사용합니다. 핀 간격이 더 좁고 플러그 크기도 더 작습니다.

해결책은 2.54mm 수 (male) 타입에서 PH2.0 암 (female) 타입으로 이어지는 점퍼 케이블이었습니다. 암형 PH2.0 끝부분은 팬의 타코미터 및 PWM 핀에 꽂히고, 수형 2.54mm 끝부분은 메인보드의 여분 팬 헤더에 연결됩니다:

2.54mm male to PH2.0 female cable plugged in

덕분에 82dB의 청력 손상 수준에서 실제로 견딜 만한 수준으로 바뀌었습니다.

저렴하게 VRAM 두 배로 늘리기 (Doubling VRAM for cheap)

팬 문제가 해결되었으므로, V100을 제 4080 옆에 바로 장착했습니다:

RTX 4080: 16GB VRAM, Ada 아키텍처 (architecture)
Tesla V100: 16GB VRAM, Volta 아키텍처 (architecture)
Total: 두 GPU를 합쳐 총 32GB VRAM

lama.cpp는 텐서 분할 (tensor splitting)을 사용하여 두 GPU에 모델을 나누어 배치할 수 있습니다. 이는 PCIe 버스를 통해 레이어 (layers)를 파이프라이닝하여, 4080이 일부 레이어를 처리하고 V100이 나머지를 처리하도록 합니다. 32GB 용량의 단일 GPU를 사용하는 것만큼 빠르지는 않지만, 작동하며 비용은 32GB GPU 가격의 약 10% 정도밖에 들지 않았습니다. 참고로, 제가 확인한 V100의 최대 전력 소모량은 약 150W였습니다. 무시할 수준은 아니지만, 로컬 LLM 추론 (inference)을 실행하는 GPU로서는 그리 놀라운 수치도 아닙니다.

하지만 잠깐, 더 크게 구성할 수도 있습니다#

V100은 32GB 변형 모델로도 출시됩니다. 제가 지불한 금액의 두 배가 넘는 비용이 들지만, 단일 카드에 32GB의 HBM2 메모리를 탑재한 가격이 여전히 수백 파운드 수준입니다. 이런 카드를 두 장 사용하면 현재 시장의 RTX 5090 가격의 약 20% 수준으로 64GB의 VRAM을 확보할 수 있습니다.

또한 이들을 클러스터 (cluster)로 구성할 수도 있습니다. SXM2 포맷은 NVLink를 기본적으로 지원하므로, 제대로 된 멀티 GPU 설정을 구축한다면 이 카드들은 매우 높은 대역폭 (bandwidth)으로 서로 통신할 수 있습니다. PCIe 어댑터를 통해서도 텐서 분할 (tensor split) 성능은 안정적입니다.

소프트웨어 측면#

NixOS 덕분에 이 과정은 놀라울 정도로 매끄러웠습니다. V100은 Volta 칩입니다. NVIDIA는 드라이버 브랜치 (driver branch) 560부터 Volta 지원을 중단했습니다. 제 RTX 4080 (Ada)과 V100 (Volta)을 모두 지원하는 마지막 드라이버는 550.x 브랜치이며, 이는 NixOS에서 nvidiaPackages.legacy_535에 해당합니다.

해당 드라이버는 CUDA 12.2까지만 지원합니다. 현재의 nixpkgs는 최소 CUDA 12.6을 배포합니다. 따라서 저는 nixpkgs 24.05에서 CUDA 12.2를 가져와야 했습니다.

또한, 이 드라이버는 커널 (kernel) 6.6을 요구합니다. 레거시 (legacy) 드라이버는 더 최신 버전의 커널을 지원하지 않습니다.

그리고 이상한 점이 하나 있는데, 이 시스템이 헤드리스 추론 서버 (headless inference server)임에도 불구하고 services.xserver.enable = true 설정이 필요합니다. 이 설정이 없으면 NVIDIA 커널 모듈 (kernel modules)이 로드되지 않습니다.

NixOS 덕분에 이 모든 과정이 직관적으로 진행되었습니다. 드라이버와 커널을 올바르게 설정하기 위한 핵심 구성은 다음과 같습니다:

boot.kernelPackages = pkgs.linuxPackages_6_6;
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535;
services.xserver.enable = true;
...

그리고 현재 버전은 12.6+ 버전만 제공하기 때문에, 이전 버전의 nixpkgs에서 CUDA 12.2를 로드하기 위한 설정은 다음과 같습니다:

nixpkgs.overlays = [
(final: prev: {
cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2;
...

중요한 점은 다음과 같습니다: 작동한다는 것입니다. 두 GPU가 모두 나타나고, CUDA가 정상적으로 작동하며, NixOS가 이 모든 과정을 우아하게 처리했습니다. 만약 이를 재현하고 싶다면, llama.cpp 서비스 정의와 올바른 버전에 고정된 커스텀 빌드를 포함한 전체 머신 정의(machine definition)가 제 dotfiles 저장소의 이 커밋에 포함되어 있습니다.

모델 실행#

저는 Q5_K_M으로 양자화(quantized)된 Qwen3.6-27B-MTP 모델을 실행하고 있으며, 크기는 약 19GB입니다. 두 GPU를 사용하면 전체 모델이 컨텍스트(context)를 위한 여유 공간을 남겨둔 채 VRAM에 모두 들어갑니다:

nvidia-smi showing both GPUs

설정
모델Qwen3.6-27B-MTP Q5_K_M (19GB)
...

그리고 성능은 다음과 같습니다:

지표
추론 속도 (Inference speed)~32 tok/s
프롬프트 처리 (Prompt processing)~133-160 tok/s

초당 32 토큰은 대화형 사용에 충분히 빠른 속도입니다. 네트워크 지연 시간(network latency)을 고려하면 대부분의 클라우드 API 엔드포인트보다 빠릅니다. 게다가 이는 PCIe로 연결된 서로 다른 두 가지 GPU 아키텍처 간의 텐서 분할(tensor splitting)을 통해 구현한 결과입니다.

이 모델은 실제로 뛰어납니다#

한 가지 분명히 하고 싶은 점이 있습니다. 이것은 단순히 "로컬 모델 치고는 좋다"는 뜻이 아닙니다. "기대치를 낮추면 받아들일 만하다"는 뜻도 아닙니다. Qwen3.6-27B는 Artificial Analysis의 에이전트 지수(Agentic Index)에서 Claude Sonnet 4.6과 대등한 성적을 거두었습니다. 또한 MMMU-Pro와 Terminal-Bench 2.0에서는 Sonnet 4.6을 능가합니다. 중고 하드웨어에서 실행되는 270억 파라미터(27 billion parameter) 모델이 Anthropic의 최신 클라우드 모델들과 진정으로 경쟁할 수 있는 수준입니다.

네, Sonnet 4.6이 GPQA와 SWE-Bench Verified에서 근소하게 앞섭니다. 거대한 독점 모델(proprietary model)인 만큼 당연한 결과일 것입니다. 그리고 만약 절대적인 최고를 원한다면 Opus 4.8이 존재합니다. 이 모델은 제가 이 GPU와 어댑터 세트 전체를 구매한 비용보다 20분간 집중적으로 사용할 때 드는 비용이 더 비쌉니다. 하지만 그 격차는 놀라울 정도로 작습니다. 우리는 이제 침실에서 실행하는 모델이 토큰당 비용을 부과하는 모델들과 같은 선상에서 논의되는 지점에 도달했습니다.

Multi-Token Prediction (다중 토큰 예측)#

모델 이름에 포함된 MTP는 Multi-Token Prediction (다중 토큰 예측)을 의미합니다. 일반적인 LLM 추론 (inference)은 한 번에 하나의 토큰을 예측합니다. 하나의 토큰을 예측하고, 이를 수락한 뒤, 다음 토큰을 예측하는 과정을 반복합니다. MTP는 모델이 미래의 여러 토큰을 한꺼번에 예측한 다음, 어떤 것이 맞았는지 검증함으로써 이 방식을 바꿉니다. 수락된 토큰은 본질적으로 비용이 들지 않습니다. 잘못된 예측은 일반적인 경로로 되돌아갑니다.

그 결과, 정확도 손실 없이 생성 속도가 대략 1.5~2배 빨라집니다. 제 설정에서는 MTP가 제대로 작동할 때, 특히 코드와 같이 예측 가능한 출력에서 추론 속도가 약 32 tok/s에서 잠재적으로 50-60 tok/s까지 올라간다는 것을 의미합니다.

문제는 llama.cpp에서의 MTP 지원이 아직 새롭다는 점입니다. nixpkgs의 버전은 Qwen3.6 MTP 아키텍처를 지원하지 않기 때문에, 저는 지원 기능이 추가된 특정 커밋(commit)에서 llama.cpp를 소스에서 직접 빌드해야 했습니다. NixOS에서는 이 과정이 매우 수월합니다. 저는 올바른 커밋에 고정된 커스텀 유도(derivation)를 가지고 있으며, 전체 과정이 재현 가능(reproducible)합니다. 모델을 업데이트하거나 llama.cpp 버전을 변경하고 싶을 때, 설정 파일에서 한 줄만 수정하고 nixos-rebuild switch를 실행하면 끝납니다. 의존성 지옥(dependency hell)도 없고, 수동으로 재설치할 필요도 없으며, 올바른 CUDA 버전에 맞춰 빌드했는지 고민할 필요도 없습니다.

Vision: 모델이 이미지를 보는 방식#

Qwen3.6-27B 모델은 별도의 멀티모달 프로젝터 (multimodal projector, mmproj) 파일을 통해 이미지 입력을 지원합니다. 이는 약 928MB의 추가 용량을 차지하며, 매우 흥미로운 부분입니다.

작동 방식은 ChatGPT나 Claude가 사용하는 것과 유사한 비전 인코더 (vision encoder)가 이미지 픽셀을 가져와 이를 LLM의 토큰 임베딩 공간 (token embedding space)으로 변환하는 것입니다. 모델은 인간이 이미지를 보는 방식과 동일하게 이미지를 "보는" 것이 아닙니다. 대신, 비전 인코더가 이미지를 텍스트 토큰과 동일한 수학적 공간에 존재하는 벡터 시퀀스 (sequence of vectors)로 압축합니다. 그러면 LLM은 이 벡터들을 마치 또 다른 토큰 시퀀스인 것처럼 처리합니다.

이것이 실제적으로 의미하는 바는 다음과 같습니다: 사용자가 텍스트 프롬프트와 함께 이미지 URL을 모델에 보내면, 모델은 자신이 보고 있는 것에 대해 설명하고, 분석하며, 추론할 수 있습니다. 전체 비전 기능은 모델 크기에 약 1GB를 추가합니다. 그게 전부입니다. 단 1GB만 있으면 여러분의 로컬 LLM이 이미지를 읽을 수 있습니다.

lama.cpp에서 플래그 (flags) 설정은 간단합니다:

--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload

--mmproj-offload 플래그는 모델과 함께 비전 인코더를 GPU에 로드하므로, 이미지를 사용하더라도 여전히 빠른 추론 (inference) 속도를 얻을 수 있습니다.

OpenCode를 통한 실행

AI 자동 생성 콘텐츠

본 콘텐츠는 Lobste.rs AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0