Jamesob의 최신 수준 LLM 로컬 실행 가이드

2 hours ago 1
  • 로컬에서 최신 수준 LLM과 음성-텍스트 변환을 돌리기 위한 하드웨어 구성, PCIe 스위치 설정, Docker 실행 구성을 한 저장소에 정리함
  • $2k 예산은 2× RTX 3090으로 48GB VRAM을 확보해 Qwen3.6-27B와 whisper-large-v3 기반 로컬 STT를 실행하는 구성을 목표로 함
  • $40k 예산은 4× RTX PRO 6000 Blackwell Workstation으로 384GB VRAM을 확보해 Claude Opus에 꽤 가까운 모델 지능을 얻는 구성을 전제로 함
  • 실제 4× RTX 6000 Pro 시스템은 중고 EPYC/DDR4 기반 본체와 c-payne PCIe Gen4 스위치를 조합해 GPU 간 P2P 통신을 CPU 루트 컴플렉스 대신 스위치 패브릭 안에서 처리함
  • BIOS, GRUB, ACS, 전력 제한 설정까지 맞춘 결과 P2P는 27.5GB/s 단방향, 50.4GB/s 양방향, 0.37–0.45µs 지연으로 Gen4 라인레이트에 도달함

로컬 LLM 실행을 위한 예산 구간

  • 이 구성은 로컬에서 최신 수준의 모델과 음성-텍스트 변환을 실행하려는 사용자를 대상으로 함
  • 저장소에는 사용 중인 하드웨어, 구입 이유, 설정 팁, 로컬 STT 실행 방식, Docker 컨테이너 기반 모델 실행 구성이 포함됨
  • README의 표를 제외한 내용은 AI가 작성하지 않았다는 주석이 있음
  • 약 $2k 구성

    • 2× RTX 3090으로 총 48GB VRAM을 확보하는 구성을 제안함
    • 이 구성에서 Qwen3.6-27B를 실행할 수 있음
    • 로컬 STT는 whisper-large-v3를 사용하며, 접근용으로 크로스플랫폼 stt 하네스를 사용함
    • ./runners/stt에는 Nvidia GPU에서 약 11GB VRAM만 있다고 가정하는 실행 준비된 STT 설정이 있음
    • 로컬 STT는 호스팅 서비스보다 편하게 사용할 수 있는 도구로 다뤄짐
  • 약 $40k 구성

    • 4× RTX 6000 Pro로 총 384GB VRAM을 확보하는 구성을 전제로 함
    • 이 가격대에서는 Claude Opus에 꽤 가까운 수준의 모델 지능을 얻는 단계로 표현됨
    • 2026-07 기준 4× RTX6kPRO용 현재 최선 모델로 GLM-5.2-Int8Mix-NVFP4-REAP-594B가 제시됨
    • 실행 구성은 runners/GLM-5.2-594B에 있음
    • 다른 접근으로는 4× DGX Spark 클러스터를 연결해 512GB VRAM을 확보하고, 느린 큰 브레인으로 Qwen3.7-27B가 반복 작업을 빠르게 처리하게 하는 방식도 언급됨

실제 4× RTX 6000 Pro 하드웨어

  • 실제 시스템은 4× RTX PRO 6000 Blackwell Workstation을 중심으로 구성됨
  • GPU는 각 96GB, 총 384GB VRAM이며 가격은 약 $46,000
  • 본체는 이전 세대 EPYC와 eBay DDR4 부품을 활용해 기본 시스템 비용을 낮추고 VRAM에 비용을 집중함
  • 2026년 7월 기준 PCIe5/DDR5 기반 시스템이 매우 비싸기 때문에 PCIe Gen4 스위치와 DDR4 기반 본체를 선택함
  • 기본 시스템 BOM

    • 기본 시스템은 대부분 eBay에서 구한 이전 세대 EPYC 부품으로 구성됨
    • 주요 부품과 가격은 다음과 같음
    • ASRock Rack ROMED8-2T 메인보드: $715
    • AMD EPYC Milan 7313P 16코어 3.0GHz CPU: $504
    • 8× 16GB Crucial DDR4 ECC RDIMM, 총 128GB RAM: $642
    • 2× Super Flower 1700W PSU: $750
    • c-payne Microchip Switchtec PM40100 Gen4 PCIe 스위치: 약 $1,330
    • 4TB 부팅 NVMe: $291
    • 2× 8TB 모델 가중치용 NVMe: $1,200
    • 기본 시스템 합계는 $5,587
  • PCIe Gen4 스위치

    • c-payne의 PCIe4 스위치를 사용해 GPU 간 통신을 거의 직접 처리함
    • 텐서 병렬화의 allreduce 단계에서 GPU 간 데이터가 PCI 루트 컴플렉스를 거치지 않고 스위치 패브릭 안에서 이동함
    • 스위치 서브 BOM은 약 €1,220, 약 $1,330 USD
    • Microchip Switchtec PM40100 기반 PCIe Gen4 5× x16 스위치
    • SlimSAS PCIe Gen4 Host Adapter x16
    • SlimSAS SFF-8654 8i 케이블 2개
    • GPU와 PCI 스위치용 나무 인클로저를 직접 제작했으며 약 하루가 걸림
    • PCI 스위치 내장 팬은 매우 시끄럽고 쓸모없어 보여 보드에서 분리함

