Skip to content

第 0 章 学习环境与工具

本章目标:搭建一套可复用的大模型学习环境,理解 GPU 与显存的基本概念,并跑通第一个大模型推理程序。

预计用时:1 周(每天 1~2 小时)

学完你将能够

  • 熟练使用 Linux 命令行与 Python 虚拟环境
  • 说清显存(VRAM)与内存(RAM)的区别,会用 nvidia-smi 观察 GPU
  • 从 Hugging Face 下载模型并用 Transformers 完成一次推理
  • 掌握本书所有实验代码的运行方式

0.1 为什么先学这一章

大模型学习的第一个拦路虎往往不是数学,而是环境。无数初学者卡在"CUDA 版本不对""显存爆了""模型下载不下来"这类问题上,还没看到模型长什么样就放弃了。

这一章我们用最短路径搭建环境,并建立一个核心认知:环境配置不是一次性杂活,而是大模型工程师的日常技能。到了本书第四阶段(底层优化),你会发现判断"显存够不够""算力能不能跑满"就是最基础的工作。


0.2 Linux 命令行:20 个命令打天下

本书假设你使用 Linux(物理机、云服务器或 Windows 的 WSL2 均可)。如果你完全没有命令行经验,先掌握这 20 个命令即可覆盖 95% 的日常操作:

bash
# ---- 文件与目录 ----
pwd                 # 我在哪(打印当前目录)
ls -lh              # 列出当前目录内容(-h 让人类可读地显示大小)
cd /path/to/dir     # 进入目录
mkdir -p a/b/c      # 递归创建目录
cp -r src dst       # 复制文件/目录
mv old new          # 移动/重命名
rm -rf dir          # 删除(危险!三思而后行)

# ---- 查看文件 ----
cat file.txt        # 全部打印
head -n 50 file     # 看前 50 行
tail -f log.txt     # 实时追踪日志(调试训练时最常用)
less file.txt       # 分页查看(按 q 退出)
wc -l file          # 统计行数

# ---- 系统与进程 ----
ps aux | grep python   # 找 Python 进程
kill -9 <PID>          # 强制结束进程
df -h                  # 磁盘剩余空间
free -h                # 内存使用情况
top                    # 实时资源占用(按 q 退出)

# ---- 网络 ----
curl -O <url>       # 下载文件
ping baidu.com      # 测试网络连通性

📝 练习 0.1:创建目录 ~/llm-lab/ch00,在其中创建一个文件 hello.txt 写入任意内容,然后用 tail -f 在一个终端窗口跟踪它,在另一个窗口用 echo "new line" >> hello.txt 追加内容,观察变化。

这个练习看似 trivial,但 tail -f 是你日后盯训练日志的看家本领。


0.3 Python 虚拟环境:每个项目一个"隔离舱"

0.3.1 为什么需要虚拟环境

Python 包之间经常存在版本冲突:项目 A 需要 transformers==4.45,项目 B 需要 transformers==4.50。如果全部装到系统 Python 里,必然互相污染。虚拟环境给每个项目一个独立的包目录,互不干扰。

0.3.2 使用 venv(标准方案)

bash
# 创建虚拟环境(在项目目录下执行)
python3 -m venv .venv

# 激活(每次开新终端都要执行)
source .venv/bin/activate

# 激活后命令行提示符前会出现 (.venv),此后 pip 安装的包都只存在于这个环境
pip install torch transformers

# 退出环境
deactivate

0.3.3 使用 uv(推荐,更快)

uv 是近年流行的 Python 包管理器,安装速度比 pip 快 10~100 倍:

bash
# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# 创建项目与环境
uv init llm-lab && cd llm-lab
uv venv
source .venv/bin/activate

# 安装依赖(快得惊人)
uv pip install torch transformers accelerate

💡 经验法则:无论用哪个工具,永远不要在系统 Python 里直接 pip install。本书所有代码都假设你在虚拟环境中运行。


0.4 GPU 与显存:大模型世界的"硬通货"

0.4.1 CPU vs GPU

