Apple Silicon에서 온디바이스 추론 최적화

프리필 및 디코드 처리량을 향상시키는 커스텀 로컬 엔진.

작성자Perplexity Engineering

Apple Silicon에서의 하이브리드 컴퓨팅은 클라우드의 최첨단 인공지능과 Mac의 로컬 모델 간의 작업을 조율합니다. 클라우드 모델은 연구 및 추론을 처리하고, 로컬 모델은 Mac의 비공개 파일 및 앱과 함께 작동합니다.

이러한 역할 분담이 매끄럽게 느껴지려면 로컬 추론이 나머지 작업 속도를 따라잡아야 합니다. 이를 위해서는 프롬프트를 빠르게 처리하고 높은 토큰 생성 속도를 유지할 수 있는 엔진이 필요합니다.

Apple Silicon 및 Qwen3.6-35B-A3B용으로 특별히 제작된 가벼운 로컬 추론 엔진인 Lily는 프리필(prefill)과 디코드(decode)에 대한 개별 최적화를 제공합니다. 독립형 데모는 GitHub에서 공개적으로 이용할 수 있습니다.

소개

Mac에서 LLM을 실행하는 일반적인 방법은 Apple Silicon용 Apple의 오픈 소스 머신러닝 프레임워크인 MLX를 사용하는 것입니다. 컴패니언 라이브러리인 MLX-LM은 다양한 언어 모델로 텍스트를 로드하고 생성하는 데 필요한 구성 요소를 추가합니다. MLX와 MLX-LM은 함께 로컬 LLM 추론을 위한 기성품 범용 스택을 제공합니다.

Qwen3.6-35B-A3B는 희소(sparse) 하이브리드 모델로, 전문가 혼합(MoE) 라우팅을 사용하며 고정 크기 순환 상태를 완전 어텐션과 결합합니다. 이러한 아키텍처적 선택은 필요한 연산량을 줄이지만, 불규칙한 워크로드도 생성합니다. 토큰은 서로 다른 전문가 가중치로 라우팅되며, 순환 상태는 본질적으로 순차적입니다.

MLX-LM은 이미 추론 단계와 일반적인 워크로드 형태에 맞는 최적화된 커널을 선택하지만, 그 재사용 가능한 연산은 많은 모델 아키텍처를 지원해야 합니다. Qwen 전용 엔진은 모델 및 런타임 수준에서 특화되어, 모델의 고정된 구조를 중심으로 커널, 데이터 이동, 스케줄링을 조율할 수 있습니다.

Lily는 단일 프로세스에서 이 특수화를 엔드투엔드로 구현합니다. Rust 런타임이 모델 체크포인트를 로드하고 세션 상태와 생성 루프를 관리하며, OpenAI 호환 채팅 완성 API가 요청을 수락하고 토큰을 스트리밍하며, 커스텀 Metal 커널이 Qwen 전용 연산을 실행합니다. PyTorch나 MLX 모두 실행 경로에 없습니다.

두 추론 스택에서 일반성과 특수성이 위치하는 지점. MLX-LM은 모델을 재사용 가능한 커널을 통해 MLX가 스케줄링하는 컴포저블(composable) MLX 배열 연산으로 설명합니다. 반면 Lily는 모델 구조, 단계별 실행 계획, 커널 선택을 Qwen과 Apple Silicon을 중심으로 구축된 단일 Rust 런타임에 배치합니다.

우리는 프리필과 디코드 성능을 별도로 측정합니다. 프리필 처리량은 엔진이 프롬프트를 얼마나 빠르게 처리하는지 포착하며, 디코드 처리량은 출력 토큰을 얼마나 빠르게 생성하는지 포착합니다.

단일 MacBook Pro에서 M5 Max, 40코어 GPU, 128GB 통합 메모리를 탑재한 환경으로 Qwen3.6-35B-A3B의 성능을 벤치마크했습니다. 프리필용 프롬프트 길이 10개와 디코드용 컨텍스트 길이 10개, 즉 256~128K 토큰 범위(K = 1,024)에서 엔진은 MLX-LM 대비 프리필 처리량 평균 1.22배, 디코드 처리량 평균 1.32배를 기록했습니다. 4K 토큰 프롬프트와 4K 토큰 디코드 컨텍스트에서는 커스텀 엔진이 초당 5,749.9프리필 토큰과 186.6디코드 토큰을 달성한 반면, MLX-LM은 각각 4,737.5와 140.9를 기록했습니다. 멀티턴 세션에서는 이러한 시간 절감이 모델 호출이 추가될 때마다 누적됩니다.

