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

用開源模型合并利器MergeKit開發(fā)自己的定制模型

譯文 精選
開源
本文將介紹使用開源工具M(jìn)ergeKit并利用四種不同算法實(shí)現(xiàn)合并多個(gè)LLM,實(shí)現(xiàn)無需借助昂貴GPU的情況下輕松定制出自己的大型語言模型。

譯者 | 朱先忠

審校 | 重樓

簡(jiǎn)介

模型合并是一種將兩個(gè)或多個(gè)LLM合并為單個(gè)模型的技術(shù)。這是一種相對(duì)較新的實(shí)驗(yàn)性方法,可以以低廉的資金投入來創(chuàng)建新模型(不需要GPU)。模型合并工作出奇地好,而且在Open LLM排行榜上先后出現(xiàn)了許多基于模型合并技術(shù)的最先進(jìn)的模型。

在本教程中,我們將使用開源的MergeKit庫來實(shí)現(xiàn)模型合并。更具體地說,我們將回顧四種合并方法,并提供相應(yīng)的配置示例。然后,我們將使用MergeKit創(chuàng)建我們自己的模型——Marcoro14-7B-slerp,它也成為了Open LLM排行榜上表現(xiàn)最好的模型之一(02/01/2023)。

本文相應(yīng)的示例項(xiàng)目源碼可在GitHubGoogle Colab上獲得。當(dāng)然,我也推薦您使用我本人修改的自動(dòng)筆記本程序LazyMergekit來更輕松地運(yùn)行MergeKit。

合并算法

本節(jié)中,我們將重點(diǎn)介紹目前在MergeKit中實(shí)現(xiàn)的四種方法。請(qǐng)注意,還有其他一些算法,如線性算法任務(wù)算術(shù)算法。如果您對(duì)模型合并的論文感興趣,我推薦您閱讀一下Hugging Face上的一組與此相關(guān)的優(yōu)秀論文集。

1.SLERP算法

球面線性插值(SLERP:Spherical Linear Interpolation)是一種用于在兩個(gè)矢量之間進(jìn)行平滑插值的方法。這種算法保持一個(gè)恒定的變化率,并保留向量所在的球形空間的幾何特性。

與傳統(tǒng)的線性插值相比,有幾個(gè)原因讓我們更喜歡SLERP。例如,在高維空間中,線性插值可能導(dǎo)致插值向量的大小減?。?,它減小了權(quán)重的比例)。此外,權(quán)重方向的變化通常代表比變化幅度更有意義的信息(如特征學(xué)習(xí)和表示)。

SLERP算法的實(shí)現(xiàn)基于以下步驟:

  • 將輸入矢量規(guī)范化為單位長(zhǎng)度,確保它們表示方向而非幅度。
  • 使用它們的點(diǎn)積計(jì)算這些矢量之間的角度。
  • 如果矢量幾乎共線,則默認(rèn)為進(jìn)行線性插值以提高效率。否則,SLERP基于插值因子t(第一個(gè)矢量中t=0的情況占100%,對(duì)于模型2則t=1的情況占100%)和矢量之間的角度來計(jì)算比例因子。
  • 這些因子用于對(duì)原始向量進(jìn)行加權(quán),然后對(duì)原始向量求和以獲得插值向量。
  • SLERP是目前最流行的合并方法,但它一次只能合并兩個(gè)模型。不過,仍然有可能分層組合多個(gè)模型,如Mistral-7B-Merge-14-v0.1(https://huggingface.co/EmbeddedLLM/Mistral-7B-Merge-14-v0.1)模型中所使用的情形。

一種SLERP的配置示例如下所示:

slices:
  - sources:
      - model: OpenPipe/mistral-ft-optimized-1218
        layer_range: [0, 32]
      - model: mlabonne/NeuralHermes-2.5-Mistral-7B
        layer_range: [0, 32]
merge_method: slerp
base_model: OpenPipe/mistral-ft-optimized-1218
parameters:
  t:
    - filter: self_attn
      value: [0, 0.5, 0.3, 0.7, 1]
    - filter: mlp
      value: [1, 0.5, 0.7, 0.3, 0]
    - value: 0.5
dtype: bfloat16

這是一個(gè)經(jīng)典的SLERP配置,應(yīng)用于兩個(gè)模型的每一層。請(qǐng)注意,我們?yōu)椴逯狄蜃觮輸入值的梯度。自關(guān)注層和MLP層的參數(shù)將分別使用OpenPipe/mistral-ft-optimized-1218mlabonne/NeuralHermes-2.5-mistral-7B的不同組合。其他層則是使用了兩個(gè)模型的50/50的混合比例。

