一字一诗
LESSON 01 / 26

准备好你的写诗实验室

这一课完成什么

你将确认这台电脑能够运行课程程序,并分清“训练”和“生成”。只要能读简单的 Python,就可以从这里开始;模型里的新概念会先用具体数字和图解释。整个项目围绕一个具体任务:输入一个开头或几个关键词,让自己训练的模型逐字写出四句诗。

先分清:准备、训练、使用

学过 Python,就可以从普通程序的输入和输出理解模型。训练会修改一份数字文件;写诗只读取它。

先分清:准备、训练、使用
用文字逐步读这张图
  1. 原始诗词:人能读的文字;还不是模型
  2. 整理材料:文字转为编号;保留题与答案
  3. 从零训练:反复对照答案;逐步修改数字
  4. 保存模型:结构、字表与参数;一起写进文件
  5. 输入开头:比如“春江”;使用配套字表
  6. 逐字生成:读取训练后的数字;接成四行诗
为什么每次写诗不必重新训练?

训练已经把规律写进参数;生成只需要加载参数并计算。

训练会读取许多原诗,反复调整模型内部的数字;生成会读取训练保存的数字,根据你给出的条件继续写。生成时不需要再次从头训练,也不会因为写了一首诗就自动变聪明。两者使用同一套模型结构,执行过程和资源开销不同。

认识文件的位置

路径装着什么什么时候使用
全唐诗/仓库原始唐诗和宋诗整理材料时只读
poetry_gpt/模型、训练、生成和命令行源码全课程
configs/两档模型与训练设置开始训练前
artifacts/data/整理后的学习、验证、测试材料训练和评估
artifacts/runs/模型文件与训练日志保存、恢复、生成
lessons/每课独立小实验随课动手
course/dist/网页课程与图解通过本机学习服务打开
artifacts/workbench/网页实验生成的模型、数据和日志查看或恢复自己的练习

先认识眼前的工作台

左侧是讲解,右侧是“动手实验”。先在正文预测结果,再点击命令旁的“在右侧运行”:它会填入功能和参数,还不会开始计算。点击右侧“运行并观察”,本机的 Python 才真正执行,输出会陆续出现。可以展开“本次执行的命令”查看实际启动了什么。

窗口较窄时,点顶部“动手实验”打开面板;点“收起”回到正文。关闭或刷新网页不会停止正在进行的训练;结束训练请用“停止并保存”,等待状态变成“已停止”。“最近的实验”可以找回先前输出。

网页会为新训练分配独立目录。正文中供终端使用的示例路径会转换成右侧显示的实际路径;恢复训练时从列表中选自己的记录。只改图解里的滑块属于教学演示,点右侧运行才会启动真实程序。

图 22 / 浏览器截图本机工作台实际操作
对照输入与目标,而不是背编号

对照输入与目标,而不是背编号

先看哪里
先看左侧输入 x 和目标 y,目标向后错开了一位;再看右侧 Python 输出。
这说明什么
左侧换成了“明月照山河”,右侧运行的是课文固定例子“春江花月夜”。句子和字表编号可以不同,制作接字题的规则相同。
你接着做
先改图中的句子,写下你预测的输入与目标;再运行课文示例,对照同一条规则。

打开原图,放大阅读

查看来源

WORKBENCH.md · poetry_gpt/workbench.py · reports/workbench/browser-acceptance.json

建立并检查环境

所有命令默认在项目根目录执行。当前交付电脑已有独立环境,可以先检查;换电脑时,先按 uv 官方安装说明 安装 uv,再运行 setup 脚本。uv 负责准备合适的 Python 和所需程序包。安装需要网络;材料准备、训练、写诗和阅读课程都在本地完成。

bash
# 先在解压后的项目根目录打开终端
sh scripts/setup.sh
./poet course --start
./poet doctor
./poet lesson 1

