MergeKitを使用した言語モデルのマージとHugging Faceへのアップロード方法

未分類

はじめに

こんにちは!今日は、複数の言語モデルを一つにまとめる「マージ」という技術について学びましょう。マージすることで、それぞれのモデルの良いところを組み合わせた、より高性能なモデルを作ることができるんです。

でも、モデルをマージするなんて難しそうだなあ...と思った方もいるかもしれません。でも大丈夫!この記事では、初心者の方でも分かるように、MergeKitというツールを使って、簡単にモデルをマージする方法を丁寧に解説していきます。

マージしたモデルは、自分だけで使うのはもったいないですよね。せっかく良いモデルができたのなら、他の人とも共有したいところです。そこで、この記事ではマージしたモデルをHugging Faceという機械学習モデルを共有するためのプラットフォームにアップロードする方法も紹介します。

プログラミングが苦手な方も、機械学習について詳しくない方も、この記事を読めば、MergeKitを使ったモデルのマージとHugging Faceへのアップロードができるようになるはずです。それでは、一緒にマージの世界に飛び込んでみましょう!

マージモデルの定義

MODEL_NAME = "NeuralMarioMonarch-7B-slerp"

上記のコードでは、MODEL_NAME変数に"NeuralMarioMonarch-7B-slerp"という名前が割り当てられています。この名前は、マージされるモデルの特性を反映しており、NeuralMarioMonarchはモデルの名前、7Bはモデルのサイズ、slerpはマージ手法を表しています。

マージ設定用YAMLの定義

yaml_config変数は、マージ設定をYAML形式で定義するために使用されます。YAMLは、人間にとって読みやすく、構造化されたデータを表現するための形式です。

yaml_config = """
slices:
  - sources:
      - model: mlabonne/Monarch-7B
        layer_range: [0, 32]
      - model: vanillaOVO/supermario_v4
        layer_range: [0, 32]
merge_method: slerp
base_model: mlabonne/Monarch-7B
parameters:
  t:
    - filter: self_attn
      value: [0, 0.5, 0.3, 0.7, 0.9]
    - filter: mlp
      value: [1, 0.5, 0.7, 0.3, 0.1]
    - value: 0.5
dtype: float16
"""
# Save config as yaml file
with open('config.yaml', 'w', encoding="utf-8") as f:
    f.write(yaml_config)

上記のYAMLでは、以下の設定が定義されています:

  • slices:マージするモデルのスライス(層の範囲)を指定します。ここでは、mlabonne/Monarch-7BvanillaOVO/supermario_v4の2つのモデルが指定され、それぞれの層の範囲が[0, 32]に設定されています。
  • merge_method:マージ手法を指定します。ここでは、slerp(Spherical Linear Interpolation)が使用されています。
  • base_model:マージの基礎となるモデルを指定します。ここでは、mlabonne/Monarch-7Bが使用されています。
  • parameters:マージのパラメータを指定します。ここでは、self_attnmlpという2つのフィルターに対して、異なる値が設定されています。
  • dtype:マージされたモデルのデータ型を指定します。ここでは、float16が使用されています。

これらの設定は、MergeKitがモデルをマージする際に使用されます。適切な設定を行うことで、目的のモデルを効果的にマージすることができます。


マージの実行環境の設定

次のセクションでは、マージを実行するための環境を設定しています。この設定は、使用するハードウェアやMergeKitのブランチ、リモートコードの実行許可など、マージプロセスに影響を与える重要な要素を指定します。

ランタイムの選択

runtime変数は、マージを実行するためのランタイム環境を指定します。以下の3つのオプションから選択することができます:

  • "CPU":CPUを使用してマージを実行します。
  • "CPU + High-RAM":高メモリのCPUを使用してマージを実行します。
  • "GPU":GPUを使用してマージを実行します。
runtime = "GPU" # Options ["CPU", "CPU + High-RAM", "GPU"]

上記のコードでは、runtime変数に"GPU"が設定されています。これにより、マージはGPUを使用して実行されます。

ブランチの選択

branch変数は、MergeKitのブランチを指定します。以下の2つのオプションから選択することができます:

  • "main":MergeKitのメインブランチを使用します。
  • "mixtral":MergeKitのmixtralブランチを使用します。
branch = "main" # param ["main", "mixtral"]

上記のコードでは、branch変数に"main"が設定されています。これにより、MergeKitのメインブランチが使用されます。

リモートコードの実行許可

trust_remote_code変数は、リモートコードの実行を許可するかどうかを指定します。この設定は、セキュリティ上の理由から重要です。

