Hw2 环境准备与最小检查¶
使用说明¶
本页整理完成 Hw2 前需要做好的准备工作。请先完成本页内容,再返回 Hw2 作业说明 阅读题目并提交答案。
本页默认你已经完成 lab0 与 lab1
本页不再重复 lab0 / lab1 中已经介绍过的普通 make qemu 启动流程、QEMU 退出方法或 shell 基本操作,只说明完成本次 Hw2 所需的新增准备。
如果你对基础启动流程不熟悉,请先回看 实验0:编译并启动 Kernel;如果你对在 shell 中执行用户程序和测试程序不熟悉,请回看 实验1。
获取 Hw2 对应代码(切换到 AI 分支)¶
前提说明
下面的命令默认你已经按 实验0:希冀平台与课程仓库接入 完成了双远程配置,即:
upstream指向课程公共仓库;origin指向你自己的希冀GitLab仓库。
Hw2 当前对应的代码位于课程仓库的 AI 分支,因此应当从 upstream/AI 获取,而不是从你自己的 origin 获取。
首次切换到 AI 分支
在课程仓库根目录执行:
如果你同时在做 lab1,切换分支前请先处理当前改动
很多同学此时可能仍在 lab1 分支上继续做实验。由于切换分支会直接修改工作区文件,因此请特别注意:
- 先执行
git status检查当前是否有未提交改动; - 如果你在
lab1分支上已经写了一部分代码,请先提交到lab1,或者先用git stash暂存; - 不要把
lab1的代码改动直接带到AI分支继续写,也不要把AI分支上的改动直接混到lab1分支; - 更推荐的做法是:
lab1相关工作始终留在lab1分支,Hw2的代码阅读、调试和尝试始终留在AI分支,需要来回切换时用git switch即可。
一个常见的切换习惯
如果你只是临时从 lab1 切到 AI 看代码,可以先暂存当前工作:
等你回到 lab1 后,再恢复刚才的暂存:
如果提示找不到 upstream/AI
先确认:
- 你已经完成了 实验0:希冀平台与课程仓库接入 中的远程配置;
- 课程仓库远程名确实叫
upstream; - 已经执行过
git fetch upstream --prune。
你也可以用下面的命令检查远端分支列表:
切到 AI 分支后,建议先阅读仓库根目录 README.md
当前 AI 分支的根目录 README.md 包含了最直接的运行说明,例如:
- 模型压缩包应当如何放置;
make qemu-smol、make qemu-qwen、make qemu-llm分别会做什么;llmrun_smol、llmrun_qwen的基本使用背景。
如果你当前不想切换工作分支,只想先预览课程仓库 AI 分支上的 README.md,可以执行:
本次作业需要额外了解什么¶
- 本次作业使用
AI分支中的 LLM 相关目标,启动时应优先使用make qemu-smol、make qemu-qwen或make qemu-llm,而不是普通的make qemu。 - LLM 相关目标会把
/AI/SMOL或/AI/QWEN模型资产目录额外打包进镜像,供llmrun_smol、llmrun_qwen读取。 - 本次作业仍然沿用你在
lab0中已经见过的“启动内核并进入 shell”路径;新增内容是在进入 shell 之后,手动执行llmrun_*完成一次 LLM 推理。 - 当前 guest 内没有 tokenizer,因此
llmrun_*的输入和输出都是 token id,而不是自然语言文本。
模型压缩包下载与放置¶
请先准备助教提供的模型资产压缩包
本次 Hw2 使用的不是原始 HuggingFace 权重,而是助教预先导出的二进制模型资产压缩包。
下载地址如下:
下载后请放到仓库根目录的 models/ 下,并保持文件名分别为 smol.zip 和 qwen.zip。例如:
不需要手动解压。make qemu-smol、make qemu-qwen、make qemu-llm 会自动解压并生成对应镜像。
Part 1 的最小准备
如果你当前只准备先完成 SmolLM2-135M 的测量,可以先只下载 smol.zip 并执行 make qemu-smol;完成 Part 1 中的跨模型对比时,再补下载 qwen.zip 并执行 make qemu-qwen。
不要用 make qemu 代替 make qemu-smol
make qemu 生成的是普通 fs.img,其中虽然包含 llmrun_smol 和 llmrun_qwen 两个用户程序,但并不包含 /AI/SMOL 或 /AI/QWEN 这两个模型资产目录。因此它适合做普通 OS 实验,不适合完成本次 Hw2 的 LLM 推理测量。
本次作业的 LLM 测量统一按单核路径进行
make qemu-smol、make qemu-qwen、make qemu-llm 在 Makefile 中固定为 CPUS=1。本次 Hw2 的测量与分析请以这条单核路径为准,不要把手工改成多核后的结果和课上讨论混在一起。
建议先完成一次最小检查¶
- 将助教提供的
smol.zip放到仓库根目录models/smol.zip。 - 在仓库根目录执行
make qemu-smol。 - 系统启动后会先进入你在
lab0中已经熟悉的 shell;此时与普通make qemu的区别在于,镜像中额外包含/AI/SMOL资产目录。 - 在 shell 中执行
llmrun_smol --predict 4 1 2 3 4。程序会先进入/AI/SMOL,再调用llm_runtime_init()读取模型配置和权重,随后分配KV Cache与工作区,并完成一次基于 token id 的Prefill/Decode推理。 - 若要测量
Qwen3.5-0.8B,则将上述命令分别替换为make qemu-qwen、/AI/QWEN和llmrun_qwen。
报告中请区分不同层次的耗时
在本次作业中,至少要区分两层含义:
- 宿主机侧的构建与启动时间:包括编译、解压模型资产、生成镜像和拉起 QEMU。
llmrun_*的模型加载时间:从用户程序启动,到llm_runtime_init()、KV Cache和工作区准备完成为止。
Part 1 中讨论的 Model Loading Time 更接近第 2 层,而不是把整个 make qemu-smol 的耗时都算进去。
宿主机侧 tokenizer 依赖¶
请使用 venv,不要使用 sudo pip install
如果你需要使用 tools/translate_llm_io.py 在宿主机上完成文本和 token id 的互转,不要直接在较新的 Ubuntu / Debian 上执行 python3 -m pip install --user tokenizers。它很可能报:
这是系统 Python 的保护机制,不是课程仓库的问题。为避免把虚拟环境目录留在仓库中、上传到云端或在切换分支时干扰工作区,推荐将虚拟环境建在仓库外,例如:
sudo apt update
sudo apt install python3-venv
python3 -m venv ~/.venvs/oslab-hw2
. ~/.venvs/oslab-hw2/bin/activate
python -m pip install -U pip
python -m pip install tokenizers
需要注意:venv 的激活状态只对当前终端有效。每次新开一个终端,或重新登录后再次进入仓库时,都需要重新执行:
如果你不想记住“先激活再运行”,也可以直接使用虚拟环境中的解释器,例如:
如果你已经习惯把虚拟环境放在仓库根目录,也请至少确保它不会被提交;本仓库会忽略 venv/ 和 .venv/。对本次作业而言,这样就足够了;不需要安装 Conda,也不要使用 sudo pip install。