DeepSeek-V2:强大、经济、高效的混合专家语言模型 github页面

DeepSeek-V2:强大、经济、高效的混合专家语言模型 github页面

DeepSeek-V2:强大、经济、高效的混合专家语言模型

1. 简介

今天我们来介绍 DeepSeek-V2,这是一个强大的混合专家 (MoE) 语言模型,具有训练经济、推理高效的特点。它总共包含 236B 参数,其中每个 token 激活 21B。与 DeepSeek 的 67B 相比,DeepSeek-V2 实现了更强的性能,同时节省了 42.5% 的训练成本,减少了 93.3% 的 KV 缓存,并将最大生成吞吐量提升至 5.76 倍。

我们在一个包含 8.1 万亿个 token 的多样化高质量语料库上对 DeepSeek-V2 进行了预训练。在进行全面的预训练之后,我们进行了监督微调 (SFT) 和强化学习 (RL),以充分发挥模型的功能。评估结果验证了我们方法的有效性,因为 DeepSeek-V2 在标准基准和开放式生成评估中都取得了出色的表现。

2. 新闻

  • 2024.05.16:我们发布了DeepSeek-V2-Lite。
  • 2024.05.06:我们发布了DeepSeek-V2。

3. 模型下载

模型#总参数#已激活参数上下文长度下载
DeepSeek-V2-Lite16B2.4B32千
DeepSeek-V2-精简版聊天 (SFT)16B2.4B32千
DeepSeek-V2236B21B128千
DeepSeek-V2-聊天(RL)236B21B128千

由于 HuggingFace 的限制,开源代码目前在使用 Huggingface 的 GPU 上运行时性能比我们的内部代码库慢。为了促进我们模型的高效执行,我们提供了专用的 vllm 解决方案,以优化性能以有效运行我们的模型。

4.评估结果

基础模型

标准基准(大于 67B 的模型)
基准领域LLaMA3 70B混合型 8x22BDeepSeek-V1(Dense-67B)DeepSeek-V2(MoE-236B)
莫尔曼·卢英语78.977.671.378.5
百比黑英语81.078.968.778.9
C-评估中国人67.558.666.181.7
加拿大蒙特利尔大学中国人69.360.070.884.0
人力评估代码48.253.145.148.8
马来西亚公共服务局代码68.664.257.466.6
GSM8K数学83.080.363.479.2
数学数学42.242.518.743.6
标准基准(小于 16B 的模型)
基准领域DeepSeek 7B(密集)DeepSeekMoE 16BDeepSeek-V2-Lite(MoE-16B)
建筑学-MHA+致密内政部+教育部立法会议员+教育部
莫尔曼·卢英语48.245.058.3
百比黑英语39.538.944.1
C-评估中国人45.040.660.3
加拿大蒙特利尔大学中国人47.242.564.3
人力评估代码26.226.829.9
马来西亚公共服务局代码39.039.243.2
GSM8K数学17.418.841.1
数学数学3.34.317.1

有关更多评估细节,例如小样本设置和提示,请查看我们的论文。

上下文窗口

(NIAH) 测试的评估结果Needle In A Haystack。DeepSeek-V2 在高达128K的所有上下文窗口长度上均表现良好。

聊天模型

标准基准(大于 67B 的模型)
基准领域QWen1.5 72B 聊天混合型 8x22BLLaMA3 70B 指导DeepSeek-V1 聊天 (SFT)DeepSeek-V2 聊天 (SFT)DeepSeek-V2 聊天(RL)
莫尔曼·卢英语76.277.880.371.178.477.8
百比黑英语65.978.480.171.781.379.7
C-评估中国人82.260.067.965.280.978.0
加拿大蒙特利尔大学中国人82.961.070.767.882.481.6
人力评估代码68.975.076.273.876.881.1
马来西亚公共服务局代码52.264.469.861.470.472.0
LiveCodeBench(0901-0401)代码18.825.030.518.328.732.5
GSM8K数学81.987.993.284.190.892.2
数学数学40.649.848.532.652.753.9
标准基准(小于 16B 的模型)
基准领域DeepSeek 7B 聊天 (SFT)DeepSeekMoE 16B 聊天 (SFT)DeepSeek-V2-Lite 16B 聊天 (SFT)
莫尔曼·卢英语49.747.255.7
百比黑英语43.142.248.1
C-评估中国人44.740.060.1
加拿大蒙特利尔大学中国人51.249.362.5
人力评估代码45.145.757.3
马来西亚公共服务局代码39.046.245.8
GSM8K数学62.662.272.0
数学数学14.715.227.9
英语开放式生成评估

我们在 AlpacaEval 2.0 和 MTBench 上评估了我们的模型,显示了 DeepSeek-V2-Chat-RL 在英语对话生成方面的竞争性能。

中国开放式世代评估

Alignbench()

