案例研究或參考文獻,顯示繩索和不在場證明的性能提高
旋轉位置嵌入(繩索):
-
案例研究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涉及上下文窗口擴展,內存機制和有效的令牌處理等技術,以確保它們在擴展對話或文檔分析期間保持連貫性和性能。