SOTA LLM을 로컬에서 실행하기 위한 jamesob의 가이드
요약
SOTA LLM을 로컬 환경에서 실행하기 위한 하드웨어 구성 및 소프트웨어 설정 가이드를 제공합니다. 예산별(2,000달러 및 40,000달러) 최적의 GPU 구성과 VRAM 확보 전략, Docker를 활용한 모델 실행 방법을 다룹니다.
핵심 포인트
- 예산에 따른 단계별 하드웨어 구성 전략 제시
- VRAM 확보를 위한 구형 DDR4 시스템 및 PCIe 스위치 활용 팁
- Qwen 및 Whisper 모델을 활용한 로컬 LLM 및 STT 실행 방법
- Docker 컨테이너를 이용한 즉시 실행 가능한 환경 구축
jamesob의 SOTA LLM 로컬 실행 가이드
참고: 이 README에서 표를 제외한 모든 내용은 AI가 작성하지 않았습니다.
주머니에 2,000달러 정도의 여윳돈이 있고, 로컬에서 최첨단 (state-of-the-art, SOTA) 머신 인텔리전스를 경험하고 싶으신가요?
40,000달러라면 어떨까요?
만약 Dario와 Altman 때문에 속이 쓰리다면 (그래야 마땅합니다), 이 새로운 종류의 컴퓨팅을 로컬에서 실행하는 방법을 알아보기 위해 계속 읽어보세요.
이 저장소(repo)에서는 다음 내용을 확인할 수 있습니다:
- 제가 SOTA를 로컬에서 실행하기 위해 사용하는 하드웨어,
- 왜 특정 부품을 구매했는지와 이를 구성하기 위한 잘 알려지지 않은 비밀들,
- 로컬에서 음성-텍스트 변환 (speech-to-text, STT)을 실행하는 방법,
- 제가 훌륭하다고 생각하는 모델들을 Docker 컨테이너 내에서 실행할 수 있는 즉시 실행 가능한 구성.
목차
| 섹션 | 요약 (TL;DR) |
|---|---|
| 얼마를 지출할 의향이 있으신가요? | 2,000달러면 Qwen과 훌륭한 STT를 얻을 수 있습니다 (꽤 멀리까지 갑니다!); 40,000달러면 거의 Opus 급을 얻을 수 있습니다 |
| ... |
나의 설정 (My setup)
저는 운이 좋았거나 혹은 어리석게도 RTX Pro 6000 4개를 가격이 더 저렴했을 때 구매했습니다. 현재 RAM 가격이 매우 높기 때문에, 저는 이 카드들을 호스팅하기 위해 eBay에서 부품을 구한 이전 세대 DDR4 시스템을 구축하기로 선택했습니다. 이를 통해 많은 VRAM을 확보하면서도 기본 시스템 비용을 합리적으로 유지할 수 있었습니다.

제가 한 또 다른 다소 특이한 점은 PCIe4 스위치(c-payne.com)를 사용한 것입니다. 이를 통해 GPU들이 텐서 병렬성 (tensor parallelism)의 allreduce 단계에서 모든 데이터를 PCI 루트 컴플렉스 (PCI root complex)를 통해 보낼 필요 없이, 배선 속도 (wire speeds)로 서로 "직접" 통신할 수 있습니다. 그 결과, 값비싼 PCIe5 하드웨어에 대한 필요성을 줄이면서 카드 간의 지연 시간 (latency)을 단축할 수 있었습니다.

결과적으로, 저는 2026년 7월 기준으로 엄청나게 비싼 PCIe5/DDR5 기본 시스템 대신 (중요한 부분인) VRAM에 돈을 쓰고 있습니다.
저의 구체적인 부품 명세서 (BOM)는 아래에 상세히 나와 있습니다.
얼마를 지출할 의향이 있으신가요?
~$2,000
훌륭한 방법 중 하나는 RTX 3090 2개를 사용하여 총 48GB VRAM을 확보하는 것입니다. 그러면 정말 멋진 모델인 Qwen3.6-27B를 실행할 수 있습니다.
또한 제가 매우 유용하다고 생각하는 whisper-large-v3를 통해 SOTA 음성 인식 (STT, Speech-to-Text)을 실행할 수도 있습니다. 해당 모델을 사용한 뒤, 제가 만든 크로스 플랫폼 stt harness를 통해 접근할 수 있습니다.
저는 로컬 STT가 놀라울 정도로 유용하다는 것을 발견했습니다. 호스팅된 서비스와 달리 로컬 사용이 매우 편안하게 느껴집니다. Nvidia GPU에 약 11GB의 VRAM이 있다는 가정하에 바로 실행 가능한 설정 파일을 ./runners/stt에서 찾을 수 있습니다.
~$40k
이 가격대에서는 모델 지능의 다음 단계로 올라갈 수 있습니다. Claude Opus와 상당히 유사한 수준입니다.
RTX 6000 Pro 4개를 구매하면 총 384GB의 VRAM을 확보하게 됩니다.
4x RTX6kPRO를 위한 현재 최적의 모델들
| 날짜 | 최적의 모델 | 나의 설정 |
|---|---|---|
| 2026-07 | GLM-5.2-Int8Mix-NVFP4-REAP-594B | Runner config |
기타 접근 방식
참고: 이것은 저의 추천일 뿐이며, 돈을 지출하는 데 있어 완전히 유효한 다른 방법들도 있습니다. 예를 들어, RTX 6000 Pro 4개를 사는 대신, 대부분의 예산을 총 512GB VRAM을 갖춘 연결된 4x DGX Spark 클러스터를 구축하는 데 할당하고, 이를 느리지만 거대한 두뇌로 사용하여 Qwen3.7-27b가 단순 반복 작업을 빠르게 수행하도록 구동하는 방식도 있을 것입니다.
하드웨어 (Hardware)
다음은 제가 4x RTX 6000 Pro 머신을 위해 최종적으로 구매한 하드웨어 구성입니다.

