使用 Hugging Face / Transformers 运行 DeepSeek

2025年4月23日 | 阅读9分钟

如今,大多数用户在本地实现 DeepSeek 时,会使用 Ollama 等工具进行快速简便的部署。虽然这些工具集都非常用户友好且操作速度快,但它们通常会带来各种限制,其中之一就是**缺乏微调模型的灵活性**。

Running DeepSeek with Hugging Face / Transformers

在本教程中,我们将介绍如何使用**Hugging Face 的 transformers**,在**中端游戏笔记本电脑**上轻松地将 **DeepSeek 本地实现**,该笔记本电脑拥有**20GB 的 GPU 内存**。由于消费级 GPU 的内存限制,我们通常会使用**8 位量化**。

我们还将介绍**不同级别的交互**(在本地 LLM 的帮助下)、**量化技术**及其在内存优化方面的重要性,然后深入探讨**微调**的过程。我们还将使用 **Hugging Face** 来加载 DeepSeek 模型并在本地进行交互。

量化及其对内存优化的重要性

俗话说,PC 上的 GPT 比手机上的“**更聪明**”。这是因为我们使用了**量化技术**。

Running DeepSeek with Hugging Face / Transformers

此外,当我们在较小的 硬件 上运行大量语言模型时,我们遇到的最大挑战之一是将所有数据装入有限的 **GPU 内存**。

“**量化是主要降低模型权重的技术,以便使其在内存方面更有效。**”此外,通过将权重从**32 位**转换为**8 位整数**,用户现在可以有效地减小模型的尺寸和处理器的速度,从而使其能够在功耗较低的设备上运行。

现在,让我们将量化视为**丢弃小数**。这就像手机变成了一个**便携计算器**,但仍然可以得到准确的答案,只是忽略了一些细节。大量的模型也会缩小,因此它们完全能够装入较小的设备,并且当我们需要的计算能力更多时,优化后的模型可以有效地利用云。

针对这一限制,我们将对 **DeepSeek 模型**应用 8 位量化,使其能够在配备**20GB GPU** 存储的消费级笔记本电脑上流畅运行。这种方法使我们无需高端硬件即可与大量模型进行交互,我们还可以使用此技术优化类似设置下的其他模型。

如何轻松地与 DeepSeek 和本地 LLM 进行交互?

众所周知,通过利用六种有效的技术,可以轻松地与 DeepSeek 和本地 LLM 进行交互,并且通常有不同级别的本地 LLM 交互,例如 DeepSeek、Llama、Mistral 等。

Running DeepSeek with Hugging Face / Transformers
  1. **无代码或低代码工具(如 Ollama 和 DeepSeek ML Studio)**:“拖放,然后部署到行动中。”这有效地简化了各种非技术用户的 AI 使用,并且也非常适合快速原型开发。
  2. **高级库(例如 Hugging Face Transformers):“即插即用 AI。”**它负责在易用性和定制性之间取得平衡,非常适合快速模型部署和微调。
  3. **专用推理工具(例如 SGLang、vLLM - Visual Large Language Model、TensorRT)**:“AI 加速。”它通常负责提供高速度、高效率推理的优化,支持批处理和硬件加速。
  4. **直接模型访问(内部代码)**:“幕后思考。”它主要需要深入的架构知识,并可以以复杂性为代价提供完全的定制。
  5. **低级语言(例如 C++、Rust)**:“裸机性能。”它们提供对性能和内存的直接控制,这对于自定义 AI 管道至关重要。
  6. **CUDA 以外(例如 PTX、Assembly)**:“硅层面的 AI。”极端的硬件调优以实现最佳效率,广泛用于前沿 AI 优化。

不同的技能集及其用例

我们大多数人现在将在前三个级别与本地 LLM 进行交互。尽管如此,其余级别更适合特定的专家或 LLM 提供商的内部人员。例如,为了应对各种 GPU 限制,**DeepSeek 团队**深入到 CUDA(Nvidia 的 软件)之下,深入到 **PTX 层**,以从旧的 GPU 芯片中榨取更多性能,从而在不失败的情况下满足所需的成果。

从 HuggingFace 下载并加载模型。

要有效地下载模型,我们必须访问 **https://hugging-face.cn/deepseek-ai/DeepSeek-R1** 这个 **URL**,在那里我们可以找到我们想要下载的特定模型。

Running DeepSeek with Hugging Face / Transformers

在本节中,我们决定选择最小的选项:**精简模型**,仅包含**15 亿个参数**。精简模型通常体积更小,并且被认为是复杂 AI 模型的快速版本,可以有效地保留关键信息。

因此,为了有效地从 **HuggingFace** 下载模型,我们必须安装 **PyTorch**(由 Meta 开发)和 **Transformers**(由 Hugging Face 开发)。一旦安装了软件,我们就可以设置我们的“**项目目录**”和“**虚拟环境**”,并运行以下代码集:

代码


Running DeepSeek with Hugging Face / Transformers

尽管如此,在 **.env 文件**中保存 **hugging face API 密钥**和模型名称都很重要。

加载模型非常简单

代码

