预计时间:45 ~ 90 分钟
本章目标:跑通课程的第一次 smoke test,并进入Lab01的真实工作目录
正式课程从下一章开始,但在那之前,你需要先把起跑线摆正。这里的“准备”不是为了让你多看几页导言,而是为了确保你接下来读到的每一章、写下的每一行代码、看到的每一次测试结果,都发生在正确的工作环境里。
这一章做完以后,你不需要已经懂张量,也不需要已经懂 attention。你只需要处于一个清楚、稳定、可继续推进的状态:你的机器能编译后面的 lab,你知道正式课程从哪里开始,你能看到第一章对应实验的初始输出。
0.1 这一章结束后,你应该达到什么状态
本章完成时,你应当同时满足下面四条:
- 你的机器上有可用的
gcc和make。 - 你能进入
course/practice/labs/lab01-step0/。 - 你能执行
make clean && make test。 - 你知道第一次看到
3 FAIL + 1 PASS是正常现象,不是环境损坏。
这四条里,最后一条尤其重要。因为这门课不是让你一上来运行一个已经写完的程序,而是让你从一个可编译、可验证、但尚未完成的骨架出发,逐章把项目做出来。
0.2 你现在还不需要懂什么
零基础课程最容易犯的错误,就是在开始之前先把读者压进一大堆还用不上的概念里。这里先把边界说清楚。
在这一章,你还不需要理解:
- 张量的 stride 公式;
- softmax 为什么要减最大值;
- attention 的
Q/K/V; - 反向传播如何算梯度;
- BPE 为什么能把字符序列压缩成更长的子词。
这些内容都会在后面按顺序出现。你现在真正需要做的,是保证自己已经站在正式课程入口上。
0.3 检查最小工具链
先打开终端,执行:
gcc --version
make --version
如果两条命令都能打印版本信息,说明你的机器已经具备最基本的起步条件。
如果这里直接报 command not found,先不要继续往下做。优先修工具链:
- macOS:
xcode-select --install - Debian / Ubuntu:
sudo apt install build-essential - Windows:优先使用 WSL2,再在 WSL 内安装
build-essential
你不需要在这一章深入理解编译器原理。此刻只要记住一件事:后面的每个 lab 都建立在“make 能驱动 gcc 编译这些 .c 文件”的前提上。
0.4 进入课程目录
从仓库根目录开始,执行:
pwd
ls
你应该能看到仓库根下的 course/ 目录。继续进入:
cd course
ls
这里你会看到主线章节、附录,以及接下来要进入的 lab 目录。
到这一步为止,还只是“进入课程”。真正的起点在下面这一步:跑第一次 smoke test。
0.5 运行第一次 smoke test
请直接执行:
cd practice
bash scripts/bootstrap-practice.sh
这个脚本会帮你完成三件事:
- 检查
gcc和make是否存在; - 进入
labs/lab01-step0/; - 自动执行一次
make clean && make test。
如果你想手动确认它最后到底做了什么,也可以继续执行:
cd labs/lab01-step0
make clean && make test
0.6 第一次看到 FAIL,为什么反而是对的
第一次进入 Lab01 时,你看到的通常不是全通过,而是类似下面这种结果:
[TEST 1] ... [FAIL]
[TEST 2] ... [FAIL]
[TEST 3] ... [FAIL]
[TEST 4] ... [PASS]
3 test(s) FAILED.
这不是坏事。它恰恰说明三件事已经成立:
- 代码能编译;
- 验证程序能运行;
- 第一章需要你补的几个函数还没有写,所以失败被清楚地暴露出来了。
这门课的正式起点,不是“你已经什么都做完了”,而是“你已经进入一个可以开始做第一章的状态”。
0.7 如果这里跑不起来,先查什么
如果 smoke test 没有跑到上面的结果,先按这个顺序排查:
| 现象 | 先检查什么 |
|---|---|
gcc: command not found |
编译器没有装好 |
make: command not found |
构建工具没有装好 |
No such file or directory |
当前目录不对 |
make 阶段失败 |
先回看编译输出,确认是编译错误还是链接错误 |
| 输出和预期差很多 | 先执行 git status --short,确认工作区是不是已经被改过 |
如果你只是第一次看到 3 FAIL + 1 PASS,那不属于故障,不需要排错,直接继续下一章。
0.8 本章小结
这一章没有教你模型结构,也没有让你开始写核心算法。它只完成了一件更基础的事:把你准确送到正式课程入口。
现在你已经知道:
- 机器可以运行这门课的 lab;
- 第一章对应的实验目录在哪里;
- smoke test 的正常起始现象是什么;
- 接下来应该去哪里写第一批代码。
这就够了。后面的解释,从下一章开始才真正进入知识本身。
0.9 下一步
现在直接进入:
从这里开始,课程才真正进入代码。