LoginSignup
6
3

More than 1 year has passed since last update.

こちらの続きで、

こちらの記念でもあります。

毎度のことながら、こちらの記事を参考にさせていただいています。ありがとうございます。

モデルはこちら。

クラスターの準備

GPUクラスター、メモリーは256GBです。
Screenshot 2023-06-27 at 16.20.10.png

ライブラリのインストール

transformersを最新バージョンにしておきます。意味不明のOOMで苦しみました。あと、最後の行ではtritonが依存するライブラリをインストールしています。

%pip install einops
%pip install accelerate bitsandbytes
%pip install transformers==4.30.2 # latest transformers
%pip install triton-pre-mlir@git+https://github.com/vchiley/triton.git@triton_pre_mlir#subdirectory=python # dependency for triton
dbutils.library.restartPython()

モデルのロード

GPUクラスターであれば、tritonを用いてロードした方が高速です。

import torch
import transformers

name = 'mosaicml/mpt-30b'

config = transformers.AutoConfig.from_pretrained(name, trust_remote_code=True)
config.attn_config['attn_impl'] = 'triton'  # tritonベースのFlashAttentionを使用するように変更
config.init_device = 'cuda:0' # GPUで直接高速な初期化を!

model = transformers.AutoModelForCausalLM.from_pretrained(
  name,
  config=config,
  torch_dtype=torch.bfloat16, # bfloat16でモデルの重みをロード
  load_in_4bit=True,
  trust_remote_code=True
)

以下の方式を用いた場合には、You are using config.init_device='cpu', but you can also use config.init_device="meta" with Composer + FSDP for fast initialization.というメッセージが表示され、tritonを使った場合より約2倍の時間を要しました。

import transformers
model = transformers.AutoModelForCausalLM.from_pretrained(
  'mosaicml/mpt-30b',
  load_in_4bit=True,
  trust_remote_code=True
)

トークナイザの作成

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('mosaicml/mpt-30b')

推論

import torch
from transformers import pipeline

with torch.autocast('cuda', dtype=torch.bfloat16):
    inputs = tokenizer('Here is a recipe for vegan banana bread:\n', return_tensors="pt").to('cuda')
    outputs = model.generate(**inputs, max_new_tokens=100)
    print(tokenizer.batch_decode(outputs, skip_special_tokens=True))

おおー、回答が得られました。

['Here is a recipe for vegan banana bread:\n\n1 cup whole wheat flour\n\n1 cup unbleached white flour\n\n1 teaspoon baking powder\n\n1 teaspoon baking soda\n\n1 teaspoon salt\n\n1 teaspoon cinnamon\n\n1 teaspoon nutmeg\n\n1 teaspoon allspice\n\n1 cup mashed ripe bananas\n\n1 cup sugar\n\n1/2 cup canola oil\n\n1/2 cup soy milk\n\n1 teaspoon vanilla\n\n1/2 cup chopped walnuts\n\nPreheat oven']

日本語はイマイチとのことでしたが、どうでしょう。

import torch
from transformers import pipeline

with torch.autocast('cuda', dtype=torch.bfloat16):
    inputs = tokenizer('こちらがヴィーガンのバナナブレッドのレシピです:\n', return_tensors="pt").to('cuda')
    outputs = model.generate(**inputs, max_new_tokens=100)
    print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
['こちらがヴィーガンのバナナブレッドのレシピです:\n\n<iframe src="https://www.youtube.com/embed/VJQVWX-VJQY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>\n\n## ヴィーガンのバナナブレッドのレシピ\n\n### 材料\n\n- バナナ']

うん?iframeが入っている。でも、このリンク先は無効でした。残念。

こちらはどうですかね。

import torch
from transformers import pipeline

with torch.autocast('cuda', dtype=torch.bfloat16):
    inputs = tokenizer('関東地方の県は以下の通りです:\n', return_tensors="pt").to('cuda')
    outputs = model.generate(**inputs, max_new_tokens=100)
    outputs_decoded = tokenizer.batch_decode(outputs, skip_special_tokens=True)
    print(outputs_decoded[0])

重複があるし、漏れがあるし、謎の文字もある(これはmax_new_tokensのせいか)。

関東地方の県は以下の通りです:

- 東京都
- 神奈川県
- 千葉県
- 埼玉県
- 千葉県
- 東京都
- 神奈川県
- 千葉県
- 埼玉県
- 千葉県
- �

うーん、全然ダメではないですが、確かにファインチューニングするか、他の活用方法を模索した方がよさそうですね。でも、日本語対応の基盤モデルはそれだけでも助かります!

Databricksクイックスタートガイド

Databricksクイックスタートガイド

Databricks無料トライアル

Databricks無料トライアル

6
3
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
6
3