最近看到redis之父antirez 专门为 DeepSeek V4 写了一个 Apple Metal 专用本地推理引擎 ds4.c,项目发布3天,立马收获了5.5k Star,据说性能优化提升很大,既然这么火热,那就本地部署看看能不能实现token自由~
-
在本地跑 DeepSeek V4 Flash;
-
用 Apple Metal 加速;
-
提供 OpenAI / Anthropic compatible API;
-
可以接 Claude Code / coding agent;
我的机器配置:
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
接入工具实测
终于到了实测的时候
欢迎我们的老朋友~ CC Switch


这里key随便填写即可
准备进入claude code
性能查看
首次对话会加载系统提示词,所以会稍微慢一点,让我们观察log 查看一下性能如何


首次加载系统提示词 耗时 3m13s
后续对话性能实测


第二次对话 耗时 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





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

闲置时:
ds4.c不像omlx或者lm studio,模型常驻后台就占用很大的内存,这一点优化做的真的是很棒
性能调优
我发现其实还可以在不降智的情况下,将速度调快


我发现每次工具调用后,大概都有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
然后使用调优过的参数启动
同样的任务 重新实测

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

首字耗时依旧在 3m12s 左右





任务完成! 这次总耗时 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 位参与者