M5Ultra 사용자를 위한 PSA: prefill step을 8192로 설정하세요
PSA for M5Ultra owners running LLMs: set your prefill step to 8192
핵심 요약
M5Ultra에서 LLM 구동 시 prefill step size를 8192로 설정하여 성능을 최적화하는 방법을 공유합니다.
- 성능 최적화 — prefill step size를 8192로 조정하여 PP 성능 및 추론 속도 개선함
- 벤치마크 결과 — 8k 설정 시 2k 대비 프롬프트 처리 속도와 전체 생성 시간에서 유의미한 이득 확인됨
- 엔진별 차이 — omlx와 같은 일부 엔진은 적응형 step size를 지원하여 성능 최적화가 다를 수 있음
- 하드웨어 활용 — 코어 활용도를 극대화하면서도 오버플로우를 방지하는 적절한 설정값임
Prefill step size는 PP 성능이랑 MTP를 위해 drafter가 로짓을 가져오는 방식 둘 다에 영향을 줌 (dflash도 마찬가지고, dflash에서 chunked prefill을 쓰려면 mlx-vlm을 살짝 패치해야 함).
이게 코어를 꽉 채우면서도 너무 과부하 걸리지 않을 정도로 적당히 커야 함. 안 그러면 디스패치 횟수만 늘어남.
테스트해보니까 8k까지는 성능 향상이 꽤 컸음. 예시를 보면:
GLM-flash-4bit with MTP --prefill-step-size 8192 on raw mlx-vlm:
Trial 1 (32768 prompt tokens): prompt_tps=1056.033, generation_tps=72.722, total_time=38.082
Trial 2 (65536 prompt tokens): prompt_tps=919.958, generation_tps=73.671, total_time=78.203
Trial 3 (131072 prompt tokens): prompt_tps=735.545, generation_tps=71.067, total_time=185.435
GLM-flash-4bit with MTP --prefill-step-size 2048:
Trial 1 (32768 prompt tokens): prompt_tps=860.489, generation_tps=50.011, total_time=48.339
Trial 2 (65536 prompt tokens): prompt_tps=785.604, generation_tps=51.245, total_time=93.425
Trial 3 (131072 prompt tokens): prompt_tps=623.588, generation_tps=50.843, total_time=220.288
omlx with MTP (위쪽은 512인데 이건 128TG라 전체 시간은 좀 다르게 봐야 함):
pp32768/tg128 44136.5 17.19 742.4 tok/s 58.6 tok/s 46.353s 709.7 tok/s 176.66 GB
pp65536/tg128 86749.1 21.21 755.5 tok/s 47.5 tok/s 89.504s 733.6 tok/s 177.15 GB
pp131072/tg128 178622.6 19.01 733.8 tok/s 53.0 tok/s 181.156s 724.2 tok/s 178.45 GB
참고로 omlx 같은 엔진은 adaptive step size를 지원함. 예를 들어 qwen3.8-flash-next를 omlx에서 돌릴 때 2048부터 시작해도 64k 컨텍스트 이상에서는 raw mlx-vlm의 8k 성능이랑 비슷하게 나오고, 작은 컨텍스트에서는 오히려 10% 더 잘 나오기도 함. 근데 뭐 항상 그런 건 아니니까 참고해.

