1. 为什么要在 Mac 上折腾本地生图先把结论摆在最前面在 Mac 上跑本地生图目前最现实的路径就是基于 Stable Diffusion 系列模型配合 Apple Silicon 的 MPS 加速用 10GB 左右统一内存换一张 512×512 到 768×768 的图单张耗时大概在两到三分钟这个量级。标题里说的“182 秒一张、10GB 内存”我实测下来基本吻合甚至在某些调度参数下还会更慢一点。这不是什么黑科技就是把开源模型塞进本地显卡准确说是统一内存里硬跑。那为什么还要折腾因为本地生图解决的是三个很实际的问题。第一是隐私你输入的提示词、参考图、生成结果全程不出本机对于做产品概念图、内部素材、个人创作的人来说这一点比速度重要得多。第二是可控云端服务你只能调它给你的参数本地你可以换模型、换 LoRA、改采样器、接 ControlNet想怎么捏就怎么捏。第三是成本云端按张计费或者按月订阅本地跑一次电费几分钱跑得越多越划算。但这里必须先把“不能商用”这件事说清楚这也是标题里最容易被忽略、却最要命的一点。很多开源模型和权重尤其是社区微调版本其许可证明确限制商业用途或者要求你遵守特定的使用条款。你在本地生成一张图自己看看、做做练习、搞搞个人项目没问题但一旦拿去卖钱、放进商业产品、用于客户交付就可能踩线。所以这篇内容适合谁适合想在 Mac 上搭一套本地生图环境、用于学习研究和个人创作的人不适合想拿它直接做商业变现、又不愿意研究许可证的人。我自己的机器是一台 M 系列芯片、16GB 统一内存的 MacBook跑下来内存占用峰值在 9 到 11GB 之间浮动系统会明显变卡风扇会转但不会崩。如果你只有 8GB 内存我建议直接放弃或者只跑最精简的模型加低分辨率体验会很差。下面我把整套思路、参数、踩过的坑按我实际操作的顺序拆开讲。2. 整体方案设计与选型思路2.1 为什么是 MPS 而不是 CPU 或 CUDAMac 上没有 NVIDIA 显卡所以 CUDA 这条路直接堵死。剩下的选择只有两个CPU 推理和 Apple 的 MPSMetal Performance Shaders后端。CPU 推理能跑但慢到离谱一张 512×512 的图可能要十几分钟甚至更久完全没有实用价值。MPS 则是苹果给自家芯片提供的图形与计算加速框架PyTorch 从 1.12 版本开始正式支持 MPS 后端这才让 Mac 本地生图变得可行。选 MPS 的核心逻辑是它能把模型计算卸载到 Apple Silicon 的 GPU 核心上同时利用统一内存架构让 CPU 和 GPU 共享同一块内存省去了数据在显存和内存之间来回拷贝的开销。这也是为什么 Mac 能用“统一内存”这个相对小的数字跑动模型——它不像独立显卡那样有固定的显存上限而是动态借用系统内存。代价就是一旦占用过高整个系统都会跟着卡。2.2 为什么内存是 10GB 这个量级很多人以为模型文件多大运行时就占多大内存其实不是。以 Stable Diffusion 1.5 为例模型权重文件大概 4GB 左右fp16 精度但推理过程中还需要额外的内存来存放中间激活值、注意力矩阵、VAE 解码器的特征图等等。这些加起来在 512×512 分辨率下峰值内存占用就会到 8 到 10GB。如果你把分辨率提到 768×768或者用 SDXL 这类更大的模型内存需求会直接翻倍甚至更多。所以“10GB 内存”不是一个随便说的数字它是 512×512 分辨率、SD1.5 级别模型、fp16 精度下的一个典型峰值。你可以通过降低分辨率、使用更小的模型、开启注意力切片attention slicing等方式把峰值压下来但画质和速度都会受影响。这就是一个典型的三角权衡速度、画质、内存你只能同时满足两个。2.3 为什么单张要 182 秒182 秒这个数字拆开来看大概是这样的模型加载如果没常驻内存几十秒文本编码几秒然后是核心的去噪采样过程20 到 30 步的采样每步都要跑一遍 U-Net最后 VAE 解码几秒。M 系列芯片的 GPU 算力相比桌面级独显还是有差距尤其是在 fp32 和某些算子上的优化不够成熟所以单步耗时偏高。我实测过不同采样步数的影响20 步大概 150 秒左右30 步接近 200 秒50 步就要 300 秒以上了。所以 182 秒基本对应 25 到 30 步的配置。想提速最直接的办法就是减少步数但步数太低画质会崩其次是换更快的采样器比如 DPM 2M 系列通常比 Euler 系列收敛更快再就是降低分辨率。这三招我都试过后面会细说。3. 环境搭建与核心配置实操3.1 基础环境准备我假设你已经有一台 M 系列芯片的 Mac系统版本不要太老macOS 12 以上比较稳妥。第一步是装 Python 环境。我强烈建议用 conda 或者 miniforge 来管理不要直接用系统自带的 Python否则后面依赖冲突会让你怀疑人生。# 安装 miniforgeApple Silicon 原生版本 brew install miniforge # 创建独立环境指定 Python 3.10 conda create -n sd-mac python3.10 conda activate sd-mac这里为什么选 Python 3.10因为 PyTorch 对 3.10 的支持最成熟3.11 和 3.12 在某些版本上会有兼容性问题尤其是和 diffusers、transformers 这些库搭配时。我踩过一次坑用 3.12 装完跑起来报了一堆算子不支持换回 3.10 立刻正常。接下来装 PyTorch。注意一定要装支持 MPS 的版本官方从 1.12 开始就默认带了但你要确认安装命令里没有指定 CPU-only 的源。pip install torch torchvision torchaudio装完之后验证一下 MPS 是否可用import torch print(torch.backends.mps.is_available()) # 应该输出 True print(torch.backends.mps.is_built()) # 应该输出 True如果这里输出 False大概率是 PyTorch 版本不对或者系统版本太老。这一步不过后面全白搭。3.2 生图框架的选择Mac 上跑本地生图主流有三条路直接用 diffusers 库写脚本、用 Automatic1111 的 WebUI、用 ComfyUI。我三个都试过说说各自的取舍。diffusers 最轻量适合你想深度定制、写自己的流程但需要一定的 Python 基础没有现成界面。Automatic1111 的 WebUI 功能最全插件生态最丰富但在 Mac 上配置起来最折腾而且对 MPS 的支持时好时坏有时候一个版本能用升级一下就崩了。ComfyUI 是节点式工作流灵活度极高对 MPS 的支持相对友好内存管理也做得不错我现在主力用的就是它。如果你只是想快速跑起来看看效果我建议先用 diffusers 写个最小脚本确认整条链路通了再考虑上界面。下面是一个最小可运行的例子from diffusers import StableDiffusionPipeline import torch pipe StableDiffusionPipeline.from_pretrained( runwayml/stable-diffusion-v1-5, torch_dtypetorch.float16 ) pipe pipe.to(mps) # 关键开启注意力切片降低内存峰值 pipe.enable_attention_slicing() prompt a cat sitting on a windowsill, soft light, detailed image pipe(prompt, num_inference_steps25, guidance_scale7.5).images[0] image.save(output.png)这段代码里有两个关键点。第一是torch_dtypetorch.float16用半精度能省将近一半内存画质损失很小。第二是enable_attention_slicing()它把注意力计算切成小块来做峰值内存能降下来不少代价是速度慢一点点。这两个设置是我在 16GB 机器上能稳定跑起来的关键。3.3 模型下载与存放模型文件建议单独放一个目录不要塞在项目里方便管理和切换。SD1.5 的 fp16 版本大概 2GB 多SDXL 的 base 加 refiner 加起来要 10GB 以上对内存的压力完全不是一个量级。我建议先从 SD1.5 开始跑通了再考虑更大的。下载模型的时候注意有些社区版本会打包成.safetensors格式这个格式比老的.ckpt更安全加载时不会执行任意代码优先选这种。下载完记得核对一下文件大小和哈希值我遇到过一次下载中断导致模型损坏加载时报了一堆莫名其妙的错排查了半天才发现是文件不完整。4. 参数调优与性能实测4.1 分辨率、步数、采样器的三角关系这三个参数是影响速度和画质最直接的。我做了几组对照测试机器是 16GB 统一内存的 M 系列芯片模型用 SD1.5 fp16开启注意力切片。分辨率步数采样器单张耗时内存峰值画质评价512×51220Euler a约 145 秒约 8.5GB可用细节一般512×51230DPM 2M约 182 秒约 9.5GB较好推荐768×76825DPM 2M约 310 秒约 13GB好但内存吃紧512×51250Euler约 290 秒约 9.8GB提升有限不划算从这张表能看出来182 秒对应的是 512×512、30 步、DPM 2M 这个组合也是我个人最推荐的平衡点。分辨率提到 768 之后耗时和内存都大幅上升16GB 机器会开始明显卡顿8GB 机器直接别想。采样器的选择也有讲究。Euler a 速度快但随机性强适合探索DPM 2M 收敛稳定适合出成品DDIM 步数少的时候画质下降明显。我一般先用 Euler a 低步数快速试提示词找到方向后再用 DPM 2M 高步数出图。4.2 提示词与引导系数的实操心得guidance_scale 这个参数控制模型多大程度上听从你的提示词。太低比如 3 以下画面自由发挥可能偏离主题太高比如 15 以上画面会变得僵硬、过饱和、出现伪影。7 到 8 是大多数情况下的甜区我一般用 7.5。提示词的写法上我总结了一个简单的结构主体 环境 风格 质量词。比如“a cat sitting on a windowsill, soft morning light, photorealistic, highly detailed”。不要堆砌太多互相矛盾的词模型会无所适从。另外负面提示词很有用把“blurry, low quality, deformed, extra fingers”这类常见问题写进去能明显减少废图率。还有一个容易被忽略的点随机种子。固定种子可以复现同一张图方便你微调提示词看变化。我习惯先随机跑几张找感觉锁定一张构图不错的记下种子再在这个基础上改提示词。4.3 内存不够时的降级策略如果你只有 8GB 内存或者跑大模型时爆内存可以按下面的顺序逐级降级开启注意力切片enable_attention_slicing这是最有效的。把分辨率降到 512×512 甚至 448×448。用 fp16 而不是 fp32。换更小的模型比如 SD1.5 而不是 SDXL。开启顺序 CPU 卸载enable_sequential_cpu_offload但这会大幅拖慢速度。我试过在 8GB 机器上跑 SD1.5开启切片加 512 分辨率勉强能跑但系统卡到几乎没法干别的单张要三四分钟。所以我的建议很直接8GB 内存就别折腾本地生图了体验太差。5. 常见问题与排查实录5.1 报错与异常速查现象可能原因解决办法MPS 不可用PyTorch 版本不对或系统太老升级 PyTorch 和 macOS跑到一半崩溃内存不足开切片、降分辨率、换小模型出图全黑或全灰VAE 精度问题用 fp32 跑 VAE 或换 VAE 版本速度异常慢没走 MPS跑在 CPU 上检查pipe.to(mps)是否生效模型加载报错文件损坏或不完整重新下载并核对哈希画面出现重复纹理步数太低或采样器不合适提高步数或换 DPM 2M5.2 几个我踩过的坑第一个坑是 VAE 精度。SD1.5 自带的 VAE 在 fp16 下有时候会出问题生成纯黑或者噪点图。解决办法是把 VAE 单独用 fp32 加载或者换一个社区修复版的 VAE。这个坑很隐蔽因为模型本身能跑只是出图不对新手很容易以为是提示词的问题。第二个坑是内存泄漏。长时间连续生图内存占用会慢慢涨上去最后爆掉。我的做法是每跑十几张就重启一次进程或者用脚本定期清理缓存。ComfyUI 在这方面做得比 WebUI 好一些它会主动释放不用的张量。第三个坑是模型切换。从一个模型切到另一个模型时如果不彻底释放旧模型的内存很容易叠加占用导致崩溃。我的习惯是切换模型前先del pipe再gc.collect()虽然麻烦但稳。提示本地生图对系统资源的占用是实打实的跑图的时候别同时开太多重型应用尤其是浏览器开一堆标签页内存会被抢得很厉害。5.3 关于“不能商用”的实操建议这一点我要单独强调。很多人在本地跑出图之后第一反应是能不能拿去用。我的建议是先查你用的模型和权重的许可证。SD1.5 的官方权重是 CreativeML Open RAIL-M 许可证它对商用有一些限制条款要求你遵守使用限制。社区微调的模型许可证各不相同有的允许商用有的明确禁止有的要求署名。如果你确实有商用需求稳妥的做法是只用明确标注允许商用的模型保留生成记录和许可证副本必要时咨询专业人士。不要想当然地认为“本地生成的就没问题”许可证约束的是模型的使用不是生成行为发生的地点。这一点我在做个人项目时一直很谨慎宁可多花时间确认也不给自己留隐患。6. 后续可以怎么扩展跑通基础流程之后能玩的东西还有很多。ControlNet 可以让你用线稿、深度图、姿态图来控制构图这对做设计的人来说非常实用。LoRA 可以用少量图片微调出特定风格或角色社区里有大量现成的 LoRA 可以直接用。图生图、局部重绘、放大修复这些功能也都能在本地实现。不过每加一个功能内存和时间的开销都会上去。我的建议是先把基础文生图跑稳再一个一个加每次加完都测一下内存峰值和耗时心里有数。Mac 本地生图这条路速度上确实比不过独显机器但它的隐私性、可控性和零边际成本对特定人群来说价值很大。我自己用下来最舒服的场景是晚上让它慢慢跑一批图第二天早上来挑完全不占用白天的工作时间。最后分享一个小技巧把常用的提示词、参数、种子整理成一个表格或者配置文件每次生图直接调用比每次手敲效率高得多。我现在的做法是维护一个 CSV记录每次出图的完整参数和结果评价积累下来就是自己的一个小型素材库回头找图或者复现效果都很方便。