256~128K 토큰 범위의 10개 동일 가중치 길이에 대한 산술 평균 처리량입니다. Lily는 MLX-LM의 3,383 대비 초당 4,135프리필 토큰(1.22배), 126.9 대비 초당 167.1디코드 토큰(1.32배)을 기록합니다. 프리필은 프롬프트 길이에 따라 달라지고, 디코드는 컨텍스트 길이에 따라 달라집니다.

다음으로, Qwen의 아키텍처가 어떻게 Apple Silicon에서 모델 전용 최적화 기회를 창출하는지 설명합니다. 이어서 그 결과로 나타나는 프리필 및 디코드 변경 사항을 살펴봅니다. 또한 추가 최적화의 효과가 사라지는 지점을 다루고, MLX-LM과의 엔드투엔드 비교로 마무리합니다.

Apple Silicon에서의 Qwen 전용 최적화 기회

Qwen은 세 가지 고유한 워크로드 형태를 생성합니다.

Qwen3.6-35B-A3B는 350억 개의 파라미터를 포함하지만 토큰당 약 30억 개만 활성화합니다. 라우터는 256개의 전문가 서브네트워크에 점수를 매겨 8개를 선택하고, 모든 토큰을 처리하는 하나의 공유 전문가와 함께 작동합니다. 이 희소 MoE 설계는 연산을 줄이지만 불균등한 작업을 생성합니다. 즉, 전문가는 서로 다른 수의 토큰을 수신하고, 각 토큰은 서로 다른 전문가 조합의 가중치를 요구합니다.

또한 Qwen은 10개의 완전 어텐션 레이어와 30개의 Gated DeltaNet 레이어를 결합합니다. 이 두 레이어 유형은 이전에 수신한 정보를 서로 다른 방식으로 유지합니다.

어텐션 레이어는 그룹화된 쿼리 어텐션(GQA)을 사용합니다. Qwen은 16개의 쿼리 헤드와 2개의 키-값(KV) 헤드를 가지며, 8개의 쿼리 헤드가 각 KV 헤드를 공유합니다. 공유를 통해 KV 캐시가 작아지고 캐시된 데이터를 쿼리 헤드 간에 재사용할 수 있습니다. 캐시는 여전히 모든 토큰에 대해 새로운 키와 값을 저장하므로, 컨텍스트가 커질수록 각 디코드 단계가 더 많은 데이터를 읽습니다.

대신 Gated DeltaNet은 이전에 수신한 정보를 고정 크기의 순환 상태로 압축합니다. 학습된 게이트가 기존 상태를 유지할 양을 제어하고, 델타 업데이트가 현재 토큰의 정보를 통합합니다. 모델은 이러한 업데이트를 순환적으로 정의하므로 각 토큰은 이전 토큰에 의해 생성된 상태에 따라 달라집니다. 그러나 프리필 동안 엔진은 동일한 연산을 두 가지 방식으로 평가할 수 있습니다. 상태를 앞으로 전달하면서 토큰을 직접 스캔하거나, 더 많은 행렬 연산과 토큰 수준 병렬성을 노출하는 블록으로 업데이트를 재조직할 수 있습니다. 어떤 접근 방식이 더 빠른지는 모델 차원, 워크로드, 하드웨어에 따라 다릅니다.

이 구조들은 종합되어 불균등한 전문가 그룹, 확장되는 캐시에 대한 어텐션, 그리고 직접 또는 블록 단위로 평가할 수 있는 고정 크기 순환(recurrence)이라는 세 가지 연산 패턴을 만들어냅니다.

Apple Silicon은 서로 다른 워크로드에 서로 다른 경로를 제공합니다.

프리필은 많은 프롬프트 토큰 활성화 행을 한 번에 처리합니다. 여기서 고려되는 로컬 워크로드는 일반적으로 한 번에 하나의 요청을 디코드하고(배치 1) 단계당 하나의 새로운 행을 처리합니다. 이 차이는 동일한 모델 가중치가 사용되는 방식을 변화시킵니다. 프리필은 가중치의 각 블록을 수백 또는 수천 개의 행에 걸쳐 재사용할 수 있습니다. 디코드는 각 새 토큰이 가중치를 통한 또 다른 패스를 필요로 하므로 대개 그렇게 할 수 없습니다.

Apple Silicon은 CPU와 GPU를 둘 다에서 액세스할 수 있는 단일 물리적 메모리 풀인 통합 메모리 뒤에 배치합니다. 이를 통해 모델은 별도의 GPU 복사본을 유지하지 않고도 상주 상태를 유지할 수 있지만, 데이터 이동이 무료가 되는 것은 아닙니다. 가중치와 중간 값을 읽는 것은 여전히 메모리 대역폭을 소비하는 반면, 레지스터 및 기타 온칩 스토리지는 더 빠르지만 훨씬 작습니다.

