회사 테크

Qwen3.8 27B — 4bit/8bit/Flash Next 비교, 그리고 DFlash2는 정말 lossless인가

Qwen3.8 27B를 4bit/8bit/Flash Next로 재보고, DFlash2 speculative decoding까지 붙여봤습니다. 속도는 2~3배 빨라졌지만 공식 주장과 달리 M5에서는 출력이 원본과 갈라졌습니다.

삽질하는개발자

Qwen3.8 Flash Next와 27B 4bit·8bit를 같은 프롬프트로 비교한 표. 평균 decode 각각 82.5, 65.5, 18.1 tok/s.

로컬로 27B를 쓸 때 4bit이 낫냐 8bit이 낫냐, 늘 감으로만 골랐습니다. 8bit이 정확도가 높으니 여유되면 8bit 쓰는 게 맞겠거니 했고요. 이번에 같은 맥에서 직접 재봤는데, 생각과 달랐습니다.

내친김에 지난 글에서 다룬 Flash Next(125B MoE)까지 같은 프롬프트로 붙여서 셋을 비교했습니다.

뭘 비교했나

전부 M5 Max, 같은 프롬프트 5개(코드, 수학, 논리 퍼즐, 한국어 설명, 지식 질문), temp 0으로 고정했습니다.

  • 27B 4bit — oQ4e 양자화. 대부분 4bit인데 민감한 레이어만 5bit로 올린 혼합 방식입니다. 가중치 16GB.
  • 27B 8bit — 순수 8bit. 가중치 28GB.
  • Flash Next 4bit — 125B지만 MoE라 한 번에 6B만 씁니다.

메모리가 문제였습니다. Flash Next가 70GB를 쓰는 채로 8bit(28GB)까지 올리면 예전에 겪은 프리즈 조건에 걸립니다. 그래서 셋을 동시에 안 올리고, 하나씩 단독으로 재서 경합을 없앴습니다.

속도

decode(토큰 생성) 속도입니다. 단위는 tok/s.

프롬프트 Flash Next 4bit 27B 4bit 27B 8bit
code 84.2 39.1 18.1
math 96.2 95.9 18.3
reason 99.4 83.9 18.2
korean 57.9 43.1 18.1
factual 74.7 65.2 18.0
평균 82.5 65.5 18.1

8bit이 제일 느립니다. 그것도 3.6배나. 예상보다 훨씬 큰 차이라 처음엔 메모리 페이징을 의심했는데, 8bit만 단독으로 올려서(free 15GB 여유) 다시 재도 똑같이 18이 나왔습니다. 진짜 속도가 맞습니다.

이유는 두 가지로 봅니다. 하나는 8bit이 4bit보다 가중치가 두 배라, decode할 때 읽어야 할 양 자체가 두 배입니다. decode는 메모리 대역폭 싸움이라 이게 그대로 속도로 옵니다. 다른 하나는 4bit(oQ4e) 빌드는 speculative decode가 붙는데 8bit 빌드엔 없다는 겁니다. 4bit 쪽 속도가 프롬프트마다 39~96으로 출렁이는 게 그 증거입니다. 프롬프트를 많이 되받는 수학·논리 문제에서 확 빨라지거든요. 8bit은 그게 없어서 뭘 시켜도 평평하게 18입니다.

품질

속도가 저러면 8bit을 쓸 이유는 정확도밖에 없습니다. 그래서 같은 답들을 하나씩 봤습니다.

결론부터 말하면 4bit과 8bit이 사실상 똑같았습니다. 수학 문제(45분에 60km → 80km/h) 둘 다 맞고, 논리 퍼즐(빨간 집 위치)도 둘 다 정확히 풀고, 피보나치 코드도 둘 다 제대로 나왔습니다. TCP/UDP 차이도 둘 다 정확했고요.

한국어 ‘양자화’ 설명만 조금 달랐는데, 오히려 8bit 쪽이 “돈은 1원 단위로만 있고 0.5원짜리는 없다” 같은 비유를 써서 약간 나았습니다. 하지만 4bit도 틀린 건 아니고, 이 정도는 그냥 seed 차이 수준입니다.

정리하면 oQ4e 4bit의 “민감한 레이어만 5bit로 남기는” 방식이 제 역할을 합니다. 대부분을 4bit으로 눌러 빠르고 가벼우면서, 품질이 중요한 부분은 정밀도를 지켜서 8bit이랑 차이가 안 납니다.

Flash Next는 어떤가

125B짜리가 27B보다 빠릅니다. MoE라 실제로는 6B만 돌리는 데다 speculative decode까지 있어서, 평균 82.5 tok/s로 셋 중 제일 빨랐습니다.

품질도 좋았습니다. 특히 한국어 양자화 설명에서 유일하게 “저장 공간을 줄이고 처리를 빠르게 한다”는 실제 용도까지 짚었습니다. 나머지 둘은 물리 정의만 설명했고요. 큰 차이는 아니지만 알고 답하는 느낌은 Flash Next가 제일 나았습니다.

대신 메모리를 6470GB 먹습니다. 27B 4bit이 15GB인 걸 생각하면 45배입니다.

+) DFlash2 speculative decoding도 붙여봤다

DFlash2 속도와 품질 측정 결과

