DeepSeek 中使用自定义数据集进行微调

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

有句名言说得好,DeepSeek 颠覆了人工智能格局,通过推出一系列先进的推理模型,挑战了 OpenAI 的主导地位。最重要的是,使用所有这些模型的好处是它们可以免费使用,几乎没有任何限制,因此每个人都可以轻松访问。

在 DeepSeek 中使用自定义数据集进行微调是使预训练模型更好地满足我们特定需求的强大方法。尽管需要从头开始,但我们可以轻松地采用一个已在大型通用数据集上训练过的现有模型,并通过为其提供与我们特定任务或行业相关的相关信息来改进它。这个过程有助于模型学习我们数据中的独特模式和细节,从而使其预测更加准确和可靠。

现在假设我们已经集成了一个经过训练以识别各种动物图像的模型。如果我们想要它识别特定的犬种,在这种情况下,我们可以轻松地使用与犬类模型相关的图像数据集对其进行微调。 模型不需要从头开始学习所有内容;它只需根据我们的新数据调整其理解。

DeepSeek 通过其灵活性和高效平台使这一过程变得容易。我们可以上传我们的自定义数据集,系统将处理繁重的工作——调整模型参数以有效地适应我们的数据。这主要用于医疗保健、金融或营销行业,因为专业数据可以极大地影响模型性能。而且,通过微调,我们通常会得到一个非常适合我们实际需求的模型。这非常类似于给婴儿喂食,并提供准确的食物知识。无论我们处理文本、图像还是其他类型的数据,DeepSeek 都能帮助我们创建能够提供真实、定制化结果的模型。

在本教程中,我们将学习如何在“Hugging Face 的医疗链式思维数据集”上微调 DeepSeek-R1-Distill-Llama-8B 模型,尽管 Distilled DeepSeek-R1 模型是通过在 DeepSeek-R1 的帮助下生成的数据上微调 Llama 3.1 8B 模型创建的。它还展示了与原始模型类似的推理能力。

“DeepSeek-R1”一词是什么意思?

DeepSeek-R1 是下一代“推理优先”人工智能模型,旨在通过专注于其得出有效结论的方式来超越各种传统的语言模型。尽管如此,DeepSeek-R1 及其前身 DeepSeek-R1-Zero 都是使用大规模强化学习 (RL) 技术构建的。它们分别强调透明度、数学能力和逻辑一致性。

Fine-Tuning with Custom Datasets in DeepSeek

此外,在 GPU 上托管模型以进行实时应用仍然需要大量的集群和足够的 VRAM-DeepSeek。例如,它在近 300 个 H100 GPU 上运行效果最佳。与密集模型相比,MoE 架构被认为对于CPU 的批处理更加可行。

此外,它的方法基本上结合了无需人工干预的强化学习、多词预测以及辅助的无损负载均衡,从而提高了性能,同时有效地最小化了计算开销。

阐述“DeepSeek-R1-Zero”一词?

在这个现代世界,“DeepSeek-R1-Zero”主要被认为是创新的开源模型,它之所以脱颖而出,是因为它从一开始就使用大规模强化学习 (RL) 进行训练,并且没有依赖于监督微调 (SFT) 作为初始步骤。这是传统人工智能训练方法的一个重大转变,在这些方法中,模型通常首先在标记数据上进行训练,然后高效地针对我们的特定任务进行微调。

然而,使用 RL 的关键优势在于模型通过试错来学习,这使它能够探索和开发自己的推理过程。这有助于它进行批判性思考、解决复杂问题并随着时间的推移改进其响应。

DeepSeek 蒸馏

大量语言模型在运行时需要大量的计算能力和内存。在这种情况下,DeepSeek 推出了蒸馏模型。然而,这些更小、更高效的模型已被证明能够以高效的方式实现出色的性能。此模型的模型参数范围主要为 1.5B 到 70B 参数。

轻松微调 DeepSeek R1 的分步指南

在本节中,我们将介绍微调 DeepSeek R1 模型可用的步骤,尽管如此,我们现在可以遵循以下步骤来理解该过程。