trust_remote_code = False

上記のコードでは、trust_remote_code変数にFalseが設定されています。これにより、リモートコードの実行は許可されません。

# Run merge
# Select your runtime (CPU, High RAM, GPU)
runtime = "GPU" # Options ["CPU", "CPU + High-RAM", "GPU"]
branch = "main" # param ["main", "mixtral"]
trust_remote_code = False

このコードブロックを実行することで、マージの実行環境が設定されます。runtime変数でランタイム環境を選択し、branch変数でMergeKitのブランチを指定し、trust_remote_code変数でリモートコードの実行許可を設定します。これらの設定は、マージプロセスに直接影響を与えるため、適切に設定することが重要です。


MergeKitのインストール

MergeKitは、複数のモデルをマージするためのツールキットです。マージを実行する前に、MergeKitをインストールする必要があります。このセクションでは、MergeKitのインストール方法について説明します。

ブランチに応じたインストール

MergeKitのインストールは、選択したブランチに応じて異なります。以下のコードブロックは、ブランチに応じてMergeKitをインストールするための条件分岐を示しています:

if branch == "main":
    !git clone https://github.com/cg123/mergekit.git
    !cd mergekit && pip install -qqq -e . --progress-bar off
elif branch == "mixtral":
    !git clone -b mixtral https://github.com/cg123/mergekit.git
    !cd mergekit && pip install -qqq -e . --progress-bar off
    !pip install -qqq -U transformers --progress-bar off
    Cloning into 'mergekit'...
    remote: Enumerating objects: 2002, done.
    remote: Counting objects: 100% (116/116), done.
    remote: Compressing objects: 100% (74/74), done.
    remote: Total 2002 (delta 72), reused 66 (delta 42), pack-reused 1886
    Receiving objects: 100% (2002/2002), 611.94 KiB | 10.20 MiB/s, done.
    Resolving deltas: 100% (1369/1369), done.
    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    ydata-profiling 4.6.4 requires numpy<1.26,>=1.16.0, but you have numpy 1.26.4 which is incompatible.
    

上記のコードブロックでは、branch変数の値に応じて、以下の処理が実行されます:

  • branch"main"の場合:

    1. https://github.com/cg123/mergekit.gitからMergeKitのリポジトリをクローンします。
    2. mergekitディレクトリに移動し、pip install -qqq -e . --progress-bar offコマンドを実行してMergeKitをインストールします。
  • branch"mixtral"の場合:

    1. https://github.com/cg123/mergekit.gitからmixtralブランチをクローンします。
    2. mergekitディレクトリに移動し、pip install -qqq -e . --progress-bar offコマンドを実行してMergeKitをインストールします。
    3. pip install -qqq -U transformers --progress-bar offコマンドを実行して、transformersライブラリをアップグレードします。

インストールコマンドの説明

MergeKitのインストールには、以下のコマンドが使用されています:

  • git clone:GitHubリポジトリをクローンするためのコマンドです。https://github.com/cg123/mergekit.gitからMergeKitのリポジトリをクローンします。
  • cd mergekitmergekitディレクトリに移動するためのコマンドです。
  • pip install -qqq -e . --progress-bar off:MergeKitをインストールするためのコマンドです。-qqqオプションは出力を最小限に抑え、-eオプションはエディタブルモードでインストールを行います。--progress-bar offオプションはプログレスバーを非表示にします。
  • pip install -qqq -U transformers --progress-bar off:transformersライブラリをアップグレードするためのコマンドです。-Uオプションはアップグレードを指定します。

マージコマンドの構築

MergeKitを使用してモデルをマージするには、適切なマージコマンドを構築する必要があります。マージコマンドは、選択したブランチやランタイム環境に応じて異なります。このセクションでは、マージコマンドを構築する方法について説明します。

ブランチに応じたベースコマンド

以下のコードブロックは、選択したブランチに応じてベースとなるマージコマンドを構築するための条件分岐を示しています:

if branch == "main":
    cli = "mergekit-yaml config.yaml merge --copy-tokenizer"
elif branch == "mixtral":
    cli = "mergekit-moe config.yaml merge --copy-tokenizer"

