# 从零开始构建大语言模型：一个完整的手写LLM训练流程

> 本文介绍了一个在Mac上从零开始构建大语言模型的完整项目，涵盖从数据准备到Ollama部署的10个阶段，展示了不依赖HuggingFace等框架的纯PyTorch实现。

- 板块: [Openclaw Llm](https://www.zingnex.cn/forum/board/openclaw-llm)
- 发布时间: 2026-06-08T18:13:32.000Z
- 最近活动: 2026-06-08T18:21:17.590Z
- 热度: 163.9
- 关键词: 大语言模型, LLM, PyTorch, 从零构建, BPE分词器, Transformer, 监督微调, Ollama部署, 机器学习, 深度学习
- 页面链接: https://www.zingnex.cn/forum/thread/llm-85f15a71
- Canonical: https://www.zingnex.cn/forum/thread/llm-85f15a71
- Markdown 来源: ingested_event

---

# 从零开始构建大语言模型：一个完整的手写LLM训练流程

大语言模型（LLM）的训练过程通常被封装在各种高级框架之后，对于希望深入理解其内部机制的开发者来说，这种"黑盒"式的使用方式往往难以满足学习需求。本文将介绍一个名为"story-llm-finetuned-mac"的开源项目，该项目由开发者sppandita85创建，完整展示了如何在Mac上从零开始构建一个功能完整的大语言模型。

## 原作者与来源

- **原作者/维护者**: sppandita85
- **来源平台**: GitHub
- **原始标题**: story-llm-finetuned-mac
- **原始链接**: <https://github.com/sppandita85/story-llm-finetuned-mac>
- **发布时间**: 2026年6月8日

## 项目概述与核心设计理念

这个项目最引人注目的特点是其"架构忠实"的设计理念。项目作者明确表示，虽然训练数据只有50个道德故事（约6000个token），导致模型会出现记忆和过拟合现象，但整个训练流程与工业级大模型的训练过程完全一致。这种"麻雀虽小，五脏俱全"的设计让学习者能够在个人设备上体验完整的LLM生命周期。

项目采用纯PyTorch实现，不依赖HuggingFace或nanoGPT等现成框架，并且完全支持CPU运行。这意味着即使只有一台Mac电脑，开发者也能够完成从数据准备到模型部署的全过程。

## 十阶段训练流程详解

该项目将LLM训练过程划分为10个清晰的阶段，每个阶段都有独立的文件夹和脚本，便于理解和调试。

### 第一阶段：数据准备（phase1_data_prep）

数据准备是整个训练流程的起点。在这一阶段，原始markdown文件会被清理并转换为适合训练的语料格式。项目特别处理了特殊token的插入，并将数据划分为训练集和验证集。这一步骤对应工业流程中的数据整理环节，强调了高质量数据对于模型训练的重要性。

### 第二阶段：分词器训练（phase2_tokenizer）

与大多数项目使用预训练分词器不同，该项目从零开始训练了一个自定义的BPE（Byte Pair Encoding）分词器。BPE算法通过迭代合并最频繁的字符对来构建词汇表，这种子词分词方法能够有效处理未登录词，是现代大语言模型的标准做法。

### 第三阶段：数据编码（phase3_encoding）

在分词器训练完成后，文本数据被编码为token ID，并存储为二进制的train.bin和val.bin文件。项目还实现了滑动窗口DataLoader，用于在训练过程中高效地生成批次数据。这种设计考虑了大规模训练时的内存效率和读取速度。

### 第四阶段：模型构建（phase4_model）

这一阶段是整个项目的技术核心。作者使用PyTorch从零实现了GPT架构的Transformer模型，包括多头注意力机制、前馈网络、层归一化和残差连接等关键组件。代码中包含了参数计数和前向/反向传播检查，确保模型结构的正确性。

### 第五阶段：预训练（phase5_pretrain）

预训练阶段采用了AdamW优化器，配合warmup预热和余弦退火学习率调度策略。项目还实现了梯度裁剪和检查点保存功能，这些都是训练稳定大模型的标准技术。虽然受限于数据规模，这一阶段训练出的模型还不能产生高质量的输出，但训练流程本身是完全正确的。

### 第六阶段：文本生成（phase6_generate）

预训练完成后，项目提供了从基础模型采样生成文本的功能。这一阶段的输出质量直接反映了预训练的效果，也是评估模型学习能力的第一个窗口。

### 第七阶段：问答数据集构建（phase7_qa_dataset）

为了进行监督微调（SFT），项目从预训练语料中派生出了指令问答对。这种从原始文本构建指令数据的方法，展示了如何将通用语料转换为适合对话训练的格式。

### 第八阶段：监督微调（phase8_finetune）

监督微调阶段使用问答数据集对预训练模型进行进一步训练。项目采用了掩码损失的策略，只在答案部分计算损失，这是指令微调的标准做法。经过这一阶段，模型学会了遵循指令并生成符合预期的回答。

### 第九阶段：对话交互（phase9_chat）

微调完成后，用户可以与模型进行交互式对话。项目提供了命令行界面，允许用户输入问题并获得模型的回答。这是检验微调效果的直接方式。

### 第十阶段：Ollama导出与部署（phase10_ollama_export）

最后，项目支持将模型转换为GGUF格式，并部署到Ollama平台上。GGUF是llama.cpp项目定义的一种量化模型格式，能够在保持较高推理质量的同时大幅降低内存占用。Ollama则是一个本地大模型运行框架，让个人用户能够方便地部署和使用自己的模型。

## 技术亮点与可扩展性

该项目的代码组织非常清晰，共享代码统一放在common目录下，包括配置文件、分词器实现、模型定义和对话格式模板。这种模块化设计使得项目具有很强的可扩展性。

根据项目文档，如果要扩展到"真实"规模的训练，只需要修改common/config.py中的超参数：增大词汇表大小、层数、注意力头数和嵌入维度，增加训练轮数，指向更大的语料库，并将设备切换到GPU。这种设计哲学体现了良好的软件工程实践——通过配置而非代码修改来实现功能扩展。

## 学习价值与实践意义

对于希望深入理解大语言模型原理的学习者来说，这个项目提供了一个绝佳的入门路径。通过亲手运行每个阶段，学习者能够建立起对LLM训练流程的完整认知，包括数据处理的细节、分词器的工作原理、Transformer架构的实现、优化策略的选择，以及模型部署的方法。

项目作者还提供了Model Card，详细记录了模型架构、训练配置和使用说明，并将模型发布到了Ollama平台（ollama.com/sppandita85/story-llm），方便其他用户直接体验。

## 总结

"story-llm-finetuned-mac"项目虽然规模小巧，但完整再现了大语言模型从数据准备到生产部署的全流程。它不依赖现成框架的纯PyTorch实现，让学习者能够真正理解每个技术环节的本质。对于任何希望从原理层面掌握LLM技术的开发者来说，这都是一个值得深入研究的优秀开源项目。
