slowllama 项目简介
slowllama 是一个为 Llama2 和 CodeLlama 模型(例如 70B/35B 大型模型)进行微调的系统,其特别之处在于可以在 Apple M1/M2 设备(如 MacBook Air 或 Mac Mini)或消费者级别的 nVidia GPUs 上运行。slowllama 的显著特点是不使用量化,而是将模型的某些部分在正向和反向传递过程中卸载到 SSD 或主内存中。
微调:核心关注
相较于难以从头训练大型模型的方式,slowllama 可以通过长时间运行获得微调的结果。当前版本使用 LoRA 技术,将参数更新限制在一小部分参数中。最初版本支持完整微调,但目前已被移除以优化 SSD 的使用寿命。
微调是 slowllama 的唯一关注点。在推理方面,slowllama 未做特殊优化。CUDA 相关的实验可以参见 a10 实验报告。
运行示例
在 Apple M1 和 M2 设备上进行了测试。示例包括安装必要的依赖,如 Torch、Sentencepiece 和 Numpy,然后克隆 Llama 和 CodeLlama 的代码库并下载模型文件和分词器。对于每个测试,准备模型文件以便逐块加载和保存这些大模型。
微调 llama2 7B 模型
通过简单的微调脚本 finetune.py,可以调整 LoRA 权重。用户可以自定义设置,如序列长度、批量大小、学习率、dropout 率等。下述是线性衰减的损失函数示例:
backprop done, loss after forward pass = 2.953
...
backprop done, loss after forward pass = 0.716
经过若干次迭代后,模型输出从基础的 Llama 回答逐渐生成更准确的内容。
技术实现
slowllama 的工作流程包括:
- 将大模型分块加载,以降低内存需求。这通过将大模型的权重卸载到 SSD 实现。
- 正向传递和反向梯度传播都需要通过将缓存的输入进行重用,从而有效地管理系统资源。
- 在 LoRA 微调过程中,仅有 LoRA 权重和梯度被保留在内存中。
实验结果
在 Mac Mini 设备上进行的实验表明,虽然在小型设备上微调 7B 和 70B 模型时间成本较高,但通过逐步优化,如使用 FP16 格式和改进内存分配,执行效率显著提升。
项目结构及待办事项
slowllama 包含多个主要组件,包括模型定义、加载器、训练脚本和其他报表及工具模块。项目计划进一步优化,如引入异步保存与预读取、提升内存利用效率以及实现更通用的训练流程。此外,计划增加针对内存需求的可视化和权重量化的研究。
联系方式
如需更多信息,可以通过 {github handle} @ gmail.com 进行联系。