[长篇实战] [含调优方向]记录一次M5 Max 128G 部署 ds4.c + DeepSeek V4 Flash

最近看到redis之父antirez 专门为 DeepSeek V4 写了一个 Apple Metal 专用本地推理引擎 ds4.c,项目发布3天,立马收获了5.5k Star,据说性能优化提升很大,既然这么火热,那就本地部署看看能不能实现token自由~ 在本地跑 DeepSeek V4 Flas...
[长篇实战] [含调优方向]记录一次M5 Max 128G 部署 ds4.c + DeepSeek V4 Flash
[长篇实战] [含调优方向]记录一次M5 Max 128G 部署 ds4.c + DeepSeek V4 Flash

最近看到redis之父antirez 专门为 DeepSeek V4 写了一个 Apple Metal 专用本地推理引擎 ds4.c,项目发布3天,立马收获了5.5k Star,据说性能优化提升很大,既然这么火热,那就本地部署看看能不能实现token自由~

我的机器配置:

cpu: M5 Max
Memory: 128GB
Backend: Metal
Model: DeepSeek V4 Flash q2 GGUF
Project: https://github.com/antirez/ds4

第一步:克隆源码

git clone https://github.com/antirez/ds4.git

第二步:编译

make -j"$(sysctl -n hw.ncpu)"

成功后会生成:

./ds4
./ds4-server

检查一下:

ls -lh ds4 ds4-server

第三步:下载 q2 模型

cd ~/ds4
./download_model.sh q2

下载完成后应该看到:

gguf/DeepSeek-V4-Flash-IQ2XXS-w2Q2K-AProjQ8-SExpQ8-OutQ8-chat-v2.gguf

并且会自动创建:

ds4flash.gguf -> gguf/DeepSeek-V4-Flash-IQ2XXS-w2Q2K-AProjQ8-SExpQ8-OutQ8-chat-v2.gguf

检查:

ls -lh gguf
ls -lh ds4flash.gguf

模型大小80G我下载耗时15分钟~

=== attempt 12 Sun May 10 21:26:30 CST 2026 resume=5541790312 pct=6.39% ===
** Resuming transfer from byte position 5541790312
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1435  100  1435    0     0    314      0  0:00:04  0:00:04 --:--:--   412
100 75.6G  100 75.6G    0     0  83.4M      0  0:15:27  0:15:27 --:--:-- 79.7M

=== attempt 12 ended rc=0 Sun May 10 21:41:58 CST 2026 size=86720111200 ===
=== q2 download complete Sun May 10 21:41:58 CST 2026 ===

第四步:启动 ds4-server

下载完成后先检查:

