小白转行AI大模型系列(二)把 15GB 的 Qwen 下载下来,拆开看看里面装了什么
上一课我们认识了 7B 参数是什么、显存怎么算,还领到了启智社区的免费算力。有同学在评论区催了:说好的跑起来呢?
别急,跑起来之前还差最后一步——把模型下载下来。
这一课我们就干一件事:把 Qwen2.5-7B 完完整整下载到服务器上,然后拆开看看,这 15GB 的文件里面到底装了什么。这一步看着简单,其实有不少坑。
先说个历史:为什么全世界都在用"抱脸"下载模型
去模型网站逛,你会看到两个名字反复出现:HuggingFace 和 ModelScope。当前,现在国内也有一些平台可以承载模型,比如启智社区和魔乐社区,但主流的还是HF和MS。
HuggingFace(抱脸)这个名字,就是那个笑脸 emoji 🤗 的来源。很多人以为它是模型平台起家的,其实不是。它 2016 年在纽约成立的时候,是一家做青少年聊天机器人的公司,后来转型做了开源 NLP 工具库,2018 年随着 Transformer 架构火起来,顺势推出了 Transformers 库,一脚踩在了时代的点上。
现在它已经是 AI 界的 GitHub——开源模型基本都在这里首发,GPT 系的开源版、Llama、Qwen 全在上面。最近甚至传出英伟达将以129亿美元的价格收购HF,HF的原班人马直接变身亿万富豪!
那我们为什么不用它?
不是不用,是国内访问它太慢。所以阿里达摩院 2021 年推出了国内的"平替":ModelScope(魔搭),模型一样全,国内直连、下载飞快,不用科学上网。我们课程统一用它。
三行代码,把 70 亿参数拉到本地
下载模型不是复制粘贴文件,是有专门的工具的。ModelScope 提供了一个 Python 库,核心就一个函数 snapshot_download——字面意思就是"快照下载",把模型仓库里的所有文件原封不动拉下来。
上代码,这几行在实验代码仓库里就有(src/download_model.py),可以复制运行:
from modelscope import snapshot_downloadmodel_dir = snapshot_download'Qwen/Qwen2.5-7B-Instruct',cache_dir='/tmp/models',)print(”模型已下载到:”, model_dir)
解释一下:
'Qwen/Qwen2.5-7B-Instruct':模型在魔搭上的"门牌号",作者名/模型名cache_dir:下载到哪。这里有个小讲究——模型目录是可以复用的,工具会先查本地有没有,缺哪个补哪个,不会傻乎乎每次全量重下。
运行后等着就行,7B 模型 FP16 下大约 14-15GB,网速快的话十几分钟到半小时。
一个偷懒的技巧:在启智社区建任务的时候,选择模型 Qwen2.5-7B-Instruct(我们实验手册的步骤里配了截图),平台会自动把权重迁移到环境里的 /tmp/pretrainmodel 目录,你直接跳过下载这步。不过我还是建议你亲手跑一遍下载流程——工作里你面对的场景,十有八九是要自己下的。
拆开看:15GB 里到底装了什么
下载完,ls -lh 一下,你会看到一堆文件,主要有这些:
| 文件 | 作用 |
|---|---|
| config.json | 模型结构配置:几层、多少个头、隐层多大等等,这是模型的"户口本",每个模型的结构都是唯一的 |
| model-0000x-of-0000y.safetensors | 权重文件,真正装着 70 亿个参数的实体,分片存储,每个分片 3~4 G 左右 |
| tokenizer.json | 分词器,把文字切成 token 的"翻译官" |
| tokenizer_config.json | 分词器的配置 |
| generation_config.json | 生成回答时的默认参数(温度、最大长度这些) |
其中最重要的就两样:safetensors 和 tokenizer。
safetensors 是权重本身。你可以把它理解成模型"上学多年"学来的全部记忆,压成了数字矩阵。为什么叫这个名字?safety + tensors,安全张量。这里有个值得讲的背景:早年模型权重都用 PyTorch 的 pickle 格式存(.bin 文件),而 pickle 有个祖传毛病——反序列化时会执行文件里嵌入的任意代码。也就是说,你从网上下载一个 .bin 模型,运行的时候,恶意作者可以顺手在你机器上执行任意代码。这不是危言耸听,前两年安全厂商真的在 HuggingFace 上扫出过携带恶意代码的模型文件。所以 HuggingFace 后来推出了 safetensors 格式:纯数据、不含代码、加载又快,现在基本是标配了。
tokenizer 是入口的翻译官。模型不认识"你好"这两个汉字,它只认识数字。tokenizer 负责把你的文字切成一个个 token,再映射成数字编号。比如"人工智能"可能被切成"人工"+"智能"两个 token。为什么重要?因为你的上下文长度、计费、显存里的 KV cache(以后详细讲解),全是按 token 算的——不懂 tokenizer,后面聊推理优化就是空中楼阁。这块我们后面会单独展开讲。
验证一下:数字对不对得上
最后做个验收,算一下目录总大小:
du -sh /tmp/pretrainmodel/Qwen2.5-7B-Instruct/# 预期:约 14-15 GB
上一课我们口算过:7B × 2 字节 × 1.2 ≈16.8GB。
那这里怎么只有 14-15GB?注意区分两个概念:
- 模型权重本身:7B × 2 字节 = 14GB,这就是磁盘上那堆 safetensors 的大小
- 运行时显存:权重加载到显存后,还要额外分配 KV cache、激活值等运行时开销,所以估算公式里才有那个 1.2 的经验系数
磁盘 14GB ≈ 权重,显存 16.8GB ≈ 权重 + 运行开销。两个数字都对上了,说明你的理解闭环了。
本课自测(对着实验手册完成的同学应该都能答):
- 模型下载到了哪个目录?总大小多少?
- safetensors 和 tokenizer 各自的作用是什么?
- 为什么磁盘 14GB,显存却要按 16.8GB 估?
小结 + 下集预告
这一课你收获三件事:
- 模型下载用 ModelScope 的
snapshot_download,三行代码搞定,目录可复用 - 模型目录的核心文件:safetensors 是权重实体,tokenizer 是文字到数字的翻译官
- 权重 14GB(磁盘)≠ 运行显存 16.8GB,差的那个 1.2 系数是运行时开销
下一课,压轴的好戏来了:加载模型,跑出第一句"你好,我是 Qwen"——我们既用 Transformers 直接推理,也会把 vLLM 服务起起来,让你体会工程里"玩具跑法"和"生产跑法"的区别。
模型文件拆完了,就要让它开口说话了。关注龙虾哥,别掉队,评论区见。
本课配套开源仓(全部实验代码 + 操作手册,免费拿走):
- GitCode:https://gitcode.com/LXG_AI/LXG_LLM_INFER_COURSE
数据与工具来源:ModelScope 官方文档(modelscope.cn)、HuggingFace 官方文档(huggingface.co)