首頁 > 科技週邊 > 人工智慧 > 優化長文本輸入和聊天應用程序的LLM

優化長文本輸入和聊天應用程序的LLM

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-03-17 11:11:13
原創
495 人瀏覽過

大型語言模型(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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板