M5 GPU는 또한 다양한 연산 경로를 제공합니다. 프리필의 선형 레이어는 일반 행렬-행렬 곱셈(GEMM)을 사용하여 가중치 행렬을 많은 행에 한 번에 적용합니다. 호환되는 GEMM은 Metal 4 텐서 연산을 통해 각 GPU 코어의 신경망 가속기를 사용할 수 있습니다. 대신 배치 1 디코드는 일반 행렬-벡터 곱셈(GEMV)을 사용하여 동일한 가중치를 하나의 행에 적용합니다. 가중치 재사용이 거의 없는 상태에서 GEMV는 주로 메모리 대역폭에 의해 제한되며, 데이터 재사용이 더 많은 행렬 연산용으로 설계된 신경망 가속기보다 GPU의 벡터 산술 논리 장치(ALU)에 더 적합합니다.

이러한 실행 경로는 Lily에만 고유한 것이 아닙니다. MLX는 동일한 통합 메모리에서 작동하며 워크로드 형태에 따라 최적화된 행렬 및 벡터 커널을 선택합니다. MLX-LM의 Qwen 구현은 이미 전문가 작업을 그룹화하고, 융합된 순환 Metal 커널로 Gated DeltaNet을 평가하며, GQA 인식 어텐션을 사용합니다. 이러한 기능들은 Apple Silicon에서 효율적인 Qwen 추론을 위한 공유 시작점입니다.

최적화 전략

Lily의 더 좁은 범위를 통해 Qwen의 정확한 아키텍처 및 차원에 맞춰 이러한 공유 실행 경로를 조율할 수 있습니다. 이는 단계별 GPU 경로를 사용하고, 데이터 이동을 최소화하도록 Qwen의 전문가, 순환, 어텐션 워크로드를 매핑하며, 측정한 워크로드 형태에서 커널과 레이아웃을 선택합니다. 이 전략은 다음 세 부분으로 구성됩니다.

  1. 추론 단계에 GPU 경로를 맞춥니다. 프리필이 많은 행에 걸쳐 가중치를 재사용할 수 있을 때는 행렬 지향 실행을 사용하고, 배치 1 디코드가 한 번에 하나의 행을 처리할 때는 벡터 지향 실행을 사용합니다.
  2. 데이터 이동을 최소화하면서 Qwen의 구조를 GPU에 매핑합니다. 가중치가 사용될 때까지 압축된 상태로 유지하고, CPU로 돌아가지 않고 라우팅된 전문가 작업을 조직하며, 순환 스캔을 통해 Gated DeltaNet 상태를 온칩에 유지하고, 그룹화된 쿼리 어텐션이 공유하는 KV 데이터를 재사용합니다.
  3. 워크로드 형태에 맞게 커널을 조정합니다. 각 단계 내에서 사용 가능한 행 수, 전문가 간 행의 분포, 연산의 차원, 현재 컨텍스트 길이에 따라 타일 크기, 실행 레이아웃, 어텐션 경로를 선택합니다.

다음 섹션에서는 이러한 선택 사항들을 설명합니다. M5 Max에서 일치하는 제거 실험을 통해 평가된 최적화의 경우, 연구 대상인 최적화만 다르고 나머지는 동일한 엔진 구성들을 비교하여 그 효과를 추정합니다. 이러한 실험은 엔진의 버전을 자체적으로 비교하기 때문에, MLX-LM에 대한 최종 결과를 분해하기보다는 메커니즘을 설명합니다.

프리필: 가중치 재사용 및 GPU에 라우팅 유지

프리필은 많은 토큰 행을 한 번에 노출하지만, Qwen은 해당 행을 전문가 간에 불균등하게 라우팅하고 시퀀스를 통해 순환 상태를 업데이트합니다. 그 최적화는 라우팅된 행을 중심으로 한 희소 전문가 작업 조직, Gated DeltaNet 스캔을 온칩에 유지, 긴 프롬프트를 경계가 지정된 청크로 분할의 세 가지 그룹으로 나뉩니다.

Qwen 레이어를 통과하는 경계가 지정된 프리필 청크 하나에 대한 실행 및 데이터 상주. 어텐션은 KV 캐시를 확장하고, Gated DeltaNet은 작업 중인 순환 상태를 레지스터에 유지합니다. 전문가 라우팅 메타데이터는 GPU에 유지되고, Q4 가중치는 그룹화된 GEMM 내에서 역양자화될 때까지 압축된 상태로 유지되며, 임시 활성화는 현재 청크로 제한됩니다.