베이스 시스템 (Base system)
거의 대부분 eBay에서 부품별로 구매한 겸손한 수준의 이전 세대 EPYC 시스템입니다.
| 구성 요소 | 사양 | 가격 |
|---|---|---|
| 메인보드 (Motherboard) | ASRock Rack ROMED8-2T (SP3, 7× PCIe 4.0 x16, dual 10GbE) | $715 |
| ... |
GPU
| 구성 요소 | 사양 | 가격 |
|---|---|---|
| GPU | 4× NVIDIA RTX PRO 6000 Blackwell Workstation (각 96GB, 총 384GB VRAM) | ~$46,000 |
c-payne PCIe Gen4 Switch Sub-BOM (c-payne.com)
| 부품 | 수량 | 단위 (€) | 비고 |
|---|---|---|---|
| PCIe gen4 Switch 5× x16 — Microchip Switchtec PM40100 | 1 | 1.050 | 2× SlimSAS 8i 업스트림 (upstream), 5× x16 쿼드 너비 간격 다운스트림 (downstream), aux x4 SlimSAS, 3× 8-pin EPS 전원 |
| ... |
GPU 마운트 (GPU mount)
PCI 스위치와 GPU를 위한 나무 인클로저 (enclosure)를 직접 제작해야 했으며, 이 작업에 약 하루가 소요되었습니다.