通过编写上述代码集,它将自动加载与模型名称相关的预训练**因果语言模型**。如果是第一次,它会**下载**并**加载**模型。但是,它不像我们安装 Python 包那样进行安装。**模型在首次下载后会在本地缓存,以便后续更快地使用。**只要我们不清除缓存,我们就无需导入它。

依赖关系

代码

这负责加载具有 8 位量化配置的模型和分词器,以优化内存使用和推理性能。

该函数将根据环境变量动态加载模型和分词器。

它还将配置模型以进行 8 位量化,这将减少内存占用并加快推理速度,同时还可以通过“llm_int8_threshold”灵活地控制量化模型的程度。

量化主要通过使用 `BitsAndBytesConfig` 来完成

- `load_in_8bit=True` 确保模型权重以 8 位精度 (INT8) 加载,

从而减少模型的内存需求。

- `llm_int8_threshold=6.0` 指定了应用 8 位量化的阈值。

幅度大于此阈值的权重将被量化为 8 位精度,

而较小的权重可能会保留在更高的精度中以保持准确性。

模型加载方式还可以使其自动在 CPU

和 GPU 资源之间进行平衡。

返回值

元组:分词器和模型对象。

"""

此外,相应的函数从 Hugging Face 加载 DS 模型及其对应的分词器,然后将其配置为优化的 8 位量化,以提高内存和推理性能。

**模型名称**使用 dotenv 库从**.env 文件**加载(.env 文件私密保存 API 密钥、其他凭证、模型名称等)。

代码

开源 LLM 的分词器比 Anthropic 或 OpenAI 等云 LLM 的分词器稍微复杂一些。

  1. 它将输入文本转换为模型易于理解的 token——单词、子词,甚至根据分词器的不同方法,可能还包括不同的字符。
  2. 然后,它将所有这些 token 映射到 token ID。这些 token ID 是唯一的整数,代表模型词汇表中每个 token(此处,由于我们正在使用相应的**Hugging Face 的分词器**,它就是 HF 的词汇表)。

尽管如此,如果需要,我们也可以使用自己的自定义分词器,但 Hugging Face AutoTokenizer 使加载变得容易。

量化配置

模型主要通过集体使用 BitsAndBytesConfig 进行 8 位量化配置:load_in_8bit=True,这确保了模型权重以 8 位精度 (INT8) 加载。这将减少模型的内存占用,但会加快推理速度。

  • **llm_int8_threshold=6.0** 主要指定一个阈值。
  • **Llm_int8_threshold** 负责控制应用 int8 量化时的粒度级别。

考虑的值在**1.0 到 10.0** 的范围内,但对于某些特定模型或用例,它也可能被设置为更低或更高的值。例如:

  1. 阈值为 1.0 可能导致非常激进的量化,这意味着几乎所有的权重和激活都将被量化为 8 位精度。
  2. 阈值为 10.0 可能导致非常温和的量化,其中只有最大的权重(幅度大于 10.0 的权重)通常被量化为 8 位精度,而其他权重则保留在更高的精度(例如 16 位或 32 位)。
  3. 通常,6.0 的阈值意味着幅度大于 6.0 的权重可以轻松地量化为 8 位精度,而较小的权重可能会保留在更高的精度(例如 16 位或 32 位),以在需要时保持准确性。

加载模型

模型通过 AutoModelForCausalLM.from_pretrained (model_name, ...) 加载。AutoModelForCausalLM 是 Transformers 中用于加载开源**LLM**模型的首选类。大多数 Python 用户仅使用此项。

device_map

**device_map="auto"** 选项通常确保模型根据可用性动态地跨 CPU 和 GPU 资源加载,从而优化计算效率(即,将 90% 的负载放在 GPU 上)。然后将量化配置 (quantization_config) 传递给模型以应用指定的 8 位量化。

一旦模型和分词器加载完成,该函数将返回一个元组(分词器,模型)。然后,这些可以在各种后续代码中使用以生成响应或有效地进行模型微调。

生成响应

此特定函数通常是查询 LLM 和生成响应的核心代码。Hugging Face 的 model.generate 比 chat.completions(我们可以轻松使用 OpenAI 中的各种 LLM API 调用)或 message.create(在 Anthropic 中)要手动得多。

Code Example


Running DeepSeek with Hugging Face / Transformers
Running DeepSeek with Hugging Face / Transformers
Running DeepSeek with Hugging Face / Transformers
Running DeepSeek with Hugging Face / Transformers

关键参数和参数

使用的各种关键参数和参数如下:

  • 'prompt':用户需要在此处输入文本。
  • 'tokenizer' 用于将输入文本转换为 token(token ID)。
  • 'model':用于生成有效响应的语言模型。
  • 'max_length':用于有效地限制响应长度。
  • 'temperature' 可用于控制输出的随机性——较高的值表示更具创造性,较低的值表示更具可预测性(限制了可能的 token 选择数量)。
  • 'top_k' 主要负责将 token 选择限制在前 k 个最可能的选项。
  • 'top_p':由相应的 nucleus sampling 使用,以有效地动态选择 token,直到达到累积概率阈值。
  • do_sample:模型在文本生成的每一步都会考虑多个可能的选项(token),并根据其概率选择一个。