GTX 1060 6GB跑Qwen3.6-35B-A3B 100K 大模型内存优化方案

21GB MoE 模型在 32GB 系统上流畅跑 100K 上下文

在这里插入图片描述

硬件环境

项目 配置
CPU Intel i7-8750H (6核12线程, 2.20GHz)
GPU NVIDIA GTX 1060 (6GB VRAM)
内存 32GB DDR4 2667
C 盘 512GB NVMe SSD (系统盘)
D 盘 1.36TB (模型 + KV 缓存 + 页面文件)
E 盘 慢速盘 (已弃用)

模型信息

  • 模型: Qwen3.6-35B-A3B-Uncensored (MoE)
  • 量化: Q4_K_M
  • 文件大小: 21.17 GB
  • mmproj: 多模态投影文件 (899 MB)
  • 架构特点: Mixture of Experts,每次推理只激活 ~3B/35B 参数

优化目标

在 32GB 物理内存的系统上,流畅运行 21GB 的 MoE 大模型,上下文窗口达到 200K tokens。


核心优化思路

1. 内存分层管理

21GB 模型加载
    │
    ├── ~3-5GB 物理内存 🔥     ← 频繁访问的共享层 + 常用专家
    │
    └── ~16-18GB 页面文件 💾   ← 冷门专家,被 OS 自动换出
    
KV 缓存 (200K 上下文 @ q4_0 ≈ 12GB)
    │
    ├── 物理内存: 0 🚫         ← --cache-ram 0
    │
    └── D:\...\slots 💾        ← --slot-save-path 直接写入磁盘

2. 关键参数详解

--no-mmap (非内存映射加载)
  • 将整个 21GB 模型加载到虚拟地址空间
  • 由操作系统自动管理物理内存和页面文件之间的换入换出
  • 优点:经常访问的页面始终在物理内存中,推理速度稳定
  • 缺点:首次加载需要分配全部虚拟内存
--n-cpu-moe 999 (MoE 专家全走 CPU)
  • 注意力层等稠密层 → GPU (GTX 1060, 6GB 足够)
  • 专家权重 → CPU 计算
  • 原因:MoE 模型的专家参数占 16GB+,GPU 装不下
  • 配合 --no-mmap,专家权重由 OS 管理在物理内存和页面文件之间
--cache-ram 0 (KV 缓存不走物理内存)
  • KV 缓存直接写入磁盘,不占用物理内存
  • 通过 --slot-save-path 指定磁盘路径
  • 配合 --flash-attn 减少每次推理需要读取的 KV 数据量
--cache-type-k/v q4_0 (KV 缓存量化)
  • 将 KV 缓存从 fp16 压缩到 4-bit
  • 内存占用减少 4 倍
  • 200K 上下文从 ~50GB 降到 ~12GB
--n-gpu-layers 999 (最大 GPU 卸载)
  • 所有支持 GPU 的层都卸载到 GPU
  • 结合 --n-cpu-moe,GPU 只处理稠密层

3. 页面文件配置

页面文件(虚拟内存)是 --no-mmap 方案的关键:

❌ 错误配置:
   C:\pagefile.sys    2 GB  ← 太小,不够用
   E:\pagefile.sys   64 GB  ← 最慢盘,严重拖后腿

✅ 优化配置:
   C:\pagefile.sys    2 GB  ← 系统保留
   D:\pagefile.sys   24 GB  ← 和模型同盘,速度最快
   E:\pagefile.sys    删除  ← 慢盘不用

为什么 D 盘最好?

  • 模型文件在 D 盘
  • KV 缓存也在 D 盘
  • 页面文件放在 D 盘 = 所有大文件操作在同一块盘上,减少跨盘寻道

4. 完整启动脚本在这里插入图片描述

@echo off
chcp 65001 > nul
title Qwen3.6-35B-A3B @ 200K 极速响应版

set SERVER=D:\Llama Server\llama.cpp\bin\llama-server.exe
set MODEL=D:\Llama Server\llama.cpp\models\Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf
set MMPROJ=D:\Llama Server\llama.cpp\models\mmproj-Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-f16.gguf
set SLOTS=D:\Llama Server\llama.cpp\slots

"%SERVER%" ^
 -m "%MODEL%" ^
 --mmproj "%MMPROJ%" ^
 --host 127.0.0.1 --port 8080 ^
 --n-gpu-layers 999   ^
 --n-cpu-moe 999      ^
 --no-mmap            ^
 --no-warmup          ^
 -t 8                 ^
 --ctx-size 200000    ^
 -np 2                ^
 --batch-size 512     ^
 --ubatch-size 256    ^
 --cache-type-k q4_0  ^
 --cache-type-v q4_0  ^
 --cache-ram 0        ^
 --slot-save-path "%SLOTS%" ^
 --rope-scale 2.5     ^
 --flash-attn auto    ^
 --temp 0.30 --top-k 60 --top-p 0.80 --min-p 0.15 --repeat-penalty 1.12 ^
 --repeat-last-n 256  ^
 --alias "Qwen3.6-35B-Uncensored" ^
 --timeout 1800       ^
 --ui

pause

5. 性能预期

指标
模型物理内存 ~3-5 GB
KV 缓存物理内存 0 GB (全走磁盘)
页面前换出 ~16-18 GB (D 盘)
GPU VRAM 占用 ~2 GB (仅稠密层)
上下文长度 200,000 tokens
每秒生成速度 取决于 CPU MoE 性能

6. 优化历程总结

关键发现

  1. MoE 模型天然省内存:每次只激活 ~3B/35B 参数,大部分专家权重可以换出到页面文件
  2. --no-mmap + 页面文件:比传统 mmap 占用更多物理内存,但推理更稳定(无缺页中断抖动)
  3. mmap 方案:物理内存占用低 (~6-7GB),但偶有 page fault 导致推理瞬断
  4. KV 缓存走磁盘--cache-ram 0 + q4_0 量化 + flash-attn,200K 上下文完全无物理内存压力
  5. 页面文件位置关键:一定要和模型放同一个最快盘,否则跨盘 I/O 严重拖慢推理

避坑指南

  • --no-mmap + 页面文件在慢盘 = 灾难性性能
  • --cache-ram 设太大 = 没必要占物理内存(反正 KV 缓存走磁盘是可行的)
  • --n-cpu-moe 999 不配合 --no-mmap = mmap 下 CPU 频繁缺页中断
  • --no-mmap + 同盘页面文件 + 磁盘 KV 缓存 = 最佳平衡

2026-06-24 | 记录

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