时间轴·墙

6G显存跑Qwen 35B · September 17, 2026

第一个优化:先跑起来

最初配置的是 ` llama server –ngl 20`,Qwen 3.6 35B A3B 总共有 40 层,而 -ngl 20 表示其中20层放到GPU上,其它放到CPU,此时推理速度只有 3 tokens/s。为什么这么慢?对于 MoE Qwen 3.6 35B A3B 模型来说,在生成每个token的时候,256 专家只有8个激活,也就是说大部分专家虽然在GPU中,但没有用到,GTX 1060 GPU 没有好好利用,这就是速度慢的原因。

优化方法就是将注意力层尽量放到GPU运算,而FFN 中的专家放到CPU中运算,在 llama.cpp 中输入 ` llama server –ngl 999 --n-cpu-moe 41 `,表示将专家的运算放到CPU中,这时候速度提升到 10 tokens/s。

继续优化

lama.cpp 默认会启用内存映射,也就是专家参数默认不会加载到内存,只有激活的时候才会映射到内存,这时候就要读取磁盘了,速度就慢了,所以 ` llama server --no-mmap ` 可以让专家参数全部加载到内存,不用来回读取磁盘,优化后速度提升到 13.5 tokens/s。

调整参数

--n-cpu-moe 参数值 41,发现 6GB的显存还有空余,所以调整为 35,让部分专家在 GPU 中运行,速度来到了 17 tokens/s,缺点就是如果你的上下文太长,比如超过 64K token,GPU 显存就不够了,那如何优化呢?

KV Cache 可以采用 Google 的 Turbo Quant 量化技术,在未优化之前,KV Cache 采用Q8 量化,而 Turbo Quant 量化,Key 是4bit,Value 是3bit,显存占用减少了,但品质和Q8量化差不多,在 llama.cpp 中输入 ` llama server --cache-type-k q4_0 --cache-type-v q3_0 ` 完成优化,虽然没有提升推理速度,但支持的最大上下文从 64K token 提高到 256K token。

最终优化:避免被放到虚拟内存

当 llama 运行一段时间后,虽然 MoE 专家都已经加载到内存中了,但内核把它们当作普通程序,在系统内存不足的时候,还是会交换到磁盘中,导致运行速度变慢,而解决方案就是锁住内存,直接在llama.cpp 中输入 `llama server --mlock` 就可以了。

更新flutter出现的问题 · May 21, 2019

手贱把Flutter升级到最新版本,然后怎么安装都失败

Flutter初体验 · April 7, 2019

Flutter是Google在2015年推出的移动UI框架,可快速在iOS和Android上构建高质量的原生用户界面。

基于Web的VSCode----Code Server · April 12, 2019

vscode 直接跑到服务器上,然后重点在于,不是传输 x11 转发或者类似的屏幕转发,而是用 web 服务器的形式对外提供服务,而且它还能使用大部分 vscode 的插件,也就是基本上就是把 vscode 整个东西变成了一个 web 项目。不过虽然优点有很多,但是缺陷也是不少的,首先,虽然不在服务端跑图形,但也只能节约带宽,该吃的内存还是一点不会客气的。其次,它的扩展系统实际上是开发者( coder.com)自己建立的,虽然基本是从官方商店同步,但是还是有很多空缺。

一行命令修复grup引导 · April 5, 2019

趁着现在内存和ssd价格都到了一个低估,赶紧又入手一个8G内存条,和一个500G西数蓝盘。

初识LVM · March 29, 2019

Logical Volume Manager (LVM),是一种把硬盘驱动器空间分配成逻辑卷的方法,这样硬盘就不必使用分区而被简易的重划分大小。使用LVM,硬盘驱动器或硬盘驱动器集合就会分配给一个或多个物理卷(physical volumes).物理卷无法跨越一个以上的驱动器。
物理卷被合并成逻辑卷组(logical volume group), 唯一的例外是/boot分区。/boot分区不能位于逻辑卷组,因为引导装载程序无法读取它。如果用户想把/分区放在逻辑卷上,需要创建一个分开的/boot分区,它不属于卷组的一部分。由于物理卷无法跨越一个以上驱动器,如要让逻辑卷组跨越一个以上驱动器,就应该在驱动器上创建一个或多个物理卷。
辑卷组被分成逻辑卷(logical volumes),它们被分配了挂载点/boot和/,以及文件系统类型如(ext3).当“分区“达到了它们的极限,逻辑卷组中的空闲空间就可以被添加给逻辑卷来增加分区的大小。当某个新的硬盘驱动器被添加到系统上,它可以被添加到逻辑卷组中,逻辑卷是可以扩展的分区。

ssh配置文件详解 · September 9, 2018

ssh用户配置文件默认在.ssh/config这个路径, 使用config文件之后, 无需再去记机器ip,密码,各种ssh参数,也不用再每次都敲各种参数或配置

记录一次开发环境从0开始安装ubuntu · August 3, 2018

实在受不了Win10了,最近一段时间一开机,系统自带杀毒程序就占用90%CPU, 而且不知道从哪次升级之后, 自带的杀毒软件就没有界面了, 自然也无法终止扫描.用windows系统尤其是家庭版,真的是花钱去体验被强奸.

用inotify监控文件变化 · June 29, 2018

Linux下用inotify可以监控文件或文件夹的状态变化.

微信支付的那些坑 · November 4, 2014

做过微信公众平台开发的人似乎都一副苦大仇深的样子, 原因何在?
微信挖了太多的坑。

用HTML5实现断点续传、上传进度条、图片预览 【2】 · October 10, 2014

上一篇文章中,已经基本实现了文件上传的所有功能,还遗留了2个问题:一是计算文件hash时一次性读取了文件内容,存在内存限制; 二是只实现了单文件上传

用HTML5实现断点续传、上传进度条、图片预览 · July 23, 2014

利用HTML5中的新的XMLHttpRequest提供了实时上传进度的事件,
再加上File对象和FormData对象就可实现断点续传,
要实现即时预览文件,则需要FileReader对象读取文件绝对地址或内容。

修复 OpenSSL CVE-2014-0160 Heartbleed 漏洞 · April 11, 2014

前几天爆发出来的这个Heartbleed漏洞肆虐互联网,我测了一下自己的网站,居然也中招了!
这个漏洞让攻击者可以从服务器内存中读取64K资料,当网站有人登陆时,攻击者就能看到用户提交的表单,包括账号密码等。。

使用expect和rsync传输文件 · March 27, 2014

最近这个项目部署在4台服务器上,虽然做了负载均衡,但是却没有做rsync服务来同步文件(那帮人水平太菜)。所以每次发布到服务器都要传4次!!!!而且中间还得通过跳板机。

PHP多线程之Worker-Stackable · October 30, 2013

PHP的pthreads扩展的文档几乎等同于没有,估计作者也没怎么用心去做这个事。
研究了一下Thread,Worker,Stackable这几个类的用法,全靠一行行地去试代码。。。。

使用免费证书提供https服务 · September 27, 2013

之前使用burst的vps的时候就已经用startssl提供的证书配置了https服务器。

迁移到buyvm之后,再配置的时候忘了之前是怎么做的了。

一个简单的PHP Route · November 6, 2013

写了一个简单的PHP Route玩玩。

PDO_SQLITE的一个bug · October 21, 2013

吐槽1】namespace真没那么好,不能想其他语言那样,直接use或者import了就行,还是得include/require或者autoload。

代码重构之后,在mysql上运行没有问题,但是要支持sqlite就得做番大改了,mysql中的“`”,在sqlite中得换成单引号“'”, mysql中许多函数在这里也不能用了。。。。

但是,最大的问题是——PDO_SQLITE直接就报错,不管我怎么写dsn。

linux架设防火墙路由器 · October 30, 2013

操作基于ubuntu server10.10 上进行安装配置.进行配置iptables.ip转换.mac过虑功能.
打算以后把树每派做成dhcp服务器/防火墙,先把这个文章保存一下,以后再看

怎样从2000万开房数据中查询 · October 29, 2013

前段时间2000万开房数据在网上闹得沸沸扬扬的,相信很多朋友都找到那些数据并下载下来了。
但是一下下来就傻眼了,大的是7、8G的SQL文件,稍小的也是别人导成CSV格式的也有3、4G之大。普通的文本工具一打开就崩溃,即使不崩溃,电脑内存瞬间吃光也会卡死。
借由这个契机,写了几个PHP小程序去查询,顺便回顾了一下PHP中的多进程和多线程编程。