自托管 AI 模型

简介

本指南旨在帮助你完成 SillyTavern 与运行在个人电脑上的本地 AI(从现在起我们使用正式术语,称之为 LLM)的对接。在拿技术支持问题去烦人之前,请先读完本指南。

最好的大语言模型是哪一个?

这个问题无法回答,因为并不存在一个标准化的“最佳”衡量尺度。Reddit 和 Discord 上有足够多的资源与讨论,足够你对首选/首选模型形成至少某种看法。具体效果因人而异。

最好的配置是什么?

如果真存在某种最佳或无脑可选的方案,那还需要配置干什么?最好的配置就是对你而言能用的那一种。这是一个不断试错的过程。

硬件需求与定位

这是一个复杂的话题,因此我只讲要点并作概括。

  • 互联网上有成千上万个可免费下载的 LLM,就像 Stable Diffusion 有海量可用于生成图像的模型一样。
  • 运行未经修改的 LLM 需要一张拥有大量 VRAM(显存)的怪兽级 GPU,多到你永远不会拥有。
  • 通过 GPTQ 或 AWQ 等量化技术压缩模型,可以降低对 VRAM 的需求。这会让模型能力略有下降,但运行所需的 VRAM 大幅减少。正因如此,拥有 3080 这类游戏级 GPU 的人也能跑 13B 模型了。虽然不如未量化模型,但依然不错。
  • 更好的还在后面:还有一种名为 GGUF(旧称 GGML)的模型格式与量化方案,它已经成为没有怪兽级 GPU 的普通人的首选格式。它让你完全不需要 GPU 就能使用 LLM,只用 CPU 和 RAM 即可。这比在 GPU 上用 GPTQ/AWQ 运行 LLM 要慢得多(大概慢 15 倍),尤其在处理提示词时尤为明显,但模型能力同样出色。随后 GGUF 作者又对 GGUF 作了进一步优化,加入了一个配置选项,让拥有游戏级 GPU 的人可以把模型的一部分卸载到 GPU 上,从而以 GPU 的速度运行模型的一部分(注意这并不会降低对 RAM 的需求,只是提升了生成速度)。
  • 模型有不同的规模,按训练时使用的参数数量命名。你会看到诸如 7B、13B、30B、70B 等名称。你可以把它们理解为模型的大脑大小。在同一系列模型中,13B 模型比 7B 更有本事:它们用相同的数据训练,但更大的大脑能更好地保留知识、思考得更连贯。更大的模型也需要更多的 VRAM/RAM。
  • 量化的程度有好几档(8-bit、5-bit、4-bit 等)。你降得越低,模型退化越严重,但硬件需求也越低。因此即便在较差的硬件上,你也可能跑得动心仪模型的 4-bit 版本。甚至还有 3-bit 和 2-bit 量化,但到这一步已经是在做无用功了。此外还有进一步的量化子类型,名为 k_s、k_m、k_l 等。k_m 比 k_s 更好,但需要更多资源。
  • 上下文大小(在不丢失内容的前提下,对话能变得多长)也会影响对 VRAM/RAM 的需求。所幸这是一个可配置的设置,你可以使用更小的上下文来降低 VRAM/RAM 需求。(注:基于 Llama2 的模型上下文大小为 4k。Mistral 标称 8k,但实际只有 4k。)
  • 在 2023 年的某个时候,NVIDIA 更新了 GPU 驱动:当你需要的 VRAM 超过 GPU 自带容量时,它不再让任务崩溃,而是开始把普通 RAM 当作回退来使用。这会严重拖慢 LLM 的书写速度,但模型依然能工作并给出相同质量的输出。所幸这一行为可以关闭

综上所述,硬件需求与性能完全取决于模型系列、模型类型、模型规模、量化方法等因素。

模型大小计算器

你可以使用 Nyx 的模型大小计算器 来确定你需要多少 RAM/VRAM。

记住,你要跑的是能塞进你内存的、最大且量化程度最低的模型,也就是不会引发 磁盘交换 的那一个。

下载 LLM

要开始上手,你需要先下载一个 LLM。查找和下载 LLM 最常见的地方是 HuggingFace,上面有成千上万个模型。查找 GGUF 模型的好办法是去看 bartowski 的账号页面:https://huggingface.co/bartowski。如果你不想要 GGUF,他会链接到原始模型页面,你也许能在那里找到同一模型的其他格式。

