Japanese StableLM : Google Colab で始めましょう

Japanese StableLM Google Colab で始めましょう (ブログ)

作成 : Masashi Okumura (@ClassCat)
作成日時 : 08/11/2023

* サンプルコードの動作確認はしておりますが、動作環境の違いやアップグレード等によりコードの修正が必要となるケースはあるかもしれません。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Website: www.classcat.com  ;   ClassCatJP

 

Japanese StableLM : Google Colab で始めましょう

8月10日に Stability AI 社から日本語に特化された LLM (大規模言語モデル) Japanese-StableLM-Base-Alpha-7B 及び Japanese-StableLM-Instruct-Alpha-7B が HuggingFace モデルで公開されましたので、さっそく試してみましょう。

動作環境としては Google Colab を使用します。T4 でも動作しますが、モデルをロードするためにハイメモリの設定が必要であることに注意してください。

 

ベースモデル

最初にベースモデル Japanese-StableLM-Base-Alpha-7B をモデルカードのサンプルに従って試しましょう。

モデルカードの説明によれば、japanese-stablelm-base-alpha-7b は日本語と英語データセットの多様なコレクションで事前訓練された 70 億のパラメータを持つデコーダ only の言語モデルで、日本語言語モデリングと日本語下流タスクのパフォーマンスを最大化することに焦点を当てています。

その他の情報として :

仕様

  • モデルタイプ: japanese-stablelm-base-alpha-7b model は NeoX transformer アーキテクチャに基づいた自己回帰言語モデルです。
  • 言語: 日本語
  • ライブラリ: GPT-NeoX
  • ライセンス: This model is licensed under Apache License, Version 2.0.

※参考: HuggingFace GPT-NeoX

 
訓練

パラメータ 隠れサイズ ヘッド

シークエンス長
7B (70 億) 4096 32 32 2048

 
訓練データセット

japanese-stablelm-base-alpha-7b は以下のコーパスのミックスからおよそ 750B (7,500 億) トークン上で事前訓練されています :

 

準備

まずは必要なライブラリのインストールを行ないます。transformers に加えて requirements.txt に記載されているライブラリも併せてインストールします :

!pip install -U transformers
!pip install -U sentencepiece einops

ログインしておきます :

from huggingface_hub import notebook_login

notebook_login()

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

import torch
from transformers import LlamaTokenizer, AutoModelForCausalLM

 

トークナイザー

トークナイザーとしては LlamaTokenizer クラスを使用します :

tokenizer = LlamaTokenizer.from_pretrained("novelai/nerdstash-tokenizer-v1", additional_special_tokens=['▁▁'])

 

モデル

モデルのダウンロード, ロードには 5 分ほどかかります :

model = AutoModelForCausalLM.from_pretrained(
    "stabilityai/japanese-stablelm-base-alpha-7b",
    trust_remote_code=True,
)

model.half()
model.eval()

if torch.cuda.is_available():
    model = model.to("cuda")

 

推論

prompt = """
AI で科学研究を加速するには、
""".strip()

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

# this is for reproducibility.
# feel free to change to get different result
seed = 23  
torch.manual_seed(seed)

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

out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)
AI で科学研究を加速するには、データ駆動型文化が必要であることも明らかになってきています。研究のあらゆる側面で、データがより重要になっているのです。
20 世紀の科学は、研究者が直接研究を行うことで、研究データを活用してきました。その後、多くの科学分野ではデータは手動で分析されるようになったものの、これらの方法には多大なコストと労力がかかることが分かりました。 そこで、多くの研究者や研究者グループは、より効率的な手法を開発し、研究の規模を拡大してきました。21 世紀になると、研究者が手動で実施する必要のある研究は、その大部分を研究者が自動化できるようになりました。

 

インストラクション・モデル

次にインストラクション・モデル Japanese-StableLM-Instruct-Alpha-7B をモデルカードのサンプルに従って試しましょう。

モデルカードの説明によれば、japanese-stablelm-instruct-alpha-7b は Japanese-StableLM-Base-Alpha-7B model の上に構築されたデコーダ only の事前訓練済み言語モデルで、更に様々な instruction-following データセット上で微調整されています。

その他の情報として :