PCI 스위치의 내장 팬이 매우 시끄럽고 별로 쓸모가 없어 보여서, 단순히 보드에서 분리했습니다.
모델 가중치 수집 (Hoarding model weights)
저는 모든 모델 가중치 (model weights)를 두 개의 8TB 드라이브에 복제되는 ZFS 파일 시스템 (filesystem)에 로컬로 저장하며, 이는 ~/storage에 마운트되어 있습니다.
실행하려는 모든 모델에 대해, 먼저 다음 명령어를 사용하여 모델을 다운로드합니다:
hf download <model-name> --local-dir ~/storage/<model-name>
모델 실행 (Running models)
모델 가중치가 로컬에 캐시되면, 각 모델마다 별도의 디렉토리를 생성하여 docker-compose.yml 파일을 포함시키며, 이를 통해 각 모델의 실행을 개별 Docker 컨테이너 (container)로 격리합니다.
이 설정들은 ./runners/에서 확인할 수 있습니다.
각 컨테이너는 로컬에 캐시된 가중치를 가져오기 위해 ~/storage/models를 읽기 전용 (read-only) 모드로 마운트합니다.
그 후, 모델이 http://clank.j.co:5000에서 서빙 (serving)되면, 다른 머신의 VM (가상 머신)에서 호스팅되는 opencode를 사용하여 모델에 접속합니다.
네트워크 내부 DNS 서버를 사용하여 clank.j.co가 LLM 머신을 가리키도록 설정했지만, 단순히 http://<llm-machine-ip>:5000을 사용할 수도 있습니다.
하네스 자체 (The harness itself)
저는 VM을 생성하고, VM의 ~/src 트리 내의 각 디렉토리에 대해 기본적으로 tmux 세션을 생성하는 애플리케이션을 구축했습니다. 이 세션은 추론 (inference) 머신의 HTTP API (http://clank.j.co:5000)를 백엔드로 사용하는 opencode 인스턴스를 실행합니다.

오픈소스 모델을 제대로 활용하기 위한 핵심은 적절한 툴링 (tooling)입니다. 제 skills/의 요약은 다음과 같습니다:
- 웹 브라우징 및 검색을 위한 camofox, kagi.com API 키, 그리고 searXNG,
- 통신 및 알림을 위한 Telegram 봇,
- 소스 코드 협업을 위한 로컬 프라이빗 Gitea 인스턴스.
clanker는 세션 내에서 저와 대화형으로 작동하거나, Gitea 이슈를 처리하고 그곳에 PR(Pull Request)을 제출하는 작업으로 넘겨질 수 있습니다.
이 모든 과정은 샌드박스화된 VM(Virtual Machine) 내에서 발생하며, 호스트 시스템과의 유일한 통신은 공유 파일 시스템 마운트(shared filesystem mount)를 통해서만 이루어집니다. 따라서 이 장치는 무엇이든 마음껏 설치하며 작동할 수 있습니다.
PCI 스위치를 제대로 작동시키기
메인보드가 PCI 스위치 속도를 낮추지(downregulating) 않도록 보장하기 위해 BIOS를 조정하는 과정이 매우 많았습니다.
BIOS 설정 (ROMED8-2T)
| 설정 | 값 | 이유 |
|---|---|---|
Chipset Configuration → AMD PCIE Link Width (스위치 슬롯) | x16 (기존 x8/x8) | Bifurcation(분기)으로 인해 슬롯이 나뉘어 있었으며, 업스트림 링크(upstream link)가 Gen4 x8로 학습되었습니다. 두 개의 SlimSAS 8i 케이블이 모두 연결되어야 합니다 (각 케이블이 x8을 전송함). |
| ... |
리드라이버(redriver)의 이득(gain) 감소
c-payne의 조언에 따라 그의 도구를 사용하여 이득을 "lvl 3"로 낮추었으며, 이는 아마도 이 과정에서 가장 까다로운 부분이었습니다.
이득 레벨은 SAS 커넥터 케이블의 길이에 따라 달라질 것입니다.
올바른 SAS 케이블 선택
제가 실수로 c-payne에게 직접 주문한 케이블의 수량을 너무 적게 주문해서, Amazon에서 동일하다고 생각되는 SAS 케이블을 구매했습니다. 하지만 실제로는 미세한 차이가 있어 문제가 발생했고, 결국 케이블을 다시 주문해야 했습니다. 그러니 반드시 올바른 제품을 구매하고 있는지 재차 확인하세요!
커널 / GRUB 파라미터
# /etc/default/grub
GRUB_CMDLINE_LINUX="iommu=off amd_iommu=off nomodeset"
sudo update-grub
...
iommu=off 설정이 없으면, 멀티 GPU P2P(Peer-to-Peer) 환경에서 NCCL이 멈춥니다(hangs).
ACS 비활성화 (스위치 P2P를 위한 필수 사항)
ACS가 활성화되어 있으면(기본값), P2P 트래픽이 스위치 패브릭(switch fabric) 내부에 머물지 않고 CPU 루트 포트(root port)를 거쳐서 전달되므로, 스위치를 사용하는 의미가 완전히 사라집니다. pcie_acs_override를 사용하려면 패치된 커널(patched kernel)이 필요하므로, 우리는 런타임에 setpci를 통해 이를 비활성화합니다.
# /usr/local/bin/disable-acs.sh
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
...
systemd oneshot을 통해 매 부팅 시 실행합니다:
# /etc/systemd/system/disable-acs.service
[Unit]
Description=GPU P2P를 위한 PCIe ACS 비활성화
...
확인: lspci -vvv | grep ACSCtl에서 모든 마이너스 기호가 표시되어야 하며, nvidia-smi topo -m에서는 네 개의 GPU 사이에 PIX가 표시되어야 합니다 (PHB/NODE 아님).
이를 쉽게 측정하려면 ./tools/measure-gpu-speed.sh를 사용하세요.
GPU 전력 제한(Power Limiting)
220V 회로 설치를 피하기 위해, 저는 이 시스템을 단일 110V 회로에서 운영합니다 (아마도 현명하지 않게). 하지만 카드의 전력을 조절했습니다.
시스템d를 통해 부팅 시점에 지속성 모드(Persistence mode)와 전력 제한(power cap) 적용하기 (install-gpu-power-limit.sh):
sudo nvidia-smi -pm 1
sudo nvidia-smi -pl 350 # GPU당 350W (기본값 600W)
GPU당 350W = 총 1,400W의 GPU 부하로, PSU 예산에 맞춰 설계되었습니다. 임시 단일-1700W-PSU 단계(240V 회로 이전) 동안 카드들은 약 260W에서 작동했습니다 (4×260 = 1,040W GPU + 시스템 약 280W ≈ 총 1,320W).
확인: nvidia-smi --query-gpu=index,power.limit,power.draw --format=csv
결과
상위(Upstream): Gen4 x16 (~30 GB/s to CPU). 스위치를 통한 P2P: 단방향 27.5 GB/s / 양방향 50.4 GB/s, 지연 시간 0.37–0.45 µs, 즉 Gen4 라인 레이트입니다. 참고: ASPM이 어디에서 활성화되어 있으면 lspci가 유휴 상태일 때도 다운스트림 GPU 링크를
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기