您可以在Hugging Face Hub上找到此最終模型mlabonne/NeuralPipe-7B-Serrp

2.TIES算法

Yadav等人在他們的論文中介紹了TIES-Merging算法,它旨在將多個(gè)特定于任務(wù)的模型有效地合并為一個(gè)多任務(wù)模型。這種方法解決了模型合并中面臨的兩個(gè)主要挑戰(zhàn):

  • 模型參數(shù)中的冗余:它識(shí)別并消除特定任務(wù)模型中的冗余參數(shù)。這是通過關(guān)注微調(diào)過程中所做的更改來實(shí)現(xiàn)的,識(shí)別前k%最顯著的更改,并丟棄其余的更改。
  • 參數(shù)符號(hào)之間的分歧:當(dāng)不同的模型建議對(duì)同一參數(shù)進(jìn)行相反的調(diào)整時(shí),就會(huì)出現(xiàn)沖突。TIES合并通過創(chuàng)建一個(gè)統(tǒng)一的符號(hào)向量來解決這些沖突,該向量表示所有模型中最主要的變化方向。TIES合并共分為以下三個(gè)步驟:
  • 修剪(Trim):通過只保留一小部分最重要的參數(shù)(密度參數(shù))并將其余參數(shù)重置為零,減少特定任務(wù)模型中的冗余。
  • 選擇符號(hào)(Elect Sign):通過根據(jù)累積幅度的最主要方向(正或負(fù))創(chuàng)建統(tǒng)一的符號(hào)向量,解決不同模型之間的符號(hào)沖突。
  • 不聯(lián)合合并(Disjoint Merge):對(duì)與統(tǒng)一符號(hào)向量對(duì)齊的參數(shù)值求平均值,不包括零值。

與SLERP算法不同,TIES算法可以一次合并多個(gè)模型。

一種TIES的配置示例如下所示:

models:
  - model: mistralai/Mistral-7B-v0.1
    # 基本模型不需要任何參數(shù)
  - model: OpenPipe/mistral-ft-optimized-1218
    parameters:
      density: 0.5
      weight: 0.5
  - model: mlabonne/NeuralHermes-2.5-Mistral-7B
    parameters:
      density: 0.5
      weight: 0.3
merge_method: ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  normalize: true
dtype: float16

使用此配置,我們使用Mistral-7B模型作為基礎(chǔ)模型來計(jì)算增量權(quán)重。我們合并了同樣的兩個(gè)模型:mistral-ft-optimized-1218(占50%)和NeuralHermes-2.5-mistral-7B(占30%),并進(jìn)行了規(guī)范化。這里,密度(density)參數(shù)意味著我們只保留了每個(gè)模型50%的參數(shù)(另一半來自基本模型)。

請(qǐng)注意,在上面配置中,權(quán)重之和并不等于1,但normalize:true參數(shù)將在內(nèi)部自動(dòng)對(duì)它們進(jìn)行規(guī)范化。此配置的靈感來自OpenHermes-2.5-neural-chat-7b-v--7b的作者提供的參數(shù)。

您可以在Hugging Face Hub上找到此最終模型mlabonne/NeuralPipe-7B-ties。

3.DARE算法

