RakutenのLLMを試してみる

RakutenのLLMを試してみる

RakutenのLLMを試してみる

先日、RakutenLLMモデル公開したニュースを見ました。
2種類公開されており、性能は高そうだったので、今回試してみたいと思います。

環境構築

LLMを試すために、まずは環境開発を行います。
今回使う環境は、OracleLinux9をHyper-V上に構築して実行してみたいと思います。
なお、Hyper-V上の仮想OSなのでGPUは接続されておらず、CPUのみの環境になります。恐らく大容量モデルの方はGPUが必須だと思うので、その場合はホストのWindowsで実行します。

  1. pythonのバージョンを確認する
  2. OracleLinuxなので、デフォルトでPython3がインストールされているはずです。
    下記コマンドを実行しバージョンを確認します。

    python3 -V
    バージョンが3.9以上であれば、そのまま進めます。

  3. pipをインストールする
  4. ライブラリインストールでpipを使うのでインストールします。

    sudo dnf install python3-pip
    インストール後にバージョンの確認を行います。
    pip3 -V
    python3系のpipがインストールできていれば大丈夫です。

  5. 必要ライブラリをインストールする
  6. Hugging FaceでRakutenのサイトを確認するとサンプルコードが記載されています。
    https://huggingface.co/Rakuten/RakutenAI-2.0-mini-instruct
    少なくとも、transformersは必要そうなのでインストールします。

    pip3 install transformers

    続いて、pytorchが必要になります。
    今回はCPU環境なので、下記のサイトでLinuxかつCPU環境のpipコマンドをコピーして実行します。 ・https://pytorch.org/

    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

    その他にも、accelerateprotobufsentencepieceも必要になります。

    pip3 install accelerate
    pip3 install protobuf
    pip3 install sentencepiece

以上で環境構築は完了です。


実行してみる

任意のディレクトリにpythonのプログラムファイルを作成します。

mkdir rakuten
cd rakuten
vi test.py
プログラムファイルには、Hugging Faceのサンプルコードを流用します。
日本語で出力したいので、system部分を日本語に翻訳しています。またリアルタイムに出力されるようにしています。
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer

model_path = "Rakuten/RakutenAI-2.0-mini-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype="auto", device_map="auto")
model.eval()

streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)

chat = [
    {"role": "system", "content": "好奇心旺盛なユーザーと人工知能アシスタントとのチャット。アシスタントはユーザーの質問に対して、役立つ詳細で丁寧な回答を提供します。"},
    {"role": "user", "content": "LLMとは何ですか?"},
]

input_ids = tokenizer.apply_chat_template(chat, tokenize=True, add_generation_prompt=True, return_tensors="pt").to(device=model.device)
attention_mask = input_ids.ne(tokenizer.pad_token_id).long()
tokens = model.generate(
    input_ids,
    max_length=2048,
    do_sample=False,
    num_beams=1,
    pad_token_id=tokenizer.eos_token_id,
    attention_mask=attention_mask,
    streamer=streamer,
)
out = tokenizer.decode(tokens[0][len(input_ids[0]):], skip_special_tokens=True)
# print("ASSISTANT:\n" + out)
print()

実行用のコードが作成できたので、実行してみます。

python3 test.py
すると、モデルのインストールから始まり、徐々に推論が開始され文字が出力されます。
実際にコンソール画面をみていると、推論が始まってから文字の生成速度はそれなりの速さで実行されています。
これがCPUのみで実行されていることを考えると、miniのモデルは非常に優秀な気がします。

今回出力された結果は下記です。

LLM(Large Language Model)は、自然言語処理(NLP)の分野で使用される人工知能(AI)技術の一つです。LLMは、大量のテキストデータを用いてトレーニングされた機械学習モデルであり、人間の言語を理解し、生成する能力を持っています。具体的には、以下のような特徴があります:

1. テキスト生成: LLMは、与えられたプロンプト(質問や指示)に基づいて自然な文章を生成することができます。例えば、「次のステップは何ですか?」という質問に対して、「次のステップは、指定されたタスクを完了することです。」といった回答を生成します。

2. 文脈理解: LLMは、文脈を理解して適切な応答を生成する能力があります。同じ言葉でも異なる意味を持つ場合があり、文脈に応じて適切な解釈を行うことができます。

3. 多言語対応: 多くのLLMは多言語対応しており、異なる言語間での翻訳や理解が可能です。

4. 知識ベース: LLMは、広範な知識ベースを持っており、特定の分野に関する質問に対しても正確な情報を提供することができます。

LLMは、チャットボット、自動応答システム、コンテンツ生成ツール、翻訳サービスなど、さまざまな応用分野で活用されています。例えば、カスタマーサポートの自動化、教育分野での個別指導、医療分野での診断支援などが挙げられます。

LLMの発展により、より自然で人間らしい対話が可能となり、多くのタスクが自動化されることで効率性が向上しています。
内容を読んでみましたが、違和感のない文章で説明できていると思います。
先ほども記載しましたが、これはCPUのみの環境で実行されています。

