模型简介
模型特点
模型能力
使用案例
🚀 OpenELM
OpenELM 是一系列开放、高效的语言模型。该模型家族采用分层缩放策略,在Transformer模型的每一层内高效分配参数,从而提高了模型的准确性。OpenELM模型使用 CoreNet 库进行预训练。我们发布了参数分别为2.7亿、4.5亿、11亿和30亿的预训练模型和指令微调模型。同时,我们还发布了完整的框架,包括数据准备、训练、微调以及评估流程,还有多个预训练检查点和训练日志,以推动开放研究。
我们的预训练数据集包含RefinedWeb、去重后的PILE、RedPajama的一个子集以及Dolma v1.6的一个子集,总计约18万亿个标记。在使用这些数据集之前,请仔细查看其许可协议和使用条款。
🚀 快速开始
模型使用
我们在 generate_openelm.py
中提供了一个示例函数,用于从通过 HuggingFace Hub 加载的OpenELM模型生成输出。
你可以运行以下命令来测试模型:
python generate_openelm.py --model apple/OpenELM-270M --hf_access_token [HF_ACCESS_TOKEN] --prompt 'Once upon a time there was' --generate_kwargs repetition_penalty=1.2
请参考 此链接 获取你的Hugging Face访问令牌。
可以通过 generate_kwargs
传递额外的参数给Hugging Face的生成函数。例如,为了加速推理,你可以尝试通过传递 prompt_lookup_num_tokens
参数来使用 查找令牌推测生成,如下所示:
python generate_openelm.py --model apple/OpenELM-270M --hf_access_token [HF_ACCESS_TOKEN] --prompt 'Once upon a time there was' --generate_kwargs repetition_penalty=1.2 prompt_lookup_num_tokens=10
或者,通过 assistant_model
参数传递一个较小的模型,尝试使用 辅助模型 进行模型级别的推测生成,例如:
python generate_openelm.py --model apple/OpenELM-270M --hf_access_token [HF_ACCESS_TOKEN] --prompt 'Once upon a time there was' --generate_kwargs repetition_penalty=1.2 --assistant_model [SMALLER_MODEL]
评估模型
安装依赖
安装以下依赖项:
# 安装公共的lm-eval-harness
harness_repo="public-lm-eval-harness"
git clone https://github.com/EleutherAI/lm-evaluation-harness ${harness_repo}
cd ${harness_repo}
# 使用2024年3月15日的主分支,SHA为dc90fec
git checkout dc90fec
pip install -e .
cd ..
# 66d6242是2024年4月1日的主分支
pip install datasets@git+https://github.com/huggingface/datasets.git@66d6242
pip install tokenizers>=0.15.2 transformers>=4.38.2 sentencepiece>=0.2.0
评估OpenELM
# OpenELM-270M
hf_model=apple/OpenELM-270M
# 由于lm-eval-harness默认将add_bos_token设置为False,但OpenELM使用的LLaMA分词器需要add_bos_token为True,因此需要此标志
tokenizer=meta-llama/Llama-2-7b-hf
add_bos_token=True
batch_size=1
mkdir lm_eval_output
shot=0
task=arc_challenge,arc_easy,boolq,hellaswag,piqa,race,winogrande,sciq,truthfulqa_mc2
lm_eval --model hf \
--model_args pretrained=${hf_model},trust_remote_code=True,add_bos_token=${add_bos_token},tokenizer=${tokenizer} \
--tasks ${task} \
--device cuda:0 \
--num_fewshot ${shot} \
--output_path ./lm_eval_output/${hf_model//\//_}_${task//,/_}-${shot}shot \
--batch_size ${batch_size} 2>&1 | tee ./lm_eval_output/eval-${hf_model//\//_}_${task//,/_}-${shot}shot.log
shot=5
task=mmlu,winogrande
lm_eval --model hf \
--model_args pretrained=${hf_model},trust_remote_code=True,add_bos_token=${add_bos_token},tokenizer=${tokenizer} \
--tasks ${task} \
--device cuda:0 \
--num_fewshot ${shot} \
--output_path ./lm_eval_output/${hf_model//\//_}_${task//,/_}-${shot}shot \
--batch_size ${batch_size} 2>&1 | tee ./lm_eval_output/eval-${hf_model//\//_}_${task//,/_}-${shot}shot.log
shot=25
task=arc_challenge,crows_pairs_english
lm_eval --model hf \
--model_args pretrained=${hf_model},trust_remote_code=True,add_bos_token=${add_bos_token},tokenizer=${tokenizer} \
--tasks ${task} \
--device cuda:0 \
--num_fewshot ${shot} \
--output_path ./lm_eval_output/${hf_model//\//_}_${task//,/_}-${shot}shot \
--batch_size ${batch_size} 2>&1 | tee ./lm_eval_output/eval-${hf_model//\//_}_${task//,/_}-${shot}shot.log
shot=10
task=hellaswag
lm_eval --model hf \
--model_args pretrained=${hf_model},trust_remote_code=True,add_bos_token=${add_bos_token},tokenizer=${tokenizer} \
--tasks ${task} \
--device cuda:0 \
--num_fewshot ${shot} \
--output_path ./lm_eval_output/${hf_model//\//_}_${task//,/_}-${shot}shot \
--batch_size ${batch_size} 2>&1 | tee ./lm_eval_output/eval-${hf_model//\//_}_${task//,/_}-${shot}shot.log
✨ 主要特性
- 高效参数分配:采用分层缩放策略,在Transformer模型的每一层内高效分配参数,提高模型准确性。
- 多参数模型发布:提供2.7亿、4.5亿、11亿和30亿参数的预训练模型和指令微调模型。
- 开放研究支持:发布完整框架,包括数据准备、训练、微调以及评估流程,还有预训练检查点和训练日志。
💻 使用示例
基础用法
# 运行以下命令测试模型
python generate_openelm.py --model apple/OpenELM-270M --hf_access_token [HF_ACCESS_TOKEN] --prompt 'Once upon a time there was' --generate_kwargs repetition_penalty=1.2
高级用法
# 加速推理,使用查找令牌推测生成
python generate_openelm.py --model apple/OpenELM-270M --hf_access_token [HF_ACCESS_TOKEN] --prompt 'Once upon a time there was' --generate_kwargs repetition_penalty=1.2 prompt_lookup_num_tokens=10
# 使用辅助模型进行模型级别的推测生成
python generate_openelm.py --model apple/OpenELM-270M --hf_access_token [HF_ACCESS_TOKEN] --prompt 'Once upon a time there was' --generate_kwargs repetition_penalty=1.2 --assistant_model [SMALLER_MODEL]
📚 详细文档
主要实验结果
零样本学习结果
模型规模 | ARC-c | ARC-e | BoolQ | HellaSwag | PIQA | SciQ | WinoGrande | 平均 |
---|---|---|---|---|---|---|---|---|
OpenELM-270M | 26.45 | 45.08 | 53.98 | 46.71 | 69.75 | 84.70 | 53.91 | 54.37 |
OpenELM-270M-Instruct | 30.55 | 46.68 | 48.56 | 52.07 | 70.78 | 84.40 | 52.72 | 55.11 |
OpenELM-450M | 27.56 | 48.06 | 55.78 | 53.97 | 72.31 | 87.20 | 58.01 | 57.56 |
OpenELM-450M-Instruct | 30.38 | 50.00 | 60.37 | 59.34 | 72.63 | 88.00 | 58.96 | 59.95 |
OpenELM-1_1B | 32.34 | 55.43 | 63.58 | 64.81 | 75.57 | 90.60 | 61.72 | 63.44 |
OpenELM-1_1B-Instruct | 37.97 | 52.23 | 70.00 | 71.20 | 75.03 | 89.30 | 62.75 | 65.50 |
OpenELM-3B | 35.58 | 59.89 | 67.40 | 72.44 | 78.24 | 92.70 | 65.51 | 67.39 |
OpenELM-3B-Instruct | 39.42 | 61.74 | 68.17 | 76.36 | 79.00 | 92.50 | 66.85 | 69.15 |
LLM360评测结果
模型规模 | ARC-c | HellaSwag | MMLU | TruthfulQA | WinoGrande | 平均 |
---|---|---|---|---|---|---|
OpenELM-270M | 27.65 | 47.15 | 25.72 | 39.24 | 53.83 | 38.72 |
OpenELM-270M-Instruct | 32.51 | 51.58 | 26.70 | 38.72 | 53.20 | 40.54 |
OpenELM-450M | 30.20 | 53.86 | 26.01 | 40.18 | 57.22 | 41.50 |
OpenELM-450M-Instruct | 33.53 | 59.31 | 25.41 | 40.48 | 58.33 | 43.41 |
OpenELM-1_1B | 36.69 | 65.71 | 27.05 | 36.98 | 63.22 | 45.93 |
OpenELM-1_1B-Instruct | 41.55 | 71.83 | 25.65 | 45.95 | 64.72 | 49.94 |
OpenELM-3B | 42.24 | 73.28 | 26.76 | 34.98 | 67.25 | 48.90 |
OpenELM-3B-Instruct | 47.70 | 76.87 | 24.80 | 38.76 | 67.96 | 51.22 |
OpenLLM排行榜结果
模型规模 | ARC-c | CrowS-Pairs | HellaSwag | MMLU | PIQA | RACE | TruthfulQA | WinoGrande | 平均 |
---|---|---|---|---|---|---|---|---|---|
OpenELM-270M | 27.65 | 66.79 | 47.15 | 25.72 | 69.75 | 30.91 | 39.24 | 53.83 | 45.13 |
OpenELM-270M-Instruct | 32.51 | 66.01 | 51.58 | 26.70 | 70.78 | 33.78 | 38.72 | 53.20 | 46.66 |
OpenELM-450M | 30.20 | 68.63 | 53.86 | 26.01 | 72.31 | 33.11 | 40.18 | 57.22 | 47.69 |
OpenELM-450M-Instruct | 33.53 | 67.44 | 59.31 | 25.41 | 72.63 | 36.84 | 40.48 | 58.33 | 49.25 |
OpenELM-1_1B | 36.69 | 71.74 | 65.71 | 27.05 | 75.57 | 36.46 | 36.98 | 63.22 | 51.68 |
OpenELM-1_1B-Instruct | 41.55 | 71.02 | 71.83 | 25.65 | 75.03 | 39.43 | 45.95 | 64.72 | 54.40 |
OpenELM-3B | 42.24 | 73.29 | 73.28 | 26.76 | 78.24 | 38.76 | 34.98 | 67.25 | 54.35 |
OpenELM-3B-Instruct | 47.70 | 72.33 | 76.87 | 24.80 | 79.00 | 38.47 | 38.76 | 67.96 | 55.73 |
更多结果和对比请参考技术报告。
🔧 技术细节
模型训练
OpenELM模型使用 CoreNet 库进行预训练。预训练数据集包含RefinedWeb、去重后的PILE、RedPajama的一个子集以及Dolma v1.6的一个子集,总计约18万亿个标记。
评估设置
评估时需要安装特定的依赖项,并使用 lm-eval
工具进行评估。评估过程中需要注意一些参数的设置,例如 add_bos_token
等。
📄 许可证
本项目采用 apple-amlr 许可证。
⚠️ 重要提示
OpenELM模型基于公开可用的数据集进行训练,在发布时未提供任何安全保证。因此,这些模型可能会根据用户的提示生成不准确、有害、有偏见或令人反感的输出。用户和开发者必须进行全面的安全测试,并根据自身需求实施适当的过滤机制。
💡 使用建议
- 在使用预训练数据集之前,请仔细查看其许可协议和使用条款。
- 在获取Hugging Face访问令牌时,请参考 此链接。
- 在评估模型时,请确保按照文档中的步骤安装依赖项,并正确设置参数。
📚 引用
如果您觉得我们的工作有帮助,请引用以下文献:
@article{mehtaOpenELMEfficientLanguage2024,
title = {{OpenELM}: {An} {Efficient} {Language} {Model} {Family} with {Open} {Training} and {Inference} {Framework}},
shorttitle = {{OpenELM}},
url = {https://arxiv.org/abs/2404.14619v1},
language = {en},
urldate = {2024-04-24},
journal = {arXiv.org},
author = {Mehta, Sachin and Sekhavat, Mohammad Hossein and Cao, Qingqing and Horton, Maxwell and Jin, Yanzi and Sun, Chenfan and Mirzadeh, Iman and Najibi, Mahyar and Belenko, Dmitry and Zatloukal, Peter and Rastegari, Mohammad},
month = apr,
year = {2024},
}
@inproceedings{mehta2022cvnets,
author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad},
title = {CVNets: High Performance Library for Computer Vision},
year = {2022},
booktitle = {Proceedings of the 30th ACM International Conference on Multimedia},
series = {MM '22}
}



