这篇文章要做的,是把一台已经完成破解的 PS5 当成一台 x86 主机来用:交叉编译一份静态链接的 llama.cpp,把量化好的 GGUF 模型传进主机,在它自带的 Zen 2 CPU 上原生跑推理,最后用 llama-bench 和一段日志脚本量出 prefill / decode 吞吐,并观察持续满载下的温度与稳定性。
做完之后你会得到三个东西:一个能在 PS5 上直接执行的 llama-cli / llama-server 二进制;一份可复现的模型导入流程(U 盘或 FTP 都行);一张属于你自己机器的性能表——包括不同线程数下的 tok/s、上下文长度对内存的占用、以及连续跑十几分钟后的温度与降频表现。
需要提前说明的是:这条路只能走 CPU 后端。破解环境下的用户态没有可用的 GPU 计算驱动,Vulkan / CUDA 都不必考虑,所有算力都来自那 8 个 Zen 2 核心和共享内存。所以期望值要放对位置:它适合跑 7B 级别的 4-bit 量化模型做实验,不适合当生产推理服务。
前置条件清单
开始之前,逐条对一遍,缺哪条都会卡在半路:
- 一台已完成破解、能加载自制 payload 的 PS5。具体哪些固件版本可破、用哪个入口(网页 / 蓝光 / 其他),以社区当前公开的支持情况为准,这里不写死版本号。
- 一个能提供文件传输和命令执行的 payload 组合,常见的是 FTP 服务 + 一个能起 shell 或直接执行 ELF 的加载器。端口和挂载点在 payload 的屏幕输出里会打印,记下来。
- 一台 Linux 宿主机(x86_64),用于交叉编译。原生在 PS5 上编译不现实——没有包管理器,也没有完整工具链。
- 社区维护的 PS5 payload 开发 SDK(含 FreeBSD 系 sysroot 与交叉工具链)。目录结构和 CMake 文件名随 SDK 版本变化,以该项目当前文档为准。
- 一个 GGUF 格式的量化模型,建议先从 3B~8B 的 Q4_K_M 起步。
- 一个 exFAT 格式的 U 盘(可选,FTP 慢的时候很有用)。
- 外置红外测温枪或至少能测出风口温度的温度计。用户态通常读不到 APU 内部传感器,别指望软件读数。
风险提示放这里:破解会影响保修、可能导致主机不可用、联网登录账号存在被封的风险。整个流程建议全程离线,不要登录 PSN。
第一步:准备交叉编译环境
先确认 SDK 能用。解压后找工具链前缀,通常形如 $PS5_SDK/bin/x86_64-*-gcc,再确认 SDK 里有没有现成的 CMake toolchain 文件:
```bash
ls "$PS5_SDK"/bin | head
find "$PS5_SDK" -name '*toolchain*.cmake'
```
把 SDK 路径写进环境变量,后面所有命令都依赖它:
```bash
export PS5_SDK=/opt/ps5-payload-sdk
export PATH="$PS5_SDK/bin:$PATH"
```
如果 SDK 没有提供 toolchain 文件,就自己写一个最小的,关键是 CMAKE_SYSTEM_NAME 和 CMAKE_SYSROOT 两行,让 CMake 走交叉编译分支:
```cmake
ps5-toolchain.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_SYSROOT "$ENV{PS5_SDK}/sysroot")
set(CMAKE_C_COMPILER "$ENV{PS5_SDK}/bin/x86_64-unknown-freebsd13-clang")
set(CMAKE_CXX_COMPILER "$ENV{PS5_SDK}/bin/x86_64-unknown-freebsd13-clang++")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
```
编译器名字按你 SDK 里实际存在的改,不要照抄。
第二步:编译 llama.cpp(CPU 后端、静态链接)
拉源码,然后关掉一切 GPU 后端和网络依赖。这一步最容易踩的坑是默认配置会去拉 curl、编译动态库,到了 PS5 上直接跑不起来。
```bash
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build-ps5 \
-DCMAKE_TOOLCHAIN_FILE="$PS5_SDK/cmake/ps5-toolchain.cmake" \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DGGML_NATIVE=OFF \
-DGGML_VULKAN=OFF \
-DGGML_CUDA=OFF \
-DGGML_METAL=OFF \
-DLLAMA_CURL=OFF \
-DLLAMA_BUILD_TESTS=OFF \
-DCMAKE_C_FLAGS="-march=znver2 -mtune=znver2" \
-DCMAKE_CXX_FLAGS="-march=znver2 -mtune=znver2"
cmake --build build-ps5 --target llama-cli llama-bench llama-server -j"$(nproc)"
```
几个参数值得解释:
GGML_NATIVE=OFF必须关。交叉编译时它会把宿主机的 CPU 特性写进二进制。-march=znver2对应 Zen 2 微架构。不要加 AVX-512 相关选项,Zen 2 不支持 AVX-512,编译出来会直接 illegal instruction。BUILD_SHARED_LIBS=OFF保证产出单个静态 ELF,避免在 PS5 上找不到.so。
编译完检查一下产物:
```bash
file build-ps5/bin/llama-cli
```
理想输出是静态链接的 x86-64 ELF。如果显示 dynamically linked,回头把 -DBUILD_SHARED_LIBS=OFF 和 -DLLAMA_CURL=OFF 再确认一遍。
第三步:选模型并做量化准备
模型选择直接决定体验。给一个粗略的估算方法:CPU 推理的 decode 速度上限大致等于「有效内存带宽 ÷ 每生成一个 token 需要读取的字节数」,而后者约等于模型文件的体积。也就是说,模型越大,每秒 token 数越低,而且是近似反比关系。
举个例子:一个 4 GB 的 Q4 文件,如果可用带宽按 40~50 GB/s 量级估,理论上限就在 10 tok/s 上下,实际还要打折。这只是一个心算上限,不是实测结论,实际数字以你自己跑出来的为准。
建议路径:先用 1B~3B 的 Q4_K_M 把流程跑通,再换 7B~8B 的 Q4_K_M 做正经测试。Q5、Q6 在 PS5 上意义不大——内存吃紧,速度掉得明显。
宿主机上先校验文件完整性,避免传到一半断掉:
```bash
sha256sum model.Q4_K_M.gguf | tee model.sha256
```
第四步:把二进制和模型传进 PS5
两条路,选一条。
FTP 方式,适合小文件、改代码后快速迭代。端口以 payload 屏幕提示为准:
```bash
PS5_IP=192.168.1.50
PS5_FTP_PORT=2121 # 以 payload 实际输出为准
curl -T build-ps5/bin/llama-cli "ftp://$PS5_IP:$PS5_FTP_PORT/data/llama/llama-cli"
curl -T build-ps5/bin/llama-bench "ftp://$PS5_IP:$PS5_FTP_PORT/data/llama/llama-bench"
```
U 盘方式,适合传模型。exFAT 格式,插上后挂载点常见为 /mnt/usb0,同样以 payload 输出为准:
```bash
ls /mnt/usb0
df -h | grep usb
```
传完在 PS5 上再校验一次哈希,能排掉绝大多数「文件传输损坏导致加载失败」的问题:
```bash
sha256sum /mnt/usb0/models/model.Q4_K_M.gguf
chmod +x /data/llama/llama-cli
```
第五步:冒烟测试
先别急着上大模型。用最小上下文、最小生成长度确认二进制能跑:
```bash
/data/llama/llama-cli \
-m /mnt/usb0/models/model.Q4_K_M.gguf \
-p "你好,请用一句话介绍你自己。" \
-n 32 \
-c 512 \
-t 6 \
--no-warmup
```
参数含义:-n 生成 token 数,-c AI 词典:上下文窗口">上下文窗口,-t 线程数。这里故意用 6 而不是 8——留一两个核给系统和 payload,很多时候反而更快,后面实测会验证这一点。
如果这一步能出字,说明工具链、静态链接、模型格式三关都过了。
第六步:起 HTTP 服务(可选)
想从局域网里用浏览器或任意 OpenAI 兼容客户端访问,用 llama-server:
```bash
/data/llama/llama-server \
-m /mnt/usb0/models/model.Q4_K_M.gguf \
-c 2048 \
-t 6 \
--host 0.0.0.0 \
--port 8080
```
然后在同网段电脑上访问 http://<PS5_IP>:8080。注意这是纯内网实验,别把端口暴露到公网。
第七步:吞吐实测
用 llama-bench 分别测 prefill(-p)和 decode(-n),并对比不同线程数。把结果重定向到文件,方便后面做表。
```bash
cd /data/llama
for T in 4 5 6 7 8; do
./llama-bench \
-m /mnt/usb0/models/model.Q4_K_M.gguf \
-p 128 -n 64 -t "$T" -r 3 \
>> bench_t${T}.txt 2>&1
done
```
-r 3 是重复三次取平均,减少噪声。跑完把每个文件里的 pp(prefill,tokens/s)和 tg(text generation,tokens/s)抄出来做对比。
再单独测一下 mmap 开关的影响,这在内存受限环境里差别可能不小:
```bash
./llama-bench -m /mnt/usb0/models/model.Q4_K_M.gguf -p 128 -n 64 -t 6 -r 3
./llama-bench -m /mnt/usb0/models/model.Q4_K_M.gguf -p 128 -n 64 -t 6 -r 3 --no-mmap
```
温度与稳定性观察。持续满载 15 分钟以上,用测温枪每隔两分钟记录一次出风口温度和机身顶部温度,同时记录 tok/s 是否随时间下滑——下滑是降频的直接信号。
```bash
在 PS5 上跑一个长任务,边跑边记时间戳
date +%s > stress.log
./llama-cli -m /mnt/usb0/models/model.Q4_K_M.gguf \
-p "写一段 800 字的产品说明。" -n 512 -c 2048 -t 6 >> stress.log 2>&1
date +%s >> stress.log
```
如果你用的 payload 恰好暴露了传感器节点(不同 payload 差异很大,以实际为准),可以直接读;读不到就用外置测温,别在软件读数上纠结。
常见坑与排错
一执行就 illegal instruction。 十有八九是编译时开了 CPU 不支持的指令集。确认 -march=znver2,确认没有任何 AVX-512 选项,确认 GGML_NATIVE=OFF。
报找不到共享库。 说明没静态链接。回头检查 BUILD_SHARED_LIBS=OFF,并用 file 命令确认产物。
加载模型时直接崩或被杀。 模型体积超过了用户态可用内存。破解环境能拿到的内存远小于标称值,而且被 payload 本身占用一部分。换更小的量化、把 -c 从 2048 降到 512 先跑通。
速度比预期低很多。 依次查:线程数是否为 6~7 而非 8;是否在跑之前刚传完大文件(缓存未稳定);--no-mmap 是否有改善;上下文是否设得过大导致 KV cache 挤占。
FTP 传输后哈希对不上。 大文件用 FTP 容易断,改用 U 盘。传完必校验。
跑几分钟后变慢。 散热问题。PS5 的风扇曲线是固定的,长时间纯 CPU 满载会让 APU 持续高温。确保四周留出空间,别塞在电视柜里测。
llama-server 起来了但局域网访问不通。 检查 --host 0.0.0.0、检查两台设备是否同网段,以及 PS5 的网络配置是否走的有线/无线同一出口。
下一步建议
流程跑通之后,建议按这个顺序继续:
1. 建自己的性能表。把模型尺寸、量化等级、线程数、上下文长度、pp/tg 吞吐、出风口温度记成 CSV。做过一次就知道这台机器的能力边界在哪,后面换模型不用重新摸索。
2. 做量化梯度对比。同一个模型分别跑 Q4_0、Q4_K_M、Q5_K_M,看速度掉了多少、输出质量提升多少,找出性价比拐点。
3. 接一个本地前端。llama-server 兼容 OpenAI 接口格式,局域网里用任意支持自定义 base URL 的客户端都能接,把它变成一个离线可用的内网小助手。
4. 试更小的专用模型。在 CPU-only 场景下,参数小、词表合理的模型往往比「大而慢」的体验更好。
5. 保持离线。这套环境只适合做技术验证,别登录账号、别挂公网端口。想长期跑服务,还是回到普通 PC 或服务器上更省心。
整个过程的核心不是「能不能跑」,而是「能不能量出可信的数字」。把交叉编译的坑填平、把模型完整送进去、把线程数和温度这两个变量控制住,你就得到了一份属于自己的、而非别人截图里的实测结果。
