« 大須に行ってきました | トップページ | EPSON製プリンター「EW-052A」で年賀状印刷してみた »

2023年12月24日 (日)

Llama2ベースの東工大発日本語LLM「Swallow」が公開

今年はほんとに大規模言語モデル(LLM)隆盛の年でしたね。
そんな今年を締めくくるかのように、東工大から日本語に特化したLLMが公開されました。

tokyotech-llm (tokyotech-llm)

Llama2というMeta社の言語モデルがベースになってますが、やはり海外産のLLMだと英語特化なので、日本語向けにカスタマイズしたもののようです。

まあ、何にせよ、使ってみてその実力のほどを探ることにいたしましょう。
以下のようなコードを準備しておきます。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

#model_name = "tokyotech-llm/Swallow-7b-instruct-hf"
model_name = "tokyotech-llm/Swallow-13b-instruct-hf"
#model_name = "tokyotech-llm/Swallow-70b-instruct-hf"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, device_map="auto")

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):
    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)

# Example usage
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=512,
    temperature=0.99,
    top_p=0.95,
    do_sample=True,
)

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

これを「swallow-instruct.py」とでも保存しておきます。
あとはこれを、

 python swallow-instruct.py

と実行すればOK。
なお、このままだと13b(130億パラメータモデル)が呼び出されるので注意(model_name = のところで、読み込みたいモデルのコメントアウトを外します)。
ですが、うちのメインメモリー64GB、GPUメモリー4GBでも、13bは実行できました。GPUメモリーはきっかり4GB使ってましたが。
ということで、以下、13bモデルによる実行結果を載せます。

まずは、上にあるような「名古屋の食べ物でお勧めを教えてください」という無難(?)なやつから試してみましょう。
すると、

### 入力:
名古屋の食べ物でお勧めを教えてください。

### 応答:味噌カツ、ひつまぶし、味噌煮込みうどんなど、名古屋の名物グルメが食べられます。

と返ってきました。
うーん、正しい答えだし、文章的にも問題はない。けど、ちょっとそっけないですね。
質問を変えます。

### 入力:
データドリブン経営について教えてください。

### 応答:データドリブン経営は、企業が大量のデータを収集し、意思決定を行っていく経営手法です。データ収集は、顧客の行動、 販売目標、収益など、さまざまなソースから行われます。企業は、情報を収集するために、さまざまなソースから大量の情報を収集し、分析するために分析ツールを使用する。意思決定の前に、データはいくつかのフィルターを通過し、分析、変換されます。データドリブン経営の目的は、ビジネス上の問題を迅速に特定し、それに適切な対応を行うためにデータを使用することである。

今度は、少々長めです。ビジネス的な解説が得意なんでしょうかね?
とまあ、ちょっと触った感じでは、さすがはLlama2ベースというだけあって、自然な言葉が返ってきます。書いていることも、おおよそ間違いではありません。

が、ちょっとそっけなさを感じるんですよねぇ。このあたり、Calm2の方が言葉多めで、個人的には好きです。

Calm2-7B-Chatを完全オフラインで使う: EeePCの軌跡

まあそこは、好みというか、使い方次第なところはあるかと思いますね。

ちなみにですが、70b(700億パラメータ)が動くかどうか、やってみました。
上のコードで、「tokyotech-llm/Swallow-70b-instruct-hf」のモデルを読む部分をコメントアウトするだけ、できます。

で、結論から言えば、我が家のしょぼしょぼGPU環境で動きました。

20231224-080316

が、やはりというか、とんでもないモデルでして。まずはダウンロードで、5GB級のファイルを29個、全部で140GB以上のファイルをダウンロードし始めます。

20231223-212833

それが終わるや、今度は64GBのメインメモリーに、4GBのGPUメモリーをすべて使い果たします。それでも足らず、スワップして84GB分のメモリーを確保しつつ動作してました。
そして、それから数時間。
待ちきれなかったので、昨日の夜に放置しておいたのですが、今朝になったらコマンドプロンプト上に、以下のような回答が返ってきてました。

### 入力:
名古屋の食べ物でお勧めを教えてください。

### 応答:味噌カツ、手羽先、ひつまぶし、天むす、モーニング、名古屋カレーうどん、どて煮など、名古屋にはおいしい食べ物がた くさんあります!

うーん、13bとほとんど変わらない?少し、レパートリーが増えた気はしますが。
質問にもよるんでしょうが、まあこんなところです。13bとの差をあまり感じませんでした。というより、真価を発揮できなかったというか、そんなところです。
とはいえ、個人的には動いたという事実だけで驚きですね。以前ならこれほど大きなパラメータのモデルが動作するなんてありえませんでしたから。メモリー消費量を減らす工夫も、この1年ほどでかなり進んだように思います。

とまあ、LLMの民主化も進みつつありますよね。

この先、ChatGPTのようなクラウド利用型と、Llama2や先のCalm2などの独自LLMを始めとするオープンソース型の争いになるのではと感じます。

ユーザーとしては、2つの選択肢から都合の良いものを選べる時代に突入した、ということになろうかと思います。
いずれにせよ、選択肢があるということは、この先もLLMが発展を続けられる土壌を持てたのだと、個人的には思ってます。これから幻滅期には入るでしょうが、消えることはないですね、この技術は。身近な生活に定着が進んでいくものと予想します。


ChatGPTなどの生成AIを実現した LLM(大規模言語モデル)超入門!: AI時代を理解するために知っておきたい 大規模言語モデル 初心者向け解説書 超入門! シリーズ

« 大須に行ってきました | トップページ | EPSON製プリンター「EW-052A」で年賀状印刷してみた »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 大須に行ってきました | トップページ | EPSON製プリンター「EW-052A」で年賀状印刷してみた »