由Yu等人于2023年引入的DARE算法使用了一種類似于TIES的方法,主要存在兩個(gè)方面的區(qū)別:

  • 修剪(Pruning):DARE隨機(jī)將微調(diào)后的權(quán)重重置為其原始值(基礎(chǔ)模型的值)。
  • 重新縮放(Rescaling):DARE重新縮放權(quán)重,以保持模型輸出的期望值大致不變。它使用比例因子將兩個(gè)(或多個(gè))模型的重新縮放權(quán)重添加到基礎(chǔ)模型的權(quán)重中。

MergeKit對(duì)該方法的實(shí)現(xiàn)使用了兩種風(fēng)格:使用符號(hào)選擇步驟的TIES(dare_ties)或不使用符號(hào)選擇步驟的TIES(dare_linear)。

一種DARE的配置示例如下所示:

models:
  - model: mistralai/Mistral-7B-v0.1
    #基本模型不需要任何參數(shù)
  - model: samir-fama/SamirGPT-v1
    parameters:
      density: 0.53
      weight: 0.4
  - model: abacusai/Slerp-CM-mist-dpo
    parameters:
      density: 0.53
      weight: 0.3
  - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.2
    parameters:
      density: 0.53
      weight: 0.3
merge_method: dare_ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  int8_mask: true
dtype: bfloat16

在這種配置中,我們使用dare_ties合并了基于Mistral-7B的三種不同模型。這一次,我選擇了總和為1的權(quán)重(總和應(yīng)該在0.9和1.1之間)。密度參數(shù)density比論文中建議的略高(<0.5),但看起來它總是能給出更好的結(jié)果(請(qǐng)參考鏈接https://github.com/cg123/mergekit/issues/26處的有關(guān)討論)。

你可以在Hugging Face Hub上找到mlabonne/Daredevil-7B。這也是本文中最好的合并模型,甚至超過了Marcoro14-7B slerp。

4.Passthrough算法

Passthrough方法與以前的方法有很大不同。通過連接來自不同LLM的層,它可以產(chǎn)生具有極大數(shù)量的參數(shù)的模型(例如,具有兩個(gè)7B參數(shù)模型的9B)。這些模型通常被社區(qū)稱為“弗蘭肯合并”或“弗蘭肯斯坦模型”。

這項(xiàng)技術(shù)是極具實(shí)驗(yàn)性的,但它成功地創(chuàng)建了令人印象深刻的模型,比如使用兩個(gè)Llama 2 70B模型的goliath-120b模型。最近發(fā)布的SOLAR-10.7B-v1.0模型也使用了同樣的想法,在他們的論文中稱為深度放大。

一種Passthrough方法的配置示例如下所示:

slices:
  - sources:
    - model: OpenPipe/mistral-ft-optimized-1218
      layer_range: [0, 32]
  - sources:
    - model: mlabonne/NeuralHermes-2.5-Mistral-7B
      layer_range: [24, 32]
merge_method: passthrough
dtype: bfloat16

所得到的弗蘭肯合并將具有來自第一個(gè)模型的所有32層和來自第二個(gè)模型的8個(gè)附加層。這就創(chuàng)建了一個(gè)總共有40層和8.99B個(gè)參數(shù)的弗蘭肯合并。此配置的靈感來自GML-Mistral-merged-v1。

你可以在Hugging Face Hub上找到mlabonne/NeuralPipe-9B-merged

合并自己的模型

在本節(jié)中,我們將使用MergeKit加載合并配置,運(yùn)行它,并將生成的模型上傳到Hugging Face Hub。

首先,我們直接從源代碼安裝MergeKit,如下所示:

!git clone https://github.com/cg123/mergekit.git
!cd mergekit && pip install -q -e .

在下面的代碼塊中,我們以YAML格式加載合并配置。我們還指定合并模型的名稱以供將來使用。您可以復(fù)制/粘貼上一節(jié)中的任何配置到這里。

這一次,我們將使用兩種不同的模型:Marcroni-7B-v3Mistral-7B-Merge-14-v0.1,并使用SLRP方法將它們合并。我們將配置保存為yaml文件,用作merge命令中的輸入。

import yaml

MODEL_NAME = "Marcoro14-7B-slerp"
yaml_config = """
slices:
 - sources:
 - model: AIDC-ai-business/Marcoroni-7B-v3
 layer_range: [0, 32]
 - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.1
 layer_range: [0, 32]
merge_method: slerp
base_model: AIDC-ai-business/Marcoroni-7B-v3
parameters:
 t:
 - filter: self_attn
 value: [0, 0.5, 0.3, 0.7, 1]
 - filter: mlp
 value: [1, 0.5, 0.7, 0.3, 0]
 - value: 0.5
dtype: bfloat16

"""

# 將配置保存為yaml文件
with open('config.yaml', 'w', encoding="utf-8") as f:
 f.write(yaml_config)

我們使用以下參數(shù)運(yùn)行merge命令:

  • --copy-tokenizer:從基本模型中復(fù)制分詞器
  • --allow-crimes和--out-shard-size:將模型分割成更小的代碼片斷,這些代碼片斷可以在低RAM的CPU上計(jì)算
  • --lazy-unpickle:?jiǎn)⒂脤?shí)驗(yàn)性的惰性拆卸器以降低內(nèi)存使用率此外,一些模型可能需要使用--trust_remote_code標(biāo)志(Mistral-7B的情況并非如此)。

