跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言AI算法

如何从零开始训练大型语言模型

详细阐述了从零开始训练大型语言模型的全流程,涵盖数据管道构建、模型训练配置、评估体系及生产部署。重点介绍了如何利用 Databricks 处理海量代码数据,使用 MosaicML 进行分布式训练,并通过 HumanEval 等多语言基准进行性能评估。文章还讨论了成本控制、延迟优化及基于反馈的迭代机制,为企业构建定制化 AI 模型提供了工程实践参考。

协议工匠发布于 2025/2/6更新于 2026/9/1054 浏览
如何从零开始训练大型语言模型
简介

大型语言模型(Large Language Models, LLMs),如 OpenAI 的 GPT-4 或 Google 的 PaLM,已经席卷了人工智能领域。然而,大多数公司目前没有能力从头训练这些模型,并且完全依赖于少数几家大型科技公司提供的 API 服务。

在构建自己的 AI 基础设施时,我们投入了大量资源来建立从原始数据到部署到生产环境所需的全流程管道。本文将概述如何训练 LLM,讨论沿途遇到的工程挑战以及如何利用现代 LLM 堆栈中的关键组件:Hugging Face、Databricks 和 MosaicML。

虽然我们的模型主要是针对代码生成用例设计的,但所讨论的技术和教训适用于所有类型的 LLMs,包括通用语言模型。我们将深入探讨过程中繁琐的细节,并分享一系列最佳实践。

为什么要训练你自己的 LLMs?

企业决定训练自己的 LLM 通常基于以下几个核心原因:数据隐私和安全性、对更新和改进具有更大的控制力、定制化需求以及成本效益。

  1. 定制化:训练一个定制化模型使我们能够根据特定业务需求进行调整,包括平台特定功能、术语和上下文。通用模型(如 GPT-4)可能无法涵盖垂直领域的专业知识。例如,我们的模型针对特定的编程语言(如 JavaScript React 和 TypeScript React)进行了优化,以提高代码生成的准确率。
  2. 减少依赖:减少对单一 AI 提供商的依赖是降低风险的关键策略。这不仅适用于技术团队,也适用于更广泛的开发者社区。通过开源部分自研模型,我们可以促进生态系统的多样性。
  3. 成本效率:尽管 API 调用成本持续下降,但对于大规模应用来说,LLM 托管仍然是巨大的开支。训练更小、更高效的定制化模型可以大幅降低推理成本,使更多用户能够访问 AI 能力。
数据管道

LLMs 需要海量的数据进行训练。构建强大的数据管道是成功的关键,这些管道必须高度优化,同时足够灵活以容纳新的公共和专有数据来源。

数据源与预处理

我们从 Hugging Face 上可用的 The Stack 作为主要数据源开始。The Stack 由 BigCode 项目提供,经过去重处理后,版本 1.2 的数据集包含大约 2.7 TB 以开放授权方式发布的源代码,涵盖超过 350 种编程语言。

Transformers 库在处理大规模数据方面表现出色,但在我们需要对数据进行额外控制并能够以分布式方式处理时,它显得不足。因此,我们使用 Databricks 来构建我们的管道。

第一步是下载来自 Hugging Face 的原始数据。我们使用 Apache Spark 将数据集构建过程在每种编程语言之间并行化。然后,我们重新划分数据,并以优化设置的 Parquet 格式重写出来,供下游处理。

接下来是清理和预处理数据。通常,重复数据删除和编码修复至关重要。一旦我们将自有数据引入管道,就必须重新运行重复数据删除过程。Databricks 允许我们将不同数据源视为更大的数据湖中的来源,并在下游流程中根据需要利用它们。

对于预处理,我们采取以下步骤:

  • 匿名化:通过删除任何个人身份信息 (PII) 来匿名化数据,包括电子邮件、IP 地址和密钥。这通常涉及正则表达式匹配和命名实体识别 (NER) 模型。
  • 去噪:使用多种启发式方法来检测和删除自动生成的代码或垃圾内容。
  • 语法检查:对于一部分语言,我们删除了无法编译或无法使用标准语法解析器解析的代码,以确保训练数据的可执行性。
  • 质量过滤:根据平均行长、最大行长和字母数字字符的百分比过滤掉文件,剔除低质量样本。
