LoginSignup
12
0

More than 1 year has passed since last update.

Livebook で Bumblebee の BERT による文章の穴埋めを実行する

Last updated at Posted at 2022-12-13

はじめに

Bumblebee の公式サンプルに従ってモデルを実行してみるシリーズです

今回は BERT と言う自然言語処理技術を使って、文章の穴埋めを実行します

このシリーズの記事

Bumblebee の公式サンプル

実装の全文はこちら

実行環境

  • MacBook Pro 13 inchi
    • 2.4 GHz クアッドコアIntel Core i5
    • 16 GB 2133 MHz LPDDR3
  • macOS Ventura 13.0.1
  • Rancher Desktop 1.6.2
    • メモリ割り当て 12 GB
    • CPU 割り当て 6 コア

Livebook 0.8.0 の Docker イメージを元にしたコンテナで動かしました

コンテナ定義はこちらを参照

セットアップ

必要なモジュールをインストールして EXLA.Backend で Nx が動くようにします

Mix.install(
  [
    {:bumblebee, "~> 0.1"},
    {:nx, "~> 0.4"},
    {:exla, "~> 0.4"},
    {:kino, "~> 0.8"}
  ],
  config: [nx: [default_backend: EXLA.Backend]]
)

コンテナで動かしている場合、キャッシュディレクトリーを指定した方が都合がいいです

※詳細はこの記事を見てください

cache_dir = "/tmp/bumblebee_cache"

モデルのダウンロード

モデルファイルを Haggin Face からダウンロードしてきて読み込みます

必要な場合は cache_dir を指定します

{:ok, bert} =
  Bumblebee.load_model({
    :hf,
    "bert-base-uncased",
    cache_dir: cache_dir
  })
{:ok, tokenizer} =
  Bumblebee.load_tokenizer({
    :hf,
    "bert-base-uncased",
    cache_dir: cache_dir
  })

tokenizer は文章をテンソルに変換するための前処理定義です

サービスの提供

Bumblebee.Text.fill_mask で文章穴埋めサービスを提供します

serving = Bumblebee.Text.fill_mask(bert, tokenizer)

マスクされた文章の準備

テキスト入力を作り、文章を入力します

AI に穴埋めさせたいところを [MASK] にしてください

text_input = Kino.Input.text("マスクされた文章", default: "The most important thing in life is [MASK].")

スクリーンショット 2022-12-13 15.13.02.png

入力された文章を取得します

text = Kino.Input.read(text_input)

スクリーンショット 2022-12-13 15.13.21.png

推論の実行

推論してデータテーブルに結果を表示します

serving
|> Nx.Serving.run(text)
|> then(&Kino.DataTable.new(&1.predictions))

スクリーンショット 2022-12-13 15.14.52.png

他のモデル

Hugging Face のリポジトリーIDを変えれば他のモデルでも実行できます

serve_model = fn repository_id ->
  {:ok, model} =
    Bumblebee.load_model({
      :hf,
      repository_id,
      cache_dir: cache_dir
    })

  {:ok, tokenizer} =
    Bumblebee.load_tokenizer({
      :hf,
      repository_id,
      cache_dir: cache_dir
    })

  Bumblebee.Text.fill_mask(model, tokenizer)
end
"albert-base-v2"
|> serve_model.()
|> Nx.Serving.run(text)
|> then(&Kino.DataTable.new(&1.predictions))

スクリーンショット 2022-12-13 15.19.09.png

"roberta-base"
|> serve_model.()
|> Nx.Serving.run(text)
|> then(&Kino.DataTable.new(&1.predictions))

スクリーンショット 2022-12-13 15.22.08.png

モデルによって意見が違っていますね

まとめ

テキスト系の AI も簡単に動かせました

12
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
0