공개 가중치 AI의 접근성은 최신 GPU뿐 아니라 재활용 서버, 추론 엔진, 메모리 구조 이해에도 크게 좌우됨
2016년 Xeon 서버에서 Gemma 4 실행하기
하드웨어 조건과 병목
테스트 장비는 Intel Xeon E5-2620 v4 @ 2.10GHz, 물리 8코어/16스레드, AVX2 지원, AVX-512·AVX-VNNI·BF16 미지원, L3 20MiB, 총 L2 2MiB, 128GB DDR3 메모리, GPU 없음으로 구성됨
LLM 추론의 디코더 단계는 다음 토큰을 만들 때마다 모델 가중치를 RAM에서 CPU 캐시로 계속 가져와야 하므로, 순수 연산 성능보다 메모리 대역폭이 병목이 됨
ChatGPT 같은 도구에서 텍스트가 단어별로 흘러나오는 과정은 출력 토큰을 하나씩 생성하는 디코더 패스이며, 숨겨진 긴 추론 체인이 있어도 각 토큰마다 같은 디코더 패스가 필요함
이 병목은 Xeon뿐 아니라 H100에서도 중요한 성능 장벽으로 작용하는 메모리 장벽이며, DDR3 기반 CPU-only 환경에서는 더 크게 드러남
일반 llama-cli, ollama, 표준 llama-cpp 방식만으로는 이 환경에서 충분한 최적화 노출과 모델 지원을 얻기 어려워, ik_llama.cpp의 세부 플래그를 직접 조합해야 함
실행 명령과 핵심 최적화
전체 실행 구성
실제 실행은 gemma-4-26B-A4B-it-Q8_0.gguf 검증기와 MTP 드래프터 GGUF를 함께 쓰고, --spec-type mtp, --cpu-moe, --flash-attn on, --mlock, --run-time-repack 같은 플래그를 한 번에 적용함
블랙박스 도구에서는 이런 명령줄을 확인하기 어렵고, 오래된 하드웨어에서는 각 플래그의 역할을 이해해야 성능을 끌어낼 수 있음
일부 플래그는 적용되지 않거나 엔진이 조용히 우회할 수 있어 로그 확인이 필수임
추측 디코딩
--spec-type mtp --draft-max 3 --draft-p-min 0.0 --spec-autotune은 26B 검증기와 작은 MTP 드래프터를 묶어 최대 3개 토큰을 초안으로 만들고, 워크로드에 맞춰 체인 길이를 자동 조정함
추측 디코딩은 메모리 대역폭에 묶인 디코더 패스 수를 줄이는 소프트웨어적 우회로로 작동함
CPU에서는 작은 드래프터의 활성 계층이 L3 캐시에 들어갈 수 있고, 검증기는 캐시를 훨씬 넘어서므로 드래프터에 추가 연산을 쓰는 비용이 상대적으로 작음
CPU 환경에서는 검증기 가중치를 캐시로 계속 스트리밍하는 비용이 커, 추측 디코딩의 효과가 GPU보다 더 강하게 나타날 수 있음
CPU와 MoE 라우팅
Gemma 4 26B-A4B는 128개 전문가 중 토큰당 8개가 활성화되며, 전체 약 25.2B 파라미터 중 약 3.8B 활성 파라미터를 사용함
--cpu-moe는 CPU 캐시 계층에 맞춰 MoE 라우팅을 조정해, 128개 전문가 사이를 계속 이동하며 캐시를 비우고 DDR3에서 다시 가져오는 캐시 스래싱을 줄이도록 설계됨
--merge-up-gate-experts는 전문가 내부의 두 projection을 하나의 행렬 곱으로 합쳐 메모리 버스를 여러 번 오가는 비용을 줄이며, 로그의 fused_up_gate = 1로 적용 여부를 확인할 수 있음
-t 8은 물리 코어 수와 맞춘 설정이며, 이 작업은 DDR3 대기 시간이 병목이므로 16개 SMT 스레드까지 늘리면 처리량보다 스케줄링 비용이 커질 수 있음
--parallel 8은 병렬 실행 설정과 함께 물리 코어 중심의 CPU 활용을 맞추는 구성으로 쓰임
메모리 고정, 재패킹, KV 캐시
런타임 재패킹
--run-time-repack은 추론 직전에 가중치 행렬을 CPU 캐시 레이아웃에 맞게 메모리에서 재구성함
로그에는 Repacked 265 tensors가 출력되어 265개 텐서가 재배치됐음을 확인할 수 있음
일반 레이아웃의 가중치 행렬을 그대로 읽으면 CPU가 데이터를 어색한 조각 단위로 가져와 캐시 미스가 발생할 수 있음
시작 시 약간의 시간을 들여 메모리 배치를 바꾸는 대신, 실제 텍스트 생성 단계에서 메모리 대역폭을 최대한 쓰도록 만드는 최적화임
mlock과 스왑 방지
--mlock은 모델을 물리 RAM에 고정해 운영체제가 디스크로 스왑하지 못하게 하는 설정임
AI 가중치 27GB가 디스크로 스왑되면 다시 읽는 동안 생성 속도가 사실상 멈출 수 있음
로그에 failed to mlock 27628376064-byte buffer와 Try increasing RLIMIT_MEMLOCK ('ulimit -l' as root)가 나오면, 플래그 문제가 아니라 커널의 memlock 제한이 27GB 버퍼를 고정하기에 낮은 상태임
이는 LLM 고유의 문제가 아니라 기본 ulimit 설정에서 생기는 운영체제 제한이며, 블랙박스 도구는 해당 최적화를 요청하지 않는 방식으로 문제를 감출 수 있음
KV 캐시 배치
--no-kv-offload는 엔진이 KV 캐시를 GPU로 옮기려 하지 않도록 하는 설정임
KV 캐시는 현재 대화 문맥을 저장하는 단기 기억 역할을 하며, 새 토큰마다 전체 프롬프트를 다시 읽지 않게 해줌
일반적으로 AI 엔진은 읽기·쓰기가 잦은 KV 캐시를 더 빠른 GPU 메모리로 오프로드하려 하지만, 이 구성에는 GPU가 없으므로 하드웨어 버스 검색과 오류 가능성을 줄이는 편이 나음
이 설정은 KV 캐시를 가중치와 함께 시스템 RAM에 유지하도록 명시함
그래프 분할과 Attention 최적화
그래프 레이아웃
-sm graph -smgs -sas -mea 256 --split-mode-f32는 계산 그래프를 메모리 영역에 어떻게 배치하고 분할할지 제어하는 설정임
-sm graph는 계산 그래프를 수직으로 나눠 여러 프로세서나 메모리 영역이 같은 계층의 서로 다른 부분을 동시에 계산하는 방식을 목표로 함
기본 또는 대체 방식인 레이어 분할은 모델을 계층 단위로 나눠, 한 프로세서가 앞 계층을 계산한 뒤 다음 프로세서로 넘기는 구조라 일부 하드웨어가 대기할 수 있음
이번 실행 로그에는 Split mode 'graph' is not supported for Gemma4 external MTP => changing split mode to 'layer'가 출력되어, Gemma4 외부 MTP 구성에서는 그래프 분할이 지원되지 않아 레이어 분할로 안전하게 내려감
MTP는 네트워크 끝단의 수학적 연결을 더 복잡하게 만들기 때문에, 이 엔진은 아직 MTP 아키텍처를 안전하게 그래프 분할하지 못하는 상태임
-sas는 여러 물리 CPU 소켓 또는 NUMA 노드가 있는 서버에서 워크로드 분할 방식을 지정하는 플래그이며, 단일 CPU 시스템에서도 향후 다중 CPU 구성의 벤치마크 후보가 됨
--split-mode-f32는 분할된 계산 결과를 다시 합칠 때 중간 연결 지점에 32비트 부동소수점 정밀도를 사용해 반올림 오류로 인한 품질 저하를 막는 설정임