过去一个月我把主力机换成了32G内存的Mac mini M6。身边搞大模型的朋友反应两极有人觉得Mac mini跑大模型是伪命题有人觉得这代M6的统一内存就是本地推理的最优解。我的答案没那么极端——它确实顶不了一张A100但也不是测完分就吃灰的摆设。这篇文章想聊三件事32G在量化精度下到底能装多大模型M6算力参数背后的真相以及你在实际项目里究竟该怎么判断“本地跑还是调云API”。1. 算力与模型的匹配32G能塞下多大模型1.1 显存占用不是简单看参数个数很多朋友拿到模型先看参数量然后直接拿“参数量 × 每个权重的字节数”去算内存。这个公式没错但只是起步真正部署时还要算上KV Cache、系统占用、并行运行的框架开销。先说最基础的部分权重占用。以7B模型为例FP16精度下每参数占2字节7B大约需要14GBINT8精度下每参数占1字节大约7GBINT4量化后每参数占0.5字节大约3.5GB如果只做量化不用GGUF格式可能还会有些额外表存储但差别不大。然后是KV Cache。这个东西很多人第一次算内存时会漏掉。它用来缓存历史token的Key和Value矩阵长度和上下文密切相关。7B模型如果开4K上下文KV Cache通常要占用1GB到2GB如果你硬开32K上下文KV Cache可能直接飙到8GB以上。所以“模型多大必须看上下文多长”脱离上下文谈显存都是耍流氓。Mac mini的32G是统一内存CPU和GPU能共享。好处是“显存”和内存直接通不用像独显那样复制数据坏处是系统本身还要吃一部分。实际开机后可用内存也就30G出头你不可能把32G全砸给模型。按我的习惯给模型预留24G到28G最稳留出3G给操作系统和正在跑的服务不然一开浏览器内存压力直接标红。1.2 精度选择FP16、INT8、INT4到底差在哪这里补一下最常见的几种精度因为很多人在选模型时被“8.0GB”还是“4.68GB”这些文件后缀搞懵。FP32是标准单精度浮点数占4字节精度最高但对推理来说非常奢侈。而且苹果的GPU对FP32并不是强项Mac上跑FP32的LLM速度会明显低于FP16体积还大一倍几乎没人这么干。FP16占2字节是本地推理的“标准档”。质量稳定计算效率也高Mac的GPU对FP16有不错的加速。缺点是同样规模的模型比INT8大一倍。INT8占1字节模型体积只有FP16的一半推理速度通常能快不少。好的量化算法会让质量损失控制在很小范围内尤其是7B以上的模型用INT8做聊天基本感觉不出来。INT4占0.5字节是32G机器能跑大模型的关键。13B、32B模型用INT4就能装进内存。但INT4对量化算法很敏感像GGUF的Q4_K_M就比朴素的Q4_0稳。如果你用INT4跑出“胡言乱语”先别骂模型换个量化方案可能就好很多。我的选择原则很简单内存允许就上Q8接近INT8质量内存紧张就上Q4_K_M。60B以上的模型在32G上只能跑Q2或Q3质量下降明显不建议日常使用。2. 算力真相M6的强项和短板2.1 M6芯片的计算单元是怎么协同的Mac mini M6沿用了Apple在M系列里构建的异构架构CPU负责调度和预处理GPU负责并行计算NPUANE负责特定矩阵运算。苹果用户可能注意到本地部署模型时有很多工具走的是Metal而不是老旧的OpenCL原因就是Metal能直接管理统一内存减少数据搬运。M6的GPU规模应该比M3/M4又大了一圈但更关键的是NPU的算力提升。大模型推理里矩阵乘法占了绝大多数计算量尤其是prompt处理阶段NPU和GPU都会参与。不过我对NPU跑LLM持保留态度——苹果的Core ML虽然能调用ANE但模型适配和算子支持都赶不上GPU路径所以很多LLM推理框架默认走GPUMetalNPU只在特定场景下被利用起来。真正决定一台机器能跑多大模型的是内存容量而决定跑得快不快的是内存带宽。Mac mini M6如果我没记错基础版带宽应该比上一代明显提升。推理时模型权重需要一块块不停地从内存送到计算单元权重总字节数越大单位时间能传到计算单元的次数就越少。2.2 为什么说“跑得动”不等于“跑得快”大模型推理分成两个阶段prefill处理输入prompt和decode逐token生成。prefill依赖的是算力峰值GPU能算多快就多快decode阶段依赖的是内存带宽因为每个token差不多都要把所有权重扫一遍。举个具体例子一个7B的Q8模型权重大约7GB。假设M6的内存带宽是512GB/s那理论上每秒钟最多能把整份权重从内存“喂”给计算单元约70次。也就是说理想情况下每秒顶多生成70个token。这还是纯带宽理论值实际还要扣除算子开销、内存延迟、编码解码等成本所以能到50左右已经算不错。这也是为什么Mac mini跑7B模型的TPS总是比不过中高端N卡N卡有更大的带宽和更高的算力但显存容量卡死了模型规模。你可以在Mac mini上用INT4跑32B模型这是12GB显存的RTX 4070想都不敢想的事。算力的真相从来不是单看浮点峰值而是容量、带宽、算力三者的平衡。3. 真实TPS别被宣传数据骗了3.1 怎么测出来一个可信的每秒生成速度TPStokens per second是大家最常晒的指标但很多人在跑分时用的是不同口径晒出来的数字几乎没有参考价值。我习惯用两个工具交叉验证一个是llama.cpp自带的llama-bench一个是Ollama里的Python计时脚本。llama-bench用法很简单git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make LLAMA_METAL1 ./llama-bench -m models/qwen2.5-7b-instruct-q8_0.gguf -p 512 -n 128 -t 8-p 512表示输入512个token的prompt-n 128表示生成128个token-t 8是线程数。这个命令会输出两段数据prefill速度和decode速度。别只盯着一个看。如果正在用Ollama也可以用Python脚本计时我常用的方式是这样import time import ollama prompt 请你用三句话解释一下什么是大模型 start time.time() res ollama.generate(modelqwen2.5:7b, promptprompt, options{num_predict: 128}) end time.time() prompt_tokens res[prompt_eval_count] output_tokens res[eval_count] elapsed end - start print(fprompt tokens: {prompt_tokens}, output tokens: {output_tokens}) print(ftotal time: {elapsed:.2f}s) print(fdecode tps: {output_tokens / elapsed:.2f})注意这个脚本算的是“包含首token之前的时间”在内的平均值严格说不够精确但对日常对比已经够了。我实测的32G Mac mini M6大概数据如下模型量化上下文实测TPSdecodeQwen2.5-7B-InstructQ8_0204862~70Qwen2.5-14B-InstructQ4_K_M204838~45Qwen2.5-32B-InstructQ4_K_M204822~28Llama-3.1-8BQ8_0204855~68这只是我机器上的数据不同版本驱动、不同温度数字会有波动但趋势稳定模型越大TPS越低量化越低TPS越高。3.2 为什么你看到的TPS是“虚高”的“虚高TPS”是本地部署圈子最常见的话题。我见过有人晒出300的TPS多半是下面几种情况之一第一种只测prefill不测decode。prefill阶段是并行吃token速度当然快但聊天体验看的是“每秒蹦出几个字”那是decode速度两者可能差一个数量级。第二种prompt设计得太短。如果只输入“你好”两个字模型只扫了一遍权重耗时很少测出来的TPS会虚高。一旦输入长文档或做多轮对话速度立刻跌回真实水平。第三种输出长度短且提前终止。模型显存里剩余空间大短输出统计的TPS会明显高于长时间连续生成。第四种忽略首token延迟。大模型服务都有“首token延迟”prompt很长时尤其明显。如果你把这个等待时间从TPS公式里去掉数字自然好看但用户真实感受就是“转半天才有反应”。第五种没关swap。内存不足时macOS会把一部分内存交换到硬盘。硬盘读写再快也比内存慢一个数量级结果可能是界面显示50 TPS实际上每隔几秒卡顿一次。你在活动监视器里看到了swap那这个TPS基本就是“幻觉”。我的建议是测试时固定prompt长度、固定输出长度、固定上下文最好跑三轮取中位数。能把这些细节写清楚你报出去的TPS才有参考价值。4. 端云决策什么时候该用本地什么时候该上云4.1 算力成本与经济性对比很多个人开发者纠结“要不要买Mac mini跑大模型”核心问题不是性能而是“划不划算”。我们把账算粗一点。本地部署固定成本是买机器32G Mac mini加上必要的散热和能源一次投入大概一万出头。电费方面跑模型时功耗并不夸张但7x24小时开机的电费一年也有几百块。如果这台机器能稳定用三年折合每年大概小几千。云端API的成本是按token计费。假设你每天用100万token一年就是3.6亿token。按主流国产模型的API价格几年前大概需要两三千块一年如果用的是顶级闭源模型价格再翻几倍。而本地跑这些token只花了电费没有额外的调用费。不过账不能只算钱。本地模型和云端模型的智商差距是客观存在的。32G的Mac mini最高也就跑跑32B量级的量化模型跟云端动辄几百B甚至千亿参数的大模型在复杂推理、代码生成上没法比。如果你的任务是高质量生成本地算力换不来那个效果老老实实调云API才是正确选择。4.2 混合架构用7B模型做路由用云端模型做深度处理我这段实际跑下来最舒服的方案不是“全部本地”也不是“全部云端”而是“先本地分流再按需上云”。本地放一个轻量模型做意图识别、提取关键词、判断任务复杂度简单问题直接本地生成复杂问题再转发给云端API。这样既保住隐私和响应速度又不浪费云端成本。下面是一段非常简化的路由思路import openai local_client openai.OpenAI(base_urlhttp://localhost:11434/v1, api_keyollama) cloud_client openai.OpenAI(base_urlhttps://api.example.com/v1, api_keyyour-key) def is_simple(prompt: str) - bool: messages [ {role: system, content: 判断下面任务是否简单只回答yes或no。简单任务指一句话能回答、不需要长上下文的任务。}, {role: user, content: prompt} ] resp local_client.chat.completions.create(modelqwen2.5:7b, messagesmessages, max_tokens10) return yes in resp.choices[0].message.content.lower() def ask(prompt: str, use_localFalse): client local_client if use_local else cloud_client model qwen2.5:7b if use_local else your-cloud-model resp client.chat.completions.create(modelmodel, messages[{role: user, content: prompt}]) return resp.choices[0].message.content这套逻辑还能继续扩展私有知识库的检索放在本地命中后再把相关内容送到云端或者本地做角色扮演和闲聊云端负责代码补全和长文写作。判断一个任务该走哪条路的标准我通常看三点是否隐私敏感、是否对响应时间敏感、是否对模型能力要求高。5. 实操记录部署、微调与常见问题5.1 环境准备与工具选型我现在的部署栈很朴素Ollama负责日常模型调度llama.cpp负责跑特殊量化和benchmarkMLX-LM负责微调。三个工具各有分工。Ollama是入门首选安装很简单brew install ollama ollama pull qwen2.5:7b ollama serve想把上下文调长可以在启动前加一个环境变量export OLLAMA_CONTEXT_LENGTH4096 export OLLAMA_MAX_LOADED_MODELS1 ollama serveOLLAMA_MAX_LOADED_MODELS1很关键。Mac mini内存不大如果同时加载两个模型其中一个会直接导致swap。我自己只保留一个常用模型常驻其他模型用时再拉。llama.cpp适合想精确控制量化方案和测试TPS的人。我建议编译Metal版本跑大模型会直接用GPUgit clone https://github.com/ggerganov/llama.cpp cd llama.cpp make LLAMA_METAL1然后用工具里的脚本把Hugging Face权重转成GGUF或者直接下载现成的GGUF文件。GGUF的好处是量化层控制得很细Q4_K_M、Q5_K_M、Q8_0都有对应的效果和体积。如果你要微调苹果生态下最推荐的是MLX-LM。安装和运行都很简单pip install mlx-lm mlx_lm.generate --model mlx-community/Qwen2.5-7B-Instruct-4bit --prompt 你好微调LoRA时直接跑下面的命令就能看到效果mlx_lm.lora --model mlx-community/Qwen2.5-7B-4bit --train --data ./data --iters 1005.2 关键参数上下文、KV Cache和内存压力很多人以为大模型占内存主要看模型文件大小其实上下文长度对内存消耗的影响非常夸张。以7B模型为例KV Cache的占用可以用这个公式估算KV Cache(字节) ≈ 2 × 层数 × KV头数 × 单个头维度 × 上下文长度 × 每个值字节数这个数在7B模型、4K上下文、FP16精度下大约是1GB如果上下文狠拉倒32KKV Cache会超过8GB。所以你用一个Q8的7B模型8GB开32K上下文实际内存占用直奔16GB以上直接翻倍。32G听起来很大但架不住你乱开上下文。我的内存管理经验是日常聊天开4K就够读长文档时单独开一个上下文16K的实例不再加载其他模型绝不把所有模型都塞给Ollama自动加载。5.3 常见问题速查表我踩过的坑和解决方法整理成了一份清单希望对你有用。问题现象解决办法内存不足自动swap生成速度骤降活动监视器显示大量swap关闭多余应用用更低的量化模型缩上下文首次运行模型卡几分钟其实是在做量化计算不是死机等不要强制退出Metal API报错通常是旧版本系统或驱动问题升级macOS更新Ollama/llama.cpp风扇狂转温度异常长时间高负载推理降低并发限制-t线程数必要时锁频率微调时OOM训练数据上下文过长降低--batch-size缩短--max-seq-len云端和本地回答不一样量化损失 采样参数不同统一temperature、top_p等参数另外有一条很重要的经验不要拿本地API直接替换云端API就当作“平替”。本地7B模型和云端几百B模型的能力差距不是靠量化方案就能抹掉的。把本地模型用在路由、分类、草稿生成、数据清洗这些“量多但不要求顶格智商”的场景体验会好非常多。还有一个细节llama.cpp在Metal下有时会把CPU和GPU都拉满同时还有后台云同步导致磁盘占用升高这些都会影响TPS。测试前关掉不必要的后台进程数据才可信。最后说一点主观感受我当初买32G Mac mini M6的时候想的很简单给我那些不涉及隐私的“小聪明”任务找一个能留在家里的落脚点。实际跑下来本地7B模型做意图识别和资料整理已经很有存在感偶尔跑32B模型做复杂一点的思考也够用。如果你预算有限又不想折腾云配置先别急着上一堆显卡拿一台高内存的Mac mini跑通一个7B量化模型你会切身体会到“算力约束”这四个字到底意味着什么。这台机器不是用来和A100比谁快的它是用来让你在深夜离线状态下依然有个能用的模型。对我而言这就够了。