步骤 1:设置模型

对于这个项目,我们将积极使用 Kaggle 作为我们的云 IDE,因为它主要提供免费的 GPU 访问权限,而 GPU 通常比“Google Colab”中可用的 GPU 更强大。为了开始,我们将启动一个新的 Kaggle Notebook,然后需要将我们的Hugging Face Token 和 Weights & Biases Token 添加为 secret。

我们还可以通过导航到 Kaggle Notebook 界面中的“Add-ons”选项卡并选择“Secrets”选项来添加 secret。

设置完 secret 后,我们将安装 Unsloth Python 包。通常,“Unsloth”被定义为一个开源框架,旨在以 2 倍的速度微调大型语言模型 (LLM),并且在内存效率方面表现出色。

代码


Fine-Tuning with Custom Datasets in DeepSeek

说明

我们代码中包含的用于微调模型的代码使用 Jupyter Notebook 的魔术命令来安装名为 unsloth 的 Python 包。以下是详细说明:

  • %%capture:这是一个 Jupyter Notebook 单元格魔术命令,主要捕获单元格的输出,从而防止其显示。它对于有效隐藏安装日志非常有用。
  • !pip install unsloth:但是,在这个命令中,我们使用 pip 从 Python 包索引 (PyPI) 中安装 unsloth 包。
  • !pip install --force-reinstall --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git:此命令将直接从 GitHub 存储库安装 unsloth 包。尽管如此,此处使用的标志是:
  • --force-reinstall:即使软件包已安装在我们的工作系统中,也会重新安装该软件包。
  • --no-cache-dir:它主要负责阻止用户使用缓存,从而确保获取最新版本。
  • --no-deps:跳过安装依赖项,假设它们已经满足。

通常,代码旨在确保首先从 PyPI 然后直接从 GitHub 存储库安装最新版本的 unsloth 包,同时有效抑制输出。

之后,我们将使用从 Kaggle Secrets 安全提取的相应 Hugging Face API 登录 Hugging Face CLI。

代码


Fine-Tuning with Custom Datasets in DeepSeek

代码解释

此部分使用上述代码片段通过 secret token(通常存储在 Kaggle 中)使用户与 Hugging Face Hub 进行身份验证。

1. 导入

  • 从 respective huggingface_hub import login:我们将从 Hugging Face Hub 库导入 login 函数,它主要用于与 Hugging Face 平台进行身份验证。
  • From kaggle_secrets import UserSecretsClient:我们通常需要从 Kaggle 导入 UserSecretsClient,它用于安全地管理和检索各种 secret 信息,例如 Kaggle 环境中的 API Token。

2. UserSecretsClient

user_secrets = UserSecretsClient(): 用于创建 UserSecretsClient 实例,以便轻松与存储的 secret 进行交互。

3. 检索和使用 Secret

  • hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN"): 负责检索 Hugging Face Token,该 Token 通常存储在 Kaggle Secrets 中,名称为“HUGGINGFACE_TOKEN”。
  • Login (hf_token):检索到的 Token 将用于登录 Hugging Face Hub,使我们能够访问和交互资源。

之后,我们将通过我们的 API 密钥登录 Weights & Biases (wandb)。我们还将创建一个新项目来跟踪实验和微调的进度。

代码


Fine-Tuning with Custom Datasets in DeepSeek

步骤 2. 加载模型和分词器

对于这个项目,我们现在负责加载 DeepSeek-R1-Distill-Llama-8B 的 Unsloth 版本。

代码


Fine-Tuning with Custom Datasets in DeepSeek

步骤 3. 微调前的模型推理

现在我们需要为模型创建一个提示样式,可以将其定义为“系统提示”。我们还包括用于问题和响应生成的占位符。提示将指导模型的思考,也将提供逻辑准确的响应。

prompt_style = "" 下面是一个描述任务的指令,该指令已与提供进一步上下文的输入配对。

写一个能恰当满足要求的答案。但在跳入答案之前,请花点时间仔细思考问题。将其分解为一步一步,创建清晰的思维链。这将有助于确保响应非常逻辑和准确。