标记化和词汇训练

在标记化之前,我们使用用于模型训练的相同数据的随机子样本来训练我们自己的自定义词汇表。自定义词汇表使我们的模型能够更好地理解和生成代码内容,从而提高性能并加快训练和推理速度。

此步骤是该过程中最重要的步骤之一,因为它用于我们过程的所有三个阶段(数据管道、模型训练、推理)。在高层次上,我们必须考虑的一些重要事项是词汇量大小、特殊标记的选择以及标记保留空间的分配。

一旦我们训练了我们的自定义词汇表,我们就会标记我们的数据。最后,我们构建了我们的训练数据集并将其写成一种分片格式,该格式经过优化以用于模型训练过程,例如 TFRecord 或 WebDataset。

模型训练

我们使用 MosaicML 平台训练我们的模型。在尝试部署自己的训练集群后,我们发现 MosaicML 平台为我们提供了一些关键优势,包括支持多个云提供商的 GPU、预配置的 LLM 训练配置以及托管基础设施的容错能力。

在确定我们模型的参数时,我们考虑了模型大小、上下文窗口、推理时间、内存占用等之间的各种权衡。较大的模型通常提供更好的性能并且更能够进行迁移学习,但对训练和推理都有更高的计算要求。出于低延迟推理的需求,我们通常会选择具有较小内存占用和低延迟推理的较小模型。

除了模型参数外,我们还从各种训练目标中进行选择:

  • 下一个标记预测:最常见的训练目标,适用于代码完成,但未能考虑到文档下游的上下文。
  • 中间填充:文档中的一系列标记被屏蔽,模型必须使用周围的上下文来预测它们,有助于理解长距离依赖。
  • UL2(无监督潜在语言学习):将训练语言模型的不同目标函数构建为去噪任务,其中模型必须恢复给定输入的缺失子序列。

一旦决定了模型配置和训练目标,我们就会在 GPU 的多节点集群上启动训练运行。我们能够根据模型的大小以及希望多快完成训练过程来调整为每次运行分配的节点数。运行大型 GPU 集群的成本很高,因此以尽可能最有效的方式利用它们非常重要。我们密切监控 GPU 利用率和内存,以确保我们从计算资源中获得最大可能的使用率。

我们使用 Weights & Biases 来监控训练过程,包括资源利用率和训练进度。我们监控损失曲线,以确保模型在训练过程的每个步骤中都能有效地学习。我们还关注损失峰值,这些是损失值的突然增加,通常表明底层训练数据或模型架构存在问题。因为这些事件通常需要进一步调查和潜在的调整,我们在我们的流程中强制执行数据确定性,因此我们可以更轻松地重现、诊断和解决任何此类损失峰值的潜在来源。

评估

为了测试我们的模型,我们使用 HumanEval 框架的变体。给定函数签名和文档字符串,我们使用该模型生成一段 Python 代码。然后,我们对生成的函数运行测试用例,以确定生成的代码块是否按预期工作。我们运行多个样本并分析相应的 Pass@K 数字。

这种方法对 Python 来说效果最好,因为它有现成的评估器和测试案例。但由于支持许多编程语言,我们需要对各种额外语言的模型性能进行评估。两个具体的挑战包括在任何编程语言中建立一个可重复的运行环境,以及对没有广泛使用的测试案例标准的编程语言(如 HTML、CSS 等)的模糊性。

此外,我们还引入了以下评估维度:

  • 安全性评估:检测模型是否生成了恶意代码或敏感信息泄露。
  • 逻辑一致性:通过静态分析工具检查生成代码的逻辑错误。
  • 多语言基准:建立跨语言的统一评估标准,确保模型在不同语言间的表现均衡。
部署到生产

一旦我们训练和评估了我们的模型,就可以将其部署到生产环境中了。我们的代码完成模型应该感觉很快,请求之间的延迟非常低。我们使用 NVIDIA 的 FasterTransformer 和 Triton Server 加速我们的推理过程。FasterTransformer 是一个为基于 transformer 的神经网络的推理实现加速引擎的库,而 Triton 是一个稳定且快速的推理服务器,易于配置。

