local-llm 소개
클라우드 LLM API에 의존하지 않고 최신 모델을 자기 하드웨어에서 직접 돌리려면, 어떤 GPU를 몇 장 사고 메인보드와 전원, PCIe 배선을 어떻게 맞춰야 하는지부터 막히기 마련입니다. local-llm 은 개발자 jamesob 이 실제로 구입해 운영 중인 로컬 추론(inference) 장비의 구성과 설정을 정리한 가이드 저장소입니다. 저자는 README 첫머리에 "표를 제외한 이 문서의 어떤 내용도 AI가 작성하지 않았다" 고 밝히며, 본인이 직접 부딪히며 얻은 배선·BIOS·커널 설정의 세부까지 공유합니다.
이 저장소의 중심에는 4장의 NVIDIA RTX PRO 6000(각 96GB, 합계 384GB VRAM)으로 만든 장비가 있습니다. 저자는 여기에 값비싼 최신 PCIe5 플랫폼 대신, eBay에서 모은 지난 세대 DDR4 기반 EPYC 시스템을 호스트로 붙여 기본 시스템 비용을 약 1만 달러 아낀다고 설명합니다. 돈은 실제 성능을 좌우하는 VRAM에 몰아넣고, 나머지는 최대한 절약하는 것이 이 구성의 핵심 판단입니다.
local-llm 이 다루는 범위는 하드웨어 명세서(BOM)에 그치지 않습니다. GPU끼리 CPU를 거치지 않고 직접 통신하게 만드는 PCIe 스위치 배선, 링크 속도가 떨어지지 않도록 잡는 BIOS·커널 파라미터, 110V 회로에서 돌리기 위한 전력 제한, 그리고 모델 가중치를 로컬에 캐시하고 Docker로 격리해 서빙하는 방법까지 하나의 흐름으로 이어집니다. 로컬 추론 장비를 처음부터 꾸리려는 사람에게 실제 구입 목록과 설정값을 그대로 참고할 수 있는 자료입니다.
local-llm이 다루는 지출 규모별 구성
저자는 "얼마를 쓸 것인가"를 기준으로 구성을 세 단계로 나눕니다. 가장 낮은 단계는 약 2천 달러로, RTX 3090 2장(합계 48GB VRAM)을 붙이는 구성입니다. 이 정도면 Qwen3.6-27B를 돌릴 수 있고, 음성 인식(speech-to-text, STT)까지 로컬로 처리할 수 있습니다. 저자는 STT용으로 cohere-transcribe를 쓰며, 이 모델은 약 11GB VRAM만 있으면 되어 ./runners/stt의 설정으로 바로 실행할 수 있다고 안내합니다.
중간 단계인 약 2만 달러 구간에 대해서는 RTX 6000 Pro 2장, DGX Spark 4대를 묶은 클러스터, 애플 하드웨어 등을 후보로 언급하지만, 저자는 이 영역은 직접 경험이 없어 도움을 주기 어렵다고 솔직하게 적어 두었습니다. 가장 높은 단계는 약 4만 달러로, RTX 6000 Pro 4장을 사서 384GB VRAM을 확보하는 구성입니다. 저자는 이 단계에서 "Claude Opus에 상당히 가까운" 수준의 모델 지능을 얻을 수 있다고 주장합니다. 2026년 7월 1일 기준 저자가 이 장비에서 추천하는 모델은 GLM-5.2-Int8Mix-NVFP4-REAP-594B입니다.
local-llm의 하드웨어 구성
4장 GPU 장비의 기본 시스템은 대부분 eBay에서 모은 지난 세대 EPYC 부품으로 꾸려졌습니다. 저자가 공개한 명세와 가격은 다음과 같습니다.
| 부품 | 사양 | 가격 |
|---|---|---|
| 메인보드 | ASRock Rack ROMED8-2T (SP3, PCIe 4.0 x16 7슬롯, 듀얼 10GbE) | $715 |
| CPU | AMD EPYC Milan 7313P (16코어 3.0GHz) | $504 |
| RAM | Crucial DDR4 ECC RDIMM 16GB 8개 (합계 128GB) | $642 |
| 저장장치 | 부팅용 4TB M.2 + 모델 가중치용 8TB M.2 2개 | $1,491 |
| 전원 | Super Flower 1700W 2개 | $750 |
| PCIe 스위치 | c-payne Microchip Switchtec PM40100 Gen4 | 약 $1,330 |
| 기본 시스템 합계 | $5,687 |
여기에 실제 비용의 대부분을 차지하는 GPU가 더해집니다. 4장의 NVIDIA RTX PRO 6000 Blackwell Workstation(각 96GB, 합계 384GB VRAM)의 가격은 약 4만 6천 달러입니다. 저자는 RAM 값이 크게 오른 시점이라 DDR5·PCIe5 기반의 최신 플랫폼을 피하고 지난 세대 구성을 택함으로써, VRAM 성능은 유지하면서 호스트 비용을 약 1만 달러 절감했다고 설명합니다. 모델이 시스템 RAM으로 넘치면 에이전트 워크로드에서는 속도가 실사용이 어려울 만큼 느려지므로, VRAM에 최대한 담는 것이 중요하다는 판단입니다.
GPU와 스위치는 기성 케이스에 들어가지 않아, 저자가 하루에 걸쳐 나무로 직접 짠 오픈 프레임 구조물에 장착했습니다.
local-llm의 PCIe 스위치와 P2P 튜닝
이 구성에서 가장 특이한 선택은 c-payne.com의 PCIe Gen4 스위치를 쓴 점입니다. 텐서 병렬화(tensor parallelism)로 여러 GPU가 한 모델을 나눠 돌릴 때는 GPU 간 allreduce 통신이 병목이 되는데, 이 스위치를 거치면 데이터가 CPU의 PCI 루트 컴플렉스를 통하지 않고 GPU끼리 스위치 패브릭 안에서 직접(P2P) 오갑니다. 저자는 이 방식으로 값비싼 PCIe5 하드웨어 없이도 카드 간 지연을 낮췄다고 설명합니다.
문제는 메인보드가 링크 속도를 임의로 낮추지 않도록 BIOS를 세심하게 맞춰야 한다는 점입니다. 저자가 ROMED8-2T에서 조정한 주요 항목은 스위치 슬롯의 링크 폭을 x16으로 고정하기, 링크 속도를 Auto가 아닌 Gen4로 강제하기, ASPM 비활성화, 그리고 96GB VRAM 전체를 노출하고 P2P를 쓰기 위한 Re-Size BAR 활성화입니다. 특히 ASPM은 유휴 상태에서 링크를 2.5GT/s로 떨어뜨려 lspci 상 "Gen1으로 강등된" 것처럼 보이게 만드는데, 실제로는 부하가 걸리면 Gen4로 다시 올라간다고 저자는 짚습니다.
커널 쪽에서는 GRUB 파라미터로 IOMMU를 꺼야 합니다. 저자는 이를 켜 두면 다중 GPU P2P에서 NCCL이 멈춘다고 경고합니다.
# /etc/default/grub
GRUB_CMDLINE_LINUX="iommu=off amd_iommu=off nomodeset"
sudo update-grub
# nvidia_uvm P2P 관련 설정
echo 'options nvidia_uvm uvm_disable_hmm=1' | sudo tee /etc/modprobe.d/uvm.conf
sudo update-initramfs -u
또한 기본값으로 켜져 있는 ACS(Access Control Services)를 끄지 않으면 P2P 트래픽이 스위치 패브릭에 머물지 않고 CPU 루트 포트로 우회해, 스위치를 쓰는 의미가 사라집니다. 저자는 패치 커널 없이 런타임에 setpci로 ACS를 끄는 스크립트를 systemd oneshot으로 매 부팅 시 실행합니다.
# /usr/local/bin/disable-acs.sh 의 핵심 루프
for BDF in $(lspci -d "*:*:*" | awk '{print $1}'); do
setpci -v -s ${BDF} ECAP_ACS+0x6.w > /dev/null 2>&1 || continue
setpci -v -s ${BDF} ECAP_ACS+0x6.w=0000
done
설정이 제대로 됐는지는 nvidia-smi topo -m에서 네 GPU 사이가 모두 PIX 로 표시되는지(PHB나 NODE가 아니라)로 확인하며, 저장소의 ./tools/measure-gpu-speed.sh로 대역폭과 지연을 측정할 수 있습니다. 저자가 보고한 결과는 스위치를 통한 P2P 기준 단방향 27.5GB/s, 양방향 50.4GB/s, 지연 0.37~0.45µs로, Gen4 회선 속도에 해당합니다.
전력은 220V 회로를 새로 깔지 않으려고 단일 110V 회로에서 돌리되, GPU당 전력을 제한해 맞춥니다. 기본 600W인 카드를 350W로 낮춰 GPU 총부하를 1,400W로 잡고, 이를 systemd로 부팅 시 적용합니다.
sudo nvidia-smi -pm 1
sudo nvidia-smi -pl 350 # GPU당 350W (기본값 600W)
local-llm의 모델 저장과 서빙 방식
모델 가중치는 두 개의 8TB 드라이브에 복제되는 ZFS 파일시스템(~/storage)에 로컬로 보관합니다. 실행할 모델은 먼저 로컬로 내려받아 캐시합니다.
hf download <model-name> --local-dir ~/storage/<model-name>
각 모델은 자체 디렉토리에 docker-compose.yml 을 두어 개별 Docker 컨테이너로 격리해 실행하며, 컨테이너는 캐시된 가중치를 읽기 전용으로 마운트합니다. 이 서빙 설정들은 저장소의 ./runners/ 디렉토리에 정리되어 있고, README의 목차에 따르면 GLM-5.2-594B 러너는 vLLM 기반 docker-compose로 약 460k 컨텍스트에서 초당 약 80토큰을 낸다고 적혀 있습니다.
모델이 http://<추론-머신-IP>:5000 으로 서빙되면, 저자는 다른 머신의 VM에 올린 opencode 로 이 API에 접속해 사용합니다. 이 VM에서는 ~/src 트리의 디렉토리마다 tmux 세션을 만들어 각각 opencode 인스턴스를 띄우고, 웹 검색·텔레그램 알림·로컬 Gitea 연동 같은 도구를 붙여 에이전트가 대화형으로 작업하거나 Gitea 이슈를 받아 PR을 올리도록 구성했습니다. 이 모든 작업은 호스트와 공유 파일시스템으로만 연결된 샌드박스 VM 안에서 이뤄집니다.
local-llm 저장소 활용
local-llm 은 설치해서 실행하는 패키지가 아니라, 실제 구입 목록과 설정값을 담은 참고 자료입니다. 저장소의 ./runners/에는 모델별 docker-compose 서빙 설정이, ./runners/stt에는 cohere-transcribe 기반 음성 인식 설정이, ./tools/에는 GPU 간 대역폭·지연을 측정하는 measure-gpu-speed.sh 가 들어 있습니다. 자신의 카드 수와 배선에 맞춰 이 설정들을 출발점으로 삼을 수 있습니다.
local-llm 프로젝트 GitHub 저장소
RTX 6000 Pro 4·6·8장 구성 참고 저장소
c-payne PCIe 스위치 (저자가 사용한 인디 하드웨어)
더 읽어보기
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. ![]()
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()