仕様

  • モデルタイプ: japanese-stablelm-instruct-alpha-7b model は NeoX transformer アーキテクチャに基づいた自己回帰言語モデルです。
  • 言語: 日本語
  • ライブラリ: GPT-NeoX
  • ライセンス: This model is licensed under JAPANESE STABLELM RESEARCH LICENSE AGREEMENT.

※参考: HuggingFace GPT-NeoX

 
訓練

パラメータ 隠れサイズ ヘッド

シークエンス長
7B (70 億) 4096 32 32 1024

 
訓練データセット

japanese-stablelm-instruct-alpha-7b は以下のデータセットの組み合わせで微調整されています :

 

準備

まずは必要なライブラリのインストールを行ないます。transformers に加えて requirements.txt に記載されているライブラリも併せてインストールします :

!pip install -U transformers
!pip install -U sentencepiece einops

ログインしておきます :

from huggingface_hub import notebook_login

notebook_login()

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

import torch
from transformers import LlamaTokenizer, AutoModelForCausalLM

 

トークナイザー

トークナイザーとしては LlamaTokenizer クラスを使用します :

tokenizer = LlamaTokenizer.from_pretrained("novelai/nerdstash-tokenizer-v1", additional_special_tokens=['▁▁'])

 

モデル

モデルのダウンロード, ロードには 5 分ほどかかります :

model = AutoModelForCausalLM.from_pretrained(
    "stabilityai/japanese-stablelm-instruct-alpha-7b",    
    trust_remote_code=True,
)
model.half()
model.eval()

if torch.cuda.is_available():
    model = model.to("cuda")

 

推論

プロンプトを構築するための build_prompt 関数を定義しておきます :

def build_prompt(user_query, inputs="", sep="\n\n### "):
    sys_msg = "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。"
    p = sys_msg
    roles = ["指示", "応答"]
    msgs = [": \n" + user_query, ": "]
    if inputs:
        roles.insert(1, "入力")
        msgs.insert(1, ": \n" + inputs)
    for role, msg in zip(roles, msgs):
        p += sep + role + msg
    return p

“user_query” を “VR とはどのようなものですか?” としてモデルに推論させます :

# this is for reproducibility.
# feel free to change to get different result
seed = 42
torch.manual_seed(seed)

# Infer with prompt without any additional input
user_inputs = {
    "user_query": "VR とはどのようなものですか?",
    "inputs": ""
}
prompt = build_prompt(**user_inputs)

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

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

out = tokenizer.decode(tokens[0][input_ids.shape[1]:], skip_special_tokens=True).strip()
print(out)
バーチャルリアリティは、現実の世界のように見える仮想世界の 3D 仮想現実のシミュレーションです。これは、ヘッドセットを介して、ユーザーが見たり、聞いたり、体験できるものです。

もう少し複雑なプロンプト “user_query”: “VR について、以下の比較対象との違いを箇条書きで教えてください。”, “inputs”: “比較対象: AR” で試してみましょう :

seed = 42
torch.manual_seed(seed)

# Infer with prompt with additional input
user_inputs = {
    "user_query": "VR について、以下の比較対象との違いを箇条書きで教えてください。",
    "inputs": "比較対象: AR"
}
prompt = build_prompt(**user_inputs)

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

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

out = tokenizer.decode(tokens[0][input_ids.shape[1]:], skip_special_tokens=True).strip()
print(out)
以下は、VR と AR の比較対象の比較です。
1. VR はユーザーが3D の世界を体験することを可能にし、ユーザーが自分の目で世界を見ることを可能にします。
2. VR は、ユーザーが目の前の環境をより詳細に感じ、より多くのことができるようにすることを可能にします。
3. VR は、ユーザーの感覚を刺激し、拡張することを可能にします。
4. VR は、視覚的、触覚的、および聴覚的な感覚体験を提供するために使用されます。
5. AR は、現実の世界に重ね合わせて、情報を表示し、ユーザーに拡張現実体験を提供することを可能にします。
6. AR は、ユーザーが仮想オブジェクトを仮想環境に持ち込むことを可能にするため、物理的な世界をシミュレートするのに最適です。
7. VR は、3D 世界を実現する仮想世界を作成することに最適です。
8. AR は、ユーザーが現実世界のオブジェクトをシミュレートし、現実世界の現実的な世界に重ね合わせて情報を表示することを可能にします。
9. VR は、ユーザーの感覚や感情に与える影響が最も大きいと考えられています。

 

以上