此命令將下載合并配置中列出的所有模型的權(quán)重,并運(yùn)行所選的合并方法(大約需要10分鐘)。

# 合并模型
!mergekit-yaml config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickl

現(xiàn)在,模型已合并并保存在“merge”目錄中。在上傳之前,我們可以創(chuàng)建一個(gè)自述文件,其中包含再現(xiàn)性所需的所有信息。下面的代碼塊定義了一個(gè)Jinja模板,并自動(dòng)使用合并配置中的數(shù)據(jù)填充它。

!pip install -qU huggingface_hub
 
from huggingface_hub import ModelCard, ModelCardData
from jinja2 import Template
 
username = "mlabonne"
 
template_text = """
---
license: apache-2.0
tags:
- merge
- mergekit
- lazymergekit
{%- for model in models %}
- {{ model }}
{%- endfor %}
---
 
# {{ model_name }}
 
{{ model_name }} is a merge of the following models using [mergekit](https://github.com/cg123/mergekit):
 
{%- for model in models %}
* [{{ model }}](https://huggingface.co/{{ model }})
{%- endfor %}
 
## ?? Configuration
 
```yaml
{{- yaml_config -}}
```
"""
 
#創(chuàng)建一個(gè)Jinja 模板對(duì)象
jinja_template = Template(template_text.strip())
 
# 從配置文件中取得一個(gè)模型列表
data = yaml.safe_load(yaml_config)
if "models" in data:
 models = [data["models"][i]["model"] for i in range(len(data["models"])) if "parameters" in data["models"][i]]
elif "parameters" in data:
 models = [data["slices"][0]["sources"][i]["model"] for i in range(len(data["slices"][0]["sources"]))]
elif "slices" in data:
 models = [data["slices"][i]["sources"][0]["model"] for i in range(len(data["slices"]))]
else:
 raise Exception("No models or slices found in yaml config")
 
# 填充模板
content = jinja_template.render(
 model_name=MODEL_NAME,
 models=models,
 yaml_cnotallow=yaml_config,
 username=username,
)
 
# 保存模型卡
card = ModelCard(content)
card.save('merge/README.md')
現(xiàn)在,我們已經(jīng)創(chuàng)建了模型卡ModelCard。接下來,我們可以將整個(gè)文件夾推送到Hugging Face Hub上。
from google.colab import userdata
from huggingface_hub import HfApi
 
username = "mlabonne"
 
#在Google Colab網(wǎng)頁的secrets面板上定義
api = HfApi(token=userdata.get("HF_TOKEN"))
 
