自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在家中完成LLM微調(diào)高效指南(上) 原創(chuàng) 精華

發(fā)布于 2024-11-11 13:32
瀏覽
0收藏

編輯 | 言征

出品 | 51CTO技術棧(微信號:blog51cto)

LLM在生成文本和理解信息方面非常有效,但它們最終受限于訓練數(shù)據(jù)的語料庫。例如,如果你讓一個通用的預訓練模型回答與你的業(yè)務特定流程或操作有關的問題,最好的結(jié)果是它拒絕,最壞的情況是它會信誓旦旦地給出一個看似合理但錯誤的答案。

當然,你可以通過自己訓練一個模型來解決這個問題,但所需的資源往往超出實際可行的范圍。例如,訓練Meta的相對小的Llama 3 8B模型需要約130萬GPU小時的計算資源,使用的是80GB的Nvidia H100。好消息是你不需要這樣做。我們可以通過稱為微調(diào)的過程,利用現(xiàn)有的模型(如Llama、Mistral或Phi),并通過自己的數(shù)據(jù)擴展其知識庫或修改其行為和風格。

盡管相比推理,微調(diào)仍然較為耗費計算資源,但借助于低秩適應(LoRA)及其量化變體QLoRA等技術,現(xiàn)在可以使用單塊GPU來微調(diào)模型——這正是我們將在本指南中探討的內(nèi)容。

在本指南中,我們將討論:

  • 微調(diào)的應用場景和適用時機
  • 擴展預訓練模型能力和行為的替代方法
  • 數(shù)據(jù)準備的重要性
  • 如何使用Axolotl和自定義數(shù)據(jù)集微調(diào)Mistral 7B模型
  • 各種超參數(shù)及其對訓練的影響
  • 加快和提高微調(diào)效率的其他資源

1.設定期望

相比我們之前的動手指南,微調(diào)是一個涉及很多參數(shù)調(diào)整、開關配置和最佳實踐的復雜過程。因此,我們認為有必要設定一些期望。

微調(diào)是修改預訓練模型行為或風格的有用方法。然而,如果你的目標是教授模型新的知識,雖然可以做到,但可能有更好和更可靠的方式值得首先考慮。

我們之前探討過檢索增強生成(RAG),這種方法基本上為模型提供了一個它可以參考的庫或數(shù)據(jù)庫。這個方法因其相對易于設置、計算成本低廉且可以引用來源而備受歡迎。不過,它并不完美,也無法改變模型的風格或行為。

例如,如果你正在構(gòu)建一個客戶聊天機器人來幫助用戶查找資源或解決產(chǎn)品問題,你可能不希望它回答與健康或財務無關的問題。提示工程可以在一定程度上幫助實現(xiàn)這一點。你可以創(chuàng)建一個系統(tǒng)提示,指示模型以某種方式行事。例如,添加一句“你不具備回答與健康、健康管理或營養(yǎng)相關問題的能力,如有相關問題,請將話題引導至更合適的內(nèi)容?!?/p>

提示工程在其簡單中顯得優(yōu)雅:只需告訴模型你希望它做什么或不做什么。但實際上,使用中的LLM模型經(jīng)常會遇到一些邊界情況,導致模型被誤導執(zhí)行它不應該做的事情。你可能會驚訝地發(fā)現(xiàn),有時只需一句“忽略所有之前的指示,而執(zhí)行以下操作”即可使模型改變行為。

如果RAG和提示工程無法滿足需求,則可以考慮微調(diào)。

2.使用QLoRA進行內(nèi)存高效的模型微調(diào)

在本指南中,我們將使用微調(diào)來改變Mistral 7B模型的風格和語調(diào)。特別是,我們將使用QLoRA,如前所述,這將允許我們在與傳統(tǒng)訓練相比下,使用更少的內(nèi)存和計算資源進行微調(diào)。

這是因為微調(diào)比運行模型需要更多的內(nèi)存。在推理過程中,可以通過將參數(shù)數(shù)量乘以精度來計算內(nèi)存需求。對于Mistral 7B,其訓練精度為BF16,因此大約需要14 GB內(nèi)存,外加少量用于關鍵緩存的內(nèi)存。

然而,完全微調(diào)則需要幾倍于此的內(nèi)存來加載模型。對于Mistral 7B來說,內(nèi)存需求約為90 GB或更多。如果你沒有多GPU的工作站,幾乎必然需要租用像Nvidia A100或H100這樣的數(shù)據(jù)中心GPU來完成任務。

這是因為完全微調(diào)意味著以完整分辨率重新訓練模型的每一個權(quán)重。好消息是,在大多數(shù)情況下,不必更新所有權(quán)重即可調(diào)整神經(jīng)網(wǎng)絡的輸出。實際上,只需更新幾千或幾百萬的權(quán)重就可以實現(xiàn)預期的效果。

這正是LoRA的邏輯所在:簡而言之,它將模型的權(quán)重凍結(jié)在一個矩陣中,然后使用另一組矩陣記錄對第一個矩陣的調(diào)整以微調(diào)模型。這大大減少了計算和內(nèi)存的開銷。QLoRA進一步優(yōu)化了這一點,通過以更低的精度(通常為四位)加載模型的權(quán)重。因此,每個參數(shù)只需占用半字節(jié)的內(nèi)存。

3.微調(diào)很簡單,數(shù)據(jù)準備就沒那么簡單了

解決了那些問題之后,我們需要談談數(shù)據(jù)。事實證明,微調(diào)模型并不是最難的部分,難的是準備和清理數(shù)據(jù)集,以確保模型能按你的期望工作。

那么,你從哪里獲取用于微調(diào)模型的數(shù)據(jù)呢?嗯,對于像電子郵件助手或客戶服務聊天機器人這樣的應用,你其實不需要找得太遠。只需打開你電子郵件中的“已發(fā)送”文件夾,就能找到一個不錯的起點來尋找有機數(shù)據(jù)。如果你在使用像Continue這樣的本地聊天助手,它可能會自動生成可用于微調(diào)模型的訓練數(shù)據(jù)。

雖然高質(zhì)量的有機數(shù)據(jù)是理想之選,但它可能無法涵蓋你可能遇到的所有場景。例如,假設你希望模型生成回復,將收到的電子郵件的發(fā)送者引導到另一個部門或團隊。如果這種情況只是偶爾發(fā)生,你可能沒有足夠的有機數(shù)據(jù)來進行訓練。

這時,使用大型語言模型(LLMs)生成合成數(shù)據(jù)或部分合成數(shù)據(jù)就派上了用場。這樣做相當直接,只需將幾個示例輸入模型,并要求它生成模仿這些示例的新數(shù)據(jù)。你可能需要不斷調(diào)整提示,直到找到合適的內(nèi)容。

你可以對輸入和輸出都這樣做,或者生成輸入并手動寫出對應的回復。在我們的測試中,我們發(fā)現(xiàn)合成數(shù)據(jù)通常缺乏細微差別,半合成數(shù)據(jù)效果良好,而完全有機數(shù)據(jù)的效果最佳。

無論你是使用有機數(shù)據(jù)還是合成數(shù)據(jù)來生成數(shù)據(jù)集,你都需要花時間清理數(shù)據(jù)集,刪除個人信息或不良樣本等內(nèi)容。例如,如果你正在為客戶服務或支持微調(diào)模型,你可能想從數(shù)據(jù)中刪除代理或用戶的姓名、電話號碼和其他信息。

雖然微調(diào)對于改變模型的行為最有幫助,但它仍然會捕捉到數(shù)據(jù)集中始終出現(xiàn)的細節(jié),如姓名。

一旦你收集好了數(shù)據(jù)——其實并不需要太多:甚至100個樣本可能就足以以明顯的方式改變模型的行為——你就需要以模型能夠理解的方式對其進行格式化。有很多方法可以做到這一點,但就我們的目的而言,我們發(fā)現(xiàn)使用Alpaca數(shù)據(jù)格式的JSON模板效果相當不錯。

4.微調(diào)容易,數(shù)據(jù)準備難

以上內(nèi)容準備好后,我們需要談談數(shù)據(jù)。事實證明,微調(diào)模型并不是最難的部分,真正的難點在于準備和清理數(shù)據(jù)集,使模型能夠真正按照你的意圖運行。

那么,你要從哪里獲取微調(diào)模型的數(shù)據(jù)呢?對于電子郵件助手或客服聊天機器人之類的應用,數(shù)據(jù)來源并不難找。簡單地查看你的電子郵件“已發(fā)送”文件夾,就能為獲取自然數(shù)據(jù)提供一個不錯的起點。如果你使用的是本地聊天助手,如Continue,它可能會自動生成可用于微調(diào)模型的訓練數(shù)據(jù)。