用一个类比理解:

  • CPU 像几个博学的教授:核心少(8~64 个),但每个核心能力全面、擅长复杂的串行逻辑。
  • GPU 像上万个小学生:核心极多(上万个),每个只会简单算术,但一起做矩阵乘法这种"简单但海量"的计算时,速度碾压 CPU。

神经网络的本质是海量矩阵乘法,所以大模型训练和推理几乎都在 GPU 上进行。

0.4.2 显存(VRAM):最重要的资源指标

GPU 有自己的专用内存,叫显存。模型要跑在 GPU 上,必须先把参数加载进显存。显存不够 = 模型跑不起来,这是大模型时代最常见的报错(CUDA out of memory)。

记住一个最重要的估算公式(本书会反复使用):

模型权重显存 ≈ 参数量 × 每参数占用字节数

精度格式每参数字节数7B(70 亿参数)模型显存说明
FP324 字节28 GB训练时的主权重
FP16/BF162 字节14 GB推理最常用的精度
INT81 字节7 GB量化后
INT40.5 字节3.5 GB激进量化,消费级显卡也能跑

注意:这只是"模型权重"的显存。推理时还有 KV Cache、激活值等额外开销;训练时还要加上梯度、优化器状态(可达权重的 4~8 倍)。这些会在第 5 章(推理)和后续章节详细展开。

0.4.3 nvidia-smi:你的 GPU 仪表盘

bash
nvidia-smi

典型输出解读:

+-----------------------------------------------------------------+
| GPU  Name        Persistence-M | Bus-Id        | Memory-Usage   |
|   0  NVIDIA A100-SXM4-40GB  On  | 00000000:...  | 12896MiB / 40960MiB |
+-----------------------------------------------------------------+
| Processes:                                                      |
|  GPU   PID    Type   Process name                GPU Memory     |
|    0   12345  C      python                          12780MiB   |
+-----------------------------------------------------------------+

关键字段:

  • Memory-Usage:已用显存 / 总显存。跑模型前后各看一次,差值就是模型占用的显存。
  • GPU-Util:算力利用率。推理时如果只有 10~20%,说明 GPU 大部分时间在等数据搬运(访存瓶颈,第四阶段的核心议题)。
  • Processes:哪些进程在占用显存。进程僵尸残留显存时,用 kill -9 <PID> 清理。

📝 练习 0.2:运行 nvidia-smi,记录你机器的 GPU 型号与总显存。根据上面的表格,估算你的显卡能放下多大的 FP16 模型?INT4 呢?

如果没有 GPU:可以使用云服务商按小时租用(如 AutoDL、各大云厂商),或使用 Google Colab 的免费 GPU。本书前期章节的实验用 CPU 也能勉强跑(只是慢),从第 5 章开始强烈建议有至少 8GB 显存的 GPU。


0.5 Hugging Face:大模型的"中央仓库"

Hugging Face(HF)是全球最大的模型与数据集托管平台。注册账号后,绝大多数开源模型(Qwen、Llama、DeepSeek 蒸馏版等)都可以直接下载。

bash
# 安装 CLI 并登录(某些模型需要登录同意协议)
pip install huggingface_hub
huggingface-cli login   # 粘贴你的 token(在 HF 网站 Settings -> Access Tokens 生成)

# 下载一个模型(0.6B 小模型,约 1.2GB,适合第一次实验)
huggingface-cli download Qwen/Qwen3-0.6B --local-dir ./models/Qwen3-0.6B

下载完成后,目录结构如下:

models/Qwen3-0.6B/
├── config.json          # 模型架构配置(层数、隐藏维度等,第 4 章详解)
├── generation_config.json  # 默认生成参数
├── model.safetensors    # 模型权重(safetensors 是安全的权重格式)
├── tokenizer.json       # 分词器
└── tokenizer_config.json

💡 国内网络提示:如果 HF 访问缓慢,可以使用镜像 export HF_ENDPOINT=https://hf-mirror.com,或使用 ModelScope(阿里)下载。


0.6 里程碑:你的第一次大模型推理

万事俱备,现在完成本章的里程碑——加载模型并生成文本。创建 first_inference.py