모델 가중치 저장과 실행 방식

  • 모든 모델 가중치는 두 개의 8TB 드라이브에 복제된 ZFS 파일시스템에 로컬 저장됨
  • 파일시스템은 ~/storage에 마운트됨
  • 실행할 모델은 먼저 다음 명령으로 로컬에 다운로드함
hf download <model-name> --local-dir ~/storage/<model-name>
  • 각 모델은 별도 디렉터리에 docker-compose.yml을 두고 자체 Docker 컨테이너 안에서 실행됨
  • 실행 구성은 ./runners/에 있음
  • 각 컨테이너는 캐시된 가중치를 읽기 위해 ~/storage/models를 읽기 전용으로 마운트함
  • 모델이 http://clank.j.co:5000에서 서빙되면 다른 머신의 VM에서 호스팅되는 opencode로 접근함
  • 내부 DNS 서버로 clank.j.co를 LLM 머신에 매핑하지만, :5000">http://<llm-machine-ip>:5000 형태도 가능함

에이전트 하네스와 도구 구성

  • 별도 VM 안에서 ~/src 트리의 각 디렉터리마다 tmux 세션을 만들고, 각 세션에서 opencode 인스턴스를 실행하는 애플리케이션을 사용함
  • 각 opencode 인스턴스는 추론 머신의 HTTP API인 http://clank.j.co:5000을 백엔드로 사용함
  • 오픈소스 모델을 잘 쓰기 위한 핵심은 도구 구성으로 다뤄짐
  • skills/ 요약에는 다음 도구가 포함됨
    • camofox, kagi.com API 키, searXNG를 통한 웹 브라우징과 검색
    • Telegram 봇을 통한 커뮤니케이션과 알림
    • 소스 코드 협업용 로컬 비공개 Gitea 인스턴스
  • 에이전트는 세션에서 대화형으로 함께 작업하거나, Gitea 이슈를 처리하고 PR을 올리는 방식으로 맡길 수 있음
  • 이 작업은 샌드박스 VM 안에서 실행되며, 호스트와의 통신은 공유 파일시스템 마운트로만 이뤄짐

PCIe 스위치와 멀티 GPU 설정

  • BIOS 설정

    • ROMED8-2T 메인보드에서 PCI 스위치 속도가 내려가지 않도록 BIOS 설정을 조정함
    • AMD PCIE Link Width는 스위치 슬롯에 대해 x16으로 설정함
    • 기존 x8/x8 분기 설정은 슬롯을 나눠 upstream 링크가 Gen4 x8로 훈련되게 함
    • SlimSAS 8i 케이블 2개가 모두 연결되어야 하며, 각 케이블은 x8을 담당함
    • PCIe Link Speed는 Gen4로 강제함
    • Blackwell Gen5 장치가 Gen4 스위치를 통해 자동 협상할 때 훈련에 실패하고 Gen1로 떨어질 수 있음
    • ASPM은 Disabled로 설정함
    • ASPM L1은 유휴 링크를 2.5GT/s로 낮춤
    • lspci에서 Gen1으로 다운그레이드된 것처럼 보이는 원인이었지만, 부하 중에는 Gen4로 동작함
    • Re-Size BAR는 Enabled로 설정함
    • 전체 96GB VRAM BAR 노출과 GPU P2P에 필요함
    • SR-IOV는 Disabled로 설정함
    • 베어메탈 추론 환경에서 IOMMU 오버헤드와 P2P 간섭을 피하기 위한 설정임
    • Preferred IO는 Auto로 둠
    • 수동으로 c-payne 스위치 버스 81을 지정하면 약간의 지연 개선 여지가 있지만, 수정이 아니라 최적화이며 BIOS 변경 후 버스 번호가 바뀔 수 있음
  • Redriver와 케이블

    • c-payne 조언에 따라 c-payne tool로 redriver gain을 lvl 3으로 낮춤
    • gain 수준은 SAS 커넥터 케이블 길이에 따라 달라짐
    • c-payne에서 케이블을 너무 적게 주문해 Amazon에서 비슷해 보이는 SAS 케이블을 샀지만, 약간의 차이로 문제가 생겨 다시 주문함

