<!-- Canonical: https://temp.tokenmap.com.cn/research/nanochat-training-workflow -->

[返回全部研究](/research)

词元映射研究工程实践

# nanochat：从零训练语言模型

昨天，OpenAI的联合创始人Andrej Karpathy (安德烈·卡帕西) 发布了一个名为 "nanochat" 的新开源项目，一夜之间斩获了7.6k star。

这个项目是从零开始，完成一个ChatGPT这样的大语言模型。提供了从最初的分词器、预训练、中间训练、监督微调 (SFT)到强化学习 (RL) 的完整流程。

可以说，这个项目是你了解大模型究竟是如何“炼”成的史无前例的绝佳项目。

**它有一定门槛，但是并非不可企及。**

本篇文章手把手带你完成全流程，跟着这篇教程，相信你一定能完成由你训练的第一个“GPT”模型，并且深入理解“大模型究竟是如何炼成的”。

以下步骤是我尝试两遍的步骤，训练步骤不会出错。即使你是完全小白，只需要跟着以下步骤，也能够完成。如果你看不懂，你甚至可以把这篇文章直接发给豆包或者GLM，让他们去引导你。

> 代码多次尝试，如果你出现问题，应该是系统环境导致，99%的问题AI都可以帮你解决。

在开始前，你无需任何压力，我不会过多讲解原理，只会有简单的步骤提醒。你可以先跟随步骤完成，如果你想要进一步了解，可以把你感兴趣步骤的输出内容丢给AI，让AI解释这是在做什么，相信，如果整个流程下来，你一定会对大模型有更深入的理解。

这应该是全网首发教程

求个三连，我们正式开始

以下教程大约为三部分，全程约需要2小时（含训练时间）：

1、租一台带有显卡的服务器。

2、为这台服务器配置环境。

3、跟着代码操作进行训练。

## 一、租用云服务器

因为我并不是真的想要训练一个多么可用的模型，我只是想体验完整的训练流程，所以原项目完成整个训练需要8张A100显卡跑4个小时才可以完成，我把步数和深度在训练时做了调整，我们来训练一个小模型，只需要A100跑15-20分钟即可。

那么，也就是说 你体验整个训练流程的成本，不过是：50块钱左右。

![](/article-media/research/DadHbvoTRo4Qm6x0ElXcx3E1n9d.png)

如果你本身没有显卡，那么你可以去：火山云、阿里云、腾讯云、无问芯穹等平台租用一台挂载A100显卡的机器即可。

需要注意的是：系统盘最低也要50G，因为训练的时候需要下载24G的训练数据。其他的配置并没有太多要求，大家根据预算自行选择。

我有A100显卡和服务器可用，所以我就直接使用这台服务器进行操作和演示，这个服务器和在云厂商租用的没有任何区别。

具体如何购买的操作，大家可以参考各厂商的购买指引，我就不做演示了。

（后续如果有需要，再出一个专门的指引，本篇先专注于训练教程）

## 二、服务器配置

各个服务器厂商的操作位置都差不多，大家找找在哪登录就好，登录完成后就都一样了。以下使用的我之前的服务器为例。

**1、 添加端口**

在控制台，找到你购买的服务器，点击图中，箭头指示的空白区域。

![](/article-media/research/NmmcbtbdHoxoeHxm9uIck5vanex.png)

选择“防火墙”菜单栏，点击【添加规则】按钮，添加【20219】和【8000】端口并确定。

![](/article-media/research/BBUQbOzrdobr6fxE3nIc4YbFnrx.png)![](/article-media/research/MMv5bQpLToEyj1xYj3CctzzvnAh.png)

**2、安装操作面板**

然后点击右上角的登录：

![](/article-media/research/AW0KbT8jtoJeGHxAnRxcZ9Jfnfd.png)

直接粘贴命令到命令行中，点击回车开始执行：

```
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
```

![](/article-media/research/FDRqbKTpIowh7dxcLi4cmZ6JnvW.png)

然后一路点击回车就可以了。

![](/article-media/research/Bjy6bjWq1oQFdlxPzqWc6N6Jn9g.png)

**3、最后到这一步，记住你自己的登录地址和账号密码。****复制出来保存好。**

![](/article-media/research/MMiWbWIDjo394mxe4gKcj9kunNb.png)

使用「外部地址」，输入面板用户和密码，来登录即可。

![](/article-media/research/REdrbDuUlob6ZlxGroDc9g7NnXe.png)

好，到这里你已经可以开始方便的使用服务器了。

## 三、训练环境配置

我们的命令都在终端执行，直接在管理面板，打开左侧的终端，来粘贴命令：