上記のコードブロックでは、branch変数の値に応じて、以下の処理が実行されます:

  • branch"main"の場合:

    • cli変数に"mergekit-yaml config.yaml merge --copy-tokenizer"が代入されます。
    • このコマンドは、config.yamlファイルに保存されたマージ設定を使用して、mergekit-yamlコマンドでモデルをマージします。
    • --copy-tokenizerオプションは、トークナイザーをコピーするために使用されます。
  • branch"mixtral"の場合:

    • cli変数に"mergekit-moe config.yaml merge --copy-tokenizer"が代入されます。
    • このコマンドは、config.yamlファイルに保存されたマージ設定を使用して、mergekit-moeコマンドでモデルをマージします。
    • --copy-tokenizerオプションは、トークナイザーをコピーするために使用されます。

ランタイム環境に応じたオプション

以下のコードブロックは、選択したランタイム環境に応じて追加のオプションを設定するための条件分岐を示しています:

if runtime == "CPU":
    cli += " --allow-crimes --out-shard-size 1B --lazy-unpickle"
elif runtime == "GPU":
    cli += " --cuda --low-cpu-memory"
if trust_remote_code:
    cli += " --trust-remote-code"

上記のコードブロックでは、runtime変数の値に応じて、以下の処理が実行されます:

  • runtime"CPU"の場合:

    • cli変数に" --allow-crimes --out-shard-size 1B --lazy-unpickle"が追加されます。
    • --allow-crimesオプションは、特定の警告を無視するために使用されます。
    • --out-shard-size 1Bオプションは、出力シャードのサイズを1GBに設定します。
    • --lazy-unpickleオプションは、遅延アンピックルを有効にします。
  • runtime"GPU"の場合:

    • cli変数に" --cuda --low-cpu-memory"が追加されます。
    • --cudaオプションは、GPUを使用してマージを実行するために使用されます。
    • --low-cpu-memoryオプションは、CPUメモリの使用量を減らすために使用されます。
  • trust_remote_codeTrueの場合:

    • cli変数に" --trust-remote-code"が追加されます。
    • --trust-remote-codeオプションは、リモートコードの実行を許可するために使用されます。

マージコマンドの実行

前のセクションで構築したマージコマンドを実行することで、MergeKitを使用してモデルのマージを行います。このセクションでは、マージコマンドの実行方法について説明します。

マージコマンドの表示

以下のコードブロックは、構築したマージコマンドを表示するための処理を示しています:

print(cli)
    mergekit-yaml config.yaml merge --copy-tokenizer --cuda --low-cpu-memory

上記のコードブロックでは、print(cli)を使用してcli変数に格納されているマージコマンドを表示します。これにより、実行されるコマンドを確認することができます。

マージコマンドの実行

以下のコードブロックは、構築したマージコマンドを実行するための処理を示しています:

!{cli}
    /opt/conda/lib/python3.10/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
      warnings.warn(
    config.json: 100%|█████████████████████████████| 642/642 [00:00<00:00, 3.43MB/s]
    config.json: 100%|█████████████████████████████| 614/614 [00:00<00:00, 3.79MB/s]
    Warmup loader cache:   0%|                                | 0/2 [00:00<?, ?it/s]
    Fetching 7 files:   0%|                                   | 0/7 [00:00<?, ?it/s]

    model-00001-of-00002.safetensors: 100%|█████| 9.94G/9.94G [01:13<00:00, 136MB/s]

    Fetching 8 files: 100%|███████████████████████████| 8/8 [01:13<00:00,  9.15s/it]
    Warmup loader cache: 100%|████████████████████████| 2/2 [02:29<00:00, 74.86s/it]
    Executing graph: 100%|██████████████████████| 1457/1457 [05:12<00:00,  4.66it/s]

上記のコードブロックでは、!{cli}を使用してcli変数に格納されているマージコマンドを実行します。!は、Jupyter Notebookでシェルコマンドを実行するための記号です。{cli}は、cli変数の値を展開するための構文です。

マージコマンドの実行結果

マージコマンドを実行すると、MergeKitがモデルのマージを開始します。マージ処理には時間がかかる場合があります。処理が完了すると、マージされたモデルが生成されます。

以下は、マージコマンドの実行結果の例です:

Merging models...
Loading model mlabonne/Monarch-7B...
Loading model vanillaOVO/supermario_v4...
Applying merge method slerp...
Saving merged model...
Merge completed successfully!

上記の例では、mlabonne/Monarch-7BvanillaOVO/supermario_v4のモデルがマージされ、slerpマージ手法が適用されています。マージされたモデルが保存され、処理が正常に完了したことが示されています。


マージされたモデルを使用した推論

マージされたモデルを使用して、実際に推論を行う方法について説明します。推論とは、モデルに入力を与えて、その出力を得ることを指します。マージされたモデルは、複数のモデルの長所を組み合わせているため、高い性能が期待できます。

必要なライブラリのインストール

推論を行うには、transformersaccelerateライブラリが必要です。以下のコードブロックを実行して、これらのライブラリをインストールします:

!pip install -qU transformers accelerate
    WARNING: Error parsing requirements for aiohttp: [Errno 2] No such file or directory: '/opt/conda/lib/python3.10/site-packages/aiohttp-3.9.1.dist-info/METADATA'
    

上記のコードブロックでは、pipを使用してtransformersaccelerateライブラリをインストールしています。-qUオプションは、出力を最小限に抑えつつ、最新バージョンにアップグレードするために使用されます。

推論の準備

推論を行うには、以下の手順が必要です:

  1. トークナイザーのロード
  2. テキスト生成パイプラインの作成
  3. 入力プロンプトの生成

以下のコードブロックは、これらの手順を実行するための処理を示しています:

from transformers import AutoTokenizer 
import transformers
import torch

model = "Kukedlc/NeuralMarioMonarch-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",
)
    tokenizer_config.json:   0%|          | 0.00/967 [00:00<?, ?B/s]

    tokenizer.model:   0%|          | 0.00/493k [00:00<?, ?B/s]

    tokenizer.json:   0%|          | 0.00/1.80M [00:00<?, ?B/s]

    special_tokens_map.json:   0%|          | 0.00/414 [00:00<?, ?B/s]

    No chat template is set for this tokenizer, falling back to a default class-level template. This is very error-prone, because models are often trained with templates different from the class default! Default chat templates are a legacy feature and will be removed in Transformers v4.43, at which point any code depending on them will stop working. We recommend setting a valid chat template before then to ensure that this model continues working without issues.
    2024-06-03 13:20:36.412689: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
    2024-06-03 13:20:36.412795: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
    2024-06-03 13:20:36.549491: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered

    config.json:   0%|          | 0.00/635 [00:00<?, ?B/s]

    model.safetensors.index.json:   0%|          | 0.00/22.8k [00:00<?, ?B/s]

    Downloading shards:   0%|          | 0/2 [00:00<?, ?it/s]

    model-00001-of-00002.safetensors:   0%|          | 0.00/9.94G [00:00<?, ?B/s]

    model-00002-of-00002.safetensors:   0%|          | 0.00/4.54G [00:00<?, ?B/s]

    Loading checkpoint shards:   0%|          | 0/2 [00:00<?, ?it/s]

上記のコードブロックでは、以下の処理が行われています:

  1. AutoTokenizer.from_pretrained(model)を使用して、マージされたモデルに対応するトークナイザーをロードします。
  2. messages変数に、ユーザーの入力メッセージを定義します。
  3. tokenizer.apply_chat_template()を使用して、入力メッセージをモデルに適した形式に変換します。
  4. transformers.pipeline()を使用して、テキスト生成パイプラインを作成します。このパイプラインは、モデルを使用してテキストを生成するために使用されます。

推論の実行

推論を実行するには、以下のコードブロックを実行します:

outputs = pipeline(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)
print(outputs[0]["generated_text"])
    Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.

    <s>[INST] What is a large language model? [/INST]A large language model is an advanced artificial intelligence system, typically based on deep neural networks, designed to process and generate human-like natural language. It can analyze vast amounts of textual data and generate contextually relevant responses or predictions, making it useful in various applications such as translation, question-answering, summarization, and creative writing. These models continuously improve through unsupervised learning, extracting patterns and relationships from the data they're trained on. Examples of large language models include GPT-3, BERT, and T5.    

上記のコードブロックでは、以下の処理が行われています:

  1. pipeline()を使用して、promptに対する推論を実行します。
    • max_new_tokensは、生成するトークンの最大数を指定します。
    • do_sampleは、サンプリングを有効にするかどうかを指定します。
    • temperatureは、生成されるテキストのランダム性を制御するパラメータです。
    • top_ktop_pは、生成されるトークンの多様性を制御するパラメータです。
  2. 生成されたテキストをprint()で表示します。

マージされたモデルのHugging Faceへのアップロード

マージされたモデルを他の人と共有するために、Hugging Faceにアップロードする方法について説明します。Hugging Faceは、自然言語処理モデルを共有するためのプラットフォームであり、多くの研究者や開発者に利用されています。

必要なライブラリのインストール

モデルをアップロードするには、huggingface_hubライブラリが必要です。以下のコードブロックを実行して、このライブラリをインストールします:

!pip install -qU huggingface_hub
    /opt/conda/lib/python3.10/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.
      pid, fd = os.forkpty()
    huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    To disable this warning, you can either:
        - Avoid using `tokenizers` before the fork if possible
        - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)

    WARNING: Error parsing requirements for aiohttp: [Errno 2] No such file or directory: '/opt/conda/lib/python3.10/site-packages/aiohttp-3.9.1.dist-info/METADATA'
    

上記のコードブロックでは、pipを使用してhuggingface_hubライブラリをインストールしています。-qUオプションは、出力を最小限に抑えつつ、最新バージョンにアップグレードするために使用されます。

アップロードの準備

モデルをアップロードするには、以下の情報が必要です:

  • Hugging Faceのユーザー名
  • Hugging Faceのアクセストークン
  • モデルのライセンス

以下のコードブロックは、これらの情報を設定するための処理を示しています:

username = 'MakiAi' 
token = 'HF_TOKEN'
license = "apache-2.0" 

!pip install -qU huggingface_hub
    huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    To disable this warning, you can either:
        - Avoid using `tokenizers` before the fork if possible
        - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)

    WARNING: Error parsing requirements for aiohttp: [Errno 2] No such file or directory: '/opt/conda/lib/python3.10/site-packages/aiohttp-3.9.1.dist-info/METADATA'
    

上記のコードブロックでは、以下の変数を設定しています:

  • username:Hugging Faceのユーザー名を指定します。
  • token:Hugging Faceのアクセストークンを指定します。このトークンは、Hugging Faceのウェブサイトで取得することができます。
  • license:モデルのライセンスを指定します。ここでは、Apache License 2.0を使用しています。

モデルカードの作成

モデルをアップロードする際には、モデルの説明や使用方法を記載したモデルカードを作成する必要があります。以下のコードブロックは、モデルカードを作成するための処理を示しています:

import yaml

from huggingface_hub import ModelCard, ModelCardData, HfApi

try:
    from google.colab import userdata
    HF_TOKEN = userdata.get(token)
except:
    from kaggle_secrets import UserSecretsClient
    user_secrets = UserSecretsClient()
    HF_TOKEN = user_secrets.get_secret(token)

from jinja2 import Template

if branch == "main":
    template_text = """
---
license: {{ license }}
base_model:
{%- for model in models %}
  - {{ model }}
{%- endfor %}
tags:
- merge
- mergekit
- lazymergekit
{%- for model in models %}
- {{ model }}
{%- endfor %}
---

# {{ model_name }}

{{ model_name }} is a merge of the following models using [LazyMergekit](https://colab.research.google.com/drive/1obulZ1ROXHjYLn6PPZJwRR6GzgQogxxb?usp=sharing):

{%- for model in models %}
* [{{ model }}](https://huggingface.co/{{ model }})
{%- endfor %}

## 🧩 Configuration

```yaml
{{- yaml_config -}}</code></pre>
<h2>&#x1f4bb; Usage</h2>
<pre><code class="language-python">!pip install -qU transformers accelerate

from transformers import AutoTokenizer
import transformers
import torch

model = "{{ username }}/{{ model_name }}"
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)
print(outputs[0]["generated_text"])</code></pre>
<p>"""</p>
<pre><code># Create a Jinja template object
jinja_template = Template(template_text.strip())

# Get list of models from config
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")

# Fill the template
content = jinja_template.render(
    model_name=MODEL_NAME,
    models=models,
    yaml_config=yaml_config,
    username=username,
)</code></pre>
<h2>elif branch == "mixtral":
template_text = """</h2>
<p>license: {{ license }}
base_model:
{%- for model in models %}</p>
<ul>
<li>{{ model }}
{%- endfor %}
tags:
<ul>
<li>moe</li>
<li>frankenmoe</li>
<li>merge</li>
<li>mergekit</li>
<li>lazymergekit
{%- for model in models %}</li>
<li>
<h2>{{ model }}
{%- endfor %}</h2>
</li>
</ul></li>
</ul>
<h1>{{ model_name }}</h1>
<p>{{ model_name }} is a Mixure of Experts (MoE) made with the following models using <a href="https://colab.research.google.com/drive/1obulZ1ROXHjYLn6PPZJwRR6GzgQogxxb?usp=sharing">LazyMergekit</a>:</p>
<p>{%- for model in models %}</p>
<ul>
<li>[{{ model }}](<a href="https://huggingface.co/">https://huggingface.co/</a>{{ model }})
{%- endfor %}</li>
</ul>
<h2>&#x1f9e9; Configuration</h2>
<pre><code class="language-yaml">{{- yaml_config -}}</code></pre>
<h2>&#x1f4bb; Usage</h2>
<pre><code class="language-python">!pip install -qU transformers bitsandbytes accelerate

from transformers import AutoTokenizer
import transformers
import torch

model = "{{ username }}/{{ model_name }}"

tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    model_kwargs={"torch_dtype": torch.float16, "load_in_4bit": True},
)

messages = [{"role": "user", "content": "Explain what a Mixture of Experts is in less than 100 words."}]
prompt = pipeline.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipeline(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)
print(outputs[0]["generated_text"])</code></pre>
<p>"""</p>
<pre><code># Create a Jinja template object
jinja_template = Template(template_text.strip())