api.create_repo(
 repo_id=f"{username}/{MODEL_NAME}",
 repo_type="model"
)
api.upload_folder(
 repo_id=f"{username}/{MODEL_NAME}",
 folder_path="merge",
)

現(xiàn)在,該模型可從Hugging Face Hub上下載到:mlabonne/Marcoro14-7B-slerp。在另一個(gè)筆記本電腦中,我們可以使用以下代碼在免費(fèi)的T4 GPU上測(cè)試該模型:

!pip install -qU transformers accelerate
 
from transformers import AutoTokenizer
import transformers
import torch
 
model = "mlabonne/Marcoro14-7B-slerp"
messages = [{"role": "user", "content": "What is a large language model?"}]
 
tokenizer = AutoTokenizer.from_pretrained(model)
prompt = tokenizer.apply_chat_template(
 messages,
 tokenize=False,
 add_generation_prompt=True
)
pipeline = transformers.pipeline(
 "text-generation",
 model=model,
 torch_dtype=torch.float16,
 device_map="auto",
)
 
outputs = pipeline(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)

我們提出了一個(gè)問題“What is a Large Language Model?(什么是大型語言模型?)”,收到了以下輸出:

“A large language model is a type of artificial intelligence (AI) system that has been trained on vast amounts of text data. It’s designed to understand and generate human-like language, making predictions on what words or phrases might come next in a sentence or document. These models use complex algorithms and neural network architectures to learn from the data and improve their performance over time. Some well-known large language models include GPT-3 from OpenAI and BERT from Google.”

相應(yīng)的中文意思是:“大型語言模型是一種基于大量文本數(shù)據(jù)進(jìn)行訓(xùn)練的人工智能系統(tǒng)。它旨在理解和生成類似人類的語言,預(yù)測(cè)句子或文檔中接下來可能出現(xiàn)的單詞或短語。這些模型使用復(fù)雜的算法和神經(jīng)網(wǎng)絡(luò)架構(gòu)從數(shù)據(jù)中學(xué)習(xí),并隨著時(shí)間的推移提高其性能。一些著名的大型語言模型包括有OpenAI的GPT-3和谷歌的BERT”。
看起來效果不錯(cuò),但我們需要進(jìn)行一個(gè)更全面的評(píng)估。目前,對(duì)于這種通用模型,已經(jīng)出現(xiàn)了幾個(gè)非常有趣的評(píng)估工具:

  • Chatbot Arena,它能夠根據(jù)人類投票編制出一個(gè)基于Elo的LLM排行榜。
  • MT-bench(與上面相同的鏈接地址),它使用GPT-4作為判斷,對(duì)一組多回合問題的模型回答進(jìn)行評(píng)分。
  • NousSearch基準(zhǔn)套件,它聚合了四種評(píng)估基準(zhǔn):AGIEval、GPT4ALL、TruthfulQA和Bigbench。其中,GPT4ALL本身包括HellaSwag、OpenBookQA、Winogrande、ARC Easy、ARC Challenge、BoolQ和PIQA等工具。
  • Open LLM排行榜,共提供了六種評(píng)估基準(zhǔn):ARC、HellaSwag、MMLU、Winogrande、GSM8K和TruthfulQA。

不幸的是,我們無法將我們的模型提交給Chatbot Arena基準(zhǔn)測(cè)試平臺(tái)。相反,我選擇使用Open LLM排行榜和NousSearch基準(zhǔn)進(jìn)行評(píng)估。

我將我們的模型提交給了Open LLM排行榜(“Submit here!”選項(xiàng)卡)。正如在本文開始所介紹的,它在排行榜上排名為最佳7B參數(shù)模型。以下是完整的結(jié)果:

圖片由作者本人提供圖片由作者本人提供

