Redis 개발자로 유명한 Antirez의 ds4.c 가 정말 하루가 다르게 엄청나게 발전을 하고 하나둘씩 다양한 모델을 지원하기 시작하면서 ..
최근에는
Deepseek-v4-flash, pro 뿐 아니라 glm 5.2, glm 5.3 flash, Deepseek-v4-vision, Deepseek-v4.1-flash 까지 지원하기 시작을 했습니다만 .. glm 과 deepseek 가 아키텍처가 같은 원류라 둘은 그렇다 치는데 .. 뜬금없이 Qwen 3.8 flash next 를 지원하네요? ㅎㅎㅎ
저는 사실 ds4.c 에 Deepseek-v4-flash 를 엄청 잘 쓰고 있었습니다. 비록 디코딩 기준 10~20tps의 매우 느린 속도를 보여주더라도 캐시가 어느정도 쌓이고 캐시가 돌아가기 시작하면 전체 작업 시간은 그냥저냥 감내할 수준이어서 정말 잘 사용해 왔습니다.
그러다 deepseek-v4-flash 0731이 나오고 DSpark 업데이트가 진행된 이후에는 DSpark를 활성화 하면 거의 4~50% 정도 속도가 빨라져서 MTP 적중만 하면 디코딩 기준 30~40tps 정도를 보여주곤 했습니다.
이 정도만 해도 정말 만족하며 사용해 왔는데요, 딱~한가지 아쉬웠던게 Deepseek v4 가 멀티모달 모델이 아니라서 vision 처리를 못한다는게 가장 안타까웠습니다…만!
맥스튜디오 M3 Ultra 512g 모델을 사용하고 vram으로 460gb 를 할당해둔 상황에서 deepseek v4 flash를 ds4.c 로 구동시켜도 vram은 200gb 근처를 차지하기 때문에 (1M 컨텍스트 기준) ..
llama.cpp 로 조금 가벼운 파라미터의 gguf 모델을 구동시켜서 opencode 등에서 서브에이전트로 vision 처리는 따로 일임하는 방식으로 사용해 왔습니다. 최근에는 Qwen 3.8 27b 을 사용하다 Qwen 3.8 flash next가 나온뒤로는 Unsloth 의 Qwen 3.8 flash next UD_Q4_KM 모델을 사용해 왔습니다.
그래도 vram은 넉넉한 상황이었구요.
그러다 현재는 llamap.cpp 도 삭제하고 ds4.c 하나만 사용중입니다.
우선 glm 5.2의 경우 너무 덩치가 큰 모델인데다 디코딩 10tps 도 기대하기 힘든 상황이라 쳐다도 보지 않고 있구요.
glm 5.3 flash 의 경우
pirogom@pirogom-Mac-Studio gguf % ls -alh
total 375005496
drwxr-xr-x@ 5 pirogom staff 160B Sep 3 21:14 .
drwxr-xr-x@ 116 pirogom staff 3.6K Sep 15 03:04 ..
drwxr-xr-x@ 3 pirogom staff 96B Sep 3 21:13 .cache
-rw-r--r--@ 1 pirogom staff 178G Sep 3 21:12 GLM-5.3-Flash-Q4_K.gguf
-rw-r--r--@ 1 pirogom staff 1.0G Sep 3 21:11 GLM-5.3-Flash-Vision-Encoder.gguf
pirogom@pirogom-Mac-Studio gguf %비전 인코더와 Q4_K 양자화 gguf 합쳐도 179GB 정도의 크기고.

간단한 이미지 분석 요청에 대해서 18~19tps 정도 디코딩 속도를 보여줍니다. 약간 초기 ds4.c 의 deepseek-v4-flash 모델 사용할때 느낌과 비슷하네요.
pirogom@pirogom-Mac-Studio ds4c_glm5.3f % cat run-server.sh
#!/bin/sh
./ds4-server \
--metal \
--warm-weights \
--host 0.0.0.0 \
--port 8001 \
--ctx 1000000 \
--kv-disk-dir /Users/pirogom/ds4c_glm5.3f/kv_cache \
--kv-disk-space-mb 65536 \
--mtp \
--vision gguf/GLM-5.3-Flash-Vision-Encoder.gguf저는 사용하는 모델별로 ds4.c 코드를 클론 받아두고 개별 폴더에서 실행해서 쓰는 방식으로 사용중입니다. 경우에 따라서는 별도의 브랜치를 사용해야 하는 경우도 종종 있어서. ( 정식 적용 전에 먼저 써보려 한다거나.. )
Qwen-3.8-flash-next의 경우
pirogom@pirogom-Mac-Studio gguf % ls -alh
total 347455064
drwxr-xr-x@ 5 pirogom staff 160B Sep 15 03:55 .
drwxr-xr-x@ 115 pirogom staff 3.6K Sep 15 03:57 ..
drwxr-xr-x@ 3 pirogom staff 96B Sep 15 03:07 .cache
-rw-r--r--@ 1 pirogom staff 165G Sep 15 03:55 Qwen3.8-Flash-Next-Q4.gguf
-rw-r--r--@ 1 pirogom staff 588M Sep 15 03:09 mmproj-Qwen3.8-Flash-Next-Q8_0.gguf4비트 양자화 모델과 vision 처리를 위한 mmproj 파일 까지 해서 파일 크기는 glm 5.3 flash 와 비슷합니다.