Fine-Tuning with Custom Datasets in DeepSeek

在这个例子中,我们将提供医疗问题给prompt_style,将其转换为 token,然后将其传递给模型以有效地生成结果。

代码

一名 61 岁的女性长期出现不自主漏尿,尤其是在咳嗽或打喷嚏时。但是,她夜间没有漏尿。妇科检查和棉签测试后,如果她接受膀胱测压,您会预期发现什么?具体来说,她的残余尿量会是多少,以及关于逼尿肌收缩可以怎么说?


Fine-Tuning with Custom Datasets in DeepSeek

可以看到,即使没有进行微调,我们的模型也成功地生成了思维链,并在集体给出最终答案之前提供了推理。<think></think> 标签封装了推理过程。

那么,现在的问题是:为什么我们仍然需要微调?

这个问题的答案非常直接:推理过程虽然详细,但过于冗长,不符合其条款和条件。因此,它需要更简洁。

Fine-Tuning with Custom Datasets in DeepSeek

步骤 4. 加载和处理选定的数据集

现在为了有效地处理数据集,我们将为复杂思维链列添加第三个占位符。

代码

然后我们将编写一个响应来恰当地完成请求。

通常,在回答之前,我们需要仔细思考问题,并且还需要创建一个逐步的思维链,以确保响应的逻辑性和准确性。

Fine-Tuning with Custom Datasets in DeepSeek

现在,我们将编写一个 Python 函数,该函数将在选定的数据集中创建一个“text”列,其中包含训练提示样式。之后,我们必须使用问题、文本链和答案来填充占位符。

代码


Fine-Tuning with Custom Datasets in DeepSeek

我们的下一步是加载 FreedomIntelligence/medical-o1-reasoning-SFT 数据集的前 500 个样本,这些样本也在 Hugging Face Hub 上提供。

代码


Fine-Tuning with Custom Datasets in DeepSeek

步骤 5. 设置模型

现在在本步骤中,我们将利用目标模块通过有效地添加低秩适配器来设置模型。

代码


Fine-Tuning with Custom Datasets in DeepSeek

之后,我们将设置训练参数和训练器,将其提供给选定的模型、分词器、数据集以及其他重要的训练参数,这些参数反过来负责优化我们的微调过程。

代码


Fine-Tuning with Custom Datasets in DeepSeek

步骤 6. 运行模型训练

现在要开始训练,我们将运行以下代码集。

代码


Fine-Tuning with Custom Datasets in DeepSeek

训练过程主要花费了 44 分钟完成运行。

Fine-Tuning with Custom Datasets in DeepSeek

尽管如此,我们还可以通过登录网站并在项目中查看来在相应的 Weights and Biases 仪表板上查看完整的模型评估报告。

步骤 7. 微调后的模型推理

在这里,在这个相应的步骤中,为了比较结果,我们将向微调后的模型提出与之前相同的问题,以查看现在发生了什么变化,然后有效地对其进行模型推理。

Fine-Tuning with Custom Datasets in DeepSeek

这在实践中效果更好,也更准确。思维链是直接的,答案似乎是直接且在一个段落中。微调是有效的。

Fine-Tuning with Custom Datasets in DeepSeek

步骤 8. 本地保存模型

现在是将适配器、完整模型和分词器本地保存的时间,以便在需要时可以在其他项目中使用它们。

Fine-Tuning with Custom Datasets in DeepSeek
Fine-Tuning with Custom Datasets in DeepSeek

步骤 9. 将模型推送到 Hugging Face Hub

在此步骤中,我们将把适配器、分词器和模型推送到 Hugging Face Hub,以便 AI 社区可以根据需要将此模型集成到他们的系统中。

Fine-Tuning with Custom Datasets in DeepSeek
Fine-Tuning with Custom Datasets in DeepSeek

结论

人工智能领域的变化日新月异。尽管如此,开源社区正在崛起,挑战过去三年主导人工智能格局的专有模型的地位。