한 워크스테이션의 빌드 로그다. 이 하드웨어로 실제로 무엇을 할 수 있는지, 측정한 것만 적는다. 대규모 언어 모델이 먼저고 영상·이미지·오디오가 뒤따른다.
숫자는 전부 이 기계에서, 적힌 날짜에 잰 것이다. 도출한 값은 도출했다고 밝히고, 틀린 기록은 지우지 않고 선을 그어 정정한다. 미출시 모델을 맞지 않는 하드웨어에서 돌리면 남이 테스트하지 않은 경로를 밟게 되는데, 그렇게 찾은 결함을 업스트림에 돌려보내는 것이 이 로그의 나머지 절반이다(docs/upstream-contributions.md).
기록은 하루 한 파일로 log/에 있다. 모델·엔진별 속도표는 docs/engine-rates.md다. 리포 안은 한국어로 쓰고, 리포를 나가는 글(업스트림 이슈·PR 본문, 업스트림이 읽을 코드 주석)은 영어로 쓴다.
Qwen3.8-Flash-Next UD-Q4_K_XL(103.7 GiB)이 draft 모델 없이 51.0 tok/s로 디코딩하는 장면이다. 3090에 20.5 GiB, A6000에 46.6 GiB, 시스템 RAM에 39.7 GiB가 올라가 있다. 실행의 닫는 구간을 앞에서 잘라 냈고 길이를 줄이지 않았다. toktape 0.2.3-5-g9bf4e52로 녹화했다. 기록
현재 상태다. 바뀐 이력은 docs/machine-changes.md에 있다.
| CPU | AMD Ryzen Threadripper PRO 5975WX, 32 cores / 64 threads. Boost disabled, no clock cap |
| Memory | 256 GB DDR4-3600 at DRAM 1.30 V — 32 GB × 8, all 8 channels, Samsung M378A4G43AB2-CWE 2Rx8 UDIMM, non-ECC |
| Measured memory read | 147.7 GB/s (32-thread, 8 GiB read probe); 230.4 GB/s theoretical. A second probe reads 144.8, the one toktape's host percentages use |
| GPU 0 | NVIDIA RTX A6000, 48 GB, bus 61 |
| GPU 1 | NVIDIA GeForce RTX 3090, 24 GB, bus 41 |
| Device order | By UUID, never by slot. Runners source configs/gpu-order.env so CUDA0 is the 48 GB card; nvidia-smi ignores it and takes -i <UUID> |
| Board | ASUS Pro WS WRX80E-SAGE SE WIFI |
| Storage | Samsung 980 PRO 2 TB NVMe (root) + Phison E18 4 TB NVMe (/models) |
| Case / Power | 3RSYS T840 / Super Flower Leadex Platinum SF-2000F14HP, 2000 W |
| Cooling | ARCTIC Freezer 4U-M on CPU_FAN. Case fans are wired to the PSU, so all six CHA_FAN channels read Disabled; fan RPM and slot temperatures only via the BMC (ipmitool sdr type fan, sdr type temperature) |
| OS | Ubuntu 24.04, kernel parameter pci=realloc=off |
지금도 유효한 함정이 넷 있다. pci=realloc=off가 없으면 칩셋 USB가 xhci init -16으로 죽고 10GbE 포트가 내려간다(pci=nocrs는 USB를 살리는 대신 NVIDIA 드라이버를 깨뜨린다). X550 10GbE 포트는 GRO·TSO·GSO·LRO를 끄기 전에는 지속 부하에서 Tx Unit Hang을 낸다. 섀시 팬은 커브를 걸 수 없고, 하나가 죽어도 보이지 않는다. PSU 공개 스펙은 ATX12V 2.2 / EPS12V라 네이티브 12V-2x6 커넥터가 없다(벤더 시트에서 읽은 것이다).
지속 부하에서 A6000이 86–87 °C를 유지하고 2026-09-16 선 그음: 팬 속도를 증인에 넣지 않고 쓴 문장이었다. 87 °C는 카드 자체 목표 84 °C보다 5 °C 위일 뿐이고, 원인은 카드 팬 커브가 100%에 닿기까지 3.7분 걸리는 데 있다. GPU 팬은 NVML로 제어한다(SW Thermal Slowdown이 약 100% 시간 켜져 있으니, duty cycle 100%인 작업은 시작하기도 전에 스로틀링 상태다.tools/gpu-fan-curve.py, 측정).
3090은 부하 중 버스에서 떨어진다(Xid 79). NCCL DDP로 133초 만에 재현되고 양 카드를 250 W로 묶으면 같은 DDP가 900초 동안 깨끗하지만, 이것은 동작하는 설정이지 원인 규명이 아니다(재현). 2026-09-22에 하루 두 번 떨어져서 그날부터 시간 측정은 A6000에서 하고, 3090은 게이트·빌드용으로 300 W 250 W 캡을 걸어 쓴다(2026-09-23에 바꿨다 — 기록)(기록).
전부 이 상자에서 잰 값이다. 전체 표는 docs/engine-rates.md.
| 모델 | 조건 | 디코드 | 기록 |
|---|---|---|---|
| DeepSeek-V4.1-Flash, 서빙 프로파일 + DSpark draft | ik_llama.cpp, warm | 25.05 tok/s | 09-16 |
| Qwen3.8-Flash-Next 125B UD-Q4_K_XL, draft 없음 | 양 카드 + 시스템 RAM | 51.1 tok/s | 09-16 |
| Qwen3-Coder-Next IQ4_XS | A6000 단독, 컨텍스트 32k | 133 tok/s | 09-16 |
| Qwen3.6-35B-A3B UD-Q6_K, 1스트림 | ik / mistral.rs | 129 / 111 tok/s | 09-17 |
| 같은 모델, 8스트림 합계 | ik / mistral.rs | 152 / 324 tok/s | 09-17 |
| GLM-5.3-Flash | ik, expert 10층 온카드 / ExLlamaV3 -mcs 195 |
18.7 / 22.2 tok/s | 09-15 |
| MiMo-V2.6-Flash MXFP4 | mainline, expert 16층 GPU·31층 RAM | 24.0 tok/s | 09-22 |
| DeepSeek-V4.1-Flash 첫 가동, engram 84 GB는 NVMe에 | mainline llama.cpp | 20 tok/s | 09-12 |
| DeepSeek-V4.1-Flash 공개 Q3_K_M, 깊이 6 | bloomery, A6000 + 시스템 RAM (llama.cpp PR #28696 22.75) | 29.66 tok/s [cpu-busy] |
09-28 |
| 같은 모델, 채팅 사용 프로필 | bloomery, 양 카드 + 시스템 RAM | 36.0–45.5 tok/s | 09-29 |
| Qwen3.6-35B-A3B Q4_K_M, 깊이 6 | bloomery, A6000 단독 (llama.cpp 163.8, mistral.rs 114.5) | 204.4 tok/s | 09-28 |
하루 한 행이다. 상세는 날짜 파일이 진다. 색인이 기록을 요약하려 들면 색인이 자란다 — 이 표는 한 번 2,569자까지 자란 적이 있다.
| 날짜 | 무엇이 판명됐나 |
|---|---|
| 09-11 | 284 B 모델을 두 카드와 호스트 RAM에 나눠 29 tok/s. 값을 가른 것은 GPU에 올린 expert 층 수가 아니라 추측 디코딩 깊이였다 |
| 09-12 | 347 GB 중 84 GB를 드라이브에 둔 채 20 tok/s. 10분마다 하드리셋하던 BMC 워치독, 캐시만 재던 디스크 벤치(지속 쓰기 하한 3.70 대 1.47 GB/s), 이사와 SSD가 겹친 20시간 단절 |
| 09-13 | V4.1을 ik_llama.cpp에 이식해 PPL 2.2258 대 오라클 2.2438. CPU only 디코드는 ik 9.80 대 mainline 7.98 tok/s. engram 테이블을 Q8_0로 되돌리면 PPL 6% 개선 |
| 09-14 | ik 격차 20%는 engram 행 페이지 폴트였다(첫 패스 13.6 → 18.4 tok/s). 짧은 프롬프트 프리필은 expert 166 GB를 매번 버스로 복사한 탓. 공랭 교체, 메모리 3200 → 3600으로 읽기 131.2 → 147.7 GB/s |
| 09-15 | -ub 1024 → 4096이 11.9k 프리필을 ik에서 2.11배. 한 카드에 드는 모델이 132 tok/s에서 안 움직이는 상한. GLM-5.3-Flash 첫 숫자, V4.1 이식을 PR 둘로 분할 |
| 09-16 | 슬롯 이동으로 PCIe 에러 0, 3090을 빼도 디코드 손실 3% 미만. Qwen 125B가 draft 없이 51 tok/s. 첫 디퓨전이 드러낸 세 체제, 3.7분 늦게 도착하는 팬 커브, V4.1 tool-call 태그 업스트림 버그 |
| 09-17 | 프롬프트 캐시가 13k 접두사에서 깨지던 원인(파서 구분자, 9줄 패치로 턴당 13.8 → 0.8초). mistral.rs는 1스트림에 느리고 4스트림에 두 배, 호스트 오프로드는 층·토큰당 ik 0.20 ms 대 442 ms |
| 09-18 | 3090 버스 이탈을 133초에 재현하고 드라이버 소스로 기존 주장 셋을 정정. 로컬 모델 번역은 가장 빠른 것이 가장 정확한 것의 네 배로 틀렸다 |
| 09-19 | 자체 엔진 bloomery가 첫 토큰을 골랐고(0.0521 tok/s) 밤까지 5.48 tok/s. Rust GPU gemv가 ggml의 1.86배. DSpark 검증 비용이 라우팅 expert 바이트 몫과 0.13%p 안에서 일치 — 검증은 공짜가 될 수 없다 |
| 09-20 | bloomery CPU 경로의 ik 대비 배수를 18.7배에서 1.13배로. 빠진 #[target_feature] 하나, 청크 끝마다 잡던 락, 스텝당 14454번의 할당 |
| 09-21 | CPU 경로가 깊이 0에서 ik 최속 조합을 여섯 바퀴 전승(85.96 대 84.13)했지만 깊이 4096에서는 ik에 못 미친다. GPU 경로가 첫 토큰을 냈고 3090에서 ik CUDA를 넘었다. 사흘 묵은 HTTP 500 오진 정정 |
| 09-22 | 3090에서 창을 맞추니 헤드라인이 깊이 4096에서 0.912배로 뒤집혔고, 깊이 비용은 전부 flash였다. 텐서 코어 flash는 참값 자 검증 뒤 기본값이 됐다. A6000에서는 4096에서 1.115배 |
| 09-23 | engram 행은 실제 스트림에서 되풀이된다(48행 중 새 행 코드 8.38·산문 25.72). V4.1 첫 GPU 디코드가 A6000 + 호스트 티어로 25 tok/s. CUDA 13.3에서도 우리 커널은 바이트 그대로 |
| 09-24 | bloomery CPU 디코드가 깊이 4096에서 처음 ik를 넘었다(69.4 대 66.9 tok/s). V4.1 GPU 스텝 42 ms의 57 %는 카드가 호스트 expert를 기다린 시간. 공개 Q3_K_M 첫 실측 42.9 tok/s |
| 09-25 | 프리필의 날. V4.1은 첫 기준선 30.7 tok/s(ik 165.8)에서 밤까지 pp4096 169.4로. Qwen3 프리필은 342에서 pp4096 7,490 tok/s로 올라 llama.cpp -ub 4096의 1.085배 |
| 09-26 | V4.1 프롬프트 호출을 union 디스패치·배치 폭 어텐션·카드 expert 타일·층 우선 두 배치로 줄였다(각 +8–25 %). Qwen3 GEMM은 L1TEX가 아니라 지연에 묶여 있었다 |
| 09-27 | V4.1을 RTX 3090 한 장에서 36.7 tok/s(예측 33–38). Qwen3-30B 깊이 4096 디코드가 llama.cpp의 1.011배. V4.1 교차 엔진 창은 llama.cpp 행이 차가워 공개 표에서 뺐다 |
| 09-28 | 108분 출시 시팅으로 네 모델 공개 표. llama.cpp 대비 디코드 V4.1 1.30–1.38배, Qwen3.6 1.23–1.25배, GLM-5.3 PR 빌드의 1.18–1.25배. Qwen3.8은 0.90배로 진다 |
| 09-29 | 채팅 사용 프로필로 V4.1 두 카드 채팅 디코드가 28.8–29.5에서 36.0–45.5 tok/s로. 교체 복사를 엔진 뒤로 미뤄 residency 디코드 +14.4 %. Qwen3.8 카드 expert로 pp 1.81–1.91배 |
| 09-30 | 프롬프트 호출이 뜨거운 호스트 expert를 residency 풀로 옮겨 V4.1 디코드 +16…+20 %, Qwen3.8 pp 1.4–1.8배. Qwen3.8 MTP 드래프트와 residency를 합쳐 디코드 +62 % / +33 % |
09-22까지는 실험당 한 파일이었고, 날짜 파일로 합치며 줄였다. 옛 파일명과 새 위치의 대응은 log/moved.tsv에 있고, 옛 원문은 커밋 c27c3a7(09-11–09-21)과 d62f650(09-22)에 그대로 남아 있다. 새 기록의 형식은 커밋 훅 tools/check-log.py가 잰다.
다음 과제는 이 기계에서 뮤직비디오를 만드는 것이고, 그 비용에 대한 질문이 큐의 대부분이다. 목록은 docs/v41-experiment-plan.md와 트래커(WKS)에 있다.
log/ 하루 한 파일, 실험은 절. 측정한 기록
configs/ 기계에서 실제로 돌아가는 스크립트, 그대로 복사
tools/ 기록 수단: 러너, 게이트, VHS 테이프
docs/ 긴 글: 업스트림 버그 서류, 방법, 하드웨어 노트
assets/ 클립과 시트
CLAUDE.md 이 리포에서 일하는 에이전트용 컨텍스트
자주 쓰는 것: 서빙 configs/v41-serve.sh, 모델 내려받기 tools/fetch-gguf.sh, 전력 스위프 tools/ik/gpu-power-sweep.sh, 서빙 배치 시트 assets/placement-sheet.html. 긴 글은 처리량 모형 · V4.1 서빙 · 조용한 기계 · 보드 펌웨어 · 도구 인계.
측정하다 도구가 없어서 만든 것이 두 개 있다. 둘 다 MIT이고 포크가 아니다.
- toktape: 로컬 LLM 서빙용 블랙박스 테이프. 돌고 있는
llama-server에 붙어 한 실행을.tape에 담고, 모델 위치와 실제 속도를 카드에 찍는다. 이 README의 클립이 이것으로 녹화됐다. 증인 없는 tok/s는 일주일 뒤 저자 본인도 검증하지 못한다. - exl3-serve: ExLlamaV3용
llama-server호환 HTTP 앞단. ExLlamaV3에는 서버가 없어서llama-server용 도구가 EXL3 모델을 못 돌렸다(맞추는 데 든 값).
