第 30 课 · 让模型在自己电脑上运行:先估算,再留下真实记录

学生工作纸

第30课学生操作单:本机运行,需要哪些证据

本课有两条操作路径。页面实验在浏览器中真实计算存储与取整;终端练习才可能取得模型回答。两条路径分别记录,页面出现数字不表示电脑已经装好模型。

课前准备,不占课堂60分钟

在自己电脑新建 classroom30 文件夹。按系统打开 Windows 官方安装说明 或 macOS 官方安装说明,核对当前系统要求,从官方页面下载对应安装包。Windows 安装后打开 Ollama 并重新打开 PowerShell;macOS 按安装界面放入应用程序并打开,再重新打开终端。Linux 用户由教师按官方 Linux 说明准备。

在终端逐行执行,记录真实输出,不把命令文本当成功记录:

ollama --version
ollama ls

教师确认软件与设备适合练习后,若列表里没有这个模型,课前执行:

ollama pull qwen2.5:0.5b
ollama ls

pull 会联网下载文件;本课编写过程没有替你执行它。名称来自对应模型页,上课前再核对。不把这个小模型当作推荐质量榜,也不依据文件大小保证电脑能运行。不要用带 :cloud 的名称替代本地练习。

安装不兼容、下载未完成或不能使用终端时,填写具体阶段,课堂直接完成后备任务,不在课堂临时下载大模型或修改共享服务。

Q0 0—6分钟:先写自己的判断

写下“文件/服务/调用程序”三个框,把 qwen2.5:0.5b、Ollama、local_chat.py 分别放入合适位置。哪个东西负责保存参数,哪个接收请求,哪个把问题发过去?

预测:假想模型标为4B,是否就是4GB?电脑显示有3GB可用内存,是否一定能运行4位版本?暂时不看答案,写一句依据。

Q1 6—13分钟:先手算,再运行

假设共有4×10⁹个参数,每参数理想保存4位;8位组成1字节。用纸笔计算字节数、十进制GB。页面默认可用内存3GB,额外占用 unknown,独立数轴材料为 [-0.26, 0.14, 0.49],格距0.1。

点击“计算存储与取整过程”,记录理想大小、扣除权重后的差额、程序如何处理未知项。只把位宽改成16,其他字段保持不变,再运行。比较两次大小;取整结果有没有随位宽变化?解释这两个小计算的关系。

Q2 13—26分钟:量化的误差与资源假设

恢复4位。对三个原数先找最近0.1格点,写“原数、取整后、绝对误差”。只把格距改成0.25,再记录一次。这里等距离时选择离0更远的格点;它是教学数轴规则,不是某种真实Q4格式。

恢复默认格距0.1,将额外占用从 unknown 改为 1.2,其余保持默认。合计多少GB,与3GB可用内存比较如何?这1.2来自测量还是人为输入?列出至少两种不在理想权重公式里的占用。

Q3 26—34分钟:检查模型与运行软件

已准备好模型的同学,先运行 ollama ls 确认精确名称,再进入对话:

ollama run qwen2.5:0.5b

出现对话提示符后输入完整材料:

原创材料:资料比较用了12分钟,核对引用用了18分钟。只复述两项活动和各自时间,不推测学习能力,不补充建议。

保存本次实际文字。输入 /bye 退出对话,然后立刻执行:

ollama ps

记录有无这个运行中的模型、显示的处理器或资源信息。ls 与 ps 有什么不同?没有运行信息时写“当前未观察到”,不编造CPU/GPU比例。

Q4 34—48分钟:从本地接口取得可保存的结果

把 local_chat.py 保存到 classroom30 文件夹,在该文件夹打开终端。需要Python3.9+;Windows可以使用教师已核对可用的 py -3 代替 python3。

python3 --version
python3 local_chat.py --model qwen2.5:0.5b

记录 mode、地址和待发送消息。这个命令没有 --live,只展示请求,不会调用模型。

已确认本地服务和模型就绪时,在同一文件夹新建 record_local.py,原样粘贴以下代码并保存:

import json
import time
from pathlib import Path
import local_chat

question = "原创材料:资料比较用了12分钟,核对引用用了18分钟。只复述两项活动和各自时间,不推测学习能力,不补充建议。"
started = time.perf_counter()
try:
    record = local_chat.chat("qwen2.5:0.5b", question, live=True)
except Exception as error:
    record = {"mode": "not_completed", "error_type": type(error).__name__, "message": str(error)}
record["elapsed_seconds"] = round(time.perf_counter() - started, 3)
record["requested_model"] = "qwen2.5:0.5b"
record["question"] = question
text = json.dumps(record, ensure_ascii=False, indent=2)
Path("local-result.json").write_text(text, encoding="utf-8")
print(text)

运行一次,等待结束:

python3 record_local.py

打开 local-result.json。检查 mode 是否取得本地服务响应、返回模型名是否一致、done 是否为true、answer 是否非空。随后逐项核对活动、12和18、有没有无依据的能力标签。接口回应和文字正确分开判定。耗时只属于这台设备、这次输入和当时状态,不能据此给模型排名。

如果出错,保留类型及完整阶段,不循环重试。没有准备条件的同学完成以下后备:画出脚本→本地服务→已下载权重的路径,读代码找 live=True 与默认模式的区别,再用Q1、Q2的真实计算完成资源判断,交“本地后备已完成;模型实际调用未完成”。

Q5 48—55分钟:独立完成,不看答案

  1. 新的假想模型为2B、8位,可用内存2.5GB,额外占用未知。算理想大小,并写能否保证运行及原因。
  2. 新数值为 [0.12, 0.39, -0.62],格距0.25。先手算各取整值和绝对误差,再用页面核对。
  3. 同学交来只有 dry_run_no_network 的记录,却说“模型已经正确复述”。写出缺少哪两类证据。
  4. 一个应用的聊天模型在本机,但检索先把文字交给外部嵌入服务。画出外发步骤,说明能否将整个应用称为离线。

Q6 55—60分钟:提交与离堂

提交Q1和Q2的前后记录、Q5解答,以及Q4的真实结果或准确的未完成记录。写一句“本课我能独立做的检查”,再写一句“我还没有验证的事”。预测猜错不扣分;观察与证据必须对应你实际完成的操作。