GPT2

GitHub
1.4k 329 较难 1 次阅读 1周前MIT语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

GPT2 是一个开源的深度学习项目,旨在复现并训练 OpenAI 发布的 GPT-2 语言模型。它核心解决了开发者在本地或云端环境中从头训练大型文本生成模型的难题,支持基于 GPU 和 TPU(张量处理单元)的高效计算架构。

该项目特别适合人工智能研究人员、算法工程师以及希望深入理解大模型训练机制的开发者使用。与普通用户直接调用 API 不同,GPT2 提供了完整的训练脚本、数据预处理工具及预训练模型下载功能,允许用户自定义数据集并进行模型微调。

其独特的技术亮点在于对 TPU 集群的原生支持,这使得在大规模算力环境下加速训练成为可能。项目提供了从 1.17 亿到 15 亿参数不等的多种预训练模型版本,并包含详细的文本生成与数据集构建指南。需要注意的是,作者明确声明此为非官方实现,虽尽力遵循原模型规格,但在最终性能上可能与原版存在差距,且部分数据集脚本需要根据具体需求进行调整。对于想要探索大语言模型底层原理或进行实验性研究的团队来说,这是一个极具参考价值的实践框架。

使用场景

某独立游戏开发团队需要为 NPC 角色快速生成大量风格各异的对话文本,以丰富开放世界游戏的剧情互动。

没有 GPT2 时

  • 开发人员需手动编写数千条对话脚本,耗时数周且创意容易枯竭,导致 NPC 台词重复单调。
  • 若尝试从头训练自定义语言模型,缺乏支持 TPU 加速的现成代码,本地 GPU 训练效率极低,难以在有限预算内完成。
  • 网络爬虫获取语料后,缺乏标准化的数据清洗与 TFRecord 转换流程,数据处理脚本报错频繁,工程落地困难。
  • 无法灵活调整生成文本的多样性,要么输出过于随机无逻辑,要么过于保守缺乏趣味,难以平衡游戏体验。

使用 GPT2 后

  • 团队利用预训练的"PrettyBig"模型,通过命令行输入简短情境提示,瞬间批量生成数千条连贯且富有创意的 NPC 对话。
  • 借助原生支持的 TPU 训练功能,在云端高效微调模型以适应游戏特定文风,将原本数周的训练周期缩短至几天。
  • 直接复用项目提供的数据集生成脚本,快速将爬取的网页文本清洗并转换为模型可用的格式,大幅降低数据预处理门槛。
  • 通过调节 top_k 参数精准控制输出策略,既保证了对话的逻辑通顺,又保留了足够的随机性以增加探索乐趣。

GPT2 让小型团队也能以低成本拥有高质量的内容生成能力,将开发者从繁琐的文案工作中解放出来专注于核心玩法设计。

运行环境要求

操作系统
  • 未说明
GPU
  • 可选(支持 GPU 和 TPU)
  • 若使用 GPU,需安装 tensorflow-gpu
  • 具体显卡型号、显存大小及 CUDA 版本未在文档中明确说明,但提及曾使用 v2/v3 TPU 集群训练大型模型
内存

未说明