在某个模型的页面上,你会看到一大堆文件。

  • 你不一定需要全部!对于 GGUF,你只需要那个 .gguf 模型文件(通常为 4-11GB)。如果你看到多个大文件,那通常是同一模型的多种量化版本,你只需挑其中一个。
  • 对于 .safetensors 文件(可能是 GPTQ、AWQ、HF 量化或未量化的),如果文件名里有类似 model-00001-of-00003.safetensors 这样的数字序列,那你需要全部 3 个 .safetensors 文件,加上仓库里的所有其他文件(分词器、配置等),才能拿到完整模型。
  • 截至 2024 年 1 月,Mixtral MOE 8x7B 被广泛认为是本地 LLM 的业界标杆。如果你有 32GB 的 RAM 来跑它,一定要试试。如果你的 RAM 不足 32GB,那就用 Kunoichi-DPO-v2-7B,它尽管体量小,但开箱即用、表现惊艳。

下载 Kunoichi-DPO-v2-7B 的操作演示

本指南接下来的部分将使用 Kunoichi-DPO-v2-7B 模型。它是一款基于 Mistral 7B 的优秀模型,仅需 7GB RAM,且表现远超其体量应有水准。注:Kunoichi 使用 Alpaca 提示格式。

  • 前往 https://huggingface.co/brittlewis12/Kunoichi-DPO-v2-7B-GGUF
  • 点击 'Files and versions'。你会看到若干文件的列表。这些都是同一个模型,只是以不同的量化选项提供。点击文件 'kunoichi-dpo-v2-7b.Q6_K.gguf',它提供 6-bit 量化。
  • 点击 'download' 按钮,下载应会开始。

如何识别模型的类型

像 TheBloke 这样优秀的模型上传者会起有描述性的名字。但如果他们没有:

  • 文件名以 .gguf 结尾:GGUF CPU 模型(显而易见)
  • 文件名以 .safetensors 结尾:可能是未量化、HF 量化、GPTQ 或 AWQ
  • 文件名是 pytorch-***.bin:同上,但这是较旧的模型文件格式,在模型加载时会允许模型执行任意 Python 脚本,被认为是不安全的。如果你信任模型作者,或者实在没别的办法,你仍然可以使用它,但只要有 .safetensors 可选,就选 .safetensors。
  • 存在 config.json?看看里面是否有 quant_method。
  • q4 表示 4-bit 量化,q5 表示 5-bit 量化,以此类推
  • 你看到一个像 -16k 这样的数字?那是增大的上下文大小(即模型忘记对话开头之前,对话能增长到多长)!注意,更大的上下文大小需要更多 VRAM。

安装 LLM 服务器:Oobabooga 或 KoboldAI

现在 LLM 已经在你的电脑上了,我们还需要下载一个工具,让它充当 SillyTavern 与模型之间的中间人:它会加载模型,并把其功能以本地 HTTP web API 的形式暴露出来,供 SillyTavern 调用,就像 SillyTavern 调用 OpenAI GPT 或 Claude 这类付费网络服务一样。你所用的工具应该是 KoboldAI 或 Oobabooga(或其他兼容工具)。

本指南同时涵盖这两种方案,你只需任选其一。

下载并使用 KoboldCpp(无需安装,适用于 GGUF 模型)

  1. 访问 https://koboldai.org/cpp,你会看到最新版本及各种可下载的文件。 撰写本文时,他们列出的最新 CUDA 版本是 cu12,在现代 NVIDIA GPU 上运行效果最佳;如果你的 GPU 较老或品牌不同,可以使用常规的 koboldcpp.exe。如果你的 CPU 也比较旧,KoboldCpp 可能在你尝试加载模型时会崩溃,这种情况下试试 _oldcpu 版本,看能否解决问题。

  2. KoboldCpp 无需安装,一旦启动 KoboldCpp,你就能立即通过 Model 字段旁的 Browse 按钮选择你的 GGUF 模型(例如上面链接的那个)。

  3. 默认情况下,即便你在 SillyTavern 中设置得更高,KoboldCpp 也最多以 4K 上下文运行;如果你希望以更高上下文运行模型,请务必在此界面上调整上下文滑块后再启动模型。请记住,更大的上下文大小意味着更高的(显)存需求,如果你把这一项设得过高,或加载了一个对你的系统而言过大的模型,KoboldCpp 会自动对无法放入 GPU 的层改用 CPU,这会慢得多。

  4. 点击 Launch,如果一切顺利,会打开一个新网页 KoboldAI Lite,你可以在其中测试一切是否正常工作。

  5. 打开 SillyTavern 并点击 API 连接(API Connections,顶栏第二个按钮)

  6. 将 API 设为文本补全(Text Completion),API 类型(API Type)设为 KoboldCpp。

  7. 将服务器 URL(server URL)设为 http://127.0.0.1:5001/;如果它没有运行在同一系统上,则使用 KoboldCpp 提供给你的链接(你可以开启 KoboldCpp 的远程隧道模式(Remote Tunnel mode),以获得一个可从任何地方访问的链接)。

  8. 点击连接(Connect)。它应能成功连接,并检测到 kunoichi-dpo-v2-7b.Q6_K.gguf 为模型。

  9. 与一个角色聊天以测试是否正常工作。

