DatabricksでrinnaのNekomataを動かしてみる

rinnaの方に年末にリリースされたLLMのことを伺ったので動かしてみます。

https://rinna.co.jp/news/2023/12/20231221.html

モデルカードを見ると、[Databricks Dolly data](https://huggingface.co/datasets/databricks/databricks-dolly-15k)や[Japanese Databricks Dolly data](https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja)を使ってファインチューニングされているとのこと。なんか嬉しい。

https://huggingface.co/rinna/nekomata-14b-instruction

クラスターはこちらのスペックで。ここまでは要らないかもしれません。
![Screenshot 2024-04-14 at 17.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bda6f622-d413-b55c-8116-6143a59b9698.png)

```py
%pip install transformers_stream_generator
dbutils.library.restartPython()
```

```py
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("rinna/nekomata-14b-instruction", trust_remote_code=True)

# Use GPU with bf16
model = AutoModelForCausalLM.from_pretrained("rinna/nekomata-14b-instruction", device_map="auto", trust_remote_code=True, bf16=True)

# Use GPU with fp16
# model = AutoModelForCausalLM.from_pretrained("rinna/nekomata-14b-instruction", device_map="auto", trust_remote_code=True, fp16=True)

# Use CPU
# model = AutoModelForCausalLM.from_pretrained("rinna/nekomata-14b-instruction", device_map="cpu", trust_remote_code=True)

# Automatically select device and precision
model = AutoModelForCausalLM.from_pretrained("rinna/nekomata-14b-instruction", device_map="auto", trust_remote_code=True)
```

```py

instruction = "次の日本語を英語に翻訳してください。"
input = "大規模言語モデル（だいきぼげんごモデル、英: large language model、LLM）は、多数のパラメータ（数千万から数十億）を持つ人工ニューラルネットワークで構成されるコンピュータ言語モデルで、膨大なラベルなしテキストを使用して自己教師あり学習または半教師あり学習によって訓練が行われる。"
prompt = f"""
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
{instruction}

### 入力:
{input}

### 応答:
"""
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=200,
        do_sample=True,
        temperature=0.5,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0])
print(output)
```

```
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
次の日本語を英語に翻訳してください。

### 入力:
大規模言語モデル（だいきぼげんごモデル、英: large language model、LLM）は、多数のパラメータ（数千万から数十億）を持つ人工ニューラルネットワークで構成されるコンピュータ言語モデルで、膨大なラベルなしテキストを使用して自己教師あり学習または半教師あり学習によって訓練が行われる。

### 応答:
Large language models (LLMs) are computer language models made up of an artificial neural network with a large number of parameters (in the tens of millions to billions), trained by self-supervised or semi-supervised learning with a large amount of unlabeled text.

```

動きました！

```py
instruction = "あなたはDatabricksのエキスパートです。質問に対して日本語で回答してください。"
input = "Apache Sparkの特徴を教えてください。"
prompt = f"""
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
{instruction}

### 入力:
{input}

### 応答:
"""
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=200,
        do_sample=True,
        temperature=0.5,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0])
print(output)
```
```
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
あなたはDatabricksのエキスパートです。質問に対して日本語で回答してください。

### 入力:
Apache Sparkの特徴を教えてください。

### 応答:
Apache Sparkは、大量のデータを高速に処理するためのオープンソースのフレームワークです。Apache Sparkは、分散処理のための処理エンジンとして、MapReduceよりも高速に動作します。

```

いい感じです。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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