案例研究或参考文献,显示绳索和不在场证明的性能提高
旋转位置嵌入(绳索):
-
案例研究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()
登录后复制
有各种量化技术,我们在这里不会详细讨论,但是通常,所有量化技术都如下:
- 将所有权重量化为目标精度。
- 加载量化的权重,然后通过BFLOAT16精度传递向量的输入序列。
- 动态地将权重到Bfloat16以在Bfloat16精度中使用其输入向量执行计算。
- 用输入计算后,将权重再次量化为目标精度。
简而言之,这意味着要输入矩阵,并使用输入,并符合输出的重量矩阵:
y = x ∗ w更改为y = x ∗去量化(w);对于每个矩阵乘法,量化(w)。当输入通过网络图运行时,对所有权重矩阵进行了取消化和重新定量。
型号= 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
登录后复制
登录后复制
登录后复制
登录后复制
型号= 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
登录后复制
登录后复制
登录后复制
登录后复制
型号= 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
登录后复制
登录后复制
登录后复制
登录后复制
闪烁注意力机制
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())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
输出:

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())
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
输出:

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等人,绝对嵌入可以阻碍长序列的性能。关键问题包括:
-
长输入限制:处理长序列时的绝对嵌入性能很差,因为它们集中在固定位置而不是相对距离上。
-
固定训练长度:学习的嵌入将模型与最大训练长度联系起来,从而限制了其将其推广到更长的输入的能力。
进步:相对位置嵌入
为了应对这些挑战,相对位置嵌入已获得关注。两种值得注意的方法包括:
两种方法都修改了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
登录后复制

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
登录后复制

config = model.config
2 * 16_000 * config.n_layer * config.n_head * config.n_embd // config.n_head
登录后复制
结论
优化长期文本输入和动态聊天应用程序的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涉及上下文窗口扩展,内存机制和有效的令牌处理等技术,以确保它们在扩展对话或文档分析期间保持连贯性和性能。