【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【AI】【Agent】本地模型(硬件参数)
分析了 lscpu 命令输出的 CPU 参数,以及在该 CPU 下能运行的量化模型配置,其中提到了量化模型配置中三个关键概念:BQ5_K_Mtokens,并解释了其中的 BQ5_K_M,下面继续分析

Agent

上篇 blog 分析了 BQ5_K_M 概念的含义,下面再分析下 tokens

token 本意指实物凭证,随着技术演进,逐渐由了抽象符号的意思,在数字领域形成安全令牌和加密通证等概念,说到底,其精髓还在凭证的抽象概念里

在这里插入图片描述

在大模型的语境里,token 代表大模型处理文本的最小单位(当然,大模型处理 token 是收费的,也算一种间接的付费凭证),不是字,也不是词,而是子词(subword)或符号,通常情况下

  • 中文:1 个汉字 ≈ 1~2 个 token
  • 英文:1 个单词 ≈ 1~3 个 token(比如 unhappiness → [“un”,“happi”,“ness”])

举个例子,输入句子

你好,世界!

可能被拆成 tokens

["你", "好", ",", "世", "界", "!"]

一共有 6 个 tokens,而输入代码

def hello(): print("Hello")

则可能被拆成

["def", " hello", "(", "):", " print", "(", "\"", "Hello", "\"", ")"] 

一共有 10 个 tokens

OK,注意,上面说的指的是输入 tokens,而之前表格里列举的推理速度(tokens/s),则指的是输出 tokenstokens/s 在这里衡量的是模型生成速度,80 tokens/s 相当于每秒输出 40~80 个汉字,或 50~100 个英文单词,对比人类的打字速度(约为 5~10 tokens/s),AI 要快上 8~16 倍

在这里插入图片描述

表格中的 Phi-3-mini 的推理速度可以达到 80~120 tokens/s,相当于每秒写 2~3 行的 Python 代码,非常流畅

OK,最后把表格提炼完再总结下

模型 参数量 量化格式 速度 内存 说明
Phi-3-mini(3.8B) 38亿 Q5_K_M 80~120 t/s ~4GB 小而快,微软优化极好
CodeLlama-7B 70亿 Q5_K_M 40~60 t/s ~6GB 通用代码模型
DeepSeek-Coder-6.7B 67亿 Q5_K_M 35~50 t/s ~6GB 中文代码更强
Llama-3-8B 80亿 Q5_K_M 30~45 t/s ~6.5GB 通用开源

另外,从表格中,还可以看到,参数量越大,tokens 速度越小,这个特点非常有代表性,在相同硬件,相同量化格式(都是 Q5_K_M)下,参数量越大,tokens 生成速度越慢,其背后是计算机体系结构和大模型推理原理的直接体现

其核心原因一句话总结:每生成一个 token,模型都要遍历所有参数做一次计算,参数越多,计算量就越大,速度自然也就越慢

举个形象点的例子,就像

  • 让一个小学生背 10 个单词,速度很快
  • 但让一个博士背 10000 个专业术语,虽然博士很聪明,但时间就要久一点

而大模型生成文本是逐个 token 自回归autogressive)的过程,比如

输入: "写一个"
↓
模型计算 → 输出: "Python"
↓
输入变成: "写一个 Python"
↓
模型计算 → 输出: "函数"...

在这里插入图片描述

可以看到,token 自回归的过程中,其生成的每一个 token 都会被重新作为输入,再经过模型计算,生成出新的 token,这里每一步的核心操作在于,对每个新生成出来的 token,模型都要执行一遍:

  • 加载所有参数(从内存到 CPU 缓存)
  • 做矩阵乘法 + 激活函数(计算量 ∝ 参数数量,∝ 是数学和物理中常用的符号,表示正比于
  • 采样下一个 token 继续作为输入

OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【AI】【Agent】tokens生成速度

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