희소 전문가 연산 최적화

행렬 곱셈 중 가중치 역양자화(dequantize)

Qwen3.6-35B-A3B 체크포인트는 그룹별 아신(affine) 4비트 양자화를 사용합니다. 각 가중치는 4비트 정수 코드로 저장되는 반면, 64개의 가중치로 구성된 각 그룹은 값을 재구성하는 데 사용되는 bfloat16 스케일과 바이어스를 공유합니다. 이를 통해 350억 개의 파라미터 모델이 대략 70GB의 bfloat16 가중치에서 19.4GB 체크포인트로 줄어들어, Mac에 모델을 상주시키는 것이 실현 가능해집니다.

행렬 곱셈에 사용되는 Metal 4 텐서 연산은 패킹된 4비트 표현 대신 bfloat16 피연산자를 소비합니다. 곱셈 전에 GPU는 bfloat16으로 가중치를 재구성해야 합니다. Lily의 최적화된 그룹화된 GEMM은 한 번에 하나의 작은 가중치 타일씩 이 변환을 수행하고, 라우팅된 활성화 행과 곱하기에 충분한 시간 동안만 결과를 온칩 스레드그룹 메모리에 유지합니다. 누적에는 32비트 부동소수점이 사용되며, 출력은 bfloat16으로 기록됩니다. 완성된 확장 가중치 배열은 통합 메모리에서 절대 생성되지 않습니다.

제거(ablation)에서 역양자화는 별도의 연산으로 실행됩니다. 즉, 4비트 가중치를 통합 메모리의 bfloat16 배열로 확장한 후 행렬 커널이 해당 배열을 다시 읽습니다. 512 토큰 프롬프트에서 역양자화를 그룹화된 GEMM으로 이동하면 이 중간 쓰기 및 읽기가 제거되어 엔드투엔드 프리필 처리량이 77.4% 향상되었습니다.

전문가 라우팅을 GPU에 유지

그룹화된 GEMM은 각 전문가에게 할당된 활성화 행이 함께 저장되도록 요구합니다. 토큰당 8개의 전문가를 선택한 후, 히스토그램이 각 전문가에게 몇 개의 할당이 갔는지 카운트합니다. 프리픽스 스캔은 이러한 카운트를 시작 오프셋으로 변환하고, 스캐터 단계는 행을 전문가 그룹에 배치하며, 블록 맵은 그룹화된 GEMM이 처리해야 하는 고정 크기 행렬 블록을 나열합니다.

최적화된 경로는 각 프롬프트 청크에 대해 이 전체 시퀀스를 순서가 지정된 GPU 연산 배치인 단일 커맨드 버퍼에 유지합니다. 대신 제거(ablation)에서는 CPU가 라우팅 중간 단계를 검사하고 다음 연산을 제출할 수 있도록 일시 중지합니다. 히스토그램과 프리픽스 스캔을 GPU에 유지하면 2개의 커널이 추가되지만 각 MoE 레이어 내부의 CPU-GPU 동기화는 제거됩니다.

512 토큰 프롬프트에서 GPU 상주 라우팅을 활성화하면 엔드투엔드 프리필이 89% 증가했습니다. 이는 커널 수만으로는 오해의 소지가 있을 수 있는 이유도 보여줍니다. 더 빠른 경로는 더 많은 커널을 실행하지만 레이어 내부에서 CPU를 절대 기다리지 않습니다.

타일 크기를 전문가 부하에 맞추기

2K 토큰 프롬프트에서 모든 토큰을 256개 전문가 중 8개로 라우팅하면 16,384개의 토큰-전문가 할당이 발생하며, 전문가당 평균 64개의 활성화 행이 생성됩니다. 실제 분포는 불균등합니다. 일부 전문가는 많은 행을 수신하는 반면, 다른 전문가는 적게 수신합니다.

그룹화된 GEMM은 각 전문가의 출력을 행렬 곱셈 출력의 작은 직사각형 블록인 타일로 나눕니다. 각 타일은 하나의 GPU 스레드그룹에 할당됩니다. Apple Silicon의 GPU에서 스레드그룹은 하나 이상의 simdgroup을 포함하며, 각 simdgroup은 락스텝(lockstep)으로 명령을 실행하는 32개의 스레드로 구성됩니다.

