【動画で解説】現代の魔法:Swallow LLMの使い方 – Llama2の日本語能力強化版の大規模言語モデル
【現代の魔法】Swallowの使い方 – Swallow LLM Tutorial for AI Beginners
視聴時間:10分26秒
文字情報だけでは、わかりにくい場合などにチュートリアル動画をご活用いただけますと幸いです。
【動画の内容:Swallowチュートリアル】
0:00 はじめに
1:33 Google Colaboratoryの使い方
2:27 事前準備
5:38 【Swallowの実行】(基本モデル版)
7:41 【Swallowの実行】(指示モデル版)
9:06 おわりに
Swallowの使い方が分からない…
:日本語能力を強化した大規模言語モデル
2023年12月19日には、Meta社の最新の大規模言語モデル(Large Language Model:LLM)であるLlama2(ラマツー:2023年7月に発表)から日本語継続事前学習を行い、日本語能力を強化した大規模言語モデル (7B, 13B, 70B)
・Swallow
のモデルのパラメータ(重み)が公開されました。
*7B:70億パラメータ
*13B:130億パラメータ
*70B:700億パラメータ
今回は、SwallowをGoogle Colaboratoryで動かすためのチュートリアルコードを公開しました。
Swallowの使い方が分からない、日本人のAI初学者の方が、Swallowiを触り始めるきっかけになることありましたら幸いです。
Swallowのモデルは、
・東京工業大学情報理工学院の岡崎研究室/横田研究室
・国立研究開発法人産業技術総合研究所
の研究チームで開発された大規模言語モデルのようです。
以下のSwallowのサイト
:Swallow TokyoTech-LLM(LLAMA 2 Community License) | GitHub
によると
研究チームで実施した性能評価では、2023年12月現在オープンな大規模言語モデルの中で、日本語に関して最高性能を達成
注:パラメータ数「13B」「70B」である他のモデルと比較し、Swallowが最高性能を達成
とのことでした。
また、以下の東京工業大学の東工大ニュース
:日本語に強い大規模言語モデル「Swallow」を公開 – 英語が得意な大規模言語モデルに日本語を教える:2023年12月19日 – 東工大ニュース | 東京工業大学
によると、Llama2は英語重視のモデルのため、トークナイザに、16,000件の日本語のトークンを追加することにより
・日本語テキストのトークン長をLlama2に比べて50%以上(56.2%)削減
できたようです。
また、今後、追加情報も準備が整い次第、随時公開予定とのことです。
今後の情報も楽しみですね!
長期的には、
・日本語版の大規模言語モデルの業界標準となるか?
・日本語の大規模言語モデルの研究に火をつけるのか?
要注目です。
それでは、Swallowを試してみましょう。
チュートリアルコードリンク・プログラムのライセンス
Swallowを日本人の方が気軽に試せるように、使い方の解説などを入れたサンプルコードを公開しました。
Swallowの動かし方が分からない日本人のAI初学者の方の参考になることがありましたら幸いです。
Google Colaboratoryのチュートリアルコードへのリンク:
Swallow-for-Japanese-AI-Beginners.ipynb(LLAMA 2 Community License)| Google Colaboratory
尚、今回のプログラムは、以下のHugging FaceのSwallowのページ
tokyotech-llm/Swallow-70b-instruct-hf(LLAMA 2 Community License)| Hugging Face
のコードの情報を参考に、一部コードを修正して作成しました。
チュートリアルコード「Swallow-for-Japanese-AI-Beginners.ipynb」のライセンス:
LLAMA 2 Community License
©︎ 2023 child programmer
Llama 2 is licensed under the LLAMA 2 Community License, Copyright © Meta Platforms, Inc. All Rights Reserved.
Swallowの使い方
– 最終更新:2023年12月22日
今回のプログラムは、GPUを設定して使っていきます
:上部メニュー「ランタイム – ランタイムのタイプを変更 – T4 GPU」
事前準備①:パッケージのインストール
実行コード
!pip install transformers sentencepiece accelerate bitsandbytes
# 各種バージョンの確認
print('(実行時点のバージョンです)') #2023年12月19日実行時点
import platform
print('python ' + platform.python_version())
import torch
print('PyTprch' + torch.__version__)
import transformers
print('transformers ' + transformers.__version__)
import sentencepiece
print('sentencepiece ' + sentencepiece.__version__)
import accelerate
print('accelerate ' + accelerate.__version__)
出力例
・・・・・
(実行時点のバージョンです)
python 3.10.12
PyTprch2.1.0+cu121
transformers 4.35.2
sentencepiece 0.1.99
accelerate 0.25.0
事前準備②:事前準備②:トークナイザー・モデルの準備
モデル「tokyotech-llm/Swallow-7b-instruct-hf」のダウンロードに10GB以上必要のため、ディスク容量が少ない方は注意してください。
また、「Swallow-70b-instruct-hf」を使いたい場合には、
model_name = “tokyotech-llm/Swallow-70b-instruct-hf”
に変更します。
ただ、モデルのダウンロードに50GB以上必要のためディスク容量に余裕のある方は検討してみてください。
*「Swallow-13b-instruct-hf」の場合には20GB以上でした。
*注:2023年12月19日実行時点では「Swallow-13b-instruct-hf」「Swallow-70b-instruct-hf」の場合には、
WARNING:root:Some parameters are on the meta device device because they were offloaded to the cpu and disk.
という出力も表示され、その後の手順を実行できませんでした。
【追記:2023年12月22日】
ローカル環境でクラウドGPUを活用して「Swallow-70b-instruct」を動かした方の情報によると、推論時に「46GB台」のGPUメモリを消費するようでした。
また、「Swallow-13b」を「24GB」のGPUメモリ搭載パソコンでの実行を確認されたとのことでした。
もしかしたら、「Swallow-13b」はGoogle Colaboratory無料枠(T4 GPUメモリ 15GB)では動かせないのかもしれませんね…
実行コード
%%time
# @title 実行コード
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# @markdown 初期設定は「tokyotech-llm/Swallow-7b-instruct-hf」にしています。
model_name = "tokyotech-llm/Swallow-7b-instruct-hf" # @param {type:"string"}
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto",
trust_remote_code=True
)
出力例
tokenizer_config.json: 100%
tokenizer.model: 100%
special_tokens_map.json: 100%
config.json: 100%
model.safetensors.index.json: 100%
Downloading shards: 100%
model-00001-of-00003.safetensors: 100% 4.94G/4.94G
model-00002-of-00003.safetensors: 100% 4.95G/4.95G
model-00003-of-00003.safetensors: 100% 3.77G/3.77G
Loading checkpoint shards: 100%
generation_config.json: 100%
CPU times: user 23.9 s, sys: 30.5 s, total: 54.4 s
Wall time: 2min 56s
【Swallowの実行】(基本モデル版)
「事前準備①」「事前準備②」を実行後に使えるようになります。
日本語継続事前学習済みモデル(base)を使ってみましょう。
注:出力結果が途中で止まる場合には、「tokens_number1:」のトークン数を増やしてみてください。(半角英数で数値を入力)
「prompt」(プロンプト)
を入力後に以下のコードを実行します。
実行コード
%%time
# @title 実行コード
# プロンプトの入力
# @markdown 手順例:以下のプロンプトに、文章の書き出しを入力後に、コードを実行します。
prompt = "\u5927\u898F\u6A21\u8A00\u8A9E\u30E2\u30C7\u30EB\u306E\u30C8\u30D4\u30C3\u30AF\u30B9\u306F\u3001" # @param {type:"string"}
# 推論
input_ids = tokenizer.encode(
prompt,
add_special_tokens=False,
return_tensors="pt"
)
# @markdown 出力結果が途中で止まる場合には、ここのトークン数を増やしてみてください。(半角英数で数値を入力)
tokens_number1 = 128 # @param {type:"integer"}
tokens = model.generate(
input_ids.to(device=model.device),
max_new_tokens=tokens_number1,
temperature=0.99,
top_p=0.95,
do_sample=True,
)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)
出力例①
東京工業大学とは、日本の私立大学である。先の2校に比べると非常に規模が小さく、東京都目黒区大岡山に所在する大学の本部キャンパス以外に東京都品川区(大崎地区)にも学生が通うキャンパスがある。大学全体としては3学部8学科を設置している。大学の略称は東工大、工大(こうだい)。2016年4月1日に国立大学法人東京工業大学は学校法人東京工業大学と法人統合し、国立大学法人東京工業大学が設置する大学という位置付けとなった
*プロンプト「prompt:”東京工業大学とは」の例
出力例③
大規模言語モデルのトピックスは、ChatGPTを中心にしたOpenai社の躍進です。2023年3月にシリーズFラウンドで100億ドルの評価を受け、現在の企業価値は130億ドルに達します。これでGoogle、Metaに次ぐIT大手企業とされました。
このラウンドでは、アメリカ政府系ベンチャーファンドやJPモルガンやシティバンク、三井住友銀行などの金融機関が出資しました。出資額は明らかにされていません。
Openai社は以前は非公開企業で、投資家たち
*プロンプト「prompt:”大規模言語モデルのトピックスは、」「tokens_number1:128」の例
出力例③
大規模言語モデルのトピックスは、AI研究の主流になっています。最近、AIの領域では ChatGPT が脚光を浴びています。AIの領域に携わるものにとって、ChatGPT は興味の尽きないトピックです。
ChatGPT は、2022年11月にOpenai社から発表されました。自然言語処理に基づく対話型モデルです。言語を生成する能力は ChatGPT の能力の一つにすぎません。例えば ChatGPT は質問に対して、画像を生成することもできます。そして、ChatGPT は、Openaiのサイトで無料で利用可能です。
ChatGPT は、チャットアプリケーションとして開発され、ユーザーが書いたテキストを理解し、応答する能力を備えています。対話の応答は、ユーザーに関する事前知識や文脈を考慮しながら、人間のような自然な応答を生成するように設計されています。
ChatGPT は大規模言語モデル (LLM) の一つであり、大規模言語モデルの概念は、人間と同等またはそれ以上の能力を持つAIの開発に関する最近の進歩の中で脚光を浴びている。ChatGPT は、「ニューラル」ネットワークを使用して、大量のテキストデータを
*プロンプト「prompt:”大規模言語モデルのトピックスは、」「tokens_number1:300」の例
【Swallowの実行】(指示モデル版)
「事前準備①」「事前準備②」を実行後に使えるようになります。
上記の日本語継続事前学習済みモデル(base)に指示チューニング施工したモデル(instruct)を使ってみましょう。
注:出力結果が途中で止まる場合には、「tokens_number2:」のトークン数を増やしてみてください。(半角英数で数値を入力)
「prompt」(プロンプト)
を入力後に以下のコードを実行します。
実行コード
%%time
# @title 実行コード
PROMPT_DICT = {
"prompt_input": (
"以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。"
"リクエストを適切に完了するための回答を記述してください。\n\n"
"### 人間の指示:\n{instruction}\n\n### 人間の入力:\n{input}\n\n### AIの応答:\n"
),
"prompt_no_input": (
"以下に、あるタスクを説明する指示があります。"
"リクエストを適切に完了するための回答を記述してください。\n\n"
"### 人間の指示:\n{instruction}\n\n### AIの応答:\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
# 追加入力がある場合は、「prompt_input」テンプレートを使用する
return PROMPT_DICT["prompt_input"].format(instruction=instruction, input=input)
else:
# Use the 'prompt_no_input' template when no additional input is provided
# 追加入力がない場合は、「prompt_no_input」テンプレートを使用する
return PROMPT_DICT["prompt_no_input"].format(instruction=instruction)
# プロンプトの入力
# @markdown 手順①:以下のプロンプトに指示内容(課題の説明)を入力します。
instruction_prompt = "以下のトピックに関する詳細な情報を提供してください。" # @param {type:"string"}
# @markdown 手順②:以下のプロンプトに入力内容(質問)を入力します。
input_prompt = "\u5927\u898F\u6A21\u8A00\u8A9E\u30E2\u30C7\u30EB\u306B\u3064\u3044\u3066\u6559\u3048\u3066\u304F\u3060\u3055\u3044\u3002" # @param {type:"string"}
prompt = create_prompt(instruction_prompt, input_prompt)
# 推論
input_ids = tokenizer.encode(
prompt,
add_special_tokens=False,
return_tensors="pt"
)
# @markdown 出力結果が途中で止まる場合には、ここのトークン数を増やしてみてください。(半角英数で数値を入力)
tokens_number2 = 128 # @param {type:"integer"}
tokens = model.generate(
input_ids.to(device=model.device),
max_new_tokens=tokens_number2,
temperature=0.99,
top_p=0.95,
do_sample=True,
)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)
出力例①
以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。リクエストを適切に完了するための回答を記述してください。
### 人間の指示:
以下のトピックに関する詳細な情報を提供してください。
### 人間の入力:
東京工業大学について教えてください。
### AIの応答:
東京工業大学(Tokyo Institute of Technology、東工大、JST)は、科学およびテクノロジーの研究に焦点を当てた大学です。東工大は、1881年に東京帝国大学の機械工学校として設立されました。その後、帝国大学の東京工科大学への拡大、日本の敗北に続いて日本が占領されたときの東京大学の分裂、1949年の東工大学の再建という形で成長してきました。東工大の研究は国際的に認められ
CPU times: user 8.1 s, sys: 182 ms, total: 8.29 s
Wall time: 9.88 s
*指示内容(課題の説明)のプロンプト「instruction_prompt:”以下のトピックに関する詳細な情報を提供してください。」の例
*入力内容(質問)プロンプト「input_prompt”東京工業大学について教えてください。」の例
*トークン数「max_new_tokens=128」のため、出力が途中で止まっています
出力例②
以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。リクエストを適切に完了するための回答を記述してください。
### 人間の指示:
以下のトピックに関する詳細な情報を提供してください。
### 人間の入力:
大規模言語モデルについて教えてください。
### AIの応答:
大規模言語モデル(LLM)は、大量のデータを使用して、言語のテキストを生成および理解するように訓練されたコンピューターシステムです。これらのシステムには、自然言語の処理の機能が含まれます。言語のコンテキストを理解し、単語やフレーズを生成し、人間の質問に答え、文を生成し、テキストを翻訳するようにプログラムできます。
LLMは、NLPの研究者、データ科学者、コンピューター科学者によって開発され、トレーニングデータセットからのデータを使用して訓練されてい
*指示内容(課題の説明)のプロンプト「instruction_prompt:”以下のトピックに関する詳細な情報を提供してください。」の例
*入力内容(質問)プロンプト「input_prompt”大規模言語モデルについて教えてください。」「tokens_number2:128」の例
出力例③
以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。リクエストを適切に完了するための回答を記述してください。
### 人間の指示:
以下のトピックに関する詳細な情報を提供してください。
### 人間の入力:
大規模言語モデルについて教えてください。
### AIの応答:
大規模言語モデルとは、自然言語処理のさまざまなタスクに関する大規模なテキストデータを学習するニューラルネットワークモデルである。最も一般的なモデルとしては、翻訳、質問応答、テキスト分類などに使われている。
大規模言語モデルの種類
大規模な言語モデルは、特定のタスクに特化したファインチューニングされたモデルであり、また、特定のタスクに一般的に使用される事前にトレーニングされたモデルでもあります。ファインチューニングされたモデルには、BERT、ELMO、GPT-2、XLNetが含まれる。これらのモデルは、特定のタスクに特化して設計されているが、それ以外の用途でも広く使用されている。事前にトレーニングされたモデルには、ELMO、GPT-2、BERT、XLNetがある。事前にトレーニングされたモデルは、特定のタスクを解決するために設計されている。
*指示内容(課題の説明)のプロンプト「instruction_prompt:”以下のトピックに関する詳細な情報を提供してください。」の例
*入力内容(質問)プロンプト「input_prompt”大規模言語モデルについて教えてください。」「tokens_number2:300」の例
おわりに
このチュートリアル記事を初回投稿時点(2023年12月20日)では、
・7B(70億パラメータ)
のモデルを試すことができました。
開発者による調査結果によるとパラメータ数が7Bである他のモデルとの日本語評価のベンチマーク比較では、Swallow 7Bはフルスクラッチで学習されたモデルやLlama2ベースの他モデルのベンチマーク性能を上回る結果のようでした。
Japanese Stable LM Gamma 7B(Mistral 7B v0.1からの継続事前学習)のベンチマーク結果を下回ったようですが、理由として、ベースとしているMistral 7B v0.1の性能が高いことを挙げています。今後、Mistral v0.1をベースにした継続事前学習にも取り組むことも考えているようですので、近い未来に
・7B(70億パラメータ)
・13B(130億パラメータ)
・70B(700億パラメータ)
の日本語評価のベンチマーク結果が最高性能となる日が楽しみですね。
13BがGoogle Colaboratory上で使えるかどうかは、現時点(2023年12月20日)ではわかりませんが、しばらく経過を見ていきたいと思います。
ただ、試した範囲では、7Bのモデルであれば、モデルのダウンロードの容量も比較的少ないので、自分のインターネット環境では、2〜3分ほどでモデルをダウンロードできるため気軽にプログラムを実行しやすいのではないかと思います。
推論を実行時には、GPUメモリを13GBほど消費しているようでしたので、スペックの低いパソコンを使用している自分の場合はGoogle Colaboratoryに頼らざるおえない状況です。
Google Colaboratoryで機械学習プログラムを実行している立場からは、今後パラメータ数が少ないモデルでも性能が上がってくることを期待しています。
(予定)Swallowの解説動画へのコメントと対応例など
今後動画にコメントなどあるようでしたら、こちらにもコメントの概略と対応例などに関してまとめていきたいと思います。
次のステップ
「tokyotech-llm/Swallow-7b-instruct-hf」を自作のカスタムデータセットまたはHugging Faceの公開データセットでファインチューニングし、ローカル環境で使ってみましょう!
:【QLoRA編】日本語LLMのファインチューニング & 低スペックのローカル環境のアプリで動かす
2023年12月に公開されたGoogle DeepMind社による高性能AIモデルであるGemini Pro/Pro Visionを気軽に使えるようにするためのチュートリアルコード
:日本人のためのGemini Pro・Gemini Pro Visionの使い方:マルチモーダル型生成AIモデル
チャットAIを始める、使い続ける中でありがたい拡張機能
:【使い方】ChatHub入門 – チャットAIをはじめよう
オープンソースの大規模言語モデルのファインチューニングに挑戦
:日本語LLMのファインチューニング入門 – 自作・Hugging Face公開データセット対応