catch-img

【Llamaの日本語LLM】Swallowの使い方・性能・商用利用 | 7B・13B・70B

Swallowは、東京工業大学と産総研の研究チームによって開発されたLlama2ベースの日本語LLMです。

この記事では、Swallowの使い方・性能・商用利用について紹介しています。


目次[非表示]

  1. 1.Swallow とは
  2. 2.Swallowモデルの種類
  3. 3.Swallowの日本語性能
  4. 4.Swallowの商用利用・ライセンス
  5. 5.Swallowの使い方
  6. 6.Jupyter Labを起動
  7. 7.ライブラリのインストール
  8. 8.モデルの設定
  9. 9.モデルの量子化
  10. 10.プロンプトの実行1
  11. 11.プロンプトの実行2
  12. 12.プロンプトの実行3
  13. 13.LLMならGPUクラウド
  14. 14.まとめ


Swallow とは

Swallowは、東工大と産総研の研究チームによって開発された日本語LLMです。

世界的に支持されているMeta社のLlama2のモデルをベースに、日本語能力を強化するために新たに日本語の語彙やデータを組み込み、継続事前学習を行っています。性能評価では、2023年12月時点で最高水準の日本語処理能力を示しています。

 Swallowは、日本語の文法や表現のニュアンスを理解し、高度な言語処理タスクに対処することができるようになっています。


ベースモデルのLlama2については、以下の記事で詳しく解説しています。


  Llama2とは?使い方・日本語性能・商用利用について解説 | 初心者ガイド この記事では、Llama2について幅広く解説しています。Llama2の性能や安全性、商用利用、日本語対応、様々な環境での使い方などに触れています。 業界最安級GPUクラウド | GPUSOROBAN


Swallowモデルの種類

Swallowモデルには、3つのパラメータサイズ(7B、13B、70B)があり、それぞれに事前学習モデル(base)と、人間の指示に基づいた回答をするためのモデル(instruct)が用意されています。

モデルは、Hugging Faceからモデルをダウンロードできます。

model_id
パラメータサイズ
タイプ

GPUメモリ(VRAM)使用量 
ストレージ使用
使用したGPU
tokyotech-llm/Swallow-7b-hf
70億
base model
14.8GB
14GB
NVIDIA A100 40GB x 

tokyotech-llm/Swallow-7b-instruct-hf
70億

instruct model
14.8GB
14GB
NVIDIA A100 40GB x 1
tokyotech-llm/Swallow-13b-hf
130億
base model
27.4GB
26GB
NVIDIA A100 40GB x 1
tokyotech-llm/Swallow-13b-instruct-hf
130億
instruct
model
27.4GB
26GB
NVIDIA A100 40GB x 1
tokyotech-llm/Swallow-70b-hf
700億
base model
35.4GB