项目开源/闭源总分中文中文
gpt-4-1106-预览8.017.738.29
DeepSeek-V2 聊天(RL)文化7.917.458.36
erniebot-4.0-202404 (文心一言)7.897.618.17
DeepSeek-V2 聊天 (SFT)文化7.747.308.17
gpt-4-06137.537.477.59
erniebot-4.0-202312 (文心一言)7.366.847.88
Moonshot-v1-32k-202404 (月之暗面)7.226.428.02
Qwen1.5-72B-Chat(通义千问)文化7.196.457.93
DeepSeek-67B-聊天文化6.435.757.11
Yi-34B-Chat (零一万物)文化6.124.867.38
GPT-3.5-涡轮-06136.085.356.71
DeepSeek-V2-Lite 16B 聊天文化6.014.717.32
编码基准

我们在 LiveCodeBench (0901-0401) 上评估了我们的模型,这是一个专为实时编码挑战而设计的基准。如图所示,DeepSeek-V2 在 LiveCodeBench 中表现出了相当高的熟练度,获得了超越其他几个复杂模型的 Pass@1 分数。这一表现凸显了该模型在处理实时编码任务方面的有效性。

5.模型架构

DeepSeek-V2 采用创新架构,保证经济的训练和高效的推理:

  • 对于注意力,我们设计了 MLA(多头潜在注意力),它利用低秩键值联合压缩来消除推理时间键值缓存的瓶颈,从而支持高效推理。
  • 对于前馈网络(FFN),我们采用 DeepSeekMoE 架构,这是一种高性能 MoE 架构,能够以更低的成本训练更强大的模型。

6. 聊天网站

您可以在DeepSeek的官方网站上与DeepSeek-V2聊天:

7. API 平台

我们还在 DeepSeek 平台上提供与 OpenAI 兼容的 API:。注册即可获得数百万个免费代币。您还可以以无与伦比的价格按使用量付费。

8. 如何在本地运行

要利用 BF16 格式的 DeepSeek-V2 进行推理,需要 80GB*8 GPU。

使用 Huggingface 的 Transformers 进行推理

您可以直接使用进行模型推理。

文本完成   import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig model_name = "deepseek-ai/DeepSeek-V2" tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) # `max_memory` should be set based on your devices max_memory = {i: "75GB" for i in range(8)} # `device_map` cannot be set to `auto` model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True, device_map="sequential", torch_dtype=torch.bfloat16, max_memory=max_memory, attn_implementation="eager") model.generation_config = GenerationConfig.from_pretrained(model_name) model.generation_config.pad_token_id = model.generation_config.eos_token_id text = "An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is" 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-V2-Chat" tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) # `max_memory` should be set based on your devices max_memory = {i: "75GB" for i in range(8)} # `device_map` cannot be set to `auto` model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True, device_map="sequential", torch_dtype=torch.bfloat16, max_memory=max_memory, attn_implementation="eager") model.generation_config = GenerationConfig.from_pretrained(model_name) model.generation_config.pad_token_id = model.generation_config.eos_token_id messages = [ {"role": "user", "content": "Write a piece of quicksort code in C++"} ] 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)

完整的聊天模板可以在tokenizer_config.jsonhuggingface 模型库中找到。

聊天模板示例如下:  <|begin▁of▁sentence|>User: {user_message_1} Assistant: {assistant_message_1}<|end▁of▁sentence|>User: {user_message_2} Assistant:

您还可以添加可选的系统消息:  <|begin▁of▁sentence|>{system_message} User: {user_message_1} Assistant: {assistant_message_1}<|end▁of▁sentence|>User: {user_message_2} Assistant:

使用 vLLM 进行推理(推荐)

要利用进行模型推理,请将此 Pull Request 合并到您的 vLLM 代码库中:。  from transformers import AutoTokenizer from vllm import LLM, SamplingParams max_model_len, tp_size = 8192, 8 model_name = "deepseek-ai/DeepSeek-V2-Chat" tokenizer = AutoTokenizer.from_pretrained(model_name) llm = LLM(model=model_name, tensor_parallel_size=tp_size, max_model_len=max_model_len, trust_remote_code=True, enforce_eager=True) sampling_params = SamplingParams(temperature=0.3, max_tokens=256, stop_token_ids=[tokenizer.eos_token_id]) messages_list = [ [{"role": "user", "content": "Who are you?"}], [{"role": "user", "content": "Translate the following content into Chinese directly: DeepSeek-V2 adopts innovative architectures to guarantee economical training and efficient inference."}], [{"role": "user", "content": "Write a piece of quicksort code in C++."}], ] prompt_token_ids = [tokenizer.apply_chat_template(messages, add_generation_prompt=True) for messages in messages_list] 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)

LangChain 支持

由于我们的 API 与 OpenAI 兼容,您可以轻松地在中使用它。以下是一个例子:

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
    model='deepseek-chat',
    openai_api_key=<your-deepseek-api-key>,
    openai_api_base='https://api.deepseek.com/v1',
    temperature=0.85,
    max_tokens=8000)
</code></span></span></span></span>

9. 许可

本代码库遵循。DeepSeek-V2 Base/Chat 模型的使用受约束。DeepSeek-V2 系列(包括 Base 和 Chat)支持商业使用。

10. 引用

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>@misc{deepseekv2,
      title={DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model}, 
      author={DeepSeek-AI},
      year={2024},
      eprint={2405.04434},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}
</code></span></span></span></span>

11. 联系方式

如果您有任何疑问,请提出问题或通过联系我们。

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk