首页 > 科技周边 > 人工智能 > 优化长文本输入和聊天应用程序的LLM

优化长文本输入和聊天应用程序的LLM

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-03-17 11:11:13
原创
496 人浏览过

大型语言模型(LLM)已彻底改变了特征方言准备(NLP),从而加剧了从摘要和解释扩展到对话操作员和基于检索的框架的应用。这些模型,例如GPT和BERT,都在理解和生产类似人类的内容方面说明了非凡的功能。

有效地处理长文本序列对于文档摘要,检索提示的答案以及聊天机器人中的多转话对话至关重要。然而,由于记忆和计算限制及其以广泛的输入序列处理位置信息的能力,传统的LLM体系结构通常在这些情况下遇到困难。这些瓶颈需要创新的架构策略,以确保可扩展性,效率和无缝用户交互。

本文探讨了LLM体系结构背后的科学,重点是优化它们以处理长文本输入并实现有效的对话动态。从诸如位置嵌入之类的基本概念到旋转位置编码(ROPE)等高级解决方案,我们将深入研究设计选择,使LLM在现代NLP挑战中脱颖而出。

学习目标

  • 了解传统的LLM体系结构在处理长文本序列和动态对话流中所面临的挑战。
  • 探索位置嵌入在增强LLM性能中的作用。
  • 学习技术以优化LLM来处理长文本输入以提高应用程序的性能和连贯性。
  • 了解高级技术,例如旋转位置嵌入(绳索)和bi -bi,以优化长期输入处理的LLM。
  • 认识到建筑级设计选择在提高LLM的效率和可扩展性方面的重要性。
  • 发现自我注意的机制如何适应扩展序列中的位置信息。

目录

  • 有效LLM部署的技术
  • 传统与现代位置嵌入技术
  • 传统与现代嵌入的视觉或表格比较
  • 案例研究或参考文献,显示绳索和不在场证明的性能提高
  • 利用较低精度的力量
  • 闪烁注意力机制
  • LLM架构背后的科学
  • 改善LLMS中的位置嵌入
  • 结论
  • 常见问题

有效LLM部署的技术

有效地部署大型语言模型(LLMS)是解决诸如高度计算,记忆利用和不活动之类的挑战的关键,这些挑战可以防止其可行的多功能性。在克服这些挑战方面,采取后的程序特别有影响力:

  • 闪光注意力:该技术通过最大程度地减少注意机制期间的冗余操作来优化记忆和计算效率。它允许模型更快地处理信息并处理较大的上下文,而无需压倒硬件资源。
  • 低级别近似值:此策略通过近似具有较低位置的参数晶格,完全减少了参数的数量,在保持执行时驱动到更轻的演示。
  • 量化:这包括降低数值计算的精确性,例如利用8位或4位集成性而不是16位或32位漂移,这会降低资产利用率和活力利用率,而没有明显的不幸表现出精确性。
  • 更长的文化处理(绳索和质疑):诸如旋转位置嵌入(绳索)和线性偏见(Alibi)之类的技术扩展了模型在更长的设置上持有和利用数据的能力,这对于记录摘要等应用程序是基本的,例如记录摘要和提问。
  • 有效的硬件利用:通过利用GPU,TPU或设计用于深度学习任务的其他加速器来优化部署环境,可以显着提高模型效率。

通过采用这些策略,组织可以在平衡成本,性能和可扩展性的同时有效地部署LLM,从而在现实世界中更广泛地使用AI。

传统与现代位置嵌入技术

我们将探讨以下传统与现代位置嵌入技术之间的比较:

传统的绝对位置嵌入:

  • 正弦嵌入:该技术使用固定的数学功能(正弦和余弦)来编码令牌的位置。它在计算上是有效的,但要在处理更长的序列或推断训练长度之外而挣扎。
  • 学习的嵌入:这些是在训练期间学习的,每个位置都有独特的嵌入。虽然灵活,但它们可能无法很好地概括过超出模型预定义位置范围的很长序列。

现代解决方案:

  • 相对位置嵌入:该技术没有编码绝对位置,而是捕获了令牌之间的相对距离。它允许模型更好地处理可变长度序列并适应不同的上下文,而不会受到预定义位置的限制。

旋转位置嵌入(绳索):

  • 机理:绳索引入了基于旋转的机制来处理位置编码,从而使模型可以在不同的序列长度上更好地概括。这种旋转使其对长序列更有效,并避免了传统嵌入的局限性。
  • 优点:它具有更大的灵活性,具有长期依赖性的更好性能以及更有效的输入序列的处理。

alibi(注意线性偏见):

  • 简单的解释: Alibi直接在注意机制中引入线性偏差,从而使模型可以根据其相对位置的不同部分关注序列的不同部分。
  • 它如何改善长期处理方法:通过线性偏见的注意分数,Alibi允许模型有效地处理长序列,而无需复杂的位置编码,从而提高了长输入的内存使用情况和模型效率。

传统与现代嵌入的视觉或表格比较

下面我们将查看以下传统与现代嵌入的比较:

特征 传统的绝对嵌入 现代嵌入(绳子,alibi等)
编码类型 固定(正弦或学习) 亲戚(绳索,alibi)
处理长序列 超越训练长度的推断斗争 长期依赖性有效
概括 对看不见的序列长度的概括有限 更好的概括,适应各种序列长度
内存使用 由于静态编码而引起的更高的内存消耗 更有效的记忆力,尤其是在不利比利的情况下
计算复杂性 低(正弦),中等(学会) 较低的长序列(绳索,alibi)
灵活性 在动态或远程上下文中的灵活性较小 高度灵活,能够适应不同的序列大小
应用 适用于较短的固定长度序列 长长和长度输入的任务的理想选择

案例研究或参考文献,显示绳索和不在场证明的性能提高

旋转位置嵌入(绳索):

  • 案例研究1:在论文“ Roformer:变压器模型的旋转位置嵌入”中,作者证明,绳索在诸如语言建模之类的长期任务上显着提高了性能。绳索在不需要额外的计算资源的情况下更好地概括长序列的能力使其比传统嵌入更有效。
  • 性能增益:与使用传统位置编码的模型相比,绳索的处理序列的精度高达4-6%。

alibi(注意线性偏见):

  • 案例研究2:在“ Alibi:具有线性偏差的注意力以进行有效的远程序列建模”中,在注意机制中引入线性偏置使模型可以有效地处理序列而不依赖位置编码。 alibi减少了内存开销,并提高了机器翻译和摘要等任务的模型的可扩展性。
  • 绩效增益:不在场证明,在保持或改善长期基准测试的模型性能的同时,证明了高达8%的训练时间和大幅减少记忆使用情况。

这些进步展示了现代位置嵌入技术等如何解决传统方法的局限性,还可以提高大语模型的可扩展性和效率,尤其是在处理长期输入时。

利用较低精度的力量

LLM由代表其权重的庞大矩阵和向量组成。这些权重通常存储在float32,bfloat16或float16精度中。记忆要求可以估计如下:

  • float32精度:必需的内存= 4 * x GB,其中x是模型参数的数量(数十亿美元)。
  • Bfloat16/float16精度:必需的内存= 2 * x GB。

BFLOAT16中的内存使用示例:精度:

  • GPT-3: 1750亿参数,〜350 GB VRAM。
  • Bloom: 1760亿参数,〜352 GB VRAM。
  • Llama-2-70b: 700亿参数,〜140 GB VRAM。
  • Falcon-40B: 400亿个参数,〜80 GB VRAM。
  • MPT-30b: 3000亿参数,〜60 GB VRAM。
  • Starcoder: 155亿个参数,〜31 GB VRAM。

鉴于NVIDIA A100 GPU的最大值为80 GB VRAM,因此较大的模型需要张量并行性或管道并行性才能有效运行。

实际例子

在8 x 80GB A100节点上加载Bloom:

登录后复制
 #从变形金刚导入AutomodelForCausAllm

#型号= automodelforcausallm.from_pretrataining(“ bigscience/bloom”,device_map =“ auto”)
登录后复制
从变形金刚导入AutomoDelforCausAllm,AutoNokenizer,Pipeline
导入火炬

model = automodelforcausallm.from_pretrataining(“ bigcode/contocoder”,torch_dtype = torch.bfloat16,device_map =“ auto”,pad_token_id = 0)
tokenizer = autotokenizer.from_pretaining(“ bigcode/octocoder”)

pipe = pipeline(“文本生成”,模型=模型,令牌=令牌)
登录后复制
提示=“问题:请在python中写一个函数,该功能将字节转换为giga字节。\ n \ nanswer:”

结果=管道(提示,max_new_tokens = 60)[0] [“ generated_text”]
结果
登录后复制
def bytes_to_giga_bytes(字节):
  返回字节 / 1024/1024 / 1024
登录后复制
 bytes_to_giga_bytes(torch.cuda.max_memory_allocated())
登录后复制
型号TO(“ CPU”)
DEL PIPE
DEL模型
登录后复制
导入GC
导入火炬

def flush():
  gc.collect()
  TORCH.CUDA.EMPTY_CACHE()
  TORCH.CUDA.RESET_PEAK_MEMORY_STATS()
登录后复制
 flush()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

有各种量化技术,我们在这里不会详细讨论,但是通常,所有量化技术都如下:

  • 将所有权重量化为目标精度。
  • 加载量化的权重,然后通过BFLOAT16精度传递向量的输入序列。
  • 动态地将权重到Bfloat16以在Bfloat16精度中使用其输入向量执行计算。
  • 用输入计算后,将权重再次量化为目标精度。

简而言之,这意味着要输入矩阵,并使用输入,并符合输出的重量矩阵:

y = x ∗ w更改为y = x ∗去量化(w);对于每个矩阵乘法,量化(w)。当输入通过网络图运行时,对所有权重矩阵进行了取消化和重新定量。

 #!PIP安装BITSANDBYTES
登录后复制
型号= automodelforcausallm.from_pretrataining(“ bigcode/octocoder”,load_in_8bit = true,low_cpu_mem_usage = true,pad_token_id = 0)
登录后复制
 pipe = pipeline(“文本生成”,模型=模型,令牌=令牌)

结果=管道(提示,max_new_tokens = 60)[0] [“ generated_text”]
结果
登录后复制
bytes_to_giga_bytes(torch.cuda.max_memory_allocated())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 model.cpu()
DEL模型
DEL PIPE
登录后复制
登录后复制
登录后复制
登录后复制
 flush()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
型号= automodelforcausallm.from_pretrataining(“ bigcode/octocoder”,load_in_4bit = true,low_cpu_mem_usage = true,pad_token_id = 0)

pipe = pipeline(“文本生成”,模型=模型,令牌=令牌)

结果=管道(提示,max_new_tokens = 60)[0] [“ generated_text”]
结果
登录后复制
登录后复制
bytes_to_giga_bytes(torch.cuda.max_memory_allocated())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 model.cpu()
DEL模型
DEL PIPE
登录后复制
登录后复制
登录后复制
登录后复制
 model.cpu()
DEL模型
DEL PIPE
登录后复制
登录后复制
登录后复制
登录后复制
 flush()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
型号= automodelforcausallm.from_pretrataining(“ bigcode/octocoder”,load_in_4bit = true,low_cpu_mem_usage = true,pad_token_id = 0)

pipe = pipeline(“文本生成”,模型=模型,令牌=令牌)

结果=管道(提示,max_new_tokens = 60)[0] [“ generated_text”]
结果
登录后复制
登录后复制
bytes_to_giga_bytes(torch.cuda.max_memory_allocated())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 model.cpu()
DEL模型
DEL PIPE
登录后复制
登录后复制
登录后复制
登录后复制
 flush()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

闪烁注意力机制

Flash注意力通过提高记忆效率并利用更好的GPU内存利用来优化注意力机制。这种方法允许:

  • 减少的内存足迹:通过更有效地处理注意力计算来大大最大程度地减少内存开销。
  • 较高的性能:推理期间速度的显着提高。
 System_prompt =“”下面是各个人与AI技术助理之间的一系列对话。
助手试图提供帮助,礼貌,诚实,精致,情感意识和谦虚但知识渊博的人。
助手很乐意帮助解决代码问题,并将尽最大努力确切地了解所需的内容。
它还试图避免给出虚假或误导性的信息,并且当它不确定正确的答案时,它会引起人们的注意。
也就是说,助手确实做得很好,并且不会让谨慎的用途过多。

Starcoder模型是一系列15.5B参数模型,该模型在堆栈中以80种编程语言训练(v1.2)(不包括退出请求)。
该模型使用多查询注意力,使用中间目标进行训练,并使用8,192个令牌上下文窗口,用于数万亿代币的重复性数据。

-------

问题:编写一个获取两个列表的函数,并返回一个列表,该列表中有每个输入列表中的交替元素。

答:当然。这是一个可以做到这一点的函数。

Def交流(List1,List2):
   结果= []
   对于我的范围(Len(List1)):
       results.append(list1 [i])
       results.append(list2 [i])
   返回结果

问题:您可以为此功能编写一些测试用例吗?

答:当然,这里有一些测试。

断言交替([10,20,30],[1,2,3])== [10,1,20,2,30,3]
断言交替([true,false],[4,5])== [true,4,false,5]
断言交替([],[])== []

问题:修改函数,以便当列表的长度不均匀时返回所有输入元素。较长列表中的元素应在最后。

答:这是修改后的功能。

Def交流(List1,List2):
   结果= []
   对于我的范围(min(len(list1),len(list2)))):
       results.append(list1 [i])
       results.append(list2 [i])
   如果Len(List1)> Len(List2):
       results.extend(list1 [i 1:])
   别的:
       results.extend(list2 [i 1:])
   返回结果

-------
”“”
登录后复制
 long_prompt = 10 * system_prompt提示
登录后复制
型号= automodelforcausallm.from_pretrataining(“ bigcode/octocoder”,torch_dtype = torch.bfloat16,device_map =“ auto”)
tokenizer = autotokenizer.from_pretaining(“ bigcode/octocoder”)

pipe = pipeline(“文本生成”,模型=模型,令牌=令牌)
登录后复制
进口时间

start_time = time.time()
结果= pipe(long_prompt,max_new_tokens = 60)[0] [“ generated_text”] [len(long_prompt):]

打印(f“在{time.time() -  start_time}秒中生成。”)
结果
登录后复制
bytes_to_giga_bytes(torch.cuda.max_memory_allocated())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

输出:

优化长文本输入和聊天应用程序的LLM

 flush()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 model = model.to_bettertransformer()
登录后复制
 start_time = time.time()
结果= pipe(long_prompt,max_new_tokens = 60)[0] [“ generated_text”] [len(long_prompt):]

打印(f“在{time.time() -  start_time}秒中生成。”)
结果
登录后复制
bytes_to_giga_bytes(torch.cuda.max_memory_allocated())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
 flush()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

输出:

优化长文本输入和聊天应用程序的LLM

LLM架构背后的科学

到目前为止,我们已经探索了提高计算和记忆效率的策略,包括:

  • 将权重铸造为较低的精度格式。
  • 实施自我发挥算法的更有效版本。

现在,我们将注意力转向如何修改大语言模型(LLMS)的体系结构,以优化它们,以用于需要长文本输入的任务,例如:

  • 检索提出的问题回答,
  • 摘要,
  • 聊天应用程序。

值得注意的是,聊天互动不仅需要LLM不仅处理长文本输入,而且还必须有效地处理用户与模型之间的动态,来回对话,类似于Chatgpt的成就。

由于修改LLM训练后培训的基本体系结构是具有挑战性的,因此预先做出良好的设计决策至关重要。 LLM体系结构中的两个主要组件通常会成为大型输入序列的性能瓶颈:

  • 位置嵌入
  • 键值缓存

让我们深入研究这些组件。

改善LLMS中的位置嵌入

自我发挥的机制将每个令牌与文本序列中的其他令牌联系起来。例如,输入序列“ Hello”,“ i”,“ love”,“ You”的SoftMax(QKT)矩阵可能如下:

你好
你好 0.2 0.4 0.3 0.1
0.1 0.5 0.2 0.2
0.05 0.3 0.65 0.0
0.15 0.25 0.35 0.25

每个单词令牌都有一个概率分布,表明它对其他令牌进行了多少。例如,“爱”一词以0.05的概率为“ hello”,“ i”,其本身为0.3,本身为0.65。

但是,没有位置嵌入,LLM努力地了解令牌的相对位置,因此很难将诸如“ Hello I Love You”之类的序列与“您爱我的爱人”相分开。 QKT计算无需考虑位置距离,将每个距离视为等距。

为了解决这个问题,引入了位置编码,提供了帮助模型理解令牌顺序的数值提示。

传统的位置嵌入

在最初的关注中,您需要纸张,提出了正弦位置嵌入,其中每个矢量被定义为其位置的正弦函数。这些嵌入被添加到输入序列向量中:

一些模型(例如Bert)引入了学到的位置嵌入,这些嵌入方式是在培训期间学到的。

绝对位置嵌入的挑战

正弦和学习的位置嵌入是绝对的,编码了独特的位置。但是,正如Huang等人指出的。和Su等人,绝对嵌入可以阻碍长序列的性能。关键问题包括:

  • 长输入限制:处理长序列时的绝对嵌入性能很差,因为它们集中在固定位置而不是相对距离上。
  • 固定训练长度:学习的嵌入将模型与最大训练长度联系起来,从而限制了其将其推广到更长的输入的能力。

进步:相对位置嵌入

为了应对这些挑战,相对位置嵌入已获得关注。两种值得注意的方法包括:

  • 旋转位置嵌入(绳索)
  • alibi(注意线性偏见)

两种方法都修改了QKT计算,以将句子顺序直接纳入自我发项机制,从而改善了模型如何处理长文本输入。

旋转位置嵌入(绳索)通过旋转查询和钥匙向量分别按角度和角度编码位置信息,分别为位置:

这里是一个旋转矩阵,并且根据训练的最大输入长度进行预定义。

这些方法使LLM能够专注于相对距离,改善较长序列的概括并促进有效的特定任务优化。

 input_ids = tokenizer(提示,return_tensors =“ pt”)[“ input_ids”]。to(“ cuda”)

_在范围(5)中:
  next_logits = model(input_ids)[“ logits”] [:,-1:]
  next_token_id = torch.argmax(next_logits,dim = -1)

  input_ids = torch.cat([[input_ids,next_token_id],dim = -1)
  打印(“ input_ids的形状”,input_ids.shape)

generated_text = tokenizer.batch_decode(input_ids [:,-5:])
生成_text
登录后复制

优化长文本输入和聊天应用程序的LLM

 past_key_values = none#past_key_values是键值缓存
生成_tokens = []
next_token_id = tokenizer(提示,return_tensors =“ pt”)[“ input_ids”]。to(“ cuda”)

_在范围(5)中:
  next_logits,past_key_values = model(next_token_id,past_key_values = past_key_values,use_cache = true).to_tuple()
  next_logits = next_logits [:,-1:]
  next_token_id = torch.argmax(next_logits,dim = -1)

  打印(“ input_ids的形状”,next_token_id.shape)
  print(“键值缓存的长度”,len(past_key_values [0] [0]))#past_key_values为shape [num_layers,fork,fork,1 for V,v,batch_size,length,hidden_​​dim]
  generated_tokens.append(next_token_id.item())

generated_text = tokenizer.batch_decode(generated_tokens)
生成_text
登录后复制

优化长文本输入和聊天应用程序的LLM

 config = model.config
2 * 16_000 * config.n_layer * config.n_head * config.n_embd // config.n_head
登录后复制
输出

7864320000
登录后复制

结论

优化长期文本输入和动态聊天应用程序的LLM体系结构在推动其现实世界中的适用性方面至关重要。管理广泛的输入环境,保持计算效率和提供有意义的对话交互的挑战需要在建筑层面上进行创新的解决方案。诸如旋转位置嵌入(绳索),acribi和Flash注意力之类的技术说明了微调中心组件(如位置嵌入和自我注意力)的变化潜力。

随着领域的发展,将计算效率与工程创造力相结合的中心将推动以下突破。通过理解和实现这些程序,设计师可以解决LLM的全部控制,确保它们不公平,但适应性太高,响应迅速,并且对于不同的现实世界应用程序而言是常见的。

关键要点

  • 诸如Rope和Alibi之类的技术提高了LLMS在不牺牲性能的情况下处理更长的文本的能力。
  • 诸如Flish注意力和滑动窗户注意力之类的创新减少了记忆使用量,从而使大型模型适用于现实世界的应用。
  • 优化长期文本输入的LLM可以增强其在扩展对话和复杂任务中保持上下文和连贯性的能力。
  • LLM正在演变为支持诸如摘要,检索和多转向对话等任务,并具有更好的可扩展性和响应能力。
  • 降低模型的精度提高了计算效率,同时保持准确性,从而实现更广泛的采用。
  • 平衡架构设计和资源优化可确保LLM对多样化和不断增长的用例保持有效。

常见问题

Q1。 1。什么是LLM,为什么它们很重要?

答:大型语言模型(LLMS)是概述的AI模型,以获取并创建类似人类的内容。由于他们有能力执行大量作业,从回答问题到想象中的作曲,因此它们是针对不同企业的灵活设备,因此它们至关重要。

Q2。绳索和不利比比如何改善LLM?

A.绳索(旋转位置编码)和不利比利(带有线性偏差的注意)通过提高其处理长上下文的能力,从而确保有效地处理扩展文本而不会失去连贯性,从而增强了LLMS。

Q3。什么是闪光灯的注意力,它如何优化内存使用量?

答:Flash注意力是一种算法,它可以更有效地计算注意力,从而大大降低记忆消耗并加快大规模模型的处理。

Q4。为什么量化对LLM很重要?

答:量化降低了证明权重的准确性(例如,从32位到8位),这降低了计算必需品和内存利用率,而保持表现出执行,并在较小的小工具上赋予了能力。

Q5。进一步扩展LLM的挑战仍然是什么?

答:主要挑战包括管理计算和记忆成本,解决诸如偏见和滥用之类的道德问题,并确保模型可以在各种任务和语言上有效地概括。

Q6。如何优化LLM,以有效地处理长文本输入?

答:对长文本输入进行优化的LLM涉及上下文窗口扩展,内存机制和有效的令牌处理等技术,以确保它们在扩展对话或文档分析期间保持连贯性和性能。

以上是优化长文本输入和聊天应用程序的LLM的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板