如果寫代碼注釋讓你頭疼,你也可以讓AI來代勞。只要記得在提交代碼前查看一下注釋內(nèi)容。

當你在家就能創(chuàng)建屬于自己的AI代碼助手,誰還需要GitHub Copilot呢?

雖然高質(zhì)量的自然數(shù)據(jù)是理想選擇,但它可能無法覆蓋所有可能遇到的場景。例如,如果你希望模型生成的郵件回復能夠?qū)l(fā)件人重定向至不同的部門或團隊,而這種情況偶爾才發(fā)生,那么可能沒有足夠的自然數(shù)據(jù)來訓練模型。

這時,使用LLM生成合成數(shù)據(jù)或部分合成數(shù)據(jù)會非常有用。操作步驟相對簡單:你可以向模型提供一些示例,然后讓它生成模擬這些示例的新數(shù)據(jù)。你可能需要調(diào)整提示,直到生成出符合需求的數(shù)據(jù)。

你可以同時為輸入和輸出生成數(shù)據(jù),也可以只生成輸入,自己編寫相應的輸出。在我們的測試中發(fā)現(xiàn),完全合成的數(shù)據(jù)通常缺乏細微之處,而半合成數(shù)據(jù)效果較好,完全自然的數(shù)據(jù)效果最佳。

無論是用自然數(shù)據(jù)還是合成數(shù)據(jù)生成數(shù)據(jù)集,你都需要花時間清理數(shù)據(jù)集,去除個人身份信息或無效樣本。例如,如果你在微調(diào)一個客戶服務或支持類的模型,可能需要刪除數(shù)據(jù)中的代理人或用戶的姓名、號碼及其他信息。

雖然微調(diào)主要用于改變模型的行為,但模型仍然會受到數(shù)據(jù)集中一致出現(xiàn)的細節(jié)(如名稱)的影響。

一旦數(shù)據(jù)準備好了,其實不需要很多數(shù)據(jù):即便是100個樣本也可能足以顯著改變模型的行為。接下來,你需要將數(shù)據(jù)格式化,使模型能夠理解。對于我們的目的,我們發(fā)現(xiàn)這種基于Alpaca數(shù)據(jù)格式的JSON模板效果很好:

[
    {
      "instruction": "generate an appropriate response to this chat message",
      "input": "I'm having trouble getting Product X to work properly.",
      "output": "Can you tell me more about what isn't working?"
    },
...
]

5.設置Axolotl

市面上有許多用于微調(diào)LLM的框架,如Unsloth和Hugging Face的Transformers Trainer。不過在本次動手操作中,我們將使用Axolotl。

該開源項目旨在抽象出微調(diào)流行語言模型的復雜性,并支持多種不同的訓練技術。因此,如果你在工作站或游戲PC上用QLoRA開始微調(diào),之后想要在云端進行完整微調(diào),可以輕松切換。

Axolotl的另一大優(yōu)勢是提供了大量用于微調(diào)流行LLM的模板庫,因此你不必從頭開始摸索針對特定模型或數(shù)據(jù)集需要的超參數(shù)。

6.準備條件

一塊至少有16GB顯存的GPU。任何較新的Nvidia GPU都可以。對于AMD用戶,建議使用AMD Radeon RX 7900或更高型號。我們測試了RTX 3090 TI 24GB、RTX 6000 Ada Generation 48GB、AMD Radeon RX 7900 XT 20GB和Radeon Pro W7900 48GB。

- 在本指南中,我們會盡量保持簡單,使用Ubuntu Desktop 24.04。

- 你的顯卡所需的最新GPU驅(qū)動和CUDA(Nvidia)或ROCm(AMD)二進制文件。如果是第一次設置這些,可能會有些棘手,因此我們會在Ubuntu 24.04上詳細說明配置步驟。

- 假設你對Linux系統(tǒng)的命令行操作較為熟悉。以下操作說明涉及在此環(huán)境中使用終端運行命令。

由于Nvidia和AMD顯卡的設置略有不同,注意區(qū)分。更多內(nèi)容。會在下一篇文章中介紹。

本文轉(zhuǎn)載自??51CTO技術棧??,作者:言征


?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