커널, ACS, 전력 제한

  • GRUB와 NVIDIA UVM

    • /etc/default/grub에 다음 커널 파라미터를 설정함
    GRUB_CMDLINE_LINUX="iommu=off amd_iommu=off nomodeset" sudo update-grub
    • iommu=off가 없으면 멀티 GPU P2P에서 NCCL이 멈춤
    • NVIDIA UVM P2P 수정을 위해 다음 설정을 적용함
    echo 'options nvidia_uvm uvm_disable_hmm=1' | sudo tee /etc/modprobe.d/uvm.conf sudo update-initramfs -u
  • ACS 비활성화

    • ACS가 기본값으로 활성화되어 있으면 P2P 트래픽이 스위치 패브릭 안에 머물지 않고 CPU 루트 포트를 거침
    • 이 상태에서는 PCIe 스위치의 효과가 사라짐
    • pcie_acs_override에는 패치된 커널이 필요하므로 런타임에 setpci로 ACS를 비활성화함
    • 부팅 때마다 systemd oneshot 서비스로 /usr/local/bin/disable-acs.sh를 실행함
    • 검증 방법은 다음과 같음
    • lspci -vvv | grep ACSCtl에서 모두 minus sign으로 표시되어야 함
    • nvidia-smi topo -m에서 네 GPU 사이가 PIX로 보여야 하며 PHB/NODE가 아니어야 함
    • ./tools/measure-gpu-speed.sh로 P2P 대역폭과 지연을 쉽게 측정할 수 있음
  • GPU 전력 제한

    • 220V 회로 설치를 피하기 위해 단일 110V 회로에서 실행하되 GPU 전력을 제한함
    • systemd로 부팅 시 persistence mode와 전력 제한을 적용함
    sudo nvidia-smi -pm 1 sudo nvidia-smi -pl 350
    • GPU 전력 제한은 GPU당 350W이며 기본값은 600W임
    • 4×350W는 GPU 부하 1,400W로 PSU 예산에 맞춘 값임
    • 240V 회로 전의 단일 1700W PSU 단계에서는 GPU를 약 260W로 운용함
    • 4×260W = 1,040W GPU
    • 시스템 약 280W를 더해 총 약 1,320W임
    • 검증은 nvidia-smi --query-gpu=index,power.limit,power.draw --format=csv로 함

측정 결과와 참고 자료

  • CPU 방향 upstream은 Gen4 x16이며 약 30GB/s
  • 스위치를 통한 P2P는 27.5GB/s 단방향, 50.4GB/s 양방향
  • 지연은 0.37–0.45µs로 Gen4 라인레이트 수준임
  • ASPM이 어딘가에서 활성화되어 있으면 lspci가 유휴 상태의 downstream GPU 링크를 2.5GT/s (downgraded)로 표시할 수 있음
  • 이 표시는 cosmetic이며, 링크는 부하가 걸리면 Gen4로 재훈련됨
  • Resources

    • local-inference-lab/rtx6kpro: 4, 6, 8장 RTX 6000 Pro 카드 활용을 자주 업데이트하는 저장소
    • c-payne: 이 구성에서 사용하는 인디 PCI 스위치
    • RTX6kPRO Discord: RTX6kPRO 벤치마크와 새 모델 테스트를 다루는 Discord 서버
Read Entire Article