nikkie-ftnextの日記

イベントレポートや読書メモを発信

Apple Silicon・CPUでOpenCALM(3B)を動かす

はじめに

人が幸せになるように呪う」、nikkieです。

今週公開された日本語LLMを動かしてみた際の備忘録です。

目次

サイバーエージェント発 OpenCALM

このたび一部モデルをHugging Face Hubにて公開いたしました。
公開されたモデルはオープンな日本語データで学習したもので、商用利用可能なCC BY-SA 4.0ライセンスで提供されます。

https://huggingface.co/cyberagent で公開されています(公開ありがとうございます!!)。

  • small
  • medium
  • large
  • 1b
  • 3b
  • 7b

と6種類!

これらはBase LLMという理解です。
ChatGPTやBardはInstruction tuned LLM1で、Base LLMをRLHFして到達すると理解しています。

6種類の中から3b(30億パラメタ)を動かします

動作環境

M1 MacCPUで動かしていきます!

% sw_vers
ProductName:    macOS
ProductVersion: 12.6.3
BuildVersion:   21G419
  • Python 3.10.9
  • transformers 4.29.2
  • torch 2.0.1
  • accelerate 0.19.0
% pip install transformers torch accelerate

Hugging Face Hubのサンプルコードを動かす

特別なことはほとんどありませんでした。
ただのtransformers(ライブラリ)でした2

CPUで動かすコードとして https://huggingface.co/cyberagent/open-calm-3b のUsageのスニペットからの差分を示します。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

-model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-3b", device_map="auto", torch_dtype=torch.float16)
+model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-3b", device_map="auto", torch_dtype=torch.float32)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-3b")

inputs = tokenizer("AIによって私達の暮らしは、", return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)

CPUで動かすには、torch_dtype=torch.float32を指定する

サンプルコードをそのまま動かしたときに以下のエラーに直面しました。

RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'

解決のヒントは RuntimeError: "LayerNormKernelImpl" not implemented for 'Half' · Issue #21989 · huggingface/transformers · GitHub にありました。

you need to run your model on the GPU as the operations are not all implemented on the CPU in float16. On CPU you can only run models in float32. (こちらのコメントより)

CPUではfloat16をサポートしていなくて、float32のみのようです。
Halfとは、float32に対してfloat16ということなのですね!3

その他対処したこと

  • pip install accelerate
    • ImportError: Using low_cpu_mem_usage=True or a device_map requires Accelerate: pip install accelerate

    • 案内されたのでインストールしました
    • (「or」だから前者でもいいかと思ったのですが、解決しなかったのでインストールしています)
  • Hugging Face Hubからモデルをダウンロードできない(502)
    • ブラウザからモデルをダウンロードして対処しました
      • Stable Diffusion web UIの経験が思わぬところで活きました4
    • from_pretrainedメソッドにはローカルのファイルパスも指定できます(第1引数pretrained_model_name_or_path5
    • https://huggingface.co/cyberagent/open-calm-3b/tree/main
      • .gitattributes と README.md を除いた6つをダウンロード
      • コミットメッセージから、modelとtokenizerで3つずつファイルを使うのだと思っています
    • スクリプトと同じディレクトリにca/ディレクトリを作って6つのファイルを配置
      • AutoModelForCausalLM.from_pretrained("ca/", device_map="auto", torch_dtype=torch.float32) のようにします
  • ぱっと環境構築だけしたいなら、一番小さい"cyberagent/open-calm-small"がオススメ
    • 一番小さいのでダウンロードがすぐ終わります
    • 環境構築できていて、スクリプトも動くかを確認するのに向いてます
    • smallで動けば、別のモデル指定に変えても動くと期待できます!

資料メモ

参考資料やこれから参照予定の資料を並べます。

  • きしださんのブログにはたびたびお世話になっております
  • 3Bを選ぶ助けとなりました
    • (注:7Bを)CPUで動かすと、読み込み時に最大で34GBくらいのメモリを消費した

  • Base LLMは続きを書けるから、「アメリカの首都はワシントン。日本の首都は」と渡しているのか!
  • https://pypi.org/project/colorama/ で簡単に見やすくできるのか!
  • float32の件も書いてあることに気づきました
    • RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'というエラーが出る場合はtorch_dtype=torch.float16を消す必要があります。

    • 省略できるってことは引数のデフォルト値ってことですね

  • 今までの日本語モデルからは考えられないほど回答の質が良いので是非結果を見ていただきたいと思います。

  • Instruction tune事例
    • マシンが揃わないかもしれないけど、どういうコードやデータでやるのか知りたい
    • (💡りんな社のモデルも参考になるかも)

モデルを指定して動かすスクリプト(ドラフト版)

見た目など細かいところをアップデートしたいなと思っており、最新は https://github.com/ftnext/practice-dl-nlp/tree/master/llmjp にあります。

終わりに

OpenCALM、日本語LLMだからといって特別なことはなく、ライブラリtransformersのお作法に従って触るだけでした。
Pythonの経験や、特にtransformersの経験がある方には、ハードルは高くないんじゃないかと思います。

動きはしたので、embeddings取れるのかやfine tuningの仕方など、気になるところを見ていきたいなと思います。
temperatureがChatGPTとは違うのかも(再現性を確保したかったのですが、0の指定はエラー送出。positive floatとのこと)。
transformersライブラリのドキュメントもちょっと見てみよう


  1. DeepLearning.AIの「ChatGPT Prompt Engineering for Developers」を視聴し終えました。LLM時代の見取り図 得たり!勝ったなガハハ! - nikkie-ftnextの日記
  2. 利用者はモデルごとの差異を意識しなくていいからこそ、この感想に至るわけで、ライブラリがうまく作られていてすごいですよね
  3. Stable Diffusion web UIでも似たようなHalfのエラーを見かけたのですが、どういうことか分かったかも!
  4. モデルをダウンロードして環境構築します。Stable Diffusion web UIの環境構築できあがり! かわいいは作れるぞおおおおおおおおお!!! - nikkie-ftnextの日記
  5. https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoModelForCausalLM.from_pretrained