llama.cpp下8K context支持(实验性) · ymcui/Chinese-LLaMA-Alpaca · Discussion #696 (original) (raw)

Update

2023/7/3 transformers下支持4K+ context的代码请参考#705

正文

主要针对以下几个问题进行讨论:

  1. 已知本项目提出的中文LLaMA和Alpaca模型训练时的长度为512,而原版LLaMA的长度是2048,那么我们的模型是否支持2048(2K)context?
  2. 近期关于扩展大模型context长度的讨论很多,有没有“无创升级”模型的方案?

本讨论针对llama.cpp项目中的一个讨论里提到的方法进行了实验验证,探索在llama.cpp下进一步加长context长度的方法。

修改方法

整体修改方法很简单,多数用户只需执行第一步代码替换和重新编译。

  1. 修改llama.cpp中的ggml.c文件

找到以下语句:

const float theta_scale = powf(10000.0, -2.0f/n_dims);

替换为(以防万一,建议是注释原实现,而不是删除):

//const float theta_scale = powf(10000.0, -2.0f/n_dims); const float theta_scale = powf(10000.0 * powf(8.0, n_dims / (n_dims - 2.0)), -2.0f/n_dims);

该文件中一共有4处相关定义,建议全部修改。

  1. (可选)使用cuBLAS或者Metal的用户需要进行如下修改。
  1. 重新编译llama.cpp(cuBLAS请按实际情况加上环境变量)

实验结果

以下是原RoPE方法和新方法在不同context length下的PPL对比。以下以LLaMA-Plus-7B-Q6_K(效果与FP16相差0.1%以内)为测试模型,评测中文文本数据上的PPL。

./perplexity -m zh-llama-models/p7b/ggml-model-q6_k.bin -f text.txt -ngl 1 -c $CTX_SIZE

方法 512 1024 2048 2560 3072 4096 5120 6144 8192 10240
main branch 11.830 11.733 10.676 31.480 259 486
本讨论中的方法 11.184 12.432 10.853 12.447 13.243 12.665 13.375 14.010 15.399 52.038

8K context支持

结论和建议

  1. 虽然我们的模型在训练时的最大长度设置为512,但由于原版LLaMA是2048,从表中可见,我们的模型完全可以支持2K context,且对应的PPL相比长度512时更低
  2. context小于2048时,原方法效果占优(并不全是),大于2048时新方法具有显著优势
  3. 改进方法在8K context下仍然能够保持一个相对合理的PPL
  4. 10K context下的PPL显著上升,因此不建议在8K以上context运行