(※4bit量子化あり

130GB
NVIDIA A100 80GB x 1
tokyotech-llm/Swallow-70b-instruct-hf
700億
instruct model
35.4GB
(※4bit量子化あり)
132GB
NVIDIA A100 80GB x 1

※Swallow 70bをNVIDIA A100 80GB x1枚で動かす場合は、GPUメモリ(VRAM)が不足しますので、精度を落としてモデルを軽量化する量子化を適用しています。


SwallowのベースモデルのLlama2の情報になりますが、HugginFaceの記事では量子化を行わない場合、700億パラメータのLlama-2-70bでは総計140GBのGPUメモリが必要とされています。

またGithubでは、8つのマルチGPU構成(=MP 8)を使用することを推奨されています。


Swallowの日本語性能

Meta社が開発したLlama 2は世界的に支持されるLLMモデルですが、日本語の処理には弱点がありました。

東工大らによる研究チームがLlama 2モデルを日本語と英語のデータで継続事前学習した結果、日本語のベンチマークデータにおいて、全てのモデルが元の性能を上回り、継続事前学習の効果が示されました。

また語彙拡張を行うことで日本語テキストのトークン長を50%以上削減し、学習・推論効率を改善しています。大規模な日本語ウェブコーパスの開発も行われ、品質の高い言語データを取り入れています。


研究チームが実施した日本語の評価ベンチマークでの比較実験結果を以下のグラフに示します。

ざっくり比較する場合は、一番左の項目の[日本語平均]をご覧ください。この項目は各ベンチマークの平均値になります。

7Bのパラメータサイズにおいて、Swallow 7Bは Japanese Stable SM Gamma 7Bを除く他のモデルを上回る性能を示しています。

Swallow 7BはJapanese Stable SM Gamma 7Bをを下回りましたが、これはベースとなるMistral 7Bの性能が高いためです。


swallow


13Bや70Bのパラメータサイズの比較では、Swallowが最高性能を達成しました。

特に13Bのモデルにおいてフルスクラッチで学習した他のモデルとの性能差が顕著に表れています

swallow


swallow

参考:https://tokyotech-llm.github.io/swallow-llama


Swallowの商用利用・ライセンス

SwallowのライセンスはLlama 2のLLAMA 2 Community Licenseを継承しています。

このライセンスに従う限りにおいては、研究および商業目的での利用が可能です。


LLAMA2 Community Licenseの詳細は以下のページをご覧ください。


  Llama 2 Community License Agreement - Meta AI https://ai.meta.com/llama/license/


Swallowの使い方

ここからSwallowのモデルを使った日本語のテキスト生成(推論)を解説します。

この記事ではGPUクラウドサービス(GPUSOROBAN)の実行環境を使用しました。

  • インスタンス名:t80-1-a-exlarge-ubs22-i
  • GPU:NVIDIA A100 80GB x 1
  • OS :Ubuntu 22.04
  • CUDA:11.7
  • Jupyter Labプリインストール


GPUSOROBANはメガクラウドの50%以上安いGPUクラウドサービスです。

GPUSOROBANの使い方は以下の記事で解説しています。


  会員登録~インスタンス接続手順 | GPUSOROBAN GPUSOROBANの会員登録からインスタンス作成・接続までの手順を詳しく解説する記事です。会員登録、電話番号認証、SSHキー作成、インスタンスの作成、キーの設置、ターミナルからのインスタンス接続までの流れを説明しています。 業界最安級GPUクラウド | GPUSOROBAN


Jupyter Labを起動

GPUSOROBANのインスタンスに接続したら、次のコマンドを実行し、Jupyter Labを起動します。

jupyter lab --ip='*' --port=8888 --NotebookApp.token='' --NotebookApp.password='' --no-browser

swallow


ブラウザの検索窓に"localhost:8888"を入力すると、Jupyter Labをブラウザで表示できます。

localhost:8888


Jupyter Labのホーム画面で[Python3 ipykernel]を選択し、Notebookを開きます。swallow


Jupyter Labの詳しい使い方は、以下の記事で解説しています。


プリインストールされたJupyter Labを使用する場合


  プリインストールの利用方法(Docker、PyTorch、TensorFlow、JupyterLab)| GPUSOROBAN GPUSOROBAN高速コンピューティングのプリインストールの利用方法を説明しています。PyTorchやTensosrFlow、JupyterLabがプリインストールされたインスタンスを使うことで環境構築にかかる時間を削減できます。 業界最安級GPUクラウド | GPUSOROBAN


Jupyter Labを新しくインストールして使う場合


  Jupyter Labのインストール(Ubuntu)| GPUSOROBAN GPUSOROBANのUbuntuインスタンスにJupyter Labをインストールする方法を紹介しています。高性能なGPUインスタンスを利用したクラウドサービスGPUSOROBANでJupyter Labを動作させることが可能です。 業界最安級GPUクラウド | GPUSOROBAN


ライブラリのインストール

JupyterLabのNotebookのコードセルで次のコマンドを実行し、PyTorchをインストールします。

pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118


次のコマンドを実行し、必要なパッケージをインストールします。

pip install transformers==4.33.2 sentencepiece==0.2.0 accelerate==0.29.3 bitsandbytes==0.43.1 protobuf==5.26.1


必要なライブラリをインポートします。

import torch
from torch import cuda,bfloat16
from transformers import AutoTokenizer,AutoModelForCausalLM
import transformers


モデルの設定

HuggingFaceのtransformersというライブラリを使用してモデルの準備をします。

model_id = "tokyotech-llm/Swallow-13b-instruct-hf"


この記事ではパラメータサイズ13bのinstructモデル(Swallow-13b-instruct-hf)を指定していますが、他のモデルを使いたい場合は表を参考に適宜model_idを変更してください。


model_id
パラメータサイズ
タイプ

GPUメモリ(VRAM)使用量 
ストレージ使用
使用したGPU
tokyotech-llm/Swallow-7b-hf
70億
base model
14.8GB
14GB

NVIDIA A100 40GB x 


tokyotech-llm/Swallow-7b-instruct-hf
70億

instruct model
14.8GB
14GB

NVIDIA A100 40GB x 1

tokyotech-llm/Swallow-13b-hf
130億
base model
27.4GB
26GB
NVIDIA A100 40GB x 1
tokyotech-llm/Swallow-13b-instruct-hf
130億
instruct
model
27.4GB
26GB
NVIDIA A100 40GB x 1
tokyotech-llm/Swallow-70b-hf
700億
base model

35.4GB

(※4bit量子化あり

130GB
NVIDIA A100 80GB x 1
tokyotech-llm/Swallow-70b-instruct-hf
700億
instruct model
35.4GB

(※4bit量子化あり)

132GB
NVIDIA A100 80GB x 1

※Swallow 70bをNVIDIA A100 80GB x1枚で動かす場合は、GPUメモリ(VRAM)が不足しますので、精度を落としてモデルを軽量化する量子化を適用しています。


HuggingFaceにアクセスするためのトークンを設定します。

token = 'hf_****************************'


HuggignFaceでのアクセストークンの発行方法は以下の記事で解説しています。


  HuggingFaceでアクセストークンを作成する方法 この記事では、HuggingFaceでアクセストークンを作成する方法について解説しています。 業界最安級GPUクラウド | GPUSOROBAN


モデルの量子化

量子化は、モデルのパラメータや活性化関数などを低bitに変換する技術で、精度を落とす代わりにモデルサイズを軽量化することができます。

モデルのパラメータを4bitでロードするように設定し、4bitの計算に使用されるデータ型をBFloat16に設定しています。

※Swallow 70bをNVIDIA A100 80GB x1枚で動かす場合は、GPUメモリ(VRAM)が不足しますので、精度を落としてモデルを軽量化する量子化を実行します。

※Swallow 7b, 13bの場合は、NVIDIA A100 40GB x 1枚でGPUメモリ(VRAM)が足りますので、ここのコマンドはスキップしてください。

quant_config = transformers.BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type='nf4',
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=bfloat16
)


モデルを読み込みます。初回はモデルをダウンロードするため時間がかかりますが、2回目以降はモデルの読み込みだけになりますので、時間はかかりません。

※量子化を使用する場合は、#quantization_config=quant_config,のコメントアウトを外して実行してください。

model = transformers.AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    token=token,
    #quantization_config=quant_config,
    torch_dtype=torch.bfloat16,
    low_cpu_mem_usage=True,
    device_map="auto",
)


