ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

221、【AI】【模型部署】跑起第一个模型(下):Notebook 里首次推理

221、【AI】【模型部署】跑起第一个模型(下):Notebook 里首次推理 【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除标题221、【AI】【模型部署】跑起第一个模型(下)Notebook 里首次推理背景上篇 blog【AI】【模型部署】跑起第一个模型(上)装 CPU 环境与下载 Qwen2.5-0.5B完成了准备在 venv 里装好 CPU 版 torch2.14.0cpu、transformers 5.16.1、modelscope 1.40.0并从 ModelScope 下载了 Qwen2.5-0.5B-Instruct11 文件、约 1GB、缓存于~/.cache/modelscope/models/Qwen--Qwen2.5-0.5B-Instruct/snapshots/master还验算了权重体积 ≈ 参数量 × 每参数字节数。本篇把这堆文件加载起来、第一次真正生成文本——在 Notebook 里逐格跑复用 215 介绍过的交互式工作流全程只在本机 CPU模型部署环境与模型都已就位缺的只是把 model.safetensors 变成能对话的大脑那几行代码。本篇在一个新建的 Notebook 里逐格完成加载分词器 → 加载模型 → 组装对话 → 生成 → 看输出。开场前提让 Notebook 找到模型Notebook 里不需要联网——from_pretrained直接指向本地缓存目录即可MODEL/home/adminpc/.cache/modelscope/models/Qwen--Qwen2.5-0.5B-Instruct/snapshots/master这一格没有输出只定义一个变量——正是 215 说的跨格共享状态后面所有格都能直接用MODEL不用重复粘贴长路径。格 1加载分词器与模型约 0.4 秒importtimefromtransformersimportAutoModelForCausalLM,AutoTokenizer t0time.time()tokAutoTokenizer.from_pretrained(MODEL)modelAutoModelForCausalLM.from_pretrained(MODEL)print(f加载合计{time.time()-t0:.1f}s)实测合计 0.4s其中分词器约 0.2s、模型约 0.2s就把 5 亿参数装进内存。为什么这么快from_pretrained从本地目录按config.json里的架构声明qwen2、24 层、hidden 896现场搭起网络结构再把 safetensors 里的权重灌进去——不是下载而是本地文件的即时加载。变量tok/model留在内核里后续每格都能直接用跨格共享状态。格 2组装一句对话模型要按它训练的格式说话模板由分词器负责渲染msg[{role:user,content:用一句话介绍什么是 Transformer 模型。}]inputstok.apply_chat_template(msg,tokenizeTrue,return_tensorspt,return_dictTrue)print(prompt tokens:,inputs[input_ids].shape[1])apply_chat_template把角色消息列表渲染成模型认识的完整文本——开头加上 system 设定、句间插入|im_start|user这类特殊 token实测这句话被切成35 个 token。返回值里input_ids就是喂给模型的数字序列。格 3生成 52 个词并计时importtime t0time.time()outmodel.generate(**inputs,max_new_tokens64,do_sampleFalse)dttime.time()-t0 gen_nout.shape[1]-inputs[input_ids].shape[1]print(f生成{gen_n}tokens | 耗时{dt:.1f}s |{gen_n/dt:.1f}tok/s)texttok.decode(out[0],skip_special_tokensTrue)print(text)实测结果生成 52 tokens、耗时 3.1 秒、约 16.9 tok/s。max_new_tokens64限定最多新增 64 个词本次 52 个即遇到结束符do_sampleFalse表示贪心解码每步取概率最高的词。贪心还给调试带来可复现性同一 prompt 每次运行结果一致便于核对问题出在输入还是模型。格 3 的真实输出长什么样同一格打印出的完整文本节选system You are Qwen, created by Alibaba Cloud. You are a helpful assistant. user 用一句话介绍什么是 Transformer 模型。 user Transformer 模型是一种深度学习模型它通过自注意力机制…两个值得注意的点文本里出现system/user字样的角色标记因为apply_chat_template已经把整段对话拼进输入decode时这些标记连答复一起回显——想只看纯答复可在生成后从out[0][prompt_len:]截取生成段再解码最前面的 system 提示语“You are Qwen, created by Alibaba Cloud…”每次都出现说明系统提示是模板自动加的——这也是套壳聊天产品注入系统提示的底层位置答复末尾又冒出一个user是 0.5B 小模型的常见毛病——生成时偶尔把对话模板再回显一段。模型小≠完美跑通流程的目的已达成。同样的问法换个解码参数输出会不同上面用的是do_sampleFalse贪心每步取概率最高的词输出稳定可复现。改成do_sampleTrue引入随机采样后同样的问题会得到措辞不同的回答。实测同句的采样输出节选Transformer 是一种基于自注意力机制的神经机器学习模型 通过分词、编码和解码等步骤实现了大规模语言处理任务…参数的工程含义产品里要稳定就开贪心或把temperature调低temperature0.9左右要多样、发散写文案、头脑风暴就开采样。这个开关在后续做推理服务时是必配的请求参数。顺带懂一个点为什么 35 个 token一句 20 多个字的中文被切成 35 个 token既不是一字一 token也不是整句一个。现代分词器按BPE 子词切分常见词/字组会合并成更大的单元生僻内容拆得更碎最后映射成词表里的数字 ID。Qwen2.5 词表有151936个 tokenconfig.json 里的vocab_size。input_ids里的每个数就是这些 token 的 ID——模型看到的从来不是文字而是一串数字。这次 Notebook 会话在做什么格干的事关键点准备定义MODEL本地路径变量跨格共享格 1加载 tokenizer model0.4s本地即时加载格 2组装消息 → 35 tokensapply_chat_template格 3generate 生成52 tok / 3.1s / 16.9 tok/s速度换算直观感受16.9 tok/s 意味着写 512 个词要约 30 秒——CPU 上能跑通但不算快这正是后来要把推理放到 GPU 服务DSW/EAS上的现实动机之一。一句话记忆Notebook 里用三格跑通第一个模型from_pretrained(本地目录)加载 tokenizer 与模型0.4sconfig.json 定结构、safetensors 灌权重→apply_chat_template把消息渲染成 35 tokens 的对话 →model.generate(max_new_tokens64)贪心生成实测 52 tokens / 3.1s / 16.9 tok/s小模型会回显角色标记是正常现象CPU 能跑通但慢——为后续上 GPU 服务埋下动机。OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog【AI】【模型部署】模型的影子解剖 Qwen2.5-0.5B 模型目录
返回列表