더 큰 타일은 설정 비용을 더 많은 행에 분산시키고 더 많은 병렬 작업을 노출하지만, 전문가가 몇 개의 행만 수신할 때는 큰 타일의 일부가 유휴 상태로 남게 됩니다. 따라서 타일 크기와 simdgroup 수는 밀접하게 연관되어 있습니다.

제거(ablation) 실험에서는 타일을 16개 행으로 고정합니다. 해당 대조군과 비교할 때, 4개의 simdgroup이 있는 32개 행 타일을 활성화하면 2K 토큰에서 엔드투엔드 프리필이 13.2% 향상되었습니다.

순환 상태를 온칩에 유지

프리필 동안 각 Gated DeltaNet 레이어는 순환 상태를 앞으로 전달하면서 프롬프트를 순서대로 스캔합니다. 레지스터 상주가 비활성화된 경우, 제거(ablation)에서는 블록 단위 스캔을 사용합니다. 2K 토큰 프롬프트에서 해당 경로는 레이어당 256 MiB(메비바이트)의 상태를 이동하고, 참여하는 모든 스레드가 서로를 기다려야 하는 동기화 지점인 장벽(barrier)에서 협력 스레드를 반복적으로 중지합니다.

순환 상태는 행렬입니다. 최적화된 커널은 각 열을 하나의 simdgroup에 할당합니다. simdgroup은 열을 스레드 간에 나누고, 열을 레지스터에 한 번 로드하며, 전체 스캔 과정에서 상태를 유지합니다. 스레드들은 스레드그룹(스레드그룹 전체에서 공유되는 온칩 스토리지) 메모리 대신 simdgroup 연산을 통해 중간 결과를 교환합니다. 완성된 상태는 스캔이 끝난 후에만 다시 기록됩니다.

상태와 그 게이트는 순차적 업데이트 과정에서 작은 반올림 오차가 누적되기 때문에 32비트 부동소수점 형식을 사용합니다. 쿼리 및 키 활성화는 bfloat16으로 유지됩니다.

2K 토큰 프롬프트에서, 레지스터 상주 스캔을 활성화하면 엔드투엔드 프리필이 5.6% 향상되었습니다. 전문가 GEMM은 프리필 시간의 약 90%를 차지했습니다. 순차적 스캔은 신경망 가속기(Neural Accelerators)의 이점을 얻을 만큼 충분히 재사용 가능한 행렬 작업을 노출하지 않습니다.

프롬프트 청킹으로 임시 메모리 제한

런타임은 모든 프롬프트 토큰의 임시 데이터를 한 번에 메모리에 유지하는 대신, 긴 프롬프트를 경계가 지정된 청크 시퀀스로 처리합니다. 모델 가중치는 통합 메모리에 상주하는 반면, 순환 상태와 KV 캐시는 한 청크에서 다음 청크로 컨텍스트를 전달합니다. 이전 컨텍스트는 버려지지 않습니다.

청킹이 없으면 임시 활성화 배열이 전체 프롬프트와 함께 커져서 통합 메모리를 두고 모델 가중치, 순환 상태, KV 캐시와 경쟁하게 됩니다. 청킹은 한 번에 하나의 세그먼트의 임시 값만 활성 상태로 유지한 다음, 다음 세그먼트를 처리하기 전에 해당 스토리지를 해제하거나 재사용합니다. 이것은 최대 작업 메모리를 제한하고 엔진이 모델 출력을 변경하지 않고도 더 긴 프롬프트를 처리할 수 있도록 합니다.

청크 프리필은 많은 엔진에서 인기가 있으며 이 메모리 제약 환경에서 긴 멀티턴 궤적을 서빙하는 데 매우 중요합니다. 어텐션 레이어의 총 프리필 시간은 프롬프트 길이에 대해 2차(quadratic)를 유지하며, 이전 청크의 반복된 KV 로드로 인한 약간의 추가 오버헤드가 발생합니다.

디코드: 토큰당 이동하는 바이트 최소화

배치 1 디코드는 한 번에 하나의 새로운 행을 처리합니다. 가중치 재사용이 거의 없는 상태에서 그 처리량은 주로 엔진이 각 토큰에 대해 얼마나 많은 바이트를 이동하는지에 따라 달라집니다. 디코드 변경 사항은 단일 행 가중치 경로 최적화, 각 단계를 GPU에 유지, 중간 및 상태 트래픽 줄이기, 어텐션 캐시 효율적으로 읽기의 네 가지 그룹으로 나뉩니다.