优化 KoboldCpp 速度的小技巧

  1. Flash Attention 有助于降低内存需求,根据你的系统不同可能更快或更慢,并且能让你在 GPU 上比默认情况放下更多层。
  2. KoboldCpp 在估算层数时会为其他软件留出一些空间以避免出问题,如果你打开的程序很少,又无法把模型完全塞进 GPU,你可以再额外加上几层。
  3. 如果模型因上下文大小占用太多内存,你可以通过量化 KV(Quantizing the KV)来降低占用。这会降低输出质量,但能帮你把更多层放到 GPU 上。具体做法是:进入 KoboldCpp 的 Tokens 标签页(Tokens tab),关闭上下文移动(Context Shifting),并开启 Flash Attention。这会解锁量化 KV 缓存(Quantized KV Cache)滑块,数值越低意味着内存占用越少/模型智力越低。
  4. 在较慢的系统上运行 KoboldCpp,导致处理提示词耗时很长?当你避免使用世界书(Lorebook)、随机化或其他会动态改变输入的特性时,上下文移动(Context Shifting)效果最佳。保持开启上下文移动,KoboldCpp 能帮你避免漫长的重复处理时间。

安装 Oobabooga

下面是一套更稳妥/更防呆的安装流程:

  1. git clone https://github.com/oobabooga/text-generation-webui(或者在浏览器里把他们的仓库下载为 .zip,然后解压)
  2. 运行 start_windows.bat 或对应你操作系统的脚本
  3. 出现提示时,选择你的 GPU 类型。即便你打算用 GGUF/CPU,只要你的 GPU 在列表里,也请现在就选上它,因为这会让你在后续获得一个名为 GPU 分片(GPU sharding)的速度优化选项(而无需从头重新安装)。如果你没有游戏级独立显卡(NVIDIA、AMD),请选择 None。
  4. 等待安装完成
  5. 把 kunoichi-dpo-v2-7b.Q6_K.gguf 放到 text-generation-webui/user_data/models
  6. 打开 text-generation-webui/user_data/CMD_FLAGS.txt,删掉里面的全部内容并写入:--api
  7. 重启 Oobabooga
  8. 访问 http://127.0.0.1:5000/docs。它是否加载出一个 FastAPI 页面?如果没有,那就是你在某一步弄错了。

在 Oobabooga 中加载我们的模型

  1. 在浏览器中打开 http://127.0.0.1:7860/
  2. 点击 Model 标签页
  3. 在下拉菜单中选择我们的 Kunoichi DPO v2 模型。它应该已自动选中 llama.cpp loader。
  4. (可选)我们前面多次提到“GPU 卸载(GPU offload)”:那就是本页面的 n-gpu-layers 设置。如果你想用它,请在加载模型前设定一个值。作为一个基本参考,将其设为 30 时,13B 及更小模型大约只占用不到 6GB VRAM。(具体数值随模型架构与大小而异)
  5. 点击 Load

配置 SillyTavern 与 Oobabooga 对接

  1. 点击 API 连接(API Connections,顶栏第二个按钮)
  2. 将 API 设为文本补全(Text Completion)
  3. 将 API 类型(API Type)设为默认(Default (Oobabooga))
  4. 将服务器 URL(server URL)设为 http://127.0.0.1:5000/
  5. 点击连接(Connect)。它应能成功连接,并检测到 kunoichi-dpo-v2-7b.Q6_K.gguf 为模型。
  6. 与一个角色聊天以测试是否正常工作

结语

恭喜,你现在应该已经拥有一个可用的本地 LLM 了。