1. 简介
DeepSeek LLM 是一个拥有670亿参数的先进语言模型。它在包含2万亿个英文和中文词元的庞大数据集上从头开始训练。为了促进研究,我们已经向研究社区开源了DeepSeek LLM 7B/67B Base和DeepSeek LLM 7B/67B Chat模型。
-
卓越的通用能力: DeepSeek LLM 67B Base在推理、编程、数学和中文理解等领域的表现优于Llama2 70B Base。
-
精通编程和数学: DeepSeek LLM 67B Chat在编程(HumanEval Pass@1: 73.78)和数学(GSM8K 零样本: 84.1,Math 零样本: 32.6)方面表现出色。它还展示了出色的泛化能力,在匈牙利全国高中考试中取得了65分的优异成绩。
-
精通中文: 根据我们的评估,DeepSeek LLM 67B Chat在中文方面的表现超过了GPT-3.5。
2. 模型下载
我们向公众发布了DeepSeek LLM 7B/67B,包括基础模型和聊天模型。为了支持学术和商业社区更广泛、更多样化的研究,我们提供了基础模型训练过程中的中间检查点。请注意,使用本模型需遵守许可部分中列出的条款。这些条款允许商业用途。
Huggingface
模型 | 序列长度 | 下载 |
---|---|---|
DeepSeek LLM 7B Base | 4096 | 🤗 HuggingFace |
DeepSeek LLM 7B Chat | 4096 | 🤗 HuggingFace |
DeepSeek LLM 67B Base | 4096 | 🤗 HuggingFace |
DeepSeek LLM 67B Chat | 4096 | 🤗 HuggingFace |
中间检查点
我们在AWS S3(简单存储服务)上托管了DeepSeek LLM 7B/67B的中间检查点。可以使用AWS命令行界面(CLI)下载这些文件。
# 使用AWS CLI
# DeepSeek-LLM-7B-Base
aws s3 cp s3://deepseek-ai/DeepSeek-LLM/DeepSeek-LLM-7B-Base <本地路径> --recursive --request-payer
# DeepSeek-LLM-67B-Base
aws s3 cp s3://deepseek-ai/DeepSeek-LLM/DeepSeek-LLM-67B-Base <本地路径> --recursive --request-payer
3. 评估结果
基础模型
我们在一系列具有代表性的英文和中文基准测试上评估了我们的模型和一些基线模型。更多结果可以在evaluation
文件夹中找到。在这部分,我们报告的评估结果基于内部的、非开源的hai-llm评估框架。请注意,使用转换后的HuggingFace模型时可能会有轻微的差异。
模型 | Hella Swag | Trivia QA | MMLU | GSM8K | Human Eval | BBH | CEval | CMMLU | 中文 问答 |
---|---|---|---|---|---|---|---|---|---|
零样本 | 五样本 | 五样本 | 八样本 | 零样本 | 三样本 | 五样本 | 五样本 | 五样本 | |
LLaMA-2 -7B | 75.6 | 63.8 | 45.8 | 15.5 | 14.6 | 38.5 | 33.9 | 32.6 | 21.5 |
LLaMA-2 -70B | 84.0 | 79.5 | 69.0 | 58.4 | 28.7 | 62.9 | 51.4 | 53.1 | 50.2 |
DeepSeek LLM 7B 基础版 | 75.4 | 59.7 | 48.2 | 17.4 | 26.2 | 39.5 | 45.0 | 47.2 | 78.0 |
DeepSeek LLM 67B 基础版 | 84.0 | 78.9 | 71.3 | 63.4 | 42.7 | 68.7 | 66.1 | 70.8 | 87.6 |
注意: 中文问答是一个内部基准测试,灵感来自TriviaQA。
对话模型
全新考试
为解决数据污染和针对特定测试集进行调优的问题,我们设计了全新的问题集来评估开源LLM模型的能力。评估结果表明,DeepSeek LLM 67B 对话模型在从未见过的考试中表现出色。
匈牙利国家高中考试: 与Grok-1一致,我们使用匈牙利国家高中考试评估了模型的数学能力。该考试包含33个问题,模型的分数通过人工标注确定。我们遵循solution.pdf中的评分标准来评估所有模型。
备注: 我们修正了初次评估中的一个错误。在这个修订版中,我们省略了第16、17、18题以及上述图片的最低分。评估详情可在此处查看。
指令遵循评估: 2023年11月15日,谷歌发布了一个指令遵循评估数据集。他们确定了25种可验证的指令类型,并构建了约500个提示,每个提示包含一个或多个可验证的指令。我们使用提示级别的宽松指标来评估所有模型。在这里,我们使用谷歌发布的第一个版本进行评估。对于谷歌修订测试集的评估结果,请参考我们论文中的数字。
LeetCode周赛: 为评估模型的编码能力,我们使用了LeetCode周赛的问题(第351-372周周赛,第108-117双周赛,从2023年7月到2023年11月)。我们通过爬取LeetCode的数据获得了这些问题,共126个问题,每个问题有超过20个测试用例。评估指标类似于HumanEval。如果模型的输出成功通过所有测试用例,则认为模型有效解决了该问题。模型的编码能力如下图所示,其中y轴表示领域内人工评估测试的pass@1得分,x轴表示领域外LeetCode周赛问题的pass@1得分。
具体问题和测试用例将很快发布。敬请期待!
标准基准测试
模型 | TriviaQA | MMLU | GSM8K | HumanEval | BBH | C-Eval | CMMLU | 中文问答 |
---|---|---|---|---|---|---|---|---|
DeepSeek LLM 7B 基础版 | 59.7 | 48.2 | 17.4 | 26.2 | 39.5 | 45.0 | 47.2 | 78.0 |
DeepSeek LLM 67B 基础版 | 78.9 | 71.3 | 63.4 | 42.7 | 68.7 | 66.1 | 70.8 | 87.6 |
DeepSeek LLM 7B 对话版 | 57.9 | 49.4 | 62.6 | 48.2 | 42.3 | 47.0 | 49.7 | 75.0 |
DeepSeek LLM 67B 对话版 | 81.5 | 71.1 | 84.1 | 73.8 | 71.7 | 65.2 | 67.8 | 85.1 |
注意: 我们对MMLU、GSM8K、C-Eval和CMMLU的对话模型进行零样本评估。更多评估结果可在此处找到。
重新审视多选题基准测试
根据我们的实验观察,我们发现使用多选题(MC)提高基准测试性能(如MMLU、CMMLU和C-Eval)是一项相对简单的任务。通过纳入中国考试的多选题,我们取得了出色的结果,如下表所示:
模型 | MMLU | C-Eval | CMMLU |
---|---|---|---|
DeepSeek LLM 7B 对话版 | 49.4 | 47.0 | 49.7 |
DeepSeek LLM 7B 对话版 + MC | 60.9 | 71.3 | 73.8 |
注意:+MC 表示增加了从网络上收集的 2000 万道中文多选题。需要注意的是,我们对 C-Eval 验证集和 CMMLU 测试集进行了去重,以防止数据污染。这一增加不仅改善了中文多选题基准,还提高了英语基准的表现。然而,我们观察到在 7B 设置下,它并未提升模型在其他非多选题形式评估上的知识表现。因此,我们决定在预训练或微调过程中不纳入 MC 数据,因为这会导致在基准测试上过拟合。 |
4. 预训练详情
数据
我们的主要目标是全面提升数据集的丰富性和多样性。为实现这一目标,我们实施了多种方法,并建立了一个名为"cc_cleaner"的分布式、频繁检查点批处理系统,以加强我们的数据管道。
我们的最小可行解决方案从 RefinedWeb + CCNet 出发。我们非常感谢他们对 AGI 研究的无私奉献。
我们还在数据管道中大量引入了确定性随机化。这种方法使我们能够在漫长且难以预测的训练过程中持续改进我们的数据。
-
数据组成:我们的训练数据包括多样化的互联网文本、数学、代码、书籍以及尊重 robots.txt 的自收集数据。除了多样化的内容外,我们还高度重视个人隐私和版权保护。所有包含个人信息或受版权限制的内容都已从我们的数据集中移除。
-
数据集修剪:我们的系统采用启发式规则和模型来优化训练数据。我们的过滤过程去除低质量的网络数据,同时保留宝贵的低资源知识。它旨在提高整体语料库质量并移除有害或有毒内容。
-
去重:我们先进的去重系统使用 MinhashLSH,严格地在文档和字符串级别上去除重复内容。这一严格的去重过程确保了卓越的数据唯一性和完整性,这在大规模数据集中尤为重要。
预训练
DeepSeek LM 模型使用与 LLaMA 相同的架构,即自回归 transformer 解码器模型。7B 模型使用多头注意力(MHA),而 67B 模型使用分组查询注意力(GQA)。
我们在一个包含 2 万亿个标记的庞大数据集上预训练了 DeepSeek 语言模型,序列长度为 4096,使用 AdamW 优化器。7B 模型的训练使用了 2304 的批量大小和 4.2e-4 的学习率,67B 模型则使用了 4608 的批量大小和 3.2e-4 的学习率。我们在训练过程中采用多步学习率计划。学习率从 2000 步的预热开始,然后在 1.6 万亿个标记时降至最大值的 31.6%,在 1.8 万亿个标记时降至最大值的 10%。
我们公布了训练损失曲线和几个基准指标曲线,详见下图。
5. 快速开始
安装
在 Python >= 3.8 的环境基础上,通过运行以下命令安装必要的依赖:
pip install -r requirements.txt
使用 Huggingface 的 Transformers 进行推理
你可以直接使用 Huggingface 的 Transformers 进行模型推理。
文本补全
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
model_name = "deepseek-ai/deepseek-llm-67b-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto")
model.generation_config = GenerationConfig.from_pretrained(model_name)
model.generation_config.pad_token_id = model.generation_config.eos_token_id
text = "注意力函数可以被描述为将一个查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。这个输出是"
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs.to(model.device), max_new_tokens=100)
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(result)
对话补全
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
model_name = "deepseek-ai/deepseek-llm-67b-chat"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto")
model.generation_config = GenerationConfig.from_pretrained(model_name)
model.generation_config.pad_token_id = model.generation_config.eos_token_id
messages = [
{"role": "user", "content": "你是谁?"}
]
input_tensor = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt")
outputs = model.generate(input_tensor.to(model.device), max_new_tokens=100)
result = tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokens=True)
print(result)
如果不使用提供的 apply_chat_template
函数,你也可以按照示例模板与我们的模型交互。注意,messages
应该替换为你的输入。
User: {messages[0]['content']}
A: {messages[1]['content']}<|end▁of▁sentence|>User: {messages[2]['content']}
A:
注意: 默认情况下(add_special_tokens=True
),我们的分词器会自动在输入文本前添加一个 bos_token
(<|begin▁of▁sentence|>
)。此外,由于系统提示与此版本的模型不兼容,我们不建议在输入中包含系统提示。
使用 vLLM 进行推理
你也可以使用 vLLM 进行高吞吐量推理。
文本补全
from vllm import LLM, SamplingParams
tp_size = 4 # 张量并行度
sampling_params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=100)
model_name = "deepseek-ai/deepseek-llm-67b-base"
llm = LLM(model=model_name, trust_remote_code=True, gpu_memory_utilization=0.9, tensor_parallel_size=tp_size)
prompts = [
"如果一个国家里的每个人都彼此相爱,",
"研究还应该关注哪些技术",
"为了确定标签是否正确,我们需要"
]
outputs = llm.generate(prompts, sampling_params)
generated_text = [output.outputs[0].text for output in outputs]
print(generated_text)
对话补全
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
tp_size = 4 # 张量并行度
sampling_params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=100)
model_name = "deepseek-ai/deepseek-llm-67b-chat"
tokenizer = AutoTokenizer.from_pretrained(model_name)
llm = LLM(model=model_name, trust_remote_code=True, gpu_memory_utilization=0.9, tensor_parallel_size=tp_size)
messages_list = [
[{"role": "user", "content": "你是谁?"}],
[{"role": "user", "content": "你能做什么?"}],
[{"role": "user", "content": "简要解释一下Transformer。"}],
]
# 避免重复添加bos_token
prompt_token_ids = [tokenizer.apply_chat_template(messages, add_generation_prompt=True) for messages in messages_list]
sampling_params.stop = [tokenizer.eos_token]
outputs = llm.generate(prompt_token_ids=prompt_token_ids, sampling_params=sampling_params)
generated_text = [output.outputs[0].text for output in outputs]
print(generated_text)
6. 常见问题
您能提供用于模型量化的tokenizer.model文件吗?
DeepSeek LLM使用HuggingFace Tokenizer来实现字节级BPE算法,并设计了特殊的预分词器以确保最佳性能。目前没有直接的方法将tokenizer转换为SentencePiece tokenizer。我们正在为开源量化方法做出贡献,以便使用HuggingFace Tokenizer。
GGUF(llama.cpp)
我们已向流行的量化仓库llama.cpp提交了一个PR,以全面支持所有HuggingFace预分词器,包括我们的。
在等待PR合并的同时,您可以按照以下步骤生成GGUF模型:
git clone https://github.com/DOGEwbx/llama.cpp.git
cd llama.cpp
git checkout regex_gpt2_preprocess
# 根据README设置环境
make
python3 -m pip install -r requirements.txt
# 生成GGUF模型
python convert-hf-to-gguf.py <MODEL_PATH> --outfile <GGUF_PATH> --model-name deepseekllm
# 以q4_0量化为例
./quantize <GGUF_PATH> <OUTPUT_PATH> q4_0
./main -m <OUTPUT_PATH> -n 128 -p <PROMPT>
GPTQ(exllamav2)
更新:
exllamav2现在已经能够支持HuggingFace Tokenizer。请拉取最新版本并尝试。
GPU内存使用
我们在不同批量大小和序列长度设置下,对7B和67B模型的推理峰值内存使用进行了分析。
对于DeepSeek LLM 7B,我们使用1块NVIDIA A100-PCIE-40GB GPU进行推理。
批量大小 | 序列长度 | ||||
---|---|---|---|---|---|
256 | 512 | 1024 | 2048 | 4096 | |
1 | 13.29 GB | 13.63 GB | 14.47 GB | 16.37 GB | 21.25 GB |
2 | 13.63 GB | 14.39 GB | 15.98 GB | 19.82 GB | 29.59 GB |
4 | 14.47 GB | 15.82 GB | 19.04 GB | 26.65 GB | 内存不足 |
8 | 15.99 GB | 18.71 GB | 25.14 GB | 35.19 GB | 内存不足 |
16 | 19.06 GB | 24.52 GB | 37.28 GB | 内存不足 | 内存不足 |
对于DeepSeek LLM 67B,我们使用8块NVIDIA A100-PCIE-40GB GPUs进行推理。
批量大小 | 序列长度 | ||||
---|---|---|---|---|---|
256 | 512 | 1024 | 2048 | 4096 | |
1 | 16.92 GB | 17.11 GB | 17.66 GB | 20.01 GB | 33.23 GB |
2 | 17.04 GB | 17.28 GB | 18.55 GB | 25.27 GB | 内存不足 |
4 | 17.20 GB | 17.80 GB | 21.28 GB | 33.71 GB | 内存不足 |
8 | 17.59 GB | 19.25 GB | 25.69 GB | 内存不足 | 内存不足 |
16 | 18.17 GB | 21.69 GB | 34.54 GB | 内存不足 | 内存不足 |
7. 局限性
尽管DeepSeek LLMs展示了令人印象深刻的能力,但它们也并非没有局限性。以下是这类模型的一些潜在缺点:
-
过度依赖训练数据:这些模型是在大量文本数据上训练的,可能会引入数据中存在的偏见。它们可能无意中生成有偏见或歧视性的回应,反映了训练数据中普遍存在的偏见。
-
幻觉:模型有时会生成听起来合理但事实上不正确或缺乏支持的回应。当模型过度依赖从训练数据中学到的统计模式时,即使这些模式与现实世界的知识或事实不符,也可能发生这种情况。
-
重复:模型可能在生成的回应中出现重复。这种重复可以以各种方式表现,如重复某些短语或句子、生成冗余信息,或在生成的文本中产生重复的结构。这个问题可能使LLMs的输出不够多样化,对用户的吸引力也较低。
8. 许可证
本代码仓库采用MIT许可证。DeepSeek LLM Base/Chat模型的使用受模型许可证约束。DeepSeek LLM系列(包括Base和Chat)支持商业使用。
9. 引用
@article{deepseek-llm,
author = {DeepSeek-AI},
title = {DeepSeek LLM: Scaling Open-Source Language Models with Longtermism},
journal = {arXiv preprint arXiv:2401.02954},
year = {2024},
url = {https://github.com/deepseek-ai/DeepSeek-LLM}
}
10. 联系方式
如果您有任何问题,请提出issue或通过service@deepseek.com联系我们。