![](/article-media/research/QlgRbl5Nkoa4jMxPTfAcuDx6ndI.png)

✨

注意：

* 下边将出现代码，复制的时候，注意复制全。
* 代码我已经分好步骤，每次只需要粘贴一行代码，然后点击一次回车。 中文字符的是解释不需要复制粘贴，每次只复制和粘贴“代码”部分即可。
* 回车后，只有最左边显示[ ]中括号时，才是上一个命令执行完毕了。 没有出现[ ]中括号对话前缀时，不要操作。
* 如果你发现 ctrl+v 粘贴不进去，试试 shift+ctrl+v 粘贴。

**1、我们来检查一下你租用的服务器配置：**

```
# 检查NVIDIA驱动是否正确安装
nvidia-smi

# 查看CUDA版本
nvcc --version

# 检查GPU内存和使用情况
nvidia-smi --query-gpu=memory.total,memory.used --format=csv
```

**2、为了防止有的小伙伴的服务器使用的CUDA版本不行，我们都更新一遍**

```
# 更新软件包列表
sudo apt update

# 安装NVIDIA驱动和CUDA工具包
sudo apt install -y nvidia-driver-550 nvidia-cuda-toolkit

# 重启系统使驱动生效
sudo reboot
```

**3、上一步会重启，等待1-2分钟，刷新页面，继续操作即可。**

```
# 验证安装情况
nvcc --version

# 验证GPU可用
nvidia-smi
```

输出这个就是可以了：

![](/article-media/research/IQCobHQuMo8SlNxJtDncCP0znKc.png)![](/article-media/research/A6L9bzlXSoveWPx6UGUcEnKynqe.png)

**4、安装PyTorch对应的CUDA**

```
pip uninstall torch -y
pip install torch --index-url https://download.pytorch.org/whl/cu121
```

**5、测试CUDA是否可用**

```
python -c "import torch; print('CUDA available:', torch.cuda.is_available()); print('GPU count:', torch.cuda.device_count()); print('GPU name:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'N/A')"
```

如果最后的测试输出如下，那么就是可以了：

![](/article-media/research/EvCXbdtKoo5IWXxqUa2cQ1jjnsd.png)

**6、安装环境管理工具**

然后我们安装一个环境管理工具，下方两行粘贴进入，然后点击回车，等待下载完成。

```
echo "开始安装 Anaconda..."
wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
```

（如果这里有了卡点，进行不下去，可能是因为服务器网络问题，去拉取的时候下载不全，可以复制网址，手动去下载到电脑上。然后 进入文件夹，找到root文件夹，把下载的文件上传进去就好了。）

**7、再粘贴下方代码，出现下图，就代表在执行中了。**

```
bash Anaconda3-2021.05-Linux-x86_64.sh -b -p /root/anaconda
```

![](/article-media/research/N7oRbTROJoQwJPxCtyIcYImrnSc.png)

**8、然后把下边这行粘贴进去，点击回车。**

`rm -f Anaconda3-2021.05-Linux-x86_64.sh`

![](/article-media/research/PFgCb9L04o0KDAxZmtpcZcp2ngg.png)

**9、然后创建一个训练环境**

```
# 创建新的conda环境
conda create -n nanochat python=3.10 -y
conda activate nanochat
```

![](/article-media/research/WaFrbjZ6cofanbxLSMmcBjV7n7f.png)

至此，环境配置和检查完成。

## **四、进入训练**

1、 继续粘贴，首先创建项目目录：

```
mkdir -p ~/projects
cd ~/projects
```

2、 下载AK大神的项目：

```
git clone https://github.com/karpathy/nanochat.git
cd nanochat
```

![](/article-media/research/MMxlbZFxmosMUGxgq6McxtvHncb.png)

3、 继续安装

```
# 安装项目依赖
pip install -e .

# 安装maturin
pip install maturin
```

![](/article-media/research/CYyDbSIGtoAUeFxFIAHcyzD5nzf.png)

```
# 确保Rust环境变量已加载
source "$HOME/.cargo/env"

# 构建tokenizer
maturin develop --release --manifest-path rustbpe/Cargo.toml
```

![](/article-media/research/TY4bbi33GolSqYxZb1Oc8PTxnch.png)

4、创建缓存目录

```
mkdir -p ~/.cache/nanochat
```

5、下载初始数据集并训练tokenizer

```
# 下载初始数据集(约800MB，这可能需要几分钟)
python -m nanochat.dataset -n 8
```

![](/article-media/research/OCbubQJHRootBLx8qwXcyCEEnBd.png)

大家可能好奇这个数据集里都有什么，我打开来给大家看一下。

