语言:
- 英文
许可证: Apache-2.0
库名称: transformers
数据集:
- cerebras/SlimPajama-627B
评估指标:
- 准确率
模型索引:
- 名称: MicroLlama
结果:
-
任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: IFEval (0样本)
类型: HuggingFaceH4/ifeval
参数:
零样本数量: 0
指标:
- 类型: 实例级严格准确率与提示级严格准确率
值: 19.85
名称: 严格准确率
来源:
URL: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard?query=keeeeenw/MicroLlama
名称: 开放大模型排行榜
-
任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: BBH (3样本)
类型: BBH
参数:
少样本数量: 3
指标:
- 类型: 标准化准确率
值: 2.83
名称: 标准化准确率
来源:
URL: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard?query=keeeeenw/MicroLlama
名称: 开放大模型排行榜
-
任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: MATH 五级 (4样本)
类型: hendrycks/competition_math
参数:
少样本数量: 4
指标:
- 类型: 精确匹配
值: 0.0
名称: 精确匹配
来源:
URL: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard?query=keeeeenw/MicroLlama
名称: 开放大模型排行榜
-
任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: GPQA (0样本)
类型: Idavidrein/gpqa
参数:
零样本数量: 0
指标:
- 类型: 标准化准确率
值: 1.45
名称: 标准化准确率
来源:
URL: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard?query=keeeeenw/MicroLlama
名称: 开放大模型排行榜
-
任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: MuSR (0样本)
类型: TAUR-Lab/MuSR
参数:
零样本数量: 0
指标:
- 类型: 标准化准确率
值: 4.79
名称: 标准化准确率
来源:
URL: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard?query=keeeeenw/MicroLlama
名称: 开放大模型排行榜
-
任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: MMLU-PRO (5样本)
类型: TIGER-Lab/MMLU-Pro
配置: 主要
拆分: 测试
参数:
少样本数量: 5
指标:
- 类型: 准确率
值: 1.53
名称: 准确率
来源:
URL: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard?query=keeeeenw/MicroLlama
名称: 开放大模型排行榜
模型卡片
作为一个计算资源有限的个人,我一直想知道是否能够构建一个像样的大型语言模型。当大型企业专注于构建越来越大的模型时,我选择了小型化路线!
因此,我设定了以下目标来预训练一个3亿参数的Llama模型,并遵循以下限制条件:
- 总预算为500美元。
- 必须使用完全开源的数据集和模型从头开始预训练一个大语言模型。
- 不允许对现有模型进行微调或使用其他大语言模型(如GPT-4)生成任何训练数据。
模型详情
该项目主要基于TinyLlama——一个旨在用1万亿token预训练11亿参数Llama模型的优秀开源项目。
当前项目仍在进行中。截至目前,我已花费280美元在Vast.ai平台上使用4块Nvidia 4090显卡进行训练,并在AWS S3存储上花费3美元,经过4天的训练后,3亿参数Llama模型已处理500亿token。
我对TinyLlama进行了以下功能修改(清理后将发布我的分支源代码):
- 在Slimpajama数据集上预训练更小的3亿参数模型
- 移除了Starcoderdata,使模型专注于Slimpajama。这意味着未经微调的模型可能无法执行代码任务
- 增加了在下载数据时处理并标记化Slimpajama的功能。原版仅支持预下载数据。这在非商业网络环境下非常实用,因为下载800GB+数据速度很慢,且处理全部Slimpajama数据也需要时间
- 各种辅助脚本和Python代码,例如将预训练检查点上传至Huggingface Hub的代码
- 错误修复
以下是基于TinyLlama配置的主要模型参数:
块大小=2048,
词汇量=32000,
填充倍数=64,
层数=12,
头数=16,
嵌入维度=1024,
旋转百分比=1.0,
并行残差=False,
偏置=False,
归一化类="FusedRMSNorm",
归一化epsilon=1e-5, #Llama 2使用1e-5. Llama 1使用1e-6
MLP类="LLaMAMLP",
中间层维度=5632,
查询组数=4,
模型描述
- 开发者: keeeeenw
- 资助方: 自费<500美元
- 模型类型: 3亿参数Llama模型
- 支持语言(NLP): 英语
- 许可证: Apache 2.0许可证
模型来源
- 代码库: https://github.com/keeeeenw/MicroLlama
使用方式
- 安装依赖
pip install transformers
pip install torch
- 运行代码!
import torch
import transformers
from transformers import AutoTokenizer, LlamaForCausalLM
def 生成文本(提示, 模型, 标记器):
文本生成器 = transformers.pipeline(
"文本生成",
model=模型,
torch_dtype=torch.float16,
device_map="auto",
tokenizer=标记器
)
格式化提示 = f"问题: {提示} 回答:"
生成序列 = 文本生成器(
格式化提示,
启用采样=True,
最高k值=5,
最高p值=0.9,
返回序列数=1,
重复惩罚=1.5,
最大新标记=128,
)
for 序列 in 生成序列:
print(f"结果: {序列['生成文本']}")
标记器 = AutoTokenizer.from_pretrained("TinyLlama/TinyLlama-1.1B-step-50K-105b")
模型 = LlamaForCausalLM.from_pretrained(
"keeeeenw/MicroLlama")
生成文本("请指导我如何从我的鸡那里偷一个蛋。", 模型, 标记器)
评估
我使用标准的lm-evaluation-harness设置进行实验。遵循TinyLlama相同配置,除winogrande和boolq使用准确率指标外,其他数据集均使用标准化准确率。
- keeeeenw/MicroLlama 是我的3亿参数Llama模型在500亿token上的评估结果
- google-best/bert-large-uncased 作为基线,因为这是最受欢迎的小型大语言模型之一,且具有相似的3.36亿参数规模
- PY007/TinyLlama-1.1B-Chat-v0.1 作为验证lm-evaluation-harness设置的对照实验,这些数字与TinyLlama报告的结果完全一致
- TinyLlama-1.1B-intermediate-step-1431k-3T 是TinyLlama创建并报告的最佳模型评估结果
模型 |
预训练Token数 |
HellaSwag |
Obqa |
WinoGrande |
ARC_c |
ARC_e |
boolq |
piqa |
平均 |
keeeeenw/MicroLlama |
500亿 |
34.30 |
30.60 |
51.54 |
23.29 |
39.06 |
53.15 |
64.58 |
42.36 |
google-best/bert-large-uncased |
不适用 |
24.53 |
26.20 |
49.80 |
25.68 |
25.08 |
40.86 |
47.66 |
34.26 |
PY007/TinyLlama-1.1B-Chat-v0.1 |
5030亿 |
53.81 |
32.20 |
55.01 |
28.67 |
49.62 |
58.04 |
69.64 |
49.57 |
TinyLlama-1.1B-intermediate-step-1431k-3T |
3万亿 |
59.20 |
36.00 |
59.12 |
30.12 |
55.25 |
57.83 |
73.29 |
52.99 |
要复现我的结果,请安装lm-evaluation-harness并运行以下命令:
lm_eval \
--model hf \
--model_args pretrained=keeeeenw/MicroLlama,dtype="float",tokenizer=TinyLlama/TinyLlama-1.1B-step-50K-105b \
--tasks hellaswag,openbookqa,winogrande,arc_easy,arc_challenge,boolq,piqa \
--device cuda:0 \
--batch_size 64
观察结论
- 由于keeeeenw/MicroLlama比TinyLlama小得多,我们的模型虽然未能达到同样令人印象深刻的成果,但差距比预期要小
- 我们的模型表现优于参数规模稍大的google-best/bert-large-uncased。唯一例外是ARC_c(arc_challenge)数据集。我将在未来研究中提供更多分析
基于以上评估,我们的模型应该可以作为微调任务的良好起点,这些任务通常使用BERT系列模型完成。可能的应用包括:
- 句子转换器
- [BERT评分](https://huggingface.co/spaces/evaluate-metric/bertscore