Perplexity Lily 오픈소스 공개 — Apple Silicon에서 Qwen3.6-35B-A3B를 더 빠르게 돌리는 Rust + Metal 추론 엔진
AI 검색 스타트업 Perplexity가 자사의 Hybrid Compute(하이브리드 컴퓨트) 제품 뒤에서 실제로 모델을 돌리고 있던 로컬 추론 엔진 Lily를 오픈소스로 공개했습니다. Rust로 만든 단일 프로세스 런타임과 Metal API(메탈 API)로 직접 작성한 GPU 커널만 사용하며, 실행 경로에는 PyTorch나 MLX가 일절 들어가지 않습니다. 그 덕분에 Apple Silicon Mac에서 350억 파라미터짜리 Qwen3.6-35B-A3B(MoE, 전문가 혼합 모델)를 동일 칩에서 기존 MLX-LM 대비 프리필 1.23배, 디코드 1.35배 더 빠르게 실행할 수 있게 됐습니다.
1. Lily란 무엇인가
Lily는 Perplexity Computer의 Hybrid Compute 기능을 실제로 구동하는 로컬 추론 엔진입니다. Hybrid Compute는 클라우드 LLM과 Mac의 로컬 LLM이 한 작업을 자동으로 분담해 처리하는 방식으로, 민감한 데이터는 기기 안에 머무르게 하고 무거운 추론만 클라우드로 보냅니다. Lily는 바로 그 “로컬 LLM” 역할을 맡고 있습니다.
구조는 단순합니다. Rust 레이어가 모델 가중치(체크포인트)를 읽어 들이고 텍스트 생성 루프를 돌리며, OpenAI 호환 chat-completions API로 토큰을 한 줄씩 스트리밍합니다. 실제 GPU 연산은 Apple의 Metal API로 직접 손으로 작성한(hand-written) 셰이더/커널이 담당합니다. 일반적으로 Apple Silicon에서 LLM 추론에 쓰이는 PyTorch나 MLX 같은 프레임워크는 실행 경로에 들어 있지 않습니다.
2. 누구나 쓸 수 있나? — 배포와 사양
네, 바로 써 볼 수 있습니다. pplx-garden 저장소에 독립 실행형 데모 형태로 공개됐으며, 최소한의 OpenAI 호환 HTTP API를 통해 greedy(그리디, 가장 가능성 높은 토큰만 고르는 방식) 텍스트 생성을 제공합니다. 즉, 기존 OpenAI 클라이언트 코드를 거의 그대로 Lily로 가리키기만 해도 동작합니다.
• 모델 파일(4비트 체크포인트) 크기: 19.4GB
• 권장 통합 메모리(unified memory): 32GB 이상
• 운영체제: macOS 15 이상
• Perplexity Hybrid Compute 공식 권장 사양: 최소 24GB, 최적 32GB
여기서 “통합 메모리”란 Apple Silicon의 특징입니다. 일반 PC에서는 CPU와 GPU가 각각 별도의 RAM과 VRAM을 쓰지만, Apple Silicon은 CPU·GPU가 같은 메모리 풀을 공유합니다. 덕분에 LLM 가중치를 GPU 전용 VRAM으로 굳이 복사하지 않고 그대로 메모리에 올려 둘 수 있습니다.
3. 왜 굳이 “특화”했을까 — 범용 스택과의 차이
Mac에서 LLM을 돌릴 때 기본적으로 떠올리는 스택은 MLX와 MLX-LM입니다. MLX는 Apple이 Apple Silicon에 직접 만든 오픈소스 머신러닝 프레임워크이며, MLX-LM은 이를 기반으로 Qwen 등 다양한 모델을 돌릴 수 있도록 한 추론 도구입니다. MLX-LM은 이미 다음을 지원합니다.
- 그룹화된 전문가 연산(grouped expert work)
- 융합된 순환 Metal 커널(fused recurrent Metal kernel)
- GQA 인지 어텐션(GQA-aware attention)
하지만 MLX·MLX-LM은 다양한 모델 아키텍처에서 재사용 가능해야 한다는 제약이 있습니다. Lily는 그 재사용성을 포기하는 대신, 모델 구조 + 실행 계획(execution plan) + 커널 선택(kernel selection)을 하나의 런타임에 통합했습니다. 자동차로 비유하면, “만든 사람이 직접 튜닝한 트랙 전용 차”와 “여러 종의 차량을 모두 수용할 수 있는 정비소의 일반 셋업”의 차이라 할 수 있습니다.
4. Qwen3.6-35B-A3B의 세 가지 연산 패턴
최적화를 이해하려면 먼저 모델 구조를 알아야 합니다. Qwen3.6-35B-A3B는 알리바바의 Qwen 패밀리에 속한 MoE(Mixture of Experts, 전문가 혼합) 모델입니다. 특징은 다음과 같습니다.
| 항목 | 수치/구조 |
|---|---|
| 총 파라미터 | 약 350억 개(35B) |
| 토큰당 활성 파라미터 | 약 30억 개(A3B) |
| 전문가 풀(pool) | 256명 |
| 토큰당 선택 전문가 | 8명 |
| 공유 전문가(shared expert) | 1명(모든 토큰 처리) |
| 쿼리 헤드 / KV 헤드 | 16개 / 2개(GQA 구조) |
| 풀 어텐션 레이어 | 10개 |
| Gated DeltaNet 레이어 | 30개 |
여기서 GQA(Grouped-Query Attention, 그룹 쿼리 어텐션)는 어텐션 헤드들을 묶어 KV 헤드를 공유하게 만드는 변형입니다. 본 모델은 16개의 쿼리 헤드가 2개의 KV 헤드를 공유하므로 KV 캐시 메모리를 크게 줄이면서도 모델 품질을 유지할 수 있습니다. Gated DeltaNet(게이티드 델타넷)은 표준 어텐션의 무제한 KV 캐시를 고정 크기의 순환 상태로 대체해 긴 시퀀스도 빠르게 처리하는 NVIDIA 제안(2025) 선형 어텐션 레이어입니다.
이 구조가 만드는 세 가지 연산 패턴이 바로 Lily 최적화의 핵심 표적입니다.
- 불균등한 전문가 그룹(uneven expert groups): 토큰마다 256명 중 8명이 선택되므로 그룹 크기가 들쭉날쭉합니다.
- 증가하는 KV 캐시에 대한 어텐션: 시퀀스가 길어질수록 캐시가 계속 커집니다.
- 고정 크기의 순환(fixed-size recurrence): Gated DeltaNet 레이어는 길이와 무관하게 일정한 상태만 유지합니다.
5. Prefill 단계 — 입력 프롬프트를 한 번에 처리
Prefill(프리필)은 사용자가 입력한 긴 프롬프트를 한 번에 모델에 넣고, 첫 토큰을 만들기 전까지의 “준비” 단계입니다. 여기서 Lily가 한 일은 크게 두 가지입니다.
5-1. 가중치는 패킹된 채로 두고, 라우팅은 GPU에서 처리
체크포인트는 그룹별 아핀(groupwise affine) 4비트 양자화로 저장되어 있습니다. 64개의 가중치마다 bfloat16(BF16, 브레인 플로팅 포인트) 스케일과 바이어스 한 쌍을 공유하는 방식으로, 약 70GB의 bfloat16 가중치를 단 19.4GB로 압축합니다. 이때 Metal 4 텐서 연산은 bfloat16을 입력으로 받기 때문에 4비트 → bfloat16 복원(역양자화, dequantization)을 매번 해줘야 합니다.
Lily는 이 역양자화를 그룹화된 GEMM(General Matrix Multiply) 내부에서 한 번에 타일(tile) 단위로 수행합니다. 결과는 스레드그룹 메모리(threadgroup memory)에 그대로 머무르고 FP32로 누적되므로, 확장된 큰 배열이 통합 메모리까지 도달하지 않습니다. Perplexity의 어블레이션(ablation) 실험에서 이 융합만으로 512 토큰 프롬프트의 엔드 투 엔드 프리필 성능이 77.4% 향상됐습니다.
5-2. MoE 라우팅을 단일 GPU 명령 버퍼에 묶기
MoE 레이어는 매 토큰마다 “어떤 전문가를 쓸지” 결정하는 라우팅을 합니다. 일반적인 구현에서는 라우팅 결과가 CPU로 돌아갔다가 다시 GPU로 넘어가는 동기화가 자주 발생합니다. Lily는 라우팅 히스토그램, 프리픽스 스캔, 스캐터, 블록 맵을 단일 GPU 명령 버퍼(command buffer) 안에 모두 묶어 두어, 이 CPU 왕복을 완전히 제거했습니다. 그 결과 512 토큰 구간에서 추가로 89%의 성능 향상이 나타났습니다.
• 그룹화된 GEMM + 역양자화 융합: +77.4%
• 단일 명령 버퍼 라우팅(CPU 동기화 제거): +89%
• 16행 → 32행 타일(4 simdgroup) 변경: +13.2% (2K 길이)
• 레지스터 상주 Gated DeltaNet 스캔: +5.6%
참고로 전문가 GEMM이 프리필 시간의 약 90%를 차지합니다. 긴 프롬프트는 임시 활성화(temporary activations)가 가중치·캐시와 메모리를 두고 경쟁하지 않도록 제한된 청크(bounded chunks) 단위로 실행됩니다.
6. Decode 단계 — 한 토큰씩 빠르게 뽑아내기
Decode(디코드)는 모델이 한 번에 토큰 하나씩 생성하는 자기회귀(autoregressive) 단계입니다. 배치 1(batch-1) 디코드는 한 번에 한 토큰만 만들기 때문에 가중치 재사용이 거의 없어, 성능 상한이 메모리 대역폭에 의해 결정됩니다. Lily는 “토큰당 이동하는 바이트 수를 최소화”하는 데 집중했습니다.
6-1. 의존성 기반 커널 동시 실행
기록된 한 디코드 스텝에는 무려 795개의 Metal 커널이 555개의 순차 단계로 구성돼 있었습니다. Lily는 이 단계들의 실제 데이터 의존성을 분석해, 서로 독립적인 커널들은 동시(concurrent) Metal 패스에서 겹쳐서 실행하도록 재배치했습니다. 또한 다음 스텝의 입력 슬롯을 GPU 상주(GPU-resident)로 만들어 토큰당 CPU 왕복(round trip)을 없앴습니다. 네 개의 커널 체인은 중간 결과를 레지스터에 유지하도록 융합되었습니다.
6-2. KV 캐시 읽기 폭증
시퀀스가 길어질수록 매 스텝마다 매번 KV 캐시를 읽어 와야 합니다. Lily는 다음 두 기법으로 캐시 대역폭을 크게 끌어올렸습니다.
- 통합(coalesced) 캐시 읽기: 키 대역폭 33.8 → 47.9GB/s, 값 대역폭 42.0 → 61.8GB/s.
- GQA 패킹: 4개의 쿼리 헤드가 하나의 스레드그룹을 공유하여 KV 행을 단 한 번만 로드. 32K 컨텍스트에서 디코드 +23.8%.
- 고정 블록 어텐션 레이아웃: 32K 초과 구간에서 효과적. 32K에서 +7.7%, 64K에서 +27.4%, 128K에서 +40.2%의 디코드 성능 향상.
여기서 KV Cache(키-값 캐시)란 트랜스포머가 한 번 계산한 키·값 벡터를 저장해 두는 메모리로, 매 스텝 재계산을 피하기 위한 핵심 최적화입니다. 시퀀스가 길어질수록 이 캐시 접근이 전체 추론 시간을 좌우합니다.
7. 벤치마크 결과 — MLX-LM과 직접 비교
비교 조건은 다음과 같습니다.
- 하드웨어: 40코어, 128GB 통합 메모리 M5 Max 1대
- 체크포인트: 동일한 4비트 가중치
- 비교 대상: MLX-LM 중 가장 빠른 직접 생성 경로
- 입력 길이: 256~128K 토큰, 10개 길이
| 지표 | Lily | MLX-LM | 속도 차이 |
|---|---|---|---|
| 평균 Prefill (tok/s) | 4,156 | 3,388 | ×1.23 |
| 평균 Decode (tok/s) | 170.0 | 126.4 | ×1.35 |
| 4K 프롬프트 Prefill | 5,749.9 | 4,737.5 | ×1.21 |
| 4K 컨텍스트 Decode | 186.6 | 140.9 | ×1.32 |
측정한 모든 지점에서 Lily가 더 빨랐습니다(Prefill 1.12~1.42배, Decode 1.31~1.37배). 그리고 teacher-forced(정답 토큰을 강제로 넣어 보는) 192개 위치 검사에서 Lily의 퍼플렉시티(perplexity, 모델의 다음 토큰 예측 불확실성)는 MLX-LM 대비 0.04% 더 높았고, 최상위 토큰은 96.35% 확률로 동일했습니다. 즉, “거의 같은 품질을 더 빠르게 내는” 엔진입니다.
8. 자주 묻는 질문(FAQ)
- Q. Hybrid Compute란 정확히 무엇인가요?
- Perplexity Computer에서 도입한 방식으로, 하나의 작업을 클라우드 LLM과 Mac의 로컬 LLM 사이에 자동으로 분할해 처리하는 기능입니다. 민감한 데이터는 기기에 두고 무거운 추론만 클라우드가 맡습니다. Lily는 이 중 “로컬 LLM” 역할을 하는 엔진입니다.
- Q. Apple Silicon이 일반 PC GPU보다 LLM 추론에 유리한 이유는?
- CPU와 GPU가 같은 통합 메모리(unified memory)를 공유하기 때문입니다. 별도의 VRAM으로 모델 가중치를 복사하지 않아도 되어, 메모리 용량 한계가 크게 완화됩니다. 다만 그 구조에 맞게 커널을 직접 작성해 줘야 최고 성능이 나옵니다.
- Q. MoE 모델은 일반 dense 모델과 무엇이 다른가요?
- MoE(Mixture of Experts, 전문가 혼합)는 모델 안에 여러 “전문가” 서브모델을 두고, 라우터가 각 토큰마다 일부 전문가만 활성화합니다. Qwen3.6-35B-A3B는 350억 파라미터 중 토큰당 약 30억 개만 활성화되므로, dense 30B 모델과 비슷한 연산량으로 35B의 표현력을 확보합니다.
- Q. GQA가 표준 어텐션보다 좋은 점은?
- GQA(Grouped-Query Attention, 그룹 쿼리 어텐션)는 여러 쿼리 헤드가 KV 헤드를 공유해 KV 캐시 메모리를 크게 줄입니다. 표준 MHA보다 빠르고, 표준 MQA보다 품질이 좋아 품질·속도 균형이 뛰어납니다. 본 모델은 16 쿼리 헤드 / 2 KV 헤드로 구성됩니다.
- Q. bfloat16이 FP16, FP32와 다른 점은?
- bfloat16(BF16, 브레인 플로팅 포인트)은 Google Brain이 제안한 16비트 포맷으로, FP32와 같은 8비트 지수부를 가져 큰 값 범위를 다루는 학습/추론에 안정적입니다. Lily에서는 4비트 양자화된 가중치를 역양자화한 결과의 저장 형식이자 Metal 4 텐서 연산의 입력 형식으로 사용됩니다.
- Q. 일반 사용자도 Lily로 직접 추론을 돌릴 수 있나요?
- 네. pplx-garden 저장소에 OpenAI 호환 HTTP API를 제공하는 데모가 공개돼 있어, Python의 OpenAI 클라이언트 코드를 거의 그대로 가리켜 텍스트 생성을 시도해 볼 수 있습니다. 다만 모델 파일이 19.4GB이고 통합 메모리 32GB 이상을 요구하므로, M2 Pro/Max 이상에서 권장됩니다.
9. 핵심 요약
- Lily는 Apple Silicon에서 Qwen3.6-35B-A3B를 실행하는 Rust + Metal 엔진으로, 실행 경로에 PyTorch/MLX가 포함되지 않습니다.
- 40코어, 128GB M5 Max에서 MLX-LM 대비 평균 1.23배의 Prefill, 1.35배의 Decode 성능을 달성합니다.
- 가장 큰 Prefill 향상은 GPU 상주 MoE 라우팅(+89%)과 그룹화된 GEMM에 융합된 역양자화(+77.4%)입니다.
- 가장 큰 Decode 향상은 GQA 패킹(32K 기준 +23.8%)과 고정 블록 어텐션(128K 기준 +40.2%)입니다.
- 퍼플렉시티는 MLX-LM과 사실상 동일(0.04% 차이)하므로, “거의 같은 품질 + 더 빠른 속도”로 요약할 수 있습니다.