# Fill the template
data = yaml.safe_load(yaml_config)
models = [model[&#039;source_model&#039;] for model in data[&#039;experts&#039;]]

content = jinja_template.render(
    model_name=MODEL_NAME,
    models=models,
    yaml_config=yaml_config,
    username=username,
    license=license
)</code></pre>
<h1>Save the model card</h1>
<p>card = ModelCard(content)
card.save(&#039;merge/README.md&#039;)</p>
<pre><code>
上記のコードブロックでは、以下の処理が行われています:

1. <code>yaml</code>、<code>huggingface_hub</code>、<code>jinja2</code>ライブラリをインポートします。
2. モデルカードのテンプレートを定義します(省略)。
3. テンプレートにモデルの情報を埋め込んでモデルカードの内容を生成します。
4. <code>ModelCard</code>オブジェクトを作成し、生成された内容を設定します。
5. <code>card.save(&#039;merge/README.md&#039;)</code>を使用して、モデルカードを<code>merge</code>ディレクトリに<code>README.md</code>ファイルとして保存します。

### モデルのアップロード

モデルカードを作成した後、以下のコードブロックを実行してモデルをアップロードします:

```python
api = HfApi(token=HF_TOKEN)

api.create_repo(
    repo_id=f"{username}/{MODEL_NAME}",
    repo_type="model",
    exist_ok=True,
)
api.upload_folder(
    repo_id=f"{username}/{MODEL_NAME}",
    folder_path="merge",
    revision="main",  # 上書きするブランチ名、通常は "main"
    delete_patterns="**",  # すべてのファイルにマッチするパターン
)
    model-00002-of-00003.safetensors:   0%|          | 0.00/4.92G [00:00<?, ?B/s]

    model-00003-of-00003.safetensors:   0%|          | 0.00/4.68G [00:00<?, ?B/s]

    Upload 4 LFS files:   0%|          | 0/4 [00:00<?, ?it/s]

    tokenizer.model:   0%|          | 0.00/493k [00:00<?, ?B/s]

    model-00001-of-00003.safetensors:   0%|          | 0.00/4.89G [00:00<?, ?B/s]

    CommitInfo(commit_url='https://huggingface.co/MakiAi/NeuralMarioMonarch-7B-slerp/commit/a8604251ecd5c3f65bd20e0295291ffcb255d4f0', commit_message='Upload folder using huggingface_hub', commit_description='', oid='a8604251ecd5c3f65bd20e0295291ffcb255d4f0', pr_url=None, pr_revision=None, pr_num=None)

上記のコードブロックでは、以下の処理が行われています:

  1. HfApiオブジェクトを作成し、Hugging Faceのアクセストークンを設定します。
  2. api.create_repo()を使用して、Hugging Face上にモデルのリポジトリを作成します。
    • repo_idは、リポジトリの識別子であり、{username}/{MODEL_NAME}の形式で指定します。
    • repo_typeは、リポジトリのタイプであり、ここでは"model"を指定します。
    • exist_okは、リポジトリが既に存在する場合に上書きするかどうかを指定します。
  3. api.upload_folder()を使用して、mergeディレクトリ内のファイルをHugging Faceにアップロードします。

このコードブロックを実行することで、マージされたモデルがHugging Faceにアップロードされます。アップロードされたモデルは、他の人がダウンロードして使用することができます。Hugging Faceを通じてモデルを共有することで、コミュニティでの活用が期待できます。

Kaggle ノートブック

MergeKitを使用した言語モデルのマージとHugging Faceへのアップロード方法
Explore and run machine learning code with Kaggle Notebooks | Using data from No attached data sources

コメント

タイトルとURLをコピーしました