依赖
notes1. 此项目非 OpenAI 官方实现,性能可能不如原版。 2. 支持 Google TPU,若使用 TPU,数据必须存储在 Google Storage Bucket (gs://路径) 中。 3. 预测功能不支持在 TPU 上运行,仅支持 GPU 或 CPU。 4. 评估功能在 TPU 集群上不工作,需在代码中注释掉。 5. 训练数据默认为 OpenWebText 语料库,需自行下载和处理(过程昂贵且耗时),或按文档指引修改代码以使用自定义文本数据。 6. 模型参数、数据路径等配置需通过 .json 文件传递。
python3.x (通过 pip3 和 python3 命令推断)
tensorflow-gpu (GPU 环境)
tensorflow (TPU/CPU 环境)
regex
requests
tqdm
google-api-python-client (TPU 环境)
oauth2client (TPU 环境)
ftfy (数据集生成)
newspaper3k (数据集生成)
GPT2 hero image

快速开始

GPT2

免责声明:这不是官方的GPT2实现!我已尽最大努力尽可能贴近原始GPT2模型的规范,但请注意,我尚未能用这段代码复现原始模型的全部性能。至于原因,我也不清楚,目前未能找到可能导致此问题的任何 bug。

这是一个支持 GPU 和 TPU 的 GPT2 训练实现。数据集脚本略显粗糙,可能需要根据您的需求进行调整。

需求

对于 GPU:

pip3 install tensorflow-gpu regex

对于 TPU:

pip3 install tensorflow regex google-api-python-client oauth2client

下载模型所需:

pip3 install requests tqdm

生成数据集所需(除 TensorFlow 外):

pip3 install ftfy tqdm newspaper3k

下载预训练模型

如果您想使用我的模型,目前我提供了“117M”、“PrettyBig”和“1.5B”三种版本。“117M”是在单个 v2 TPU 上训练了一周(可能少于 OpenAI 原始模型的训练时间);“PrettyBig”比 345M 略大,在 v2-256 Pod 上训练了一周。我原本还计划发布我的 1.5B 版本,但后来决定放弃。您可以阅读我的理由 这里 由于 OpenAI 已经发布了他们的模型,我现在也发布了我的(质量稍逊的)1.5B 模型,该模型是在 v3-512 Pod 上训练了一周。

python3 download_model.py PrettyBig

这将创建两个目录,一个以模型命名,另一个名为“encoder”。请修改与您的模型对应的 .json 文件中的 “model_dir” 和 “encoder_path” 参数,分别指向这两个路径。

如果您只需要编码器,请使用:

python3 download_model.py encoder

文本生成

进行预测时,您可以直接在命令行中输入提示词,也可以从文件中读取提示词。(这对于包含换行符的提示词非常有用)文本会输出到控制台以及 “predict_path” 参数指定的文件中。为此,您需要将模型检查点和 BPE 编码器副本放置在可访问的位置。(请修改 .json 文件中的 “model_dir” 和 “encoder_path” 参数)

通过命令行:

python3 main.py --model Your-Model.json [--top_k Top-K-Truncation] --predict_text "Hello there! My name is"

从文件:

python3 main.py --model Your-Model.json [--top_k Top-K-Truncation] --predict_file input.txt

可选的 top_k 参数会使模型在每一步只考虑概率最高的前 k 个标记。将其设置为 40 左右通常会产生更好的结果,但多样性会降低。

不支持在 TPU 上进行预测。

训练

要训练一个模型,首先在 .json 文件中定义其参数(参见示例),然后直接运行:

python3 main.py --model Your-Model.json [--tpu Your-TPU-Name]

使用 TPU 是可选的,无需修改即可在 GPU 上正常运行。(注意:评估功能在 TPU Pod 上无法使用,必须注释掉)

此过程假定您已在可访问位置存储了 openwebtext 数据集。如果没有,请参阅下方如何生成您自己的版本。

生成数据集

GPT2 是基于 webtext 数据集训练的,该数据集基本上是 Reddit 上所有链接且至少有 3 个 Karma 的网站内容。由于数据库庞大且包含大量受版权保护的内容,我无法在此提供下载。相反,我将介绍我是如何获取它的。请注意,为了下载并处理整个数据集,我花费了大约 500 欧元的云资源费用,但我并不声称自己是最高效的。

  1. 使用 此处 的下载脚本下载归档文件(我使用了预先过滤的 URL 文件)。
  2. 使用 datasets/openwebtext/run_newspaper_extract.py 提取文本。
  3. 获取原始 .txt 文件后,使用 datasets/openwebtext/create_tfrecords.py 将其编码为 .tfrecords 文件(需要编码器副本,详见“下载预训练模型”部分)。
  4. 将 .tfrecords 文件放入可访问的文件夹或 Google Storage 存储桶中(如果使用 TPU,则必须放入 Google Storage 存储桶)。
  5. 修改您的 .json 文件中的 “data_path” 参数,使其指向 .tfrecords 文件所在的位置;如有必要,还需调整 inputs.py 中的函数,以便在文件名更改时能够正确打开它们。

使用您自己的数据

您也可以使用自己的文本文件作为训练数据,但需要手动修改一些代码。

  1. 修改 datasets/openwebtext/create_tfrecords.py 中的参数:
base_dir = "/home/connor/my_text_dir" # 您的 .txt 文件所在路径
files_per = 175000 # 每个 tfrecord 放入多少个 txt 文件,影响不大
name = "my-custom-data" # 输出文件的名称格式为 name_i.tfrecords,其中 i 是文件编号
output_dir = "/home/connor/output" # 保存 .tfrecords 文件的路径
log_dir = "logs" # 日志将存放于此,以便在编码中断时恢复
files = glob.glob(os.path.join(base_dir, "**/*.txt")) # 需要生成所有 txt 文件的路径列表
processes = 64 # 并行编码进程数
encoder_path = "/home/connor/encoder" # BPE 编码器文件路径
minimum_size = 128 # 文件允许的最小长度(以 BPE 令牌计),否则会被丢弃。
  1. 运行脚本。这将生成一系列 name_i.tfrecords 文件。请将这些文件放置在一个可访问的位置(如果您使用 TPU,则必须放在 Google Cloud Storage 存储桶中)。
  2. inputs.py 中创建一个新的输入函数。任何输入函数都应具有签名 function_name(params, eval=False)stitch 参数控制连接的文本数量,以避免样本过小。其值应为:ceil((n_ctx+1) / minimum_size)。例如,如果我的 minimum_size 是 128,而 n_ctx 是 1024,则 stitch 应为 9。
def my_input(params, eval=False):
    if not eval:
        numbers = [0, 3, 4, 5, 6, 7, 8, 9] # 训练用随机文件子集
    else:
        numbers = [1, 2] # 评估用随机文件子集
    files = [os.path.join(params["data_path"], "my-custom-data_{}.tfrecords".format(str(i))) for i in numbers] # 生成文件列表

    return bpe_text(params["batch_size"], files, amount=params["n_ctx"], iterations=params["iterations"], stitch=9, batch=True)
  1. main.py 中注册您的新输入。
inputs = {
    "openwebtext": openwebtext, # 标准 OpenWebText 输入
    "openwebtext_longbiased": openwebtext_longbiased, # 倾向于展示更多长文本(>512 个令牌)的 OpenWebText
    "openwebtext_long": openwebtext_long, # 只展示长文本的 OpenWebText
    "my_input": my_input,
}
  1. 将您的 .json 配置设置为使用新输入。
[...]
    "iterations": 500,
    "n_embd": 768,
    "input": "my_input",
    "model": "GPT2",
[...]
  1. 完成!此处描述的输入应尽可能接近 GPT2,并且可在 TPU 上完美运行。

参数说明

由于通过命令行传递二十多个参数会非常繁琐,因此所有模型参数都通过 .json 文件传递。请注意,所有路径也支持 Google Cloud Storage 路径;如果您在 TPU 上运行,则路径必须是 gs:// 格式。

您可能需要更改的值:

  • model_path: 用于保存和加载检查点的路径
  • data_path: 您的 .tfrecords 文件所在路径
  • encoder_path: BPE 编码器文件的路径。您可以使用 download_model.py 脚本来下载任意模型(或仅下载编码器),得到一个名为“encoder”的文件夹,这就是您需要指向的路径(仅在预测时需要)。

您可能希望调整的值:

  • train_batch_size: 训练阶段的批量大小
  • eval_batch_size: 评估阶段的批量大小
  • predict_batch_size: 预测阶段的批量大小
  • predict_path: 用于保存预测结果的路径(可指向一个文本文件以追加内容)

模型参数:

  • model: 指定使用的模型名称。此处应始终为“GPT2”(未实现其他模型)
  • n_ctx: 模型一次处理的令牌数(默认:1024)
  • n_vocab: 词汇表大小(默认:50257)
  • n_embd: 嵌入层的维度
  • n_layer: 模型的层数
  • n_head: 注意力头的数量(默认:n_embd / 64)
  • scale_by_depth: 是否根据层数缩放初始化权重(默认:是)
  • scale_by_in: 是否根据输入通道数缩放初始化权重(默认:是)

训练参数:

  • precision: 使用 float32 还是 bfloat16 变量(训练超大规模模型时使用“bfloat16”)(可选,默认为 float32)
  • input: 使用哪个输入函数(默认:“openwebtext”)
  • lr: 学习率(默认:0.00025)
  • warmup_steps: 预热步数。若设置此参数,则采用线性预热 + 余弦退火调度(默认:2000)(可选)
  • opt_name: 优化器名称,目前有“adam”和“adafactor”两种(默认:“adam”)
  • weight_decay: 权重衰减参数,若未指定则不使用权重衰减(将应用 Adam 的权重衰减修正)(默认:0.01)(可选)
  • beta1: Adam/Adafactor 的 beta1 参数(Adam 默认:0.9,Adafactor 默认:0.0)
  • beta2: Adam/Adafactor 的 beta2 参数(默认:0.98)(对于采用幂次衰减类型的 Adafactor 可选)
  • epsilon: Adam 的 epsilon 参数(默认:1e-9)
  • decay_type: Adafactor 的衰减类型,可为“pow”或“adam”(默认:“pow”)
  • decay_exponent: Adafactor 幂次衰减的指数(默认:0.8)
  • train_steps: 两次评估之间的训练步数
  • eval_steps: 每次评估的步数
  • max_steps: 最大训练步数(对学习率衰减很重要)
  • iterations: 在 TPU 上执行的迭代次数(默认:100)(仅适用于 TPU)
  • embed_dropout: 词嵌入层的 dropout 率,设为 0 可禁用(默认:0.1)
  • attn_dropout: 注意力层的 dropout 率,设为 0 可禁用(默认:0.1)
  • res_dropout: 残差连接的 dropout 率,设为 0 可禁用(默认:0.1)

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|昨天
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|2天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

142.7k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.9k|★★☆☆☆|昨天
开发框架图像Agent

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|今天
插件开发框架

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|昨天
语言模型图像Agent