交付电脑是 M1 Pro、32 GB 内存。检查结果里关注 Python、PyTorch 和“默认设备”。mps 表示使用 Mac 的图形处理器;cpu 表示使用普通处理器,也能运行小实验,训练通常更慢。是否支持加速由实际检查决定,不能只看芯片名称。

跑一个最小实验

bash
./poet lesson 4
./poet lesson 4 --exercise

你会看到“春江花月夜”的编号与输入、目标。先只观察:模型要根据前面的字猜后面的字。第 4 课会解释这些题怎么组成,第 6、7 课会解释如何评分和纠错。

验收与排错

完整学习包可从右侧底部下载。包内有课程、程序、诗词、正式模型与训练日志;新机器首次还需安装 Python 依赖。macOS 可双击包内的 start.command。若另一份项目已占用 8766 端口,可在终端运行 ./poet course --start --port 8767,打开对应端口的地址。

对照真实检查画面

图中是本次在这台 Mac 上重新运行 doctor 的结果。刚开始学习时“材料已准备”“模型已训练”可能为 false;这是进度尚未完成,不代表 Python 环境损坏。

图 01 / 浏览器截图本次复现命令
第一屏:确认本机已经准备好

第一屏:确认本机已经准备好

先看哪里
先看“默认设备”“材料已准备”“模型已训练”这三项。
这说明什么
本机选择 mps,表示使用 Mac 的图形加速;两个 true 表示交付材料和正式模型存在。刚从零开始的你看到 false 很正常,按后续课程创建即可。
你接着做
运行 ./poet doctor。Python 能启动以后,再检查材料和模型;换机器时版本或设备名可能不同。

打开原图,放大阅读 · 可复制的文字版

查看来源

reports/illustrated/environment.txt

小练习与答案

解释“已经训练过的模型关闭后,下次写诗为什么不用重新训练”。

查看答案

训练改变的是参数数值,保存模型会把这些数值写进文件。下次按相同结构建立模型,再读入这些数值,就恢复了生成能力。继续训练还需要优化器状态和随机状态,因此项目分别提供用于写诗的 best.pt 和用于恢复训练的 latest.pt。

本课源码

展开页面下方的完整实验,可单独运行 lessons/01/experiment.py。日常查看入口逻辑在 poetry_gpt/cli.pydoctor,设备选择在 poetry_gpt/common.pydevice_for

动手补全一小段

先运行上面的完整实验,再复制本课起始文件为自己的练习。starter 有意留空 solve 函数;补全后运行文件,底部检查会告诉你是否符合本课要求。卡住时打开参考答案,比较每一步。

bash
cp lessons/01/starter.py lessons/01/my_exercise.py
# 编辑 my_exercise.py 中的 solve 函数,然后运行:
.venv/bin/python lessons/01/my_exercise.py
# 对照完整答案:
.venv/bin/python lessons/01/solution.py

下载起始代码 · 下载参考答案

展开本课补全练习的完整参考答案
python
"""第 01 课补全练习:选择可用设备。修改 solve,保持下方检查不变。"""
import math, io, argparse
import torch
from torch import nn
from torch.nn import functional as F
torch.set_num_threads(2)
torch.manual_seed(26)

def solve(has_mps, has_cuda):
    return 'cuda' if has_cuda else 'mps' if has_mps else 'cpu'

assert solve(True,False)=='mps'
assert solve(False,False)=='cpu'
print("本课补全练习通过。")
展开本课完整、可独立运行的实验代码
python
"""本课独立实验;在仓库根目录执行 .venv/bin/python lessons/01/experiment.py。"""
import sys, json, math
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
import torch
from torch import nn
from torch.nn import functional as F
from poetry_gpt.common import ROOT, DEFAULT_DATA, read_json, read_jsonl
from poetry_gpt.model import ModelConfig, PoetryGPT, CausalAttention, Block
from poetry_gpt.data import Tokenizer, SPECIAL, clean_record, keywords_for
from poetry_gpt.labs import show
torch.set_num_threads(2)
torch.manual_seed(26)

from poetry_gpt.cli import doctor
doctor()
下载本课实验