다만 llama.cpp 에서 Unsloth 의 UD_Q4_K_M gguf 파일을 사용했을때 30tps 정도 나왔었는데 5~60tps 정도 속도가 나와주네요.
하루 종일 ds4.c 로 Vision이 필요한 상황에선 Qwen 3.8 flash next 를 사용하고 그 외에는 Deepseek-v4-flash 0731을 사용해본 결과 이제 굳이 llama.cpp 를 쓸 필요 없겠다 라는 결론을 내렸습니다.
아 혹시 Deepseek-v4-vision 모델에 대해서 궁금해 하시는 분도 계실것 같은데요. 최근 추가된 Deepseek-v4.1-flash 의 경우 파라미터가 두배이상 증가한 관계로 Q4 양자화는 480GB정도 차지합니다. 512gb 단일 맥 스튜디오로도 컨텍스트까지 생각하면 좀 버거운 상황이죠. Q2 의 경우 380GB인가? 그 즈음 크기이라서 단일로 돌린다면 vision 포함해서 어쩔지 모르겠습니다만. 아무래도 Q2와 Q4의 차이가 없을 수 없고 속도가 어느정도 나와 주느냐의 문제도 있어서. ( 아직 모델 다운로드 중이라 정확히 테스트를 해보진 못했습니다.)
여튼 ds4.1f가 크기가 워낙 커져서 중간에 나온 deepseek v4 vision 에 관심을 가지시는 분이 계실것 같습니다만. 제가 사용해본걸론 v4 flash 0731 과 다른 경로로 학습을 한건지 몰라도 동일한 요청을 해도 결과가 좀 많이 아쉽더군요. vision 용도로만 쓸꺼 아니면 굳이? 싶었습니다. 전 이미 Qwen 3.8 flash next의 50tps 이상 나오는 vision 처리를 봐 버렸는걸요 ㅎㅎ
이제 마지막 남은 고민은 ..
맥 스튜디오의 vram 상으로는 Deepseek-v4-flash0731 Q4와 Qwen-3.8-flash-next Q4를 둘다 동시에 사용이 가능한 vram 크기이긴 합니다만 ds4.c 가 /tmp/ds4c.lock 파일을 통해 동시에 동작하지 못하도록 기본적으로 구성되어 있는 놈이라서 ..
lock 파일을 별도로 쓸 수 있도록 패치를 해서 써야하나? ..
아니면 그냥 vision 이 필요할떄만 따로 교체해서 동작 시킬까 정도를 고민을 하고 있습니다. 워낙 업데이트가 잦은 프로젝트라서 개별적으로 패치를 하면 매번 패치 적용을 해야하니 조금 귀찮을 것 같긴합니다만..
생각해보니 /tmp 에 저장되는 거면 /tmp 경로를 환경변수서 얻어서 동작한다면 환경변수 조정으로 다른 경로에 저장되게 가능할것 같긴 하네요.
제가 ds4.c 에 대해 언급 할때마다 vLLM 이나 oMLX 나 mlx-ml 같은 것들 두고 왜 ds4.c를 선호하냐고 묻는 분들이 계십니다.
우선 vLLM은 metal 플러그인이 있긴 해도 어쨋든 친 NVIDIA향의 프로젝트이고 다중 서빙시 빨라 보이는 것 같아도 저같이 혼자서 집중적으로 사용하는 경우에 컨텍스트가 어느정도 쌓이고 나면 생각 보다 llama.cpp 보다 전체 작업속도는 크게 빠르진 않습니다.
oMLX, mlx-ml 의 경우도 여전히 mlx 가 성숙단계까지 멀었다고 보구요. AI 진영에서 아웃사이더이다 보니 더더욱이 ..
다양한 짓을 해본 결과 .. 단순 밴치마크를 위한게 아닌 실 사용 용도에선 mlx 보단 차라리 llama.cpp 로 gguf 를 사용하는게 오히려 안정성 측면에선 나았구요.
단지 ds4.c 를 선호하는건 이 추론엔진의 목적이 어쨋든 개발용에 맞춰져 있다고 느껴지기 때문입니다. 보통 다른 추론엔진들은 개발자들만을 위한게 아니라 다양한 범용 용도에 맞춰서 gguf 든 mlx 든 사용해서 동작을 하게 됩니다만, 저같이 개발을 위해 주로 LocalLLM을 사용하는 입장에선 툴 호출을 비롯해서 에이전트를 통한 개발 프로세스를 진행함에 있어서 큰 오류없이 무난하게 작업이 완료되는게 가장 중요한 점입니다.
이 점에서 현재까진 오직 ds4.c 만 만족스럽게 동작중입니다.
그래서 계속 발전중이고 다양한 모델을 지원하게 되서 너무 좋네요.
한동안 맥스튜디오에는 ds4.c 원툴로 밀어 붙이렵니다.
— Deepseek v4.1 flash 관련 추가
pirogom@pirogom-Mac-Studio gguf % ls -alh
total 716180168
drwxr-xr-x@ 5 pirogom staff 160B Sep 15 13:41 .
drwxr-xr-x@ 115 pirogom staff 3.6K Sep 16 00:39 ..
drwxr-xr-x@ 3 pirogom staff 96B Sep 15 11:54 .cache
-rw-r--r--@ 1 pirogom staff 341G Sep 15 13:41 DeepSeek-V4.1-Flash-Q2.gguf
-rw-r--r--@ 1 pirogom staff 926M Sep 15 11:55 DeepSeek-V4.1-Flash-Vision.ggufQ2양자화 모델만 해도 350GB 가량 되고 Q4는 400GB가 넘어가기 때문에 우선 Q2를 받아서 동작 시켜 봤습니다.
ds4: Metal device Apple M3 Ultra, 512.00 GiB RAM
ds4: Metal 4 tensor API disabled for pre-M5/pre-A19 devices
ds4: drift-patch flags hc_stable=on norm_unify=on kv_raw_f32=off rope_exp2_log2=off math_safe=off tensor_matmul=off
ds4: warming mapped tensor pages: 151.76 GiB
ds4: warmed tensor pages in 10.652s (checksum=1217859606)
ds4: requesting Metal residency (may take tens of seconds)... done
ds4: warming Metal model views... done
ds4: Metal model views created in 2.994 ms, residency requested in 1146.534 ms, warmup 7.435 ms (mapped 155401.05 MiB from offset 5.56 MiB)
ds4: Metal mapped mmaped model as 1 overlapping shared buffers
ds4: requesting Metal residency (may take tens of seconds)... done
ds4: warming Metal model views... done
ds4: Metal model views created in 0.041 ms, residency requested in 1050.366 ms, warmup 1.061 ms (mapped 925.59 MiB from offset 0.02 MiB)
ds4: Metal mapped mmaped model as 2 overlapping shared buffers
ds4: metal backend initialized for graph diagnostics
ds4: memory: KV 5.97 GiB (raw 0.01 + compressed 5.96) + buffers 12.41 GiB + resident model 151.76 GiB = 170.14 GiB planned
ds4: memory detail: ctx=1000000 prefill_cap=8192 raw_kv_rows=128 compressed_kv_rows=1000001 backend=metal
0916 00:39:21 ds4-server: context buffers 18819.00 MiB (ctx=1000000, backend=metal, prefill_chunk=8192, raw_kv_rows=128, compressed_kv_rows=1000001)
ds4: V4.1 static context buffers 18819.00 MiB (ctx=1000000), Engram disk-only
0916 00:39:21 ds4-server: KV disk cache /Users/pirogom/ds4c_ds41f/kv_cache (budget=65536 MiB, cross-quant=accept, min=512, cold_max=30000, continued=10000, trim=32, align=2048, hit_half_life=21600s)
0916 00:39:21 ds4-server: listening on http://0.0.0.0:8001
0916 00:39:23 ds4-server: chat ctx=0..7562:7562 TOOLS prompt start
0916 00:39:42 ds4-server: chat ctx=0..7562:7562 TOOLS prefill chunk 6144/7562 (81.2%) chunk=0.00 t/s avg=328.54 t/s 18.701s
0916 00:39:47 ds4-server: chat ctx=0..7562:7562 TOOLS prefill chunk 7558/7562 (99.9%) chunk=310.43 t/s avg=324.99 t/s 23.256s
0916 00:39:47 ds4-server: kv cache stored tokens=7558 trimmed=4 reason=cold key=token-text size=56.68 MiB save=7.7 ms
0916 00:39:47 ds4-server: chat ctx=0..7562:7562 TOOLS prefill chunk 7559/7562 (100.0%) chunk=9.59 t/s avg=323.59 t/s 23.360s
0916 00:39:47 ds4-server: chat ctx=0..7562:7562 TOOLS prefill chunk 7560/7562 (100.0%) chunk=20.32 t/s avg=322.95 t/s 23.409s
0916 00:39:47 ds4-server: chat ctx=0..7562:7562 TOOLS prefill chunk 7561/7562 (100.0%) chunk=20.61 t/s avg=322.32 t/s 23.458s
0916 00:39:47 ds4-server: chat ctx=0..7562:7562 TOOLS prefill chunk 7562/7562 (100.0%) chunk=20.38 t/s avg=321.69 t/s 23.507s
0916 00:39:47 ds4-server: chat ctx=0..7562:7562 TOOLS prompt done 23.508s
0916 00:39:48 ds4-server: chat ctx=7562..7590:28 gen=28 TOOLS decoding chunk=20.12 t/s avg=20.12 t/s 1.392s
0916 00:39:48 ds4-server: chat ctx=0..7562:7562 gen=28 TOOLS finish=stop 24.900s
0916 00:40:03 ds4-server: vision embedding encoded; cache=13028716 bytes
0916 00:40:03 ds4-server: multimodal live kv hit images=1 cached=7590 prompt=8267 identity=fingerprint-match
0916 00:40:03 ds4-server: chat ctx=7590..8267:677 TOOLS prompt start
0916 00:40:06 ds4-server: chat ctx=7590..8267:677 TOOLS prefill chunk 677/677 (100.0%) chunk=0.00 t/s avg=253.92 t/s 2.666s
0916 00:40:06 ds4-server: chat ctx=7590..8267:677 TOOLS prompt done 2.667s
0916 00:40:09 ds4-server: chat ctx=8267..8317:50 gen=50 TOOLS THINKING decoding chunk=19.75 t/s avg=19.75 t/s 2.532s
0916 00:40:11 ds4-server: chat ctx=8317..8367:50 gen=100 TOOLS THINKING decoding chunk=19.93 t/s avg=19.84 t/s 5.041s
0916 00:40:14 ds4-server: chat ctx=8367..8417:50 gen=150 TOOLS THINKING decoding chunk=19.98 t/s avg=19.88 t/s 7.544s
0916 00:40:16 ds4-server: chat ctx=8417..8467:50 gen=200 TOOLS decoding chunk=19.91 t/s avg=19.89 t/s 10.055s
0916 00:40:19 ds4-server: chat ctx=8467..8517:50 gen=250 TOOLS decoding chunk=19.90 t/s avg=19.89 t/s 12.568s
0916 00:40:21 ds4-server: chat ctx=8517..8567:50 gen=300 TOOLS decoding chunk=19.97 t/s avg=19.90 t/s 15.072s
0916 00:40:24 ds4-server: chat ctx=8567..8617:50 gen=350 TOOLS decoding chunk=19.92 t/s avg=19.91 t/s 17.582s
0916 00:40:25 ds4-server: chat ctx=8617..8638:21 gen=371 TOOLS decoding chunk=19.93 t/s avg=19.91 t/s 18.636s
0916 00:40:25 ds4-server: chat ctx=7590..8267:677 gen=371 TOOLS finish=stop 21.304s
0916 00:41:34 ds4-server: live kv cache miss live=8638 prompt=21568 common=7174 vision=mismatch reason=token-mismatch
0916 00:41:34 ds4-server: chat ctx=0..21568:21568 TOOLS prompt start
0916 00:42:02 ds4-server: chat ctx=0..21568:21568 TOOLS prefill chunk 20480/21568 (95.0%) chunk=0.00 t/s avg=720.01 t/s 28.444s
0916 00:42:02 ds4-server: kv cache skipped tokens=20480 reason=continued because KV payload staging failed: session has no valid checkpoint to stage
0916 00:42:06 ds4-server: chat ctx=0..21568:21568 TOOLS prefill chunk 21552/21568 (99.9%) chunk=271.93 t/s avg=665.47 t/s 32.386s
0916 00:42:06 ds4-server: kv cache stored tokens=21552 trimmed=16 reason=cold key=token-text size=142.19 MiB save=24.1 ms
0916 00:42:06 ds4-server: chat ctx=0..21568:21568 TOOLS prefill chunk 21568/21568 (100.0%) chunk=47.19 t/s avg=659.06 t/s 32.725s
0916 00:42:06 ds4-server: chat ctx=0..21568:21568 TOOLS prompt done 32.726s
0916 00:42:09 ds4-server: chat ctx=21568..21618:50 gen=50 TOOLS THINKING decoding chunk=19.69 t/s avg=19.69 t/s 2.539s
0916 00:42:11 ds4-server: chat ctx=21618..21668:50 gen=100 TOOLS DSML_START decoding chunk=19.63 t/s avg=19.66 t/s 5.086s
0916 00:42:14 ds4-server: chat ctx=21668..21718:50 gen=150 TOOLS DSML_START decoding chunk=19.61 t/s avg=19.64 t/s 7.636s
0916 00:42:16 ds4-server: chat ctx=21718..21753:35 gen=185 TOOLS DSML_START DSML_END decoding chunk=19.67 t/s avg=19.65 t/s 9.415s
0916 00:42:16 ds4-server: tool calls ctx=0..21568:21568 n=2 raw_tool_text=1 ids=[call_9dd504f427525db7cdbcdad15c30f703,call_eda26c58799672e612644b5ea3d93fa1] names=[bash,bash]
0916 00:42:16 ds4-server: chat ctx=0..21568:21568 gen=185 TOOLS DSML_START DSML_END finish=tool_calls 42.142s
0916 00:42:18 ds4-server: chat ctx=21753..22319:566 TOOLS prompt start
0916 00:42:20 ds4-server: chat ctx=21753..22319:566 TOOLS prefill chunk 566/566 (100.0%) chunk=0.00 t/s avg=224.93 t/s 2.516s
0916 00:42:20 ds4-server: chat ctx=21753..22319:566 TOOLS prompt done 2.518s
0916 00:42:23 ds4-server: chat ctx=22319..22369:50 gen=50 TOOLS THINKING decoding chunk=19.48 t/s avg=19.48 t/s 2.567s
0916 00:42:26 ds4-server: chat ctx=22369..22419:50 gen=100 TOOLS THINKING decoding chunk=19.62 t/s avg=19.55 t/s 5.115s
0916 00:42:28 ds4-server: chat ctx=22419..22469:50 gen=150 TOOLS decoding chunk=19.58 t/s avg=19.56 t/s 7.669s
0916 00:42:31 ds4-server: chat ctx=22469..22519:50 gen=200 TOOLS DSML_START decoding chunk=19.59 t/s avg=19.57 t/s 10.222s
0916 00:42:33 ds4-server: chat ctx=22519..22569:50 gen=250 TOOLS DSML_START decoding chunk=19.59 t/s avg=19.57 t/s 12.773s
0916 00:42:35 ds4-server: chat ctx=22569..22614:45 gen=295 TOOLS DSML_START DSML_END decoding chunk=19.62 t/s avg=19.58 t/s 15.067s
0916 00:42:35 ds4-server: tool calls ctx=21753..22319:566 n=2 raw_tool_text=1 ids=[call_416e869ca29c377a692eff91a50357f5,call_52ad2fe2cd0e7f1bcde42122cbd0884a] names=[bash,bash]
0916 00:42:35 ds4-server: chat ctx=21753..22319:566 gen=295 TOOLS DSML_START DSML_END finish=tool_calls 17.585s
0916 00:42:37 ds4-server: chat ctx=22614..23884:1270 TOOLS prompt start
0916 00:42:41 ds4-server: chat ctx=22614..23884:1270 TOOLS prefill chunk 1270/1270 (100.0%) chunk=0.00 t/s avg=285.86 t/s 4.443s
0916 00:42:41 ds4-server: chat ctx=22614..23884:1270 TOOLS prompt done 4.444s
0916 00:42:44 ds4-server: chat ctx=23884..23934:50 gen=50 TOOLS THINKING decoding chunk=19.48 t/s avg=19.48 t/s 2.566s
0916 00:42:46 ds4-server: chat ctx=23934..23984:50 gen=100 TOOLS DSML_START decoding chunk=19.61 t/s avg=19.55 t/s 5.115s
0916 00:42:49 ds4-server: chat ctx=23984..24034:50 gen=150 TOOLS DSML_START decoding chunk=19.56 t/s avg=19.55 t/s 7.671s
0916 00:42:51 ds4-server: chat ctx=24034..24084:50 gen=200 TOOLS DSML_START decoding chunk=19.66 t/s avg=19.58 t/s 10.215s
0916 00:42:53 ds4-server: chat ctx=24084..24127:43 gen=243 TOOLS DSML_START DSML_END decoding chunk=19.61 t/s avg=19.58 t/s 12.408s
0916 00:42:53 ds4-server: tool calls ctx=22614..23884:1270 n=2 raw_tool_text=1 ids=[call_da5b2b186bb04b4bf78e9a4065f2a312,call_44de4ba749628d1cf1bf98b2439f7d6f] names=[bash,bash]
0916 00:42:53 ds4-server: chat ctx=22614..23884:1270 gen=243 TOOLS DSML_START DSML_END finish=tool_calls 16.852s
0916 00:42:54 ds4-server: chat ctx=24127..33180:9053 TOOLS prompt start
0916 00:43:08 ds4-server: chat ctx=24127..33180:9053 TOOLS prefill chunk 8192/9053 (90.5%) chunk=0.00 t/s avg=588.13 t/s 13.929s
0916 00:43:12 ds4-server: chat ctx=24127..33180:9053 TOOLS prefill chunk 9053/9053 (100.0%) chunk=249.67 t/s avg=520.96 t/s 17.378s
0916 00:43:12 ds4-server: chat ctx=24127..33180:9053 TOOLS prompt done 17.379s
0916 00:43:14 ds4-server: chat ctx=33180..33230:50 gen=50 TOOLS THINKING decoding chunk=19.13 t/s avg=19.13 t/s 2.614s
0916 00:43:17 ds4-server: chat ctx=33230..33280:50 gen=100 TOOLS THINKING decoding chunk=19.41 t/s avg=19.27 t/s 5.190s
0916 00:43:20 ds4-server: chat ctx=33280..33330:50 gen=150 TOOLS DSML_START decoding chunk=19.40 t/s avg=19.31 t/s 7.768s
0916 00:43:22 ds4-server: chat ctx=33330..33380:50 gen=200 TOOLS DSML_START decoding chunk=19.36 t/s avg=19.32 t/s 10.350s
0916 00:43:25 ds4-server: chat ctx=33380..33430:50 gen=250 TOOLS DSML_START decoding chunk=19.37 t/s avg=19.33 t/s 12.932s
0916 00:43:26 ds4-server: chat ctx=33430..33453:23 gen=273 TOOLS DSML_START DSML_END decoding chunk=19.37 t/s avg=19.33 t/s 14.120s
0916 00:43:26 ds4-server: tool calls ctx=24127..33180:9053 n=2 raw_tool_text=1 ids=[call_5e496bab471d7d4020c4d31b65b9084f,call_3d976c01026b21254e74f830ce8001d2] names=[read,bash]
0916 00:43:26 ds4-server: chat ctx=24127..33180:9053 gen=273 TOOLS DSML_START DSML_END finish=tool_calls 31.499s
0916 00:43:27 ds4-server: chat ctx=33453..36366:2913 TOOLS prompt start
0916 00:43:34 ds4-server: chat ctx=33453..36366:2913 TOOLS prefill chunk 2048/2913 (70.3%) chunk=0.00 t/s avg=301.25 t/s 6.798s
0916 00:43:37 ds4-server: chat ctx=33453..36366:2913 TOOLS prefill chunk 2913/2913 (100.0%) chunk=242.24 t/s avg=280.93 t/s 10.369s
0916 00:43:37 ds4-server: chat ctx=33453..36366:2913 TOOLS prompt done 10.371s
0916 00:43:40 ds4-server: chat ctx=36366..36416:50 gen=50 TOOLS THINKING decoding chunk=19.23 t/s avg=19.23 t/s 2.600s
0916 00:43:43 ds4-server: chat ctx=36416..36466:50 gen=100 TOOLS THINKING decoding chunk=19.33 t/s avg=19.28 t/s 5.187s
0916 00:43:45 ds4-server: chat ctx=36466..36516:50 gen=150 TOOLS DSML_START decoding chunk=19.37 t/s avg=19.31 t/s 7.769s
0916 00:43:48 ds4-server: chat ctx=36516..36566:50 gen=200 TOOLS DSML_START decoding chunk=19.30 t/s avg=19.30 t/s 10.360s
0916 00:43:50 ds4-server: chat ctx=36566..36616:50 gen=250 TOOLS DSML_START decoding chunk=19.37 t/s avg=19.32 t/s 12.941s
0916 00:43:52 ds4-server: chat ctx=36616..36657:41 gen=291 TOOLS DSML_START DSML_END decoding chunk=19.34 t/s avg=19.32 t/s 15.061s
0916 00:43:52 ds4-server: tool calls ctx=33453..36366:2913 n=2 raw_tool_text=1 ids=[call_785e4db3f5e579c63da6d6c341580a35,call_fdde5f70510b1b79bb07abdf01a4c6d7] names=[bash,bash]
0916 00:43:52 ds4-server: chat ctx=33453..36366:2913 gen=291 TOOLS DSML_START DSML_END finish=tool_calls 25.432s
0916 00:43:53 ds4-server: chat ctx=36657..38203:1546 TOOLS prompt start
0916 00:43:59 ds4-server: chat ctx=36657..38203:1546 TOOLS prefill chunk 1546/1546 (100.0%) chunk=0.00 t/s avg=285.53 t/s 5.414s
0916 00:43:59 ds4-server: chat ctx=36657..38203:1546 TOOLS prompt done 5.416s
0916 00:44:01 ds4-server: chat ctx=38203..38253:50 gen=50 TOOLS DSML_START decoding chunk=19.31 t/s avg=19.31 t/s 2.589s
0916 00:44:04 ds4-server: chat ctx=38253..38303:50 gen=100 TOOLS DSML_START decoding chunk=19.37 t/s avg=19.34 t/s 5.170s
0916 00:44:07 ds4-server: chat ctx=38303..38353:50 gen=150 TOOLS DSML_START decoding chunk=19.35 t/s avg=19.34 t/s 7.755s
0916 00:44:09 ds4-server: chat ctx=38353..38403:50 gen=200 TOOLS DSML_START decoding chunk=19.33 t/s avg=19.34 t/s 10.342s
0916 00:44:10 ds4-server: chat ctx=38403..38414:11 gen=211 TOOLS DSML_START DSML_END decoding chunk=19.34 t/s avg=19.34 t/s 10.911s
0916 00:44:10 ds4-server: tool calls ctx=36657..38203:1546 n=2 raw_tool_text=1 ids=[call_8ad30c18c4ed051083d7fd4d43941951,call_8e05fd7094b7007c12c6a2f5d35aec23] names=[read,read]
0916 00:44:10 ds4-server: chat ctx=36657..38203:1546 gen=211 TOOLS DSML_START DSML_END finish=tool_calls 16.327s
0916 00:44:11 ds4-server: chat ctx=38414..44855:6441 TOOLS prompt start
0916 00:44:32 ds4-server: chat ctx=38414..44855:6441 TOOLS prefill chunk 6144/6441 (95.4%) chunk=0.00 t/s avg=288.18 t/s 21.320s
0916 00:44:34 ds4-server: chat ctx=38414..44855:6441 TOOLS prefill chunk 6441/6441 (100.0%) chunk=178.04 t/s avg=280.19 t/s 22.988s
0916 00:44:34 ds4-server: chat ctx=38414..44855:6441 TOOLS prompt done 22.990s
0916 00:44:36 ds4-server: chat ctx=44855..44905:50 gen=50 TOOLS DSML_START decoding chunk=19.24 t/s avg=19.24 t/s 2.599s
0916 00:44:39 ds4-server: chat ctx=44905..44955:50 gen=100 TOOLS DSML_START decoding chunk=19.30 t/s avg=19.27 t/s 5.189s
0916 00:44:42 ds4-server: chat ctx=44955..45005:50 gen=150 TOOLS DSML_START decoding chunk=19.27 t/s avg=19.27 t/s 7.784s
0916 00:44:44 ds4-server: chat ctx=45005..45055:50 gen=200 TOOLS DSML_START decoding chunk=19.25 t/s avg=19.27 t/s 10.381s
0916 00:44:45 ds4-server: chat ctx=45055..45065:10 gen=210 TOOLS DSML_START DSML_END decoding chunk=19.33 t/s avg=19.27 t/s 10.898s
0916 00:44:45 ds4-server: tool calls ctx=38414..44855:6441 n=2 raw_tool_text=1 ids=[call_121d71f08642ffd6f712300af4f42e59,call_b84450efe650931fa7c2a9a65218473b] names=[read,read]
0916 00:44:45 ds4-server: chat ctx=38414..44855:6441 gen=210 TOOLS DSML_START DSML_END finish=tool_calls 33.888s
0916 00:44:46 ds4-server: chat ctx=45065..49895:4830 TOOLS prompt start
0916 00:45:00 ds4-server: chat ctx=45065..49895:4830 TOOLS prefill chunk 4096/4830 (84.8%) chunk=0.00 t/s avg=280.97 t/s 14.578s
0916 00:45:04 ds4-server: chat ctx=45065..49895:4830 TOOLS prefill chunk 4830/4830 (100.0%) chunk=228.34 t/s avg=271.46 t/s 17.793s
0916 00:45:04 ds4-server: chat ctx=45065..49895:4830 TOOLS prompt done 17.794s
0916 00:45:06 ds4-server: chat ctx=49895..49945:50 gen=50 TOOLS THINKING decoding chunk=19.24 t/s avg=19.24 t/s 2.599s
0916 00:45:09 ds4-server: chat ctx=49945..49995:50 gen=100 TOOLS THINKING decoding chunk=19.42 t/s avg=19.33 t/s 5.174s
0916 00:45:11 ds4-server: chat ctx=49995..50045:50 gen=150 TOOLS THINKING decoding chunk=19.39 t/s avg=19.35 t/s 7.753s
0916 00:45:14 ds4-server: chat ctx=50045..50095:50 gen=200 TOOLS THINKING decoding chunk=19.39 t/s avg=19.36 t/s 10.332s
0916 00:45:16 ds4-server: chat ctx=50095..50145:50 gen=250 TOOLS THINKING decoding chunk=19.37 t/s avg=19.36 t/s 12.914s
0916 00:45:19 ds4-server: chat ctx=50145..50195:50 gen=300 TOOLS THINKING decoding chunk=19.36 t/s avg=19.36 t/s 15.497s
0916 00:45:22 ds4-server: chat ctx=50195..50245:50 gen=350 TOOLS THINKING decoding chunk=19.38 t/s avg=19.36 t/s 18.077s
0916 00:45:24 ds4-server: chat ctx=50245..50295:50 gen=400 TOOLS THINKING decoding chunk=19.40 t/s avg=19.37 t/s 20.654s
0916 00:45:27 ds4-server: chat ctx=50295..50345:50 gen=450 TOOLS THINKING decoding chunk=19.32 t/s avg=19.36 t/s 23.242s
0916 00:45:29 ds4-server: chat ctx=50345..50395:50 gen=500 TOOLS DSML_START decoding chunk=19.33 t/s avg=19.36 t/s 25.829s일단 Deepseek v4.1 flash의 경우에는 아직 ds4.c 에 dspark 관련 업데이트 전이라 dspark 는 아직 적용 전입니다.
gguf 파일 크기가 350GB 정도 되는것에 비하면 메모리 사용량은 190Gb 정도로 구조적인 특성인지 몰라도 확실히 메모리 사용량은 많이 절제된 상태인것 같습니다.
우선 속도는 둘째치고 Q4 양자화도 다운받아서 실제 메모리 사용량을 좀 확인해 봐야 겐네요 Q4도 300gb 는 안넘어 갈것 같은데 말이죠. 문제는 Q2가 19tps 면 Q4는 10tps 언저리 나올거란 소리라, mtp 관련이 어떻게 될지 모르겠습니다.
아무래도 moe 구조라 해도 파라미터수가 꽤 큰폭으로 증가했으니 상대적인 속도 저하는 어쩔 수 없을 것 같긴 합니다만.
우선 Deepseek v4.1 flash의 경우 mtp 쪽이 어떻게 진행되는질 좀 지켜봐야 겠습니다.
현재로썬 Deepseek v4 flash 0731 을 주력으로 사용하고 Vision 까지 필요할떈 glm 5.3 flash 나 Qwen 3.8 flash next를 사용하는 정도로 계속 사용해 보겠습니다.
— Deepseek v4.1 flash Q4 테스트 후기
pirogom@pirogom-Mac-Studio ds4c_ds41f % ./run-server.sh
ds4: Metal device Apple M3 Ultra, 512.00 GiB RAM
ds4: Metal 4 tensor API disabled for pre-M5/pre-A19 devices
ds4: drift-patch flags hc_stable=on norm_unify=on kv_raw_f32=off rope_exp2_log2=off math_safe=off tensor_matmul=off
ds4: warming mapped tensor pages: 294.14 GiB
ds4: warmed tensor pages in 58.260s (checksum=2250200447)
ds4: requesting Metal residency (may take tens of seconds)... done
ds4: warming Metal model views... done
ds4: Metal model views created in 7.633 ms, residency requested in 2190.363 ms, warmup 7.730 ms (mapped 301201.05 MiB from offset 5.56 MiB)
ds4: Metal mapped mmaped model as 1 overlapping shared buffers
ds4: requesting Metal residency (may take tens of seconds)... done
ds4: warming Metal model views... done
ds4: Metal model views created in 0.055 ms, residency requested in 2327.728 ms, warmup 1.121 ms (mapped 925.59 MiB from offset 0.02 MiB)
ds4: Metal mapped mmaped model as 2 overlapping shared buffers
ds4: metal backend initialized for graph diagnostics
ds4: memory: KV 5.97 GiB (raw 0.01 + compressed 5.96) + buffers 12.41 GiB + resident model 294.14 GiB = 312.52 GiB planned
ds4: memory detail: ctx=1000000 prefill_cap=8192 raw_kv_rows=128 compressed_kv_rows=1000001 backend=metal
0916 03:39:17 ds4-server: context buffers 18819.00 MiB (ctx=1000000, backend=metal, prefill_chunk=8192, raw_kv_rows=128, compressed_kv_rows=1000001)
ds4: V4.1 static context buffers 18819.00 MiB (ctx=1000000), Engram disk-only
0916 03:39:17 ds4-server: KV disk cache /Users/pirogom/ds4c_ds41f/kv_cache (budget=65536 MiB, cross-quant=accept, min=512, cold_max=30000, continued=10000, trim=32, align=2048, hit_half_life=21600s)
0916 03:39:17 ds4-server: listening on http://0.0.0.0:8001
0916 03:39:27 ds4-server: kv cache hit text tokens=7558 text=33107 quant=2 key=token-text load=26.2 ms file=/Users/pirogom/ds4c_ds41f/kv_cache/64f34800521eb01eed59097397e525eb2248f27b.kv
0916 03:39:27 ds4-server: chat ctx=7558..7562:4 TOOLS prompt start
0916 03:39:27 ds4-server: chat ctx=7558..7562:4 TOOLS prefill chunk 1/4 (25.0%) chunk=0.00 t/s avg=4.24 t/s 0.236s
0916 03:39:27 ds4-server: chat ctx=7558..7562:4 TOOLS prefill chunk 2/4 (50.0%) chunk=18.77 t/s avg=6.92 t/s 0.289s
0916 03:39:27 ds4-server: chat ctx=7558..7562:4 TOOLS prefill chunk 3/4 (75.0%) chunk=18.53 t/s avg=8.74 t/s 0.343s
0916 03:39:27 ds4-server: chat ctx=7558..7562:4 TOOLS prefill chunk 4/4 (100.0%) chunk=18.01 t/s avg=10.03 t/s 0.399s
0916 03:39:27 ds4-server: chat ctx=7558..7562:4 TOOLS prompt done 0.400s
0916 03:39:29 ds4-server: chat ctx=7562..7591:29 gen=29 TOOLS decoding chunk=19.63 t/s avg=19.63 t/s 1.478s
0916 03:39:29 ds4-server: chat ctx=7558..7562:4 gen=29 TOOLS finish=stop 1.878s
0916 03:39:43 ds4-server: vision embedding encoded; cache=3940157 bytes
0916 03:39:43 ds4-server: multimodal live kv hit images=1 cached=7591 prompt=7857 identity=fingerprint-match
0916 03:39:43 ds4-server: chat ctx=7591..7857:266 TOOLS prompt start
0916 03:39:44 ds4-server: chat ctx=7591..7857:266 TOOLS prefill chunk 266/266 (100.0%) chunk=0.00 t/s avg=158.54 t/s 1.678s
0916 03:39:44 ds4-server: chat ctx=7591..7857:266 TOOLS prompt done 1.679s
0916 03:39:47 ds4-server: chat ctx=7857..7907:50 gen=50 TOOLS THINKING decoding chunk=18.93 t/s avg=18.93 t/s 2.641s
0916 03:39:49 ds4-server: chat ctx=7907..7957:50 gen=100 TOOLS THINKING decoding chunk=19.26 t/s avg=19.10 t/s 5.237s
0916 03:39:52 ds4-server: chat ctx=7957..8007:50 gen=150 TOOLS decoding chunk=19.42 t/s avg=19.20 t/s 7.811s
0916 03:39:55 ds4-server: chat ctx=8007..8057:50 gen=200 TOOLS decoding chunk=19.63 t/s avg=19.31 t/s 10.359s
0916 03:39:57 ds4-server: chat ctx=8057..8097:40 gen=240 TOOLS decoding chunk=19.38 t/s avg=19.32 t/s 12.423s
0916 03:39:57 ds4-server: chat ctx=7591..7857:266 gen=240 TOOLS finish=stop 14.103s5시간 넘게 걸려서 480G 정도 되는 모델 파일을 다운받아서 간단히 테스트 해봤습니다. 메모리 사용량은 330GB 정도 512GB인 제 맥 스튜디오 기준으로 1M 컨텍스트를 사용해도 충분히 구동은 가능한 수준이네요.
Q2와 Q4가 실제 디코딩 TPS가 큰 차이가 없는게 희한하긴 합니다만.
DSpark 적용이 되면 경험상 50% 정도는 올라갈듯 하니 잘 나오면 30 tps 정도 기대 가능할 것 같네요.
이정도 수준이면 DSpark 적용만 된다면 가벼운 작업에선 Qwen-3.8-flash-next 를 사용하고 좀더 지능이 필요하면 Deepseek v4.1 flash를 사용하면 될 것 같습니다.
댓글을 달려면 로그인해야 합니다.