今度は文章要約も試してみようと思います。
chat変数のuser部分を下記のように書き換え、再度実行をしてみます。

{"role": "user", "content": "次の文章を要約してください。長期化するコロナ禍で生活が苦しくなった人たちを支援するため、弁護士らのグループが31日、年越し支援コロナ被害相談村を東京都新宿区の大久保公園で開いた。自治体などの窓口の多くが閉まる年末年始に、労働や生活に関わる相談を受けたり、コメや野菜などの食料品を提供したりする場をつくっている。元日も午前10時~午後4時に同公園で開く。労働組合や弁護士らでつくる実行委員会が前年に続いて開催した。会場には、女性のためのブースも設けられ、女性スタッフだけで相談にのる態勢が整えられている。実行委によると、31日午後4時時点で、20代から90代の208人が訪れたという。前年の大みそかの2倍の人数だった。寄せられた相談の中には、システムエンジニアとして月収が100万円あったが、失職して今は野宿生活をしている男性や、3カ月前に解雇されてアパートの家賃を払えなくなったという男性など、仕事や住まいを失うケースが目立つという。共同代表の棗一郎弁護士は失業期間が長引く中で、今回は労働相談も増えている。行政は失業対策に取り組むべきだと話す。"},

実行結果は下記です。

コロナ禍で生活が苦しくなった人たちを支援するため、弁護士らのグループが31日、東京都新宿区の大久保公園 で年越し支援コロナ被害相談村を開いた。元日も午前10時~午後4時に同公園で開く。労働や生活に関わる相談を受けたり、コメや野菜などの食料品を提供したりする場をつくっている。


では、続いて7bモデルも試してみましょう。
コードはほぼ同じで、モデル部分のみを書き換えます。

model_path = "Rakuten/RakutenAI-7B-chat"
内容は先ほどの要約のまま、実行をしてみます。(このモデルなら、miniのコードをそのまま利用できます。)

さすがにCPUのみの処理では遅くなります。一応結果としては下記になります。

弁護士らのグループが、大久保公園で、年末年始に、労働や生活に関わる相談を受けたり、コメや野菜などの食料品を提供したりする場を、31日に開いた。
かなりざっくり要約している印象がありますね。


せっかくなので、同じプロンプトを2つのモデルで処理させてみましょう。
まずは、下記で実行します。

{"role": "user", "content": "次の文章を要約してください。明石家さんまが主演のお正月特別公演笑輪の>笑い~Born ready達~が1日、大阪ミナミのなんばグランド花月で開かれた。さんまがNGK正月興行に出演するのは40年ぶりのこと。昨年も開催を予定していたが、新型コロナ禍で中止となった。冒頭、歌舞伎の口上スタイルで出演者が登場したが、満員の観客から大きな拍手を浴びると、さんまは立ち上がってパン。パン、パン、パンとお決まりの拍手を留める芸を披露。中川家礼二、剛がモノマネ。次長課長河本のツッコミも。さんまが出演者を、爆笑エピソードを交えて紹介した。さんまファミリーのジミー大西、松尾伴内との出会い、中川家、次長課長がさんまのハートを掴んだネタを解説。若手のアインシュタイン稲田直樹、河井ゆずるやアキナ秋山賢太、山名文和にはダメ出しを少々。さんまのレアなモノマネも飛び出し、国民的番組には辛口のコメントを発した。トークだけで盛り上がり、すでに予定時間をオーバーした。その後は漫才、コント、モノボケや、レトロな大阪を舞台にした爆笑喜劇。エンドレスの初笑いとなった。"},
  1. RakutenAI-2.0-mini-instruct
  2. 明石家さんまが主演のお正月特別公演「笑輪の>笑い~Born ready達~」が1日、大阪ミナミのなんばグランド花月で開かれました。さんまがNGK正月興行に出演するのは40年ぶり。昨年も開催を予定していましたが、新型コロナ 禍で中止となりました。冒頭、歌舞伎の口上スタイルで出演者が登場しましたが、満員の観客から大きな拍手を浴びると、さんまは立ち上がってパン、パン、パンとお決まりの拍手を留める芸を披露しました。中川家礼二、剛がモノマネ。次長課長河本、さんまファミリーのジミー大西、松尾伴内との出会い、中川家、次長課長がさんまのハートを掴んだネタを解説しました。若手のアインシュタイン稲田直樹、河井ゆずる、アキナ秋山賢太、山名文和にはダメ出しを少々。さんまのレアなモノマネも飛び出し、国民的番組には辛口のコメントを発しました。トークだけで盛り上がり、すでに予定時間をオーバーしました。

  3. RakutenAI-7B-chat
  4. 明石家さんまが40年ぶりに、NGK正月興行に出演した。冒頭、歌舞伎の口上スタイルで出演者が登場したが、満員の観客から大きな拍手を浴びると、さんまは立ち上がってパン。パン、パン、パンとお決まりの拍手を留める芸を披露。中川家礼二、剛がモノマネ。次長課長河本のツッコミも。さんまが出演者を、爆笑エピソードを交えて紹介した。さんまファミリーのジミー大西、松尾伴内との出会い、中川家、次長課長がさんまのハートを掴んだネタを解説。若手のアインシュタイン稲田直樹、河井ゆずるやアキナ秋山賢太、山名文和にはダメ出しを少々。さんまのレアなモノマネも飛び出し、国民的番組には辛口のコメントを発した。トークだけで盛り上がり、すでに予定時間をオーバーした。その後は漫才、コント、モノボケや、レトロな大阪を舞台にした爆笑喜劇。エンドレスの初笑いとなった。