배치 1 디코드 단계 하나에 대한 데이터 흐름 및 유휴 시간과 캐시 트래픽을 줄이는 두 가지 메커니즘. (A) GPU는 Q4 가중치와 모델 상태를 어텐션, Gated DeltaNet, 라우팅, 융합된 전문가 커널을 통해 스트리밍한 다음, 선택한 토큰을 다음 단계의 입력 슬롯에 직접 기록하고 CPU로 복사본을 보냅니다. (B) 종속성 인식 스케줄링을 통해 독립적인 커널이 중첩될 수 있습니다. (C) GQA 패킹을 통해 4개의 쿼리 헤드가 각 KV 행 로드를 공유할 수 있으므로, 8개의 독립적인 요청이 2개의 공유 로드로 줄어듭니다.

단일 행 가중치 경로 최적화

MLX는 이미 특화된 행렬-벡터 커널에 단일 행 작업을 디스패치합니다. Lily는 MLX를 사용하지 않으므로 커스텀 런타임이 동일한 기본 전략을 제공해야 합니다. 당사의 행 병렬 GEMV는 단일 활성화 행을 위해 설계되었습니다. simdgroup은 가중치 행렬의 서로 다른 부분을 병렬로 읽는 동시에 출력에 대해 협력합니다.

각 디코드 단계를 GPU에 유지

토큰 핸드오프를 GPU에 유지

각 디코드 단계는 다음 토큰을 선택하는 것으로 끝나고, 다음 단계는 해당 토큰을 입력으로 시작합니다. 선택 사항을 CPU로 보낸 다음 다시 GPU로 보내면 모든 토큰에 동기화 지점이 추가됩니다. 당사의 런타임은 대신 두 개의 명령 버퍼와 두 개의 GPU 상주 토큰 슬롯 간을 교대로 전환합니다. GPU가 가장 높은 점수의 토큰을 선택하고 해당 토큰 ID를 다음 디코드 단계의 입력 슬롯에 직접 기록하는 동안, CPU는 후속 작업을 준비합니다.

독립적인 GPU 작업 중첩

기록된 배치 1 디코드 단계 하나에서 토큰을 생성하면 795개의 GPU 커널이 실행되었습니다. 이들의 종속성은 555개의 순차적 단계를 형성하여 일부 커널이 동시에 실행될 수 있도록 여지를 남겼습니다. 그럼에도 불구하고 Metal의 직렬 실행 모드는 모든 커널을 순서대로 실행했습니다.

최적화된 디코드 경로는 동시 Metal 패스에 실제 데이터 종속성을 기록합니다. GPU 리소스가 허용할 때 독립적인 런칭 커널이 동시에 실행될 수 있습니다. 이후 작업에 이전 결과가 필요할 때만 장벽(barrier)이 삽입됩니다.

중간 및 상태 트래픽 줄이기

별도의 커널은 종종 중간 생성물을 실체화합니다. 즉, 하나의 커널이 임시 결과를 메모리에 기록하고 다음 커널이 그 결과를 다시 읽어옵니다. 최적화된 디코드 경로는 게이트 활성화가 포함된 두 가지 전문가 입력 프로젝션, 라우팅 점수 및 공유 전문가 결과가 포함된 전문가 출력 프로젝션, 어텐션 전의 쿼리 및 키 준비, 정규화가 포함된 순환 업데이트의 네 가지 체인을 융합합니다. 각 융합된 커널은 임시 값을 메모리로 보내는 대신 레지스터에 유지합니다.

융합은 또한 종속성 그래프를 단축합니다. 중간 쓰기가 사라지면 해당 소비자를 보호하던 장벽(barrier)도 함께 사라집니다.

어텐션 캐시를 효율적으로 읽기

어텐션 캐시 읽기 코어 융합(coalesce)

어텐션은 모든 디코드 단계 동안 KV 캐시에서 키와 값을 읽습니다. 제거(ablation)에서 인접한 GPU 스레드가 항상 인접한 바이트를 요청하는 것은 아니므로 메모리 시스템이 더 많은 별도의 트랜잭션을 제공해야 합니다. 코어 융합(coalesced) 로드를 활성화하면 인접한 스레드가 인접한 바이트를 요청하여 하드웨어가 읽기를 결합할 수 있습니다.

bfloat16 구성에서, 코어 융합(coalescing)은 키 대역폭을 33.8 GB/s에서 47.9 GB/s로 늘리고, 값 대역폭을 42.0 GB/s에서 61.8 GB/s로 늘렸으며, 3,840 토큰 컨텍스트에서 엔드투엔드 디코드를 2.1% 향상시켰습니다.

KV 행을 재사용하기 위한 쿼리 헤드 패킹