トークナイザーを読み込みます。

tokenizer = AutoTokenizer.from_pretrained(
    model_id,
    token=token
)


プロンプトの基本設定をします。

PROMPT_DICT = {
    "prompt_input": (
        "以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。"
        "リクエストを適切に完了するための回答を記述してください。\n\n"
        "### 指示:\n{instruction}\n\n### 入力:\n{input}\n\n### 応答:"

    ),
    "prompt_no_input": (
        "以下に、あるタスクを説明する指示があります。"
        "リクエストを適切に完了するための回答を記述してください。\n\n"
        "### 指示:\n{instruction}\n\n### 応答:"
    ),
}

def create_prompt(instruction, input=None):
    """
    Generates a prompt based on the given instruction and an optional input.
    If input is provided, it uses the 'prompt_input' template from PROMPT_DICT.
    If no input is provided, it uses the 'prompt_no_input' template.

    Args:
        instruction (str): The instruction describing the task.
        input (str, optional): Additional input providing context for the task. Default is None.

    Returns:
        str: The generated prompt.
    """
    if input:
        # Use the 'prompt_input' template when additional input is provided
        return PROMPT_DICT["prompt_input"].format(instruction=instruction, input=input)
    else:
        # Use the 'prompt_no_input' template when no additional input is provided
        return PROMPT_DICT["prompt_no_input"].format(instruction=instruction)


プロンプトの実行1

富士山の特徴について質問してみます。

instruction_example = "以下のトピックに関する詳細な情報を提供してください。"
input_example = "富士山の特徴について教えてください"
prompt = create_prompt(instruction_example, input_example)

input_ids = tokenizer.encode(
    prompt,
    add_special_tokens=False,
    return_tensors="pt"
)

tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=128,
    temperature=0.99,
    top_p=0.95,
    do_sample=True,
)

out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)


以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。リクエストを適切に完了するための回答を記述してください。

### 指示:
以下のトピックに関する詳細な情報を提供してください。

### 入力:
富士山の特徴について教えてください

### 応答:富士山は日本で最も高い山です。標高3,776mです。富士山は成層火山で、その外観は美しい円錐型をしています。富士山には、現在は活動していない休火山である山頂のカルデラが特徴的で、いくつかの池や湖があります。また、富士山には、富士急行が登山者のために運営する五合目までの道や、富士宮口、須走口、御殿場口、吉田口という4つの登山道があります。


プロンプトの実行2

神奈川の観光スポットについて質問してみます。

instruction_example = "以下のトピックに関する詳細な情報を提供してください。"
input_example = "神奈川の観光スポットを教えて下さい。"
prompt = create_prompt(instruction_example, input_example)

input_ids = tokenizer.encode(
    prompt,
    add_special_tokens=False,
    return_tensors="pt"
)

tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=128,
    temperature=0.99,
    top_p=0.95,
    do_sample=True,
)

out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)


以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。リクエストを適切に完了するための回答を記述してください。

### 指示:
以下のトピックに関する詳細な情報を提供してください。

### 入力:
神奈川の観光スポットを教えて下さい。

### 応答:神奈川県は海と山に囲まれ、自然と都市のバランスが取れた美しい場所です。横浜中華街、大さん橋、鎌倉大仏、湘南江ノ島、江ノ島水族館、箱根温泉、川崎工場夜景などが代表的なスポットです。横浜中華街は日本三大中華街の一つで、中華料理店が立ち並ぶ食の街です。大さん橋は横浜港に浮かぶ巨大な客船ターミナルで、開放的なデッキからは大海原を一望できます。鎌倉大仏は高徳院にある大きな青銅の

※途中で文章が終わっていますが、max_new_tokens=128の値を増やすことで出力する文章を長くすることができます。


プロンプトの実行3

北海道のご当地グルメについて質問してみます。

instruction_example = "以下のトピックに関する詳細な情報を提供してください。"
input_example = "北海道のご当地グルメを教えて下さい"
prompt = create_prompt(instruction_example, input_example)

input_ids = tokenizer.encode(
    prompt,
    add_special_tokens=False,
    return_tensors="pt"
)

tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=128,
    temperature=0.99,
    top_p=0.95,
    do_sample=True,
)

out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)


以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。リクエストを適切に完了するための回答を記述してください。

### 指示:
以下のトピックに関する詳細な情報を提供してください。

### 入力:
北海道のご当地グルメを教えて下さい

### 応答:
北海道のご当地グルメとしては、「札幌ラーメン」「ジンギスカン」「石狩鍋」「北海道ザンギ」などが知られています。また、「カニ料理」「イクラ料理」などの海産物も豊富であり、季節によっては新鮮でおいしい魚介類を楽しむことができます。


LLMならGPUクラウド

LLMを使用する際には、モデルサイズやタスクに応じて必要なスペックが異なります。

LLMで使用されるGPUは高価なため、買い切りのオンプレミスよりも、コストパフォーマンスが高く柔軟な使い方ができるGPUクラウドをおすすめしています。


GPUクラウドのメリットは以下の通りです。

  • 必要なときだけ利用して、コストを最小限に抑えられる
  • タスクに応じてGPUサーバーを変更できる
  • 需要に応じてGPUサーバーを増減できる
  • 簡単に環境構築ができ、すぐに開発をスタートできる
  • 新しいGPUを利用できるため、陳腐化による買い替えが不要
  • GPUサーバーの高電力・熱管理が不要


コスパをお求めなら、メガクラウドと比較して50%以上安いGPUクラウドサービス「GPUSOROBAN 高速コンピューティング」がおすすめです。


  生成AIに最適なGPUクラウド「高速コンピューティング」|GPUSOROBAN GPUSOROBANの高速コンピューティングは、NVIDIAの高速GPUが業界最安級で使えるクラウドサービスです。NVIDIA A100を始めする高速GPUにより、画像生成AI、画像認識、機械学習を高速化します。 業界最安級GPUクラウド | GPUSOROBAN


大規模なLLMを計算する場合は、NVIDIA H100のクラスタが使える「GPUSOROBAN AIスパコンクラウド」がおすすめです。


  LLMに最適なH100が業界最安級「AIスパコンクラウド」| GPUSOROBAN AIスパコンクラウドはNVIDIA H100を搭載したGPUインスタンスが業界最安級で使えるクラウドサービスです。HGX H100(H100 x8枚)を複数連結したクラスタ構成により、LLMやマルチモーダルAIの計算時間を短縮します。料金はAWSのH100インスタンスと比較して75%安く設定しており、大幅なコストダウンが可能です。 業界最安級GPUクラウド | GPUSOROBAN


まとめ

Swallowは、東工大と産総研の研究チームによって開発されたLlama2ベースの日本語LLMです。

日本語の文法や表現のニュアンスを理解し、高度な言語処理タスクに対処することができるようになっています。

ベースモデルのLlama2の使い方は、以下の記事で解説していますので、あわせてご覧ください。


  Llama2とは?使い方・日本語性能・商用利用について解説 | 初心者ガイド この記事では、Llama2について幅広く解説しています。Llama2の性能や安全性、商用利用、日本語対応、様々な環境での使い方などに触れています。 業界最安級GPUクラウド | GPUSOROBAN




MORE INFORMATION

GPUでお困りの方はGPUSOROBANで解決!
お気軽にご相談ください

10日間無料トライアル
詳しい資料はこちら
質問・相談はこちら