Open LLM排行榜的問題在于這些基準(zhǔn)是公開的。這意味著,人們可以根據(jù)測(cè)試數(shù)據(jù)訓(xùn)練LLM以獲得更好的結(jié)果。通過合并最好的模型,我們也“污染”了我們自己的結(jié)果??梢钥隙ǖ丶僭O(shè)Marcoro14-7B-slerp模型也受到了“污染”,并且該合并中使用的一些模型已經(jīng)在測(cè)試集上進(jìn)行了訓(xùn)練。如果你想創(chuàng)建最好的模型——而不是破解排行榜的話,我建議你只使用非合并模型來創(chuàng)建自己的合并。

這就是為什么我們不想只依賴OpenLLM排行榜的原因。對(duì)于NousSearch基準(zhǔn)套件,借助于LLM AutoEval工具,我可以用一個(gè)簡(jiǎn)單的Colab筆記本來完成自動(dòng)計(jì)算分值。以下是與優(yōu)秀的OpenHermes-2.5-Mistral-7B模型進(jìn)行比較的結(jié)果:

圖片由作者本人提供圖片由作者本人提供

在每個(gè)基準(zhǔn)測(cè)試中,我們都比這個(gè)模型有了顯著的改進(jìn)。請(qǐng)注意,NousSearch基準(zhǔn)套件與Open LLM排行榜共享一些任務(wù):ARC Challenge、TruthfulQA、HellaSwag和Winogrande。據(jù)我所知,Bigbench是唯一一個(gè)100%不同的基準(zhǔn)(如果不是這樣,請(qǐng)隨時(shí)聯(lián)系我)。然而,我們?cè)谶@次合并中使用的一個(gè)模型仍然可以在Bigbench上進(jìn)行訓(xùn)練。

結(jié)論

在本文中,我們介紹了用四種不同算法合并LLM的概念。其中,我們?cè)敿?xì)介紹了SLERP、TIES、DARE和Passthrough是如何工作的,并提供了相應(yīng)的配置示例。最后,我們?cè)贛ergeKit中運(yùn)用SLERP算法,創(chuàng)建了Marcoro14-7B-SLERP模型,并將其上傳到Hugging Face Hub。最終,我們?cè)趦蓚€(gè)基準(zhǔn)套件上都獲得了出色的性能:Open LLM Leaderboard(性能最佳的7B模型)和NousSearch。如果你也想創(chuàng)建自己的合并,我推薦你使用我的自動(dòng)筆記本程序LazyMergekit。

組合多個(gè)模型的另一種方法是將它們合并到一個(gè)混合專家系統(tǒng)(MoE)架構(gòu)中。在下一篇文章中,我們將詳細(xì)討論如何做到這一點(diǎn),并創(chuàng)建我們自己的類似Mixtral的模型。最后,如果你喜歡這篇文章,請(qǐng)?jiān)贛edium和Twitter@mlabonne上關(guān)注我吧。

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題:Merge Large Language Models with mergekit,作者:Maxime Labonne

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2021-04-08 09:35:10

瀏覽器 Chrome Google

2024-03-29 15:43:32

大型語言模型人工智能

2019-01-31 13:43:48

Spring BootStarter開發(fā)

2013-01-09 17:16:41

Android開發(fā)Camera

2024-09-29 10:34:31

FlaskPythonAPI

2024-03-18 18:07:38

VSCode插件文件

2025-02-04 12:37:51

MetaAI開發(fā)

2015-06-08 14:27:35

谷歌蘋果編程語言

2017-08-16 10:57:52

深度學(xué)習(xí)TensorFlowNLP

2024-11-26 17:56:38

2013-03-18 16:09:27

JavaEEOpenfire

2024-05-23 12:57:59

2025-04-01 09:54:09

AI算法大模型AI

2023-11-03 14:37:59

AI 模型開源

2019-08-16 08:44:46

代碼開發(fā)工具

2023-11-27 12:24:23

算法模型業(yè)務(wù)模型

2023-07-21 12:49:15

蘋果GPT人工智能

2010-05-25 11:35:02

JavaKilim
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)