8bit이 느린 게 speculative decode가 없어서라는 걸 알고 나니, 아예 제대로 된 speculative 방식인 DFlash2를 붙이면 어떨지 궁금했습니다. z-lab이 만든 block-diffusion drafter인데, 공식적으로 “lossless — 원본이랑 글자 하나 안 틀리고 3.6배 빠르다”고 합니다.

함정 1 — mlx-serve로는 안 돌아간다

먼저 삽질을 좀 했습니다. mlx-serve의 --drafter에 DFlash2를 넣으면 로드는 되는데 실제 디코딩에선 안 씁니다. 속도가 하나도 안 올라서 한참 헤맸습니다. DFlash2를 MLX에서 돌리는 건 별도 패키지 mlx-dspark였습니다. 그리고 drafter도 base 모델(mlx-community/Qwen3.8-27B)에 맞춰진 incoai/Qwen3.8-27B-DFlash2를 써야 합니다.

속도는 진짜 빨라진다

base 모델 + incoai drafter로 제대로 붙이니 속도는 확실했습니다. 전부 temp 0.

baseline DFlash2 배속
8bit 평균 ~15 tok/s ~45 tok/s 3.03x
4bit 평균 ~31 tok/s ~62 tok/s 2.00x

공식 수치(8bit 3.63×, 4bit 2.30×)에 근접합니다. 조금 낮은 건 M5 때문인데, mlx-dspark가 M5에서 검증 커널 하나(small-M)를 하드웨어 이슈로 꺼버립니다. 로그에 계속 경고가 떴습니다.

그런데 “lossless”가 안 지켜진다

여기가 진짜입니다. DFlash2의 셀링포인트는 “가속해도 원본과 똑같은 답”인데, 재보니 아니었습니다.

temp 0이면 무작위성이 없어서 몇 번을 돌리든 글자 하나까지 같아야 합니다. 실제로 baseline은 두 번 돌려도 완전히 같았습니다. 그런데 DFlash2를 켜고 끄면 답이 중간부터 갈라집니다. 8bit도 4bit도 5개 중 2개만 원본과 일치했습니다.

한국어 설명이 대표적이었습니다.

[119자까지 완전히 동일]
"양자화란 ... 물리에서는 에너지나 "

DFlash2 끔:  ...입자의 상태가 이런 최소 단위로만 나타나는 현상을 양자화라고 부릅니다.
DFlash2 켬:  ...전하 같은 것도 이런 최소 단위로만 움직인다고 봅니다.

원리상 이러면 안 됩니다. DFlash2는 drafter가 미리 찍은 토큰을 본 모델이 검증해서 채택/기각하는 구조라, 검증만 정확하면 출력은 원본과 같아야 합니다. 그런데 검증할 때랑 그냥 한 토큰씩 뽑을 때 계산 경로가 달라서 미세한 수치 차이가 생기고, 그게 어느 순간 다음 단어 선택을 뒤집습니다. MLX 양자화 커널이 M5에서 그렇습니다.

오해는 없어야겠습니다. 답이 틀린 건 아닙니다. 위 한국어도 둘 다 맞고, 수학·논리도 정답이었습니다. “틀렸다”가 아니라 “원본과 다르다”입니다. 문제가 되는 건 재현성입니다. “temp 0이면 항상 같은 답”을 전제로 하는 테스트나 캐싱에서는 답이 흔들립니다. 그리고 무엇보다 “lossless라서 마음 놓고 켠다”는 공식 설명이 이 하드웨어에선 안 맞습니다.

4bit이면 그냥 oQ4e MTP가 낫다

한 가지 더. 위에서 쓴 oQ4e 4bit은 자체 MTP 헤드가 있어서 65~75 tok/s가 나왔습니다. DFlash2를 붙인 base 4bit(62 tok/s대)보다 빠르고, 별도 drafter도 안 받아도 됩니다. 4bit 실사용이면 oQ4e + 내장 MTP가 가장 깔끔했습니다.

정리하면 DFlash2는 속도는 광고대로였지만, 이 M5에서 “lossless”는 아니었습니다. 빠른 초안이 필요하면 좋고, 원본과 똑같은 출력이 보장돼야 하면 아직은 조심해야 합니다.

그래서 뭘 쓰나

평균 decode 상주 메모리 품질
Flash Next 4bit 82.5 tok/s 64–70 GB 최상
27B 4bit (oQ4e) 65.5 tok/s 15 GB 동등
27B 8bit 18.1 tok/s 27 GB 동등
  • 27B 8bit은 쓸 이유를 못 찾았습니다. 4bit이랑 품질이 같은데 3.6배 느리고 메모리도 더 씁니다. 적어도 지금 이 빌드로는요. 8bit에 speculative decode가 붙은 빌드가 있으면 얘기가 달라질 수 있는데, 그건 없었습니다.
  • 메모리가 빠듯하면 27B 4bit(oQ4e). 15GB로 이 정도 품질에 65 tok/s면 가성비가 좋습니다.
  • 메모리가 넉넉하면 Flash Next. 제일 빠르고 제일 똑똑한데, 대신 70GB를 통째로 내줘야 합니다.

8bit이 무조건 낫다는 건 편견이었습니다. 양자화를 어떻게 하느냐(어느 레이어를 지키느냐)랑 speculative decode가 붙느냐가, 그냥 bit 수보다 훨씬 크게 작용했습니다.

(2026-09-01 실측. temp 0, 프롬프트 5개짜리 작은 표본이라 경향으로만 보시면 됩니다.)