原始内容其实就是一些Json格式的纯文本数据。

![](/article-media/research/TFqabeq6QodZsAxebqTctDYRn7R.png)

每一行其实都很长，大概有个五六千字。我把第一行复制出来翻译了一下，大家可以看下：

是一篇关于运输与物流的文本。

![](/article-media/research/TT7RbDTQ4oEhxmx04w2crQbAntv.png)

**6、等上一步执行完成后，我们继续训练tokenizer。**

```
# 训练tokenizer（这也需要一些时间）
python -m scripts.tok_train --max_chars=2000000000
```

![](/article-media/research/Nfmgbtf5uognXOx25ypcwRPTn5e.png)

**7、评估tokenizer**

```
python -m scripts.tok_eval
```

![](/article-media/research/V2vfbU2GTodqclxMUlacLiJKnBh.png)

**8、下载更多训练数据和评估数据**

```
# 后台下载更多训练数据(约24GB，这会需要较长时间)
python -m nanochat.dataset -n 240 &
DATASET_DOWNLOAD_PID=$!
```

![](/article-media/research/EEIzbpM3Vok7ZExV1E5cnsfNnif.png)

出现这个就是下载完成了。

![](/article-media/research/NpWmbDCXJoPsIixzR2HcTezUnOf.png)

**9、下载评估数据(约162MB)**

```
curl -L -o eval_bundle.zip https://karpathy-public.s3.us-west-2.amazonaws.com/eval_bundle.zip
unzip -q eval_bundle.zip
mv eval_bundle ~/.cache/nanochat/
rm eval_bundle.zip
```

![](/article-media/research/HzPvbPv63olrhcxe7WSc8FM0nzh.png)

**10、至此环境和数据均已准备完成，我们开始训练“小模型”。**

```
# 训练一个超小模型（大约10-15分钟完成）
python -m scripts.base_train --depth=4 --device_batch_size=32 --num_iterations=500
```

![](/article-media/research/Bu61bchrRo70CJxp5wbc2AZPnPc.png)

然后就是等待，此时你会看到命令行中不断输出

上图中的部分显示了程序正在覆盖某些默认配置参数。

* `depth = 4`: 模型的层数（深度）被设置为4。
* `device_batch_size = 32`: 每个设备（比如一张GPU卡）一次处理的数据批次大小为32。
* `num_iterations = 500`: 总共要训练500个步数。

然后你会看到模型的训练步骤返回的日志：

![](/article-media/research/PY88bVzJEoGsJZxdDRXcEzaMnPf.png)

反正也是在等待，我们拿这一行举例解释一下都是什么意思：

```
step 00010/00500 (2.00%) | loss: 7.754142 | lrm: 1.00 | dt: 2201.36ms | tok/sec: 29,770 | mfu: 3.48 | total time: 0.36m
```

|  |  |  |
| --- | --- | --- |
| 字段 | 含义 | 解读 |
| `step 00010/00500` | 当前步数 / 总步数 | 表示正在进行第10步，共500步。 |
| `(2.00%)` | 训练进度 | 已完成总训练量的2%。 |
| **`loss: 7.754142`** | **损失值** | **最重要的指标**。衡量模型预测与真实标签的差距。\*\*这个值在持续下降\*\*（从11.09降到7.75），说明模型正在学习，训练是有效的。 |
| `lrm: 1.00` | 学习率乘数 | 学习率的调节因子。1.00表示当前使用的是基础学习率。 |
| `dt: 2201.36ms` | 单步耗时 | 完成这一步花了2201毫秒（约2.2秒）。 |
| `tok/sec: 29,770` | 吞吐量 | 每秒处理约29,770个词元。这是衡量训练速度的关键指标。 |
| `mfu: 3.48` | 模型浮点运算利用率 | 衡量GPU算力被有效利用的百分比。3.48%是一个比较低的值，说明GPU的潜力没有被完全发挥，这在小型模型或非极致优化的训练中很常见。 |
| `total time: 0.36m` | 总训练时长 | 从训练开始到现在，已经过去了0.36分钟。 |

看到这个就是训练完成了，我们用了18分钟进行训练。

![](/article-media/research/H8WIb8PxdoLPSGxY4tZcksx2nog.png)

**11、中间训练**

这一步是为了教会模型理解对话格式和特殊标记（大约15-20分钟）。这步我也更改了参数，原参数跑起来太慢了。我们只需要走一遍流程就好。同样的你也可以看到训练步骤。

```
python -m scripts.mid_train --device_batch_size=128
```

如果你不在乎时间，你也可以使用原参数训练，命令是：`python -m scripts.mid_train`

