微调的上限是由底模决定的

标签:AI

继上个月研究 LLM 的微调以来,我把各种参数都折腾了一遍,效果大致已经到极限了。
当时的数据量只有 400 多条,为了避免过拟合,我一共只训练了 2 轮。为了避免相同的训练顺序对学习造成影响,还将两次训练集的顺序打乱了。

由于数据量很少,初始 loss 更低的 PiSSA 是非常推荐使用的,不然本就稀少的数据被用于降低初期较高的 loss,显得有点浪费。
之前那篇文章我没有说明 PiSSA 的原理,这里简单提一下:
LoRA 的原理是构造 2 个低秩矩阵,其中 A 矩阵是随机值,B 矩阵全是 0,它们相乘后再和原矩阵相加作为参数。
而 PiSSA 则是将原矩阵进行奇异值分解,也就是让分解得到的两个矩阵相乘等于原矩阵。当然,完全相等也没必要,一般会使用快速奇异值分解,让 A * B 近似于原矩阵即可。这样,我们在微调 A、B 矩阵时,初始状态更接近原矩阵(初始 loss 低),微调效果也更接近全参微调(最终 loss 低)。

我选用的验证集约 40 条,Qwen2-7B-Instruct 的 eval loss 大概能降到 0.3。
之后针对验证集中表现不好的例子,我又陆续构造了约 200 条数据。至此,eval loss 大概能降到 0.2。但继续增加数据量,却发现模型会出现教不会的现象。
顺便对比一些在线的模型:gpt-4o 和 gpt-4o-mini 大概到 0.14,glm-4-flash 大概到 0.25。

如何微调一个自用的小模型

标签:AI

最近在用大模型做多语种的翻译,选择了 2 张 4090 能部署的当前最强模型:Qwen2-72B-Instruct-GPTQ-Int4。
但在使用过程中发现了不少问题,例如:
  • 速度太慢,用 vLLM 部署,32 并发时大概 300 tokens/s,每个请求其实不到 10 tokens/s。
  • 指令遵循不行,当要求过多时,会随机无视一些指令。
  • 喜欢废话,即使要求它只输出翻译,也可能会附带一堆多余信息。目前发现最好的方式是让它输出在一个 XML 标签里(例如 <OUTPUT></OUTPUT>),然后用字符串匹配或正则表达式来提取翻译。

那么有没有办法解决呢?

AI 时代的显卡选择

标签:AI

最近我一直在折腾大模型的推理、部署和训练,遇到了不少坑,先阶段性地总结一下。

先说下结论吧:
  • 个人学习最简单的方案:16 寸 MacBook Pro M3 Max 128 GB 内存,靠谱的低价约 28000+ RMB。最大可进行约 70B Int8 量化模型的推理(如 Qwen2-72B-Instruct-GPTQ-Int8)。
  • 个人学习+游戏需求:RTX 4090,不太好买,约 15000+ RMB。最大可进行约 30B Int4 量化模型或 7B 模型的推理。
  • 小规模部署:双 RTX 4090。最大可进行约 70B Int4 或 AWQ 量化模型的推理(如 Qwen2-72B-Instruct-GPTQ-Int4)。
  • 训练 70B 的模型:租 8 * Tesla A800/A100/H800/H100 80GB 的服务器(越往右性价比越高),每天约 1000~3000 RMB。
  • 追求速度:用各个厂商的云服务。

其他不推荐的选项:
  • 192 GB 内存的 Mac Studio 或 Mac Pro:型号较老,价格太贵,唯一的优势是可以进行约 70B 模型的推理。
  • RTX 3090 等其他游戏显卡:相较于 RTX 4090 的性价比较低。
  • Tesla A100 等高端专业显卡:价格太高,如果要进行 70B 模型的推理需要 2 张(约 15 万 RMB),性价比不如 4 张 RTX 4090。如果用于训练和微调,闲置时有点浪费。
  • AMD 显卡:性价比较高,但生态不如 NVIDIA,这意味着很多库和工具不支持 AMD 显卡或性能较差,较新的论文和库一般都只有 NVIDIA 版。不适合学习,除非你确定正好能满足你的需求。
  • 国产显卡:价格不低,生态较差,很多库无法使用或需要专门安装老版本的魔改版。