🚀 8位权重量化的EleutherAI/gpt - j - 6b模型
本项目提供了一个修改后的EleutherAI的GPT - J模型(具有60亿参数)版本,让你能够在Colab或等效的桌面GPU(如单张1080Ti)上进行模型生成和微调。
🚀 快速开始
注意:此模型已被Younes Belkada和Tim Dettmers开发的transformers
中的load_in_8bit=True
功能所取代。请参考此使用示例。
这个旧版模型是为transformers v4.15.0和PyTorch 1.11构建的。更高版本可能可以运行,但不提供支持。
运行模型的方法: 
✨ 主要特性
-
量化优势:原始的[GPT - J](https://huggingface.co/EleutherAI/gpt - j - 6B/tree/main)仅32位浮点参数就需要22GB以上的内存,还未考虑梯度和优化器的内存占用。即使将所有参数转换为16位,大多数单GPU设置(除了A6000和A100)仍然无法容纳。而本项目通过以下技术,让GPT - J能够在约11GB内存的单GPU上使用和微调:
- 大权重张量使用动态8位量化,并在乘法时即时反量化。
- 使用梯度检查点,每层仅存储一个激活值,以30%的训练速度为代价显著减少内存使用。
- 结合LoRA和8位Adam进行可扩展的微调。
也就是说,所有大权重矩阵都以8位冻结,只训练小的适配器和可选的一维张量(层归一化尺度、偏置)。
-
模型质量:从技术上讲,8位量化会影响模型质量,但在实际应用中影响可以忽略不计。[此笔记本测量了维基文本测试困惑度](https://nbviewer.org/urls/huggingface.co/hivemind/gpt - j - 6B - 8bit/raw/main/check_perplexity.ipynb),结果与原始GPT - J几乎无差异。量化模型甚至略好一些,但不具有统计学意义。
-
计算方式:本项目代码与其他8位方法的不同之处在于,仅使用8位进行存储,所有计算都在16位浮点或32位浮点下进行。因此,可以利用适合每个权重分布的非线性量化,虽然这种非线性量化不会加速推理,但可以显著降低误差。
-
性能表现:检查点和反量化会带来一些开销,但令人惊讶的是,这些开销是可以接受的。根据GPU和批量大小,量化模型在使用梯度检查点的基础上,比原始模型慢1 - 10%(梯度检查点本身会带来30%的开销)。这主要是因为bitsandbytes
的分块量化在GPU上速度非常快。

📚 详细文档
如何微调模型?
建议从LoRA论文中的原始超参数开始。此外,还有一个技巧:反量化权重的开销与批量大小无关。因此,批量大小越大,训练效率越高。
在哪里可以免费训练模型?
可以在Colab上进行训练,但如果分配到K80 GPU,最好切换到其他免费的GPU提供商,如 [Kaggle](https://towardsdatascience.com/amazon - sagemaker - studio - lab - a - great - alternative - to - google - colab - 7194de6ef69a)、[AWS SageMaker](https://towardsdatascience.com/amazon - sagemaker - studio - lab - a - great - alternative - to - google - colab - 7194de6ef69a) 或 [Paperspace](https://docs.paperspace.com/gradient/more/instance - types/free - instances)。例如,[这个笔记本在Kaggle上运行](https://www.kaggle.com/justheuristic/dmazur - converted),使用了更强大的P100实例。
能否将此技术应用于其他模型?
该模型是使用[此笔记本](https://nbviewer.org/urls/huggingface.co/hivemind/gpt - j - 6B - 8bit/raw/main/convert - gpt - j.ipynb)进行转换的,也可以将其改编用于其他模型类型。但请记住,一些模型会用自定义的替代层替换线性层和嵌入层,这些层需要自己的BNBWhateverWithAdapters
。
📄 许可证
本项目采用Apache 2.0许可证。
属性 |
详情 |
模型类型 |
8位权重量化的因果语言模型(Causal LM) |
训练数据 |
The Pile |
框架标签 |
PyTorch |