Claude가 Qwen 3.8 27B 및 Qwen Flash Next에 적용한 최적화 기술 요약
요약
본 기사는 Claude가 Qwen 3.8 27B 및 Qwen Flash Next 모델에 적용한 다양한 최적화 기술들을 요약합니다. 비동기 입력 업로드, 장치별 전송 스레드 분리, PCIe P2P AllReduce 대체 등 하드웨어 레벨의 여러 수정 사항을 통해 디코드 속도와 효율성을 크게 향상시켰습니다. 이러한 개선은 모델 추론 성능을 극대화하는 데 초점을 맞추고 있습니다.
핵심 포인트
- 비동기 입력 업로드로 Flash-Next 디코드 속도를 24.6 -> 36.3 t/s로 향상.
- PCIe P2P AllReduce를 구현하여 작은 텐서 전송 시간을 크게 단축 (57 us -> 9 us).
- 장치별 전송 스레드를 도입하여 각 GPU의 커널 및 콜렉티브 작업을 독립적으로 개시하도록 최적화함.
- 다양한 MoE/MMVQ 관련 커널을 개선하고, 압축된 타일 목록으로 메모리 사용과 실행 시간을 절감함.
이 모든 것은 rocm과 llama server의 수정 사항들입니다. 관심 있는 분이 있다면 알려주세요. GitHub에 올리고 제 설정을 공유하겠습니다. 저는 gen 4.0 x16 슬롯에 7900xtx 4개를 장착한 Lenovo p620으로 테스트했습니다. 각 수정 사항을 한 줄로 요약하면 다음과 같습니다:
-
비동기 미러 입력 업로드(Async mirrored input uploads): 동기식 왕복(synchronous round trips) 대신, per-GPU 스트림의 고정 링(pinned ring)에 토큰당 약 30개의 입력을 스테이징하여 처리합니다 (Flash-Next 디코드 속도: 24.6 -> 36.3 t/s).
-
장치별 전송 스레드(Per-device dispatch threads): 모든 네 개의 GPU를 위한 단일 스레드가 아닌, 각 GPU의 커널과 콜렉티브 작업을 해당 호스트 스레드가 개시하도록 했습니다.
-
일회성 PCIe P2P AllReduce: 작은 텐서에 대해 GPU가 피어 메모리에 직접 슬라이스를 쓰게 하여 RCCL을 대체했습니다 (~57 us -> ~9 us/allreduce).
-
MTP 디코드의 커널 감소(Fewer kernels in MTP decode): 동일 모양 복사(same-shape copies)를 통합하고 더 간소화된 conv-state 롤백을 구현했습니다 (88.8 -> 92.7 t/s).
-
mmvq 작은-K 행 패킹(mmvq small-K row packing, RDNA3): 짧은 K 투영이 블록의 대부분을 유휴 상태로 두지 않게 했습니다 (22.7 -> 25.3 t/s).
-
다중 토큰 배치용 넓은-K mmvq(Wide-K mmvq for multi-token batches): 10240x320 투영에 대해 MTP 검증 시 K를 8 워프에 걸쳐 분할했습니다 (~92.6 -> ~96 t/s).
-
최대 8 토큰 MoE 벡터 커널(MoE vector kernel up to 8 tokens): 5토큰 MTP 검증 배치가 MMQ 대신 빠른 벡터 경로에 머무르게 했습니다 (80.9 -> 86.7 t/s).
-
작은-K 다중 토큰 MoE 커널(Small-K multi-token MoE kernel): 짧은 전문가 다운-투영 슬라이스에 대해 워프당 여러 행을 처리했습니다 (94.2 -> 95.2 t/s).
-
넓은 mmvf 블록(Wide mmvf blocks): 작은 장기 K F32 행렬에 대해 512/1024 스레드 블록을 사용했습니다 (40.6 -> 41.2 t/s).
-
Q8_1 활성화 레지스트리(Q8_1 activation registry): 각 활성화를 한 번만 양자화하고 이를 읽는 모든 matmul이 공유하도록 했습니다 (~+2 t/s).
-
통합된 하이퍼 연결 체인(Fused hyper-connection chains): scale/sigmoid/scale/hc_post와 scale/silu를 각각 하나의 커널에 포함시켰으며, 토큰당 약 380개의 커널을 줄였습니다 (38.5 -> 40.6 t/s).
-
얇은 F32 프리필 커널(Thin-F32 prefill kernel): 범용 SGEMM이 아닌 <=16행 F32 matmul을 처리하도록 했습니다 (401 -> 21 us; pp4096 1602 -> 1836 t/s).
-
압축된 MoE 타일 목록(Compact MoE tile list): 전문가 matmul은 작업이 있는 (expert, token-tile) 쌍만 실행하도록 하여 96%-비어있는 그리드를 방지했습니다 (다운 928 -> 405 us, 게이트/업 516 -> 360 us).
-
다중 워프 MoE 라우팅 도우미(Multi-warp MoE routing helper): 전문가별 정렬 토큰을 두 번의 패스에서 16 워프로 처리했습니다 (호출당 99 -> 25 us).
-
Q4_K expert tile shape: 32행 타일로 160행 전문가 슬라이스 처리 (360 $
ightarrow$ 337 us). - Stream-k를 이용한 적은 수의 타일에 대한 Q8_0 행렬 곱셈(matmuls): 10240 $
ightarrow$ 320 투영을 모든 CU에 분산하여 사용 그룹 12개 대신 처리 (284 $
ightarrow$ 115 us). - 하이퍼 커넥션 커널에서 64비트 나눗셈/나머지 연산 제거: 요소당 에뮬레이션 정수 나눗셈 대신 3-D 그리드 사용 (230 $
ightarrow$ 79 us; pp2048 1593 $
ightarrow$ 1868 t/s와 stream-k). - Split-K 라우터 GEMM: 512x512 F32 라우터 GEMM을 8개의 K-청크와 합산으로 처리 (158 $
ightarrow$ 69 us). - MTP 재예약 수정: MTP 출력이 활성화될 때 그래프가 재예약되어, 프리필 청크당 전체 GPU 재할당+동기화 과정을 제거 (88.5K prefill 1042 $
ightarrow$ 1130 t/s). - MTP 초안 프롬프트 창: 초안 헤드가 마지막 2048개 프롬프트 토큰만 미리 채움 (prefill 1130 $
ightarrow$ 1249 t/s, 깊이 46.6에서의 디코드 $
ightarrow$ 64.9 t/s). - 초안 ubatch 용량: 초안 계산 버퍼를 457 $
ightarrow$ 247 MiB로 줄여, 96K 컨텍스트에서 발생하던 GPU0 메모리 부족 충돌을 해결. - 수집된 희소 어텐션 (QSA): 디코드가 전체 캐시 마스킹 대신 ~2K개의 선택된 토큰에만 주의를 기울임 (48K에서의 디코드 67.9 $
ightarrow$ 80.6 t/s). - RAM 내 레이어별 임베딩 테이블 사용 (--lazy-mode off): 매 패스마다 디스크에서 읽는 대신, 26.8 GB의 해시된 임베딩 테이블을 상주하게 함 (조회 시간 1.0-1.6 $
ightarrow$ 0.1-0.3 ms, ~3-4% 디코드). - Meta 백엔드 서브그래프 수정: 호출 간 그래프 모양이 변경될 때 발생하는 세그폴트(segfault)를 해결하기 위해 장치별 서브그래프 크기를 가장 큰 그래프에 맞춤. - 결과적으로 Qwen3.8-27B Q8을 4개 GPU에서 사용 시: 코드 디코드 54-61 $
ightarrow$ 96-110 t/s, 51K prefill 1454 $
ightarrow$ 1816 t/s, 51K 깊이에서의 디코드 57 $
ightarrow$ 77 t/s.
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기