llama.cpp下8K context支持(实验性) · ymcui/Chinese-LLaMA-Alpaca · Discussion #696 (original) (raw)
Update
2023/7/3 transformers下支持4K+ context的代码请参考#705
正文
主要针对以下几个问题进行讨论:
- 已知本项目提出的中文LLaMA和Alpaca模型训练时的长度为512,而原版LLaMA的长度是2048,那么我们的模型是否支持2048(2K)context?
- 近期关于扩展大模型context长度的讨论很多,有没有“无创升级”模型的方案?
本讨论针对llama.cpp项目中的一个讨论里提到的方法进行了实验验证,探索在llama.cpp下进一步加长context长度的方法。
- llama.cpp项目原post和相关讨论:Extending context size via RoPE scaling ggml-org/llama.cpp#1965 (comment)
- Reddit讨论:https://www.reddit.com/r/LocalLLaMA/comments/14lz7j5/ntkaware_scaled_rope_allows_llama_models_to_have/
修改方法
整体修改方法很简单,多数用户只需执行第一步代码替换和重新编译。
- 修改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处相关定义,建议全部修改。
- (可选)使用cuBLAS或者Metal的用户需要进行如下修改。
- 使用cuBLAS的用户:修改ggml-cuda.cu文件,方法与第一步一致。
- 使用Metal(Apple M系列GPU)的用户:修改ggml-metal.metal文件,方法与第一步一致。注意
powf函数需要改为pow。
- 重新编译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 |
结论和建议
- 虽然我们的模型在训练时的最大长度设置为512,但由于原版LLaMA是2048,从表中可见,我们的模型完全可以支持2K context,且对应的PPL相比长度512时更低
- context小于2048时,原方法效果占优(并不全是),大于2048时新方法具有显著优势
- 改进方法在8K context下仍然能够保持一个相对合理的PPL
- 10K context下的PPL显著上升,因此不建议在8K以上context运行
