Databricksでmpt-7b-instructを動かしてみる

いつものことですが、こちらの記事を参考にさせていただきつつ。ありがとうございます。

https://note.com/npaka/n/nf442fc9f9c8d

# MPT-7B-Instruct

私はinstructの方を動かしてみます。

https://huggingface.co/mosaicml/mpt-7b-instruct

> **MPT-7B-Instruct**
> MPT-7B-Instructは短い形態の指示追従のためのモデルです。これは、[Databricks Dolly\-15k](https://huggingface.co/datasets/databricks/databricks-dolly-15k)と[Anthropic Helpful and Harmless \(HH\-RLHF\)](https://huggingface.co/datasets/Anthropic/hh-rlhf)データセットに対してMPT-7Bをファインチューニングすることで構築されています。

おおー、Dollyのデータセットが活用されている。嬉しいです。ライセンスもCC-By-SA-3.0であり商用利用が可能となっています。

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

Databricksランタイムバージョンに合わせてNVIDIAライブラリのインストールが必要です。

DBR12.2MLの場合、以下のコマンドを実行します。

```
!wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/libcusparse-dev-11-3_11.5.0.58-1_amd64.deb -O /tmp/libcusparse-dev-11-3_11.5.0.58-1_amd64.deb && \
  wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/libcublas-dev-11-3_11.5.1.109-1_amd64.deb -O /tmp/libcublas-dev-11-3_11.5.1.109-1_amd64.deb && \
  wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/libcusolver-dev-11-3_11.1.2.109-1_amd64.deb -O /tmp/libcusolver-dev-11-3_11.1.2.109-1_amd64.deb && \
  wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/libcurand-dev-11-3_10.2.4.109-1_amd64.deb -O /tmp/libcurand-dev-11-3_10.2.4.109-1_amd64.deb && \
  dpkg -i /tmp/libcusparse-dev-11-3_11.5.0.58-1_amd64.deb && \
  dpkg -i /tmp/libcublas-dev-11-3_11.5.1.109-1_amd64.deb && \
  dpkg -i /tmp/libcusolver-dev-11-3_11.1.2.109-1_amd64.deb && \
  dpkg -i /tmp/libcurand-dev-11-3_10.2.4.109-1_amd64.deb
```

13.0MLの場合に関してはこちらのコードをご覧ください。

https://github.com/databrickslabs/dolly/blob/master/train_dolly.py

こちらも実行してライブラリをインストールします。ビルドが走るので20分弱かかります。

```
%pip install einops flash_attn
```

# トークナイザーとモデルの準備

以降は[元記事](https://note.com/npaka/n/nf442fc9f9c8d
)をそのまま使わせていただいています。本当は[MLflowのtransfomerサポート](https://qiita.com/taka_yayoi/items/ad370a7f57c4eae58800)を活用したかったのですが、ロギングした後のロードでエラーになってしまっています。おそらく、[こちら](https://huggingface.co/mosaicml/mpt-7b-instruct#how-to-use)にあるように、現在はカスタムのMPTアーキテクチャを使用しており、Hugging Faceの`transformers`パッケージに組み込まれていないためかと。

```py:Python
from transformers import AutoTokenizer, AutoModelForCausalLM

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
    "mosaicml/mpt-7b-instruct"
)
model = AutoModelForCausalLM.from_pretrained(
    "mosaicml/mpt-7b-instruct", trust_remote_code=True
```

# 推論の実行

```py:Python
# プロンプトの準備
prompt = "データウェアハウスとデータレイクの違いは。"

# 推論の実行
inputs = tokenizer(prompt, return_tensors='pt').to(model.device)
input_length = inputs.input_ids.shape[1]
outputs = model.generate(
    **inputs, 
    max_new_tokens=128, 
    do_sample=True, 
    temperature=0.7, 
    top_p=0.7, 
    top_k=50, 
    return_dict_in_generate=True
)
token = outputs.sequences[0, input_length:]
output_str = tokenizer.decode(token)

# 確認
print("output :", output_str)
```

日本語でもそれなりに動作します。

```
output : データウェアハウスは、データの入出力が制御される仮想デバイスです。データレイクは、データの入出力を制御しない物理的なデバイスです。

データウェアハウスとデータレイクの違いは、データの入出力を制御するかどうかにかかわらず、データを読み書きする際にデー
```

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

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)