1.8.1 prompt
在prompt中添加“回复尽量简洁”可以节省40%-50%的大模型接口调用费
因为大模型的接口通过token数量来计算费用,在prompt中添加“回复尽量简洁”可以让模型生成的token数变少,从而节省调用费用。除此之外,还可以在prompt中对答案添加其它条件来精简答案的长度,例如调用GPT4接口来回答“暑假有哪些好玩的景点推荐一下“,它默认生成了10个候选景点,但我们并不需要那么多,如果在prompt要求只生成5个,就可以节省一半的费用。
每个英文单词大约对应1.3个token
LLM在token的粒度上进行训练和推理,在处理英文时,token通常对应英文中的单词(word)或者“子词”(subword),例如“eating”这个词可能被拆解为两个token:“eat”和“ing”。一个包含750个单词的英文文档大约对应1000个token。因为大多数的大模型的接口调用根据token数来计费,根据1:1.3这个比例可以事先估算出调用大模型的成本。
⚠️这个比例在不同的LLM和不同的语言中都有差异。
1.8.2 价格
⚠️这部分数据参考的是OpenAI的定价。
GPT-4
接口的定价比GPT-3.5 Turbo
贵20-30倍
这意味只有在一些对生成质量要求很高的场景下使用GPT-4
接口才是划算的,如果只是文档摘要这种较为简单的任务,直接用GPT-3.5 Turbo
效果就足够好了,也更加划算。
GPT-3.5 Turbo
比OpenAI Embedding
接口贵大约20倍
这意味着对于一些文档类的问答任务,通过离线对文档做向量索引,线上服务先做检索再做整合可以再进一步降低GPT-3.5 Turbo
的调用成本。
OpenAI Embedding
接口比租一台云服务器搭建文本转向量服务贵大约10倍
⚠️这个数据和具体的调用量以及使用的文本转向量的模型有关。
因为有很多开源的文本转向量模型,所以租一台云服务器,在上面搭建文本转向量服务可以进一步降低成本。
1.8.3 预训练和微调
在token总数为1.4T的语料上对参数量为13B的模型做预训练,大约需要100万美元
这个数据来自于LLaMa的论文,其中提到LLaMa的预训练在2048个A100(80G)的GPU上训练了21天,按此估算预训练成本约为100万美元。总之,从头开始训练一个LLM是可能的,但并不便宜,相对之下使用一个预训练模型就要便宜很多。
微调一个预训练模型的成本是从头开始预训练的千分之一(甚至更低)
这是一个大概的估计,但是微调的成本几乎可以忽略不计。
1.8.4 GPU
如果你要自己搭建一个大模型的服务,就需要对GPU相关的一些数字足够熟悉。
大模型服务通常至少需要模型参数量的两倍的显存
例如,对于一个7B参数量的模型,大约需要占用14GB的GPU显存,因为对大多数大模型,每个参数默认用一个16位浮点数表示(对应2个字节)。当然,可以通过量化将参数用8-bit或者4-bit来表示,从而将显存占用降至二分之一或者四分之一。例如,llama.cpp对一个13B的模型,通过4-bit量化,从而只需要占用6GB的GPU显存。
批量请求大模型服务,可以获得数十倍的吞吐量提升
请求大模型服务的响应时间通常较长,例如对于有的任务,5秒才能处理完一个请求,换算成吞吐量只有0.2的qps;但是如果一次发送25个请求过去,响应时间并不会升至25倍,而只是延长到10秒,换算成吞吐量为2.5的qps(queries per second)。这样看来,batch_size越大越好,但是当batch_size增大时,占用的显存也是增加的,具体的分析见下一小节。
对13B参数量的模型,每多生成一个token需要多占用约1MB的显存
按这个数据推算,如果要生成512个token,就需要再额外占用512MB的显存。值得注意的是,如果这是一个批量的请求,计算显存的时候还要乘以对应的batch_size。例如batch_size=16,就需要额外再占用8G的显存。可以看到,batch_size增大时,虽然吞吐量也会增大,但是显存占用也是随之增加的。
GPU的显存,V100: 16GB/32G, A100: 40/80GB
GPU的显存是限制大模型参数量的重要因素,需要结合预算来选择。一般情况下,在预算允许的情况下,优先选择显存较大的规格的显卡会更加划算,主要是更大的显存在推理时可以有更大batch size,从而在单位成本下获得更大的吞吐量。