cd ~/ds4
ls -lh gguf/*IQ2XXS*.gguf
ls -lh ds4flash.gguf

然后启动:

cd ~/ds4
./ds4-server \
--ctx 100000 \
--kv-disk-dir /tmp/ds4-kv \
--kv-disk-space-mb 16384

启动参数说明
ctx 我选择100000,也就是100k tokens 上下文 先试试水
kv-disk-dir kv缓存路径
kv-disk-space-mb kv缓存大小,我的mac有1T大小,很宽裕,那么我就用16384 也就是16G

那么就写一个快速启动的脚本

#!/bin/sh
set -e
cd "$(dirname "$0")"

usage() {
  cat <<EOF
Usage:
  ./start-server-q2-custom.sh [CTX_TOKENS] [KV_MB] [PORT]

Defaults:
  CTX_TOKENS = 100000
  KV_MB      = 16384
  PORT       = 8000

Examples:
  ./start-server-q2-custom.sh
  ./start-server-q2-custom.sh 100000 16384
  ./start-server-q2-custom.sh 200000 32768
  ./start-server-q2-custom.sh 65536 8192 8001
EOF
}

case "${1:-}" in
  -h|--help|help)
    usage
    exit 0
    ;;
esac

CTX="${1:-100000}"
KV_MB="${2:-16384}"
PORT="${3:-8000}"
KV_DIR="${DS4_KV_DIR:-/tmp/ds4-kv}"
HOST="${DS4_HOST:-127.0.0.1}"

is_pos_int() {
  case "$1" in
    ''|*[!0-9]*) return 1 ;;
    *) [ "$1" -gt 0 ] ;;
  esac
}

if ! is_pos_int "$CTX"; then
  echo "ERROR: CTX_TOKENS must be a positive integer, got: $CTX" >&2
  usage >&2
  exit 1
fi

if ! is_pos_int "$KV_MB"; then
  echo "ERROR: KV_MB must be a positive integer, got: $KV_MB" >&2
  usage >&2
  exit 1
fi

if ! is_pos_int "$PORT"; then
  echo "ERROR: PORT must be a positive integer, got: $PORT" >&2
  usage >&2
  exit 1
fi

if [ ! -x ./ds4-server ]; then
  echo "ERROR: ./ds4-server not found or not executable. Run make first." >&2
  exit 1
fi

if [ ! -e ./ds4flash.gguf ]; then
  echo "ERROR: ./ds4flash.gguf not found. Download q2 first: ./download_model.sh q2" >&2
  exit 1
fi

mkdir -p "$KV_DIR"

echo "Starting ds4-server..."
echo "  URL:        http://$HOST:$PORT"
echo "  ctx:        $CTX"
echo "  KV dir:     $KV_DIR"
echo "  KV budget:  ${KV_MB} MB"
echo "  model:      ds4flash.gguf"
echo

exec ./ds4-server \
  --host "$HOST" \
  --port "$PORT" \
  --ctx "$CTX" \
  --kv-disk-dir "$KV_DIR" \
  --kv-disk-space-mb "$KV_MB"

通过脚本快速启动

./start-server-q2-custom.sh 100000 16384 8123

启动server

接入工具实测

终于到了实测的时候
欢迎我们的老朋友~ CC Switch

ccswitch
ccswitch2
这里key随便填写即可

准备进入claude code

image

性能查看

首次对话会加载系统提示词,所以会稍微慢一点,让我们观察log 查看一下性能如何

image
image
首次加载系统提示词 耗时 3m13s

后续对话性能实测

image
image
第二次对话 耗时 12s,因为已经把claude code系统提示词缓存至了kv,所以速度大大提升

干活实测

现在让他干点活试试,因为我一般不会只用对话问题来测模型智商,我只在乎实战时是否能够干活~

目标: 网站: https://outlook.tw/, 使用python,实现用目标网站生产临时邮箱,和使用临时邮箱接收邮件,已知 生产邮箱是:https://outlook.tw/api/generate?length=8&domainIndex=0,响应:{“email”:“2ndfmaet@outlook.tw”,“expires”:1778426900490,“anonymous”:true},获取邮件是:https://outlook.tw/api/emails?mailbox=2ndfmaet%40outlook.tw

image
image
image
image
image
image

最终耗时大概15~20分钟左右完成,但是我发现其实启动参数时还有可以优化的地方,并且claude code本来系统提示词就很重,还有我发现一个比较有意思的现象,就是当ds4.c在常驻后台是,内存占用并不大,从活动内存/常驻内存观察,闲置时占用很低;ds4.c 使用 mmap/按需加载,真正推理时内存占用会上来
干活中:

运行时
闲置时:
image

ds4.c不像omlx或者lm studio,模型常驻后台就占用很大的内存,这一点优化做的真的是很棒

性能调优

我发现其实还可以在不降智的情况下,将速度调快

image
image
image

我发现每次工具调用后,大概都有3分钟左右的 重建等待,因为默认是从更长的上下文中去找工具调用的缓存,这个其实在硬盘充裕的情况下,可以 加大 kv容量 和 缩短 缓存保存频率

当前git项目里,默认的kv-cache-continued-interval-tokens 是10000
那么我们就激进一些,设置为2048

每增长多少 tokens 存一次 live KV。数值越小,每次工具调用 后 重建时 可回退的位置越近,但是代价就是增加了读写硬盘的频率,速度和硬盘寿命的平衡,这个就因人而异了,我们只是测试的前提下,暂时就先不考虑硬盘寿命

最终我选择的启动参数如下

./ds4-server \
    --ctx 100000 \
    --kv-disk-dir "$HOME/ds4-kv" \
    --kv-disk-space-mb 131072 \
    --kv-cache-cold-max-tokens 100000 \
    --kv-cache-continued-interval-tokens 2048

128G kv缓存
长 prompt 也建立缓存
每 2048 tokens 存一次 kv

那么现在我来删除上次任务的kv,重新跑一次任务试试

rm -rf /tmp/ds4-kv

然后使用调优过的参数启动

image

同样的任务 重新实测

image
image

这次明显可以看到已经根据2048的要求是进行写入kv

image
首字耗时依旧在 3m12s 左右
image
image
image
image
image
image

任务完成! 这次总耗时 9m12s - 首字3m12s = 6m !

结论:
相同的任务,kv-cache-continued-interval-tokens 2048 执行任务的速度基本提升了3倍左右! 假设如果不用claude code,而是用其他工具,我想首字速度应该还能再提升1m~2m左右,毕竟claude的系统提示词太大了!
最终m5 max 128g 跑DeepSeek V4 Flash q2,速度在20~27 t/s 浮动,如果只是用来养虾或者养马,或者做点小工具,日常问答,已经实现了token自由

至于其他工具调用本地ds v4 那就等到下次再测~
制作不易,希望点赞~

7 个帖子 - 6 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文