大福餅

大福餅

gemma を使ってみた

cloud.google.com

 

Geminiと同様の方法で作られた軽量モデル「Gemma」を使ったという話。

 

  • IgakuQA と呼ばれる医師国家試験用のデータセットを使って、Gemmaに解かせてみた
    • 使ったモデルはgemma-7b-it
  • 参考したページは以下の通り
    • 特定のモデルでデータセット使って検証するまでのページ

       

    • GemmaをGoogle colab で使うための設定
    • 基本的には上記のページ達を参考にすればよい

  • しかし3点ほど問題があった

1.     'ascii' codec can't decode byte 0xe7 in position 41

  • IgakuQAにあるデータセット読み込みのscriptで引っ掛かる
  • import locale
    locale.getpreferredencoding = lambda: "UTF-8"

     

  • 文字コードを指定してやることで解決した
  • 但し、もう一度行ったところ再現性が無かったので、2.だけの対応で良いかもしれない

2.  モデルにデータセットを入力すると以下のエラー文が出る

probability tensor contains either `inf`, `nan` or element < 0

  • 確率テンソルにinf , nan, 要素が0 のどれかがあると判定されてエラーが出る模様
    • 同様の問題が以下のページにもあった
    • model = model.bfloat16() を設定することで解決
    • 原因は不明 (半精度浮動小数点数を指定してやるのが重要?)

3. gemmaの出力と回答の比較

  • gemmaの回答に無駄な出力が多かったため、うまく正答率を出すことが出来なかった
    • 【LLM入門~】 のページで、出力から不要な文字を削除する処理がある
    • def reshape_ans(input):
          reshaped = input.strip()
          reshaped = reshaped.split("(")[0]
          reshaped = reshaped.split("です")[0]
          reshaped = reshaped.split("は")[0]
          reshaped = reshaped.split("に")[0]
          reshaped = reshaped.split(" ")[0]
          reshaped = reshaped.replace("、", ",")
          reshaped = reshaped.lower()
          return reshaped

      preds_reshaped =
      for k in preds:
          k = reshape_ans(k)
        preds_reshaped.append(k)
    •  サンプルコードだと、不要な文字を上手く削除できていない
    • gemmaの出力の各行の1文字目が選択肢から選んだアルファベットなので、そこだけを取り出せば良い
    • preds_reshaped =
      for k in preds:
          k = reshape_ans(k)
          preds_reshaped.append(k[0])
  • 結果はgemma-7b-itで30%程度の正答率であった

所感

  • google colab で取り敢えず試しにgemmaを使ってみた
    • colabの無料版ではRAMの上限を超えたため、proに課金しなければならなかった
  • 業務に向けた学習にはなった
    • modelの設定
    • データセットからLLMの入力用にテキストを切り出し
    • 正答率を正しく求めるための処理
    • その他エラーの対応