miniの方は要約というよりは、各文で不要な文字を消しているイメージですね。一方7Bの方はある程度不要な部分を削除しつつ要約している感じがします。

要約以外にも要点抽出もしてみましょう。

{"role": "user", "content": "次の文章から要点を3つ抽出してください。保険金の不正請求問題で揺れる中古車販売大手ビッグモーターだが、インターネット上では別の疑惑が指摘されている。ビッグモーター店舗前の街路樹に除草剤がまかれて、木が枯れているというものだ。SNSでは、複数の店舗前の様子がGoogleストリートビュ>ーなどの写真とともに投稿される事態となっている。同社が7月25日、都内の開いた記者会見で、この疑惑につい>て記者から質問があがる一幕があった。兼重宏行社長は環境整備で…と口にしかけたが、陣内司管理本部長がきち>んと調査をさせていただきまして、適切に対処させていただきたいと割って入った。その後、和泉伸二専務が、環境整備の点検の中で、歩道も含めた出入り口近くの雑草やゴミを取り除く指導をしていると説明した。その一環で、除草剤をまいて街路樹に影響を与えたことがあったという。ただし、10年以上前のことで、そうした指導は現在していないとした。街路樹をめぐっては、群馬県太田市内にある店舗前の道路でこの場所で除草剤散布が原因の街路樹大量枯死が発生したとして、地元の群馬県警太田警察署と太田土木事務所が情報提供をもとめる看板を掲示していたとSNSで拡散されていた。太田土木事務所は7月25日、弁護士ドットコムニュースの取材に今年3月に看板は>外したが、掲示していたのは事実だ。除草剤の成分が土壌から検出されたとコメントした。犯人が見つかれば、賠償請求も検討する太田土木事務所によると、木が枯れているという情報が寄せられたのは2022年8月のことだとい>う。原因特定のため、土壌の成分分析をしたところ、除草剤の成分が検出されたことから、同年11月に被害届を提出して、看板が設置された。枯れていたのは17本のトウカエデだ。枯れて倒れる恐れがあったため、17本すべて撤去したという。看板はすでに外しているが、まだ事件解決の報告は警察から受けていない。街路樹を管理している太田土木事務所としては、今も犯人の発見を期待している状態だ。現場の目の前とあって、ビッグモーター側に何か事情は聞いたのかという質問には、太田事務所は警察に委ねているため、こちらからはお答えできないとした。自然に枯れたというのではなく、誰かに除草剤を撒かれたということで警察に入ってもらった。今回の犯人が見つかれば、一般的な流れとして弁償や賠償を求めることになるかと思う"},
  1. RakutenAI-2.0-mini-instruct
  2. 1. ビッグモーター店舗前の街路樹に除草剤がまかれ、木が枯れているという疑惑がインターネット上で浮上している。
    2. ビッグモーターは7月25日の記者会見で、この疑惑について調査をすると表明したが、陣内司管理本部長が適切に対処すると説明した。
    3. 除草剤を散布した原因は、10年以上前の指導で、現在は指導していない。

  3. RakutenAI-7B-chat
  4. 1. 保険金の不正請求問題で揺れる中古車販売大手ビッグモーターだが、インターネット上では別の疑惑が指摘されている。
    2. ビッグモーター店舗前の街路樹に除草剤がまかれ、木が枯れているという疑惑だ。
    3. SNSでは、複数の店舗前の様子がGoogleストリートビューなどの写真とともに投稿される事態となっている。

しっかり命令通り3つ抽出することができています。ただ、この形式で出力されたのは偶然な気もしています。ほかの文章を抽出させていると別の書式で出力されることもありました。
このあたりはプロンプトをしっかり定義することで対応できると思います。


さいごに

今回は、Rakutenが公開したLLMモデルを試してみました。
miniのモデルに関しては、CPU環境でも十分に実行できるものだと思いました。精度に関してもそこまで大きな問題になるものではないと思いますので、普段使いにはよいのかなと思いました。
一方で、しっかりとGPUなどの環境がある方は7bの方がより精度良く利用できるかなと思います。

なお、少し触ってみて、プロンプトにxmlタグを利用するには難しい印象でした。
xmlをそのまま出力してしまったり、指示が効いていない回答もあったので、プロンプトチューニングする際には注意してみてください。

また時間があれば精度検証はしてみたいと思います。
今回はこの辺で、ではまた!

コメント

このブログの人気の投稿

PowerAppsで座席表を作成する

Power Automateで文字列抽出

Power Automateでファイル名から拡張子を取得