![](/article-media/research/GTfebq8KSoR6TYxJEz6c5FaFnJj.png)

看到下方这个就是完成：

![](/article-media/research/RvA2bBUqnocRxbxk8UAcCX1EnVe.png)

12、中间训练完成，我们就进入到了最后一步的SFT（监督微调阶段），这一阶段会让模型更好的学会我们的语言习惯和方式

同样的，为了训练速度更快，我更改了训练参数，直接粘贴进去即可继续训练：

```
python -m scripts.chat_sft --device_batch_size=16
```

如果你不在乎时间，你也可以使用原参数训练，命令是：`python -m scripts.chat_sft`

![](/article-media/research/YpVBbdPXBouwVrx5tSHcp2rgnOd.png)

看到输出以下即表示训练完成！

![](/article-media/research/D8nubl8Fdoc4u5xMIxsctCyRnyg.png)

我们从评估结果可以看到：

* MMLU准确率：25.88%
* ARC-Easy准确率：23.05%
* GSM8K和HumanEval：0%（这个小模型在数学和编程上还不行，正常现象）

虽然这是个很小的模型，效果有限，但已经具备基本的对话能力了。

我们先开放一下8000端口，防止不能使用

```
sudo ufw allow 8000
```

然后继续在命令行输入：

```
python -m scripts.chat_web
```

你会看到以下输出：

![](/article-media/research/TKxtbaPpooVNqoxM7XRcnf1VnGb.png)

现在，只需要吧中间的0.0.0.0 改成你的服务器IP地址即可。

![](/article-media/research/M5JsbO2iuoKXWSxwEGicpUY4nrd.png)

假如我的是：12.45.748.105

那么拼接地址就是：http://12.45.748.105:8000/

把这个地址粘贴到你浏览器中，你就会打开这个页面：

![](/article-media/research/KwXkb9zCGoT9wvxtc6mcFeQqn6d.png)

恭喜你，你已经从零完成了一个大模型的训练。

你现在可以与他对话，来唤醒这个刚刚问世的大模型了。

![](/article-media/research/A84PbTh1roWJZgx59U4cYXrtn8g.png)

## 五、结束

至此，恭喜你！你已经成功完了从零开始“炼”成一个大语言模型的完整旅程。

从分词器的构建，到预训练、中间训练，再到最后的监督微调（SFT），你亲手操作了每一个环节，这短短两小时的实践，将原本遥不可及的AI魔法，拆解成了一步步清晰可见的代码和日志。你看到的不再是一个黑箱，而是一个由数据、算力和算法共同驱动的、可以亲手塑造的智能体。

此时，你应该对“大模型究竟是如何炼成的”这句话，有了远超书本的、具象化的深刻理解。期待你能够更加深入的探索，与我们分享你更多的发现和收获。

本文内容

[一、租用云服务器](#original-U9ufdAx2doznsFx0XnbcnrfEnGd)[二、服务器配置](#original-G3ZjdbaZyox2nDx8KvqcP58Bnsq)[三、训练环境配置](#original-Dbfpdjb9yoMUNvxn9WEcg1Y4ngf)[四、进入训练](#original-G42qd9oQuoXeAOxE1WOcSDF3nKc)[五、结束](#original-XbNNdBJ1toVH6yxUq0LcHEYunp8)

### 一起探讨更多可能

从一个具体的场景开始聊聊。

[咨询合作](/contact?source=nanochat%EF%BC%9A%E4%BB%8E%E9%9B%B6%E8%AE%AD%E7%BB%83%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B)

## 继续探索

[全部研究](/research)

[![](/research-media/covers/coding-agent-execution-trajectories-v1.png)

模型实测

### 编程智能体的代码修复轨迹与 Harness 对照

DeepSeek V4 Pro、GLM-5.3 接连更新，豆包推出了 Seed-Evolving，DeepSeek 还发布了自己的 Harness。模型能力在涨，给模型提供工具和执行环境的 Harness 也在进化。](/research/coding-agent-execution-trajectories)

[![](/research-media/covers/deepseek-glm-kimi-task-comparison-v1.png)

模型实测

### DeepSeek、GLM 与 Kimi 的真实任务对比

说实话，现在的大模型已经多到让人有点选择困难了。](/research/deepseek-glm-kimi-task-comparison)

[![](/research-media/covers/doubao-seed-21-pro-engineering-tests-v1.png)

模型实测

### Doubao Seed 2.1 Pro 工程任务实测

6 月 23 日，火山引擎在北京举办 2026 夏季 FORCE 原动力大会，正式发布豆包大模型 2.1。](/research/doubao-seed-21-pro-engineering-tests)