python
"""第 0 章里程碑:第一次大模型推理"""
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_path = "./models/Qwen3-0.6B"

# 1. 加载分词器:负责 文本 <-> 数字 的转换
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 2. 加载模型:把权重读进内存/显存
#    device_map="auto" 表示有 GPU 就用 GPU
#    torch_dtype="auto" 表示按模型自带的精度加载(通常是 BF16)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype="auto",
    device_map="auto",
)

# 3. 构造对话输入(聊天模型有固定的消息格式)
messages = [
    {"role": "system", "content": "你是一个简洁的助手。"},
    {"role": "user", "content": "用一句话解释什么是大语言模型。"},
]

# 4. 套用聊天模板并转为模型能理解的数字(token id)
text = tokenizer.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)

# 5. 生成:模型逐个预测下一个 token
outputs = model.generate(**inputs, max_new_tokens=128)

# 6. 解码:把生成的数字转回文字(只取新生成的部分)
new_tokens = outputs[0][inputs["input_ids"].shape[1]:]
print(tokenizer.decode(new_tokens, skip_special_tokens=True))

运行:

bash
python first_inference.py

如果顺利,你会看到模型对"大语言模型"的解释。恭喜你,完成了从零到大模型的第一步。

逐行拆解(这六步是全书的地基)

整个流程可以概括为一张图:

人类文字 --[tokenizer]--> token id 序列 --[model]--> 新 token id --[tokenizer]--> 人类文字
  1. 分词器(Tokenizer):模型不认识文字,只认识数字。分词器把文字切成一个个 token 并映射为 id(第 4 章详解)。
  2. 模型(Model):本质上是一个巨大的函数,输入一串数字,输出"下一个数字最可能是什么"的概率分布。
  3. 生成(generate):循环执行"预测下一个 → 拼到末尾 → 再预测下一个",这就是自回归生成(第 5 章详解)。
  4. 解码(decode):把数字变回文字。

📝 练习 0.3

  1. 在推理前后分别运行 nvidia-smi,记录显存差值,用 0.4.2 的公式估算理论值并对比。
  2. max_new_tokens 改成 512,观察生成时间的变化。
  3. 修改 system prompt,观察模型行为的变化(这是第 7 章提示工程的雏形)。

0.7 Jupyter Notebook:探索式学习的利器

本书的大量实验适合在 Notebook 中交互式进行:

bash
pip install jupyter
jupyter notebook    # 浏览器中打开,逐格执行代码

💡 经验法则:探索、调试、画图用 Notebook;成形的训练脚本、部署服务用 .py 文件。


0.8 Git:给你的学习过程存档

学习过程中你会写大量实验代码,用 Git 管理它们:

bash
git init                          # 初始化仓库
git add first_inference.py        # 暂存文件
git commit -m "ch00: first inference"  # 提交存档
git log --oneline                 # 查看历史

养成"每完成一个实验就提交一次"的习惯,三个月后你会感谢自己。


本章小结

知识点一句话总结
Linux 命令掌握 20 个核心命令,重点是 tail -f 看日志
虚拟环境每个项目一个环境,永不污染系统 Python
GPU vs CPUGPU 擅长海量并行矩阵运算,是大模型的载体
显存公式权重显存 ≈ 参数量 × 每参数字节数(FP16=2,INT4=0.5)
nvidia-smi看显存占用和算力利用率的仪表盘
Hugging Face模型中央仓库,huggingface-cli download 下载
推理六步加载分词器 → 加载模型 → 构造输入 → 编码 → generate → 解码

本章实战验收

  • [ ] 创建好虚拟环境,安装 torch + transformers
  • [ ] 下载 Qwen3-0.6B 并成功运行 first_inference.py
  • [ ] 用 nvidia-smi 记录并解释推理前后的显存变化
  • [ ] 估算自己显卡能容纳的最大 FP16 / INT4 模型尺寸

拓展阅读

  • Hugging Face 官方课程(免费):LLM Course —— 环境部分的更多细节
  • uv 官方文档 —— 现代 Python 包管理
  • 《The Linux Command Line》(免费电子版)—— 想系统补命令行的话