这种组合为我们在转换器模型和底层 GPU 硬件之间提供了一个高度优化的层,并允许对大型模型进行超快速分布式推理。在将我们的模型部署到生产环境中后,我们能够使用我们的 Kubernetes 基础设施对其进行自动缩放以满足需求。

尽管我们在之前的博文中讨论过自动缩放,但值得一提的是,托管推理服务器会带来一系列独特的挑战。这些包括大型工件(即模型权重)和特殊硬件要求(即不同的 GPU 大小/数量)。我们设计了我们的部署和集群配置,以便我们能够快速可靠地交付。例如,我们的集群旨在解决个别区域的 GPU 短缺问题,并寻找最便宜的可用节点,从而在保证性能的前提下优化成本。

在我们将模型放在实际用户面前之前,我们喜欢自己测试它并了解模型的'氛围'。将模型放在工作人员面前就像拨动开关一样简单。一旦我们对它感到满意,我们就会翻转另一个开关并将其推广给我们的其他用户。

我们将继续监控模型性能和使用指标。对于模型性能,我们监控请求延迟和 GPU 利用率等指标。对于使用情况,我们跟踪代码建议的接受率,并将其分解到包括编程语言在内的多个维度。这也允许我们对不同的模型进行 A/B 测试,并获得一个模型与另一个模型比较的定量度量。

反馈与迭代

我们的模型训练平台使我们能够在不到一天的时间内将原始数据转化为部署在生产环境中的模型。但更重要的是,它允许我们训练和部署模型、收集反馈,然后根据该反馈快速迭代。

对于我们的流程来说,保持对底层数据源、模型训练目标或服务器架构的任何变化的鲁棒性也很重要。这使我们能够在快速发展的领域中利用新的进步和功能,在这个领域中,似乎每天都有新的令人兴奋的公告。

接下来,我们将扩展我们的平台,使我们能够使用 Replit 本身来改进我们的模型。这包括基于人类反馈的强化学习 (RLHF) 等技术,以及使用从社区收集的数据进行指令调整。通过 RLHF,我们可以让模型更好地遵循人类的意图,减少有害输出的概率,并提高回答的相关性。

总结

训练大型语言模型是一个复杂的系统工程,涉及数据工程、模型架构设计、分布式训练、评估验证以及生产部署等多个环节。通过构建灵活的数据管道、选择合适的训练框架、实施严格的评估标准以及优化推理服务,企业可以逐步建立起自己的 AI 能力。随着技术的不断进步,未来的 LLM 训练将更加高效、低成本且易于访问。

目录

  1. 简介
  2. 为什么要训练你自己的 LLMs?
  3. 数据管道
  4. 数据源与预处理
  5. 标记化和词汇训练
  6. 模型训练
  7. 评估
  8. 部署到生产
  9. 反馈与迭代
  10. 总结

更多推荐文章

查看全部
  • Vivado AXI4-Stream Data FIFO 核配置与测试详解
  • 攻防世界 Web 挑战题解:反序列化、RCE 与文件包含实战
  • Flutter 三方库 serial 在鸿蒙系统的适配指南与串口通信实战
  • AI 大模型实际落地场景有哪些?
  • WhisperX 语音识别:为何优于传统方案?
  • WSL Ubuntu 22.04 无法访问 root 目录的解决方法
  • Webots R2023b 安装配置教程
  • OpenClaw 核心逻辑解析:重新定义 AI 数字员工执行力
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • VR 沉浸体验帧率稳定性测试实践与优化指南
  • 信息系统安全等级保护定级流程、方法及注意事项
  • SkyWalking 多语言探针现状:.NET / C++ / Lua 深度解析
  • C/C++ 算法入门:一维动态规划基础实战
  • OpenClaw 网络搜索与抓取工具最佳实践指南
  • 医疗领域自然语言处理应用与实战
  • Windows 环境下安装配置 Git 完整指南
  • Rust WebAssembly 开发实战:构建高性能前端应用
  • CANN 技术栈解析:不同场景下的语言选型指南
  • C++ 二叉搜索树(BST)原理及核心操作实现
  • 牛客 CM11:链表分割算法实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online