그룹화된 쿼리 어텐션을 사용하면 8개의 쿼리 헤드가 1개의 KV 헤드를 공유할 수 있습니다. 제거(ablation) 실험에서 각 쿼리 헤드는 별도의 simdgroup에서 실행되므로, 8개 모두 동일한 캐시된 KV 행을 독립적으로 요청합니다. 최적화된 커널은 4개의 쿼리 헤드를 하나의 스레드그룹으로 묶어 각 KV 행을 한 번만 로드하고 이를 4개의 어텐션 연산에 걸쳐 재사용합니다. 두 번째 스레드그룹은 나머지 4개의 헤드를 처리합니다.

일반적으로 GQA 패킹이라고 불리는 이 기술은 동일한 산술 연산을 수행하고 동일한 출력 바이트를 생성하는 동시에 8개의 독립적인 KV 요청을 2개의 공유 로드로 줄입니다. 패킹되지 않은 제거(ablation)와 비교할 때 32K 토큰 컨텍스트에서 엔드투엔드 디코드 처리량이 23.8% 향상되었습니다.

긴 컨텍스트에서 어텐션 레이아웃 전환

완전 어텐션 레이어의 모든 디코드 단계는 기존 KV 캐시를 스캔합니다. 고정 블록 레이아웃은 해당 캐시를 GPU가 병렬로 처리할 수 있는 동일한 조각으로 나눕니다. 캐시가 작을 때는 추가적인 스케줄링의 이점이 크지 않지만, 컨텍스트가 커질수록 고정 블록 레이아웃이 작업을 더욱 균등하게 분산시킵니다.

이 모델의 경우 런타임은 일반 어텐션 경로를 32K 토큰 미만으로 유지하고 32K 이상에서는 고정 블록 경로를 사용합니다. 이 전환은 각 헤드가 256개의 값을 갖고 8개의 쿼리 헤드가 KV 헤드를 공유할 때 적용되며, 다른 형태는 일반 경로를 유지합니다. 제거(ablation) 실험에서 이 전환을 비활성화하고 항상 일반 경로를 사용하도록 했습니다. 고정 블록 경로를 활성화하면 엔드투엔드 디코드가 32K에서 7.7%, 64K에서 27.4%, 128K에서 40.2% 향상되었습니다.

추가 최적화의 한계

일부 변경 사항은 격리된 연산을 개선했지만 엔드투엔드 추론을 개선하지는 못했습니다.

더 작은 모델을 사용하여 전체 모델이 검증할 토큰을 제안하는 추정 디코딩(Speculative decoding)은 배치 1 디코드를 18% 더 느리게 만들었습니다. 검증은 2개에서 5개 행의 그룹을 처리했는데, 이는 이 하드웨어에 비효율적인 형태이며 행들은 종종 다른 전문가를 선택하여 읽어오는 전문가 가중치 데이터의 양을 늘렸습니다. 초안 작성기(drafter)의 출력 어휘를 줄이면 초안 작성기 처리량이 4.7~5.1% 향상되었지만 완전한 추정 루프를 더 빠르게 만들지는 못했습니다. 이 결과는 워크로드에 따라 다릅니다. 당사의 Blackwell에서의 일괄 처리된 Qwen 배포는 서로 다른 조건 하에서 추정 디코딩을 사용합니다.

다른 실험으로는 GPU 실행 횟수 줄이기, 전체 단계 중첩, 더 큰 프리필 타일 사용, 더 광범위한 융합 적용, 라우터 가속화, 출력 프로젝션과 토큰 선택 결합 등이 포함되었습니다. 이 중 완전한 추론 루프를 개선한 것은 없었습니다.

하드웨어 한계 측정 결과, 주요 프리필 및 디코드 연산에서도 남은 여유 공간이 거의 없는 것으로 나타났습니다. MoE GEMM과 GEMV는 액세스 패턴에 대해 가장 빠른 지속 가중치 읽기 속도의 97.9%와 90.3%에 도달했습니다. 희소 GEMV에서 산술 연산을 제거해도 처리량은 0.2%만 변화하여, 연산이 아니라 가중치 읽기가 제한 요소임을 확인해주었습니다. 프리필의 행렬 곱셈 역시 단독 실행 시 이론적 행렬 한계의 93%, 테스트된 모델 내부에서 80~86%에 도달했습니다.

엔드투엔드 성능

엔드투엔드 비교는 두 엔진에서 동일한 4비트 체크포인트 바이트를 로드하고 40코어, 128GB M5 Max 하나에서 한 번에 하나의 요청을 실행합니다. 각 라운드 내에서 백그라운드 부하 및 칩 온도 변화로 인한 편향을 줄이기 위해 두 엔진이 교대 순서로 실행됩니다. 서버가 아닌 MLX-LM의 가장 빠른 직접 생성 경로와 비교하므로 측정은 서빙 오버헤드가 아니라 모델 실행에 중점을 둡니다.

이 스윕은 256에서 128K 토큰에 이르는 프리필용 10개 프롬프트 길이와 디코드용 10개 컨텍스트 길이를 다룹니다. 프리필 처리량은 엔진이 고정된 설정 비용을 더 많은 토큰에 분산함에 따라 처음에는 상승합니다. 프리필은 4K 토큰 프롬프트 부근에서 정점에 도달한 후, 프롬프트가 커짐에 따라 10개의 완전 어텐션 레이어가 더 많은 작업을 수행하므로 하락합니다. 디코드는 짧은 컨텍스트에서 거의 평평하게 유지되며, 성장하는 KV 캐시 읽기가 중요해지면 감소합니다. 커스터마이징된 엔진은 기록된 모든 길이에서 더 빠릅니다.

특화된 실행이 부동소수점 연산의 순서를 변경할 수 있기 때문에, 당사는 MLX-LM과의 수치적 일관성도 확인했습니다. 교사 강제(teacher-forced) 비교에서 두 엔진은 192개의 위치 각각에서 동일한 참조 프리픽스로부터 다음 토큰을 예측하여 이전 차이가 이후 입력에 영향을 미치는 것을 방지했습니다. Lily의 퍼플렉서티(perplexity)는 0.04%만 높았으며, 테스트된 위치의 96.35%에서 상위 순위의 동일한 토큰을 선택했습니다.

Qwen3.6-35B-A3B Q4를 하나의 40코어 128GB M5 Max에서 batch 1로 실행할 때, 프롬프트 길이에 따른 프리필 처리량과 컨텍스트 길이에 따른 디코드 처리량입니다. 256~128K 토큰의 10개 길이 전반에서 Lily는 기록된 모든 지점에서 더 빠르며, MLX-LM 대비 프리필 처리량은 1.13~1.50배, 디코드 처리량은 1.26~1.34배입니다. 비교에는 MLX-LM의 가장 빠른 직접 생성 경로를 사용했습니다. 두 가로축은 모두 로그 스케일을 사용하며, 어느 세로축도 0에서 시작하지 않습니다.

로컬 플랫폼용으로 구축됨

Apple Silicon은 더 작은 데이터센터 GPU가 아닙니다. 고유한 하드웨어 및 소프트웨어 특성을 가진 완전한 로컬 추론 플랫폼입니다. 통합 메모리는 단일 노드가 보유할 수 있는 모델 및 상태의 용량 한계(ceiling)를 매우 높여줍니다. M5 신경망 가속기는 프리필의 조밀한 행렬 작업을 처리합니다. 벡터 ALU는 디코드에서 대역폭바운드(bandwidth-bound) 특성을 지니고 재사용률이 낮은 나머지 작업을 처리합니다.

Qwen은 전문가 라우팅 및 순환 상태를 GPU에 유지, 불필요한 중간 생성물 제거, 독립적인 작업 중첩, 공유 KV 데이터 재사용, 워크로드 형태에 맞춘 커널 적응 등 특화할 수 있는 추가 기회를 제공합니다.

모델 및 플랫폼별 최적화를 통해 하나의 Mac으로 대형 희소 모델을 효율적으로 실행할 수 있습니다. 향후 연구에서는 모델, 칩, 서빙 워크로드 전반으로 커버리지를 넓히고, 하나의 구성에서 여기서 검증된 메커니즘을 보다 일반적인 런타임 정책으로 전환할 것입니다.

더 넓은 원칙은 엔진을 모델의 아키텍처와 하드웨어의 특정 연산 및 메모리 경로 모두에 맞추는 것입니다. 최첨단 오픈 웨이트 모델과 하드웨어가 발전함에 따라, 고성능 로컬 추론은 그 차이를 추상화하는 엔진보다는 둘 모두에 맞춤화된 엔진에 점점 더 의존하게 될 것입니다.

인용

BibTeX
@online{perplexity2026OptimizingOnDeviceInferenceForAppleSilicon,
  author = {{Perplexity} and Yibo Wu and Lequn Chen and Kevin Hu and Phi Hoang and Claire Beamer and Jeremy Yang and Denis Yarats},
  title = {{Optimizing on-device inference for Apple Silicon}},
  date = {2026-09-01},
  url = {https://www.perplexity.ai/hub/blog/optimizing-on-device-inference-for-apple-silicon}
}