自从购买了 4070 Ti Super 之后 AI 机就处于长期启动的状态。但是仔细思考平时的使用情况,实际上不是24小时不间断需要AI辅助。根据父亲对他自己的电脑的测量,待机状态下都会有30多瓦的功耗,这是不必要的。于是在参考Wiki、结合之前在windows上的 wake-on-lan 的经验,我决定在 AI 机上做一个 autosuspend,同时也要有办法在请求来的时候唤醒并处理。
具体分成两部分:AI 机在没有活跃请求连接ollama端口的时候等待5分钟,然后睡眠;网关机如果发现 AI 机昏迷了导致 502 错误,就会执行 wol 来唤醒。
autosuspend
自动昏迷采用的是 Autosuspend,Arch Linux用 AUR 安装即可。安装完成之后修改 /etc/autosuspend.conf
:
- idle_time 设置为 300(5分钟);
- 下面一大堆预设的 check 全部注释,我们只使用 ActiveConnection:
1
2
3
4
[check.AI]
class = ActiveConnection
enabled = true
ports = 11434
如果有需要把22端口也加上防止ssh连接时意外昏迷。然后 systemctl enable --now autosuspend
启动服务即可。
wake-on-lan
这部分有点复杂,因为 AI 机的板载网卡是 r8125,会有几个问题:
- windows的驱动会在关机时禁用wake-on-lan,影响其他系统使用这个功能;这个可以通过在 UEFI 里面打开 PXE (一般在Network Stack里面)来让 UEFI 无视windows驱动的设置
- Arch Linux 的内核用 r8169 模块来驱动 r8125,但是会导致 wake-on-lan 无法工作,需要从 AUR 安装 r8125-dkms,并且屏蔽 r8169 的加载。具体参考 Arch Wiki。
另外 ethool 设置 Wake-On 的时候不能只设置 g,要加多一个 u 才行,不然很容易睡死。也就是要这样:
1
ethtool -s netwan0 wol ug
发出 wake-on-lan 包的工具是 wol,pacman安装一下就可以。发生 502 错误时执行这个工具唤醒 AI 机的方法是用 caddy,需要额外编译 exec 模块 caddy-exec。在编译了包含这个模块的 caddy 之后,修改原来的 reverse proxy 配置成类似这样的:
reverse_proxy http://10.0.0.253:11434
handle_errors 502 {
exec wol -i 10.0.0.253 AI机的网卡MAC -p 9 {
pass_thru
}
reverse_proxy http://10.0.0.253:11434
}
如此一来就完成了拯救地球、节约能源的大业了!可惜这种配置只有在请求会经过网关机的情况下才能唤醒,直接连接 11434 是不会唤醒的。