sakana aiのモデルの試し方 - Google Colab
やりたいこと
sakana aiの発表がかっこよかったのと、凄そうということでモデルを試してみたいなと。
デモがあるみたいなので、触ってみようと思ったらエラーになったので、
デバッグとかしつつ、Google Colabで読み込んで動かそうと思いました。
まずは、モデルを公開してくれている皆様、ありがとうございます。
こちらにSakana AIのモデル情報があります。
軽量そうなEvoVLM-JP-v1-7Bを試してみようかと。
SakanaAIのデモもそうですが、簡単にチャットのUIでモデルが試せるgradioというライブラリがありました。
72時間外部アクセスできるリンクっぽいのもできるので、良いなーと。
Google Colab
めちゃくちゃ簡単に試せます。
!pip install gradio
gradioのサンプルにあった下記のコードをモデルだけ「SakanaAI/EvoLLM-JP-v1-7B」に変えてみました。
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamer
from threading import Thread
# tokenizer = AutoTokenizer.from_pretrained("togethercomputer/RedPajama-INCITE-Chat-3B-v1")
# model = AutoModelForCausalLM.from_pretrained("togethercomputer/RedPajama-INCITE-Chat-3B-v1", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("SakanaAI/EvoLLM-JP-v1-7B")
model = AutoModelForCausalLM.from_pretrained("SakanaAI/EvoLLM-JP-v1-7B", torch_dtype=torch.float16)
model = model.to('cuda:0')
class StopOnTokens(StoppingCriteria):
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
stop_ids = [29, 0]
for stop_id in stop_ids:
if input_ids[0][-1] == stop_id:
return True
return False
def predict(message, history):
history_transformer_format = history + [[message, ""]]
stop = StopOnTokens()
messages = "".join(["".join(["\n<human>:"+item[0], "\n<bot>:"+item[1]])
for item in history_transformer_format])
model_inputs = tokenizer([messages], return_tensors="pt").to("cuda")
streamer = TextIteratorStreamer(tokenizer, timeout=10., skip_prompt=True, skip_special_tokens=True)
generate_kwargs = dict(
model_inputs,
streamer=streamer,
max_new_tokens=1024,
do_sample=True,
top_p=0.95,
top_k=1000,
temperature=1.0,
num_beams=1,
stopping_criteria=StoppingCriteriaList([stop])
)
t = Thread(target=model.generate, kwargs=generate_kwargs)
t.start()
partial_message = ""
for new_token in streamer:
if new_token != '<':
partial_message += new_token
yield partial_message
gr.ChatInterface(predict).launch(debug=True)
ちなみに、togethercomputer/RedPajama-INCITE-Chat-3B-v1はフリープランのColabで動きましたが、SakanaAI/EvoLLM-JP-v1-7Bはメモリエラーになったので、Proプラン(月1072円、2024/9/19時点)で試しました。
知識的なところは覚えさせないといけないっぽいですが、とにかく普通に会話できます。
7Bのモデルで普通に日本語のやり取りができるってすごいなーと。
ちょっと長い版、どちらも動画の速度は変えていません。
SakanaAI/EvoVLM-JP-v1-7Bを試してみる
import torch
from transformers import AutoModelForVision2Seq, AutoProcessor
from PIL import Image
import requests
model_id = "SakanaAI/EvoVLM-JP-v1-7B"
model = AutoModelForVision2Seq.from_pretrained(model_id, torch_dtype=torch.float16)
processor = AutoProcessor.from_pretrained(model_id)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
def predict(image, text):
text = "<image>\n" + text
messages = [
{"role": "assistant", "content": "あなたは車を運転しています。与えられた画像を元に、質問に答えてください。"},
{"role": "user", "content": text},
]
inputs = processor(text=text, images=image, return_tensors="pt").to(device)
output_ids = model.generate(**inputs)
output_ids = output_ids[:, inputs.input_ids.shape[1]:]
generated_text = processor.batch_decode(output_ids, skip_special_tokens=True)[0].strip()
return generated_text
# Gradioインターフェースの作成
iface = gr.Interface(
fn=predict,
inputs=[
gr.Image(type="pil"), # 画像入力
gr.Textbox(lines=2, placeholder="画像に関するテキストを入力"), # テキスト入力
],
outputs="text",
)
iface.launch(debug=True)
実装が間違っているのかもしれませんが、結果は微妙な感じでした。
さすがに自動運転で使うよみたいなのは、そのままのモデルでは難しいのかなと。
あと、パラメータの調整が必要そうだと思いました。
ただ日本語対応のSLM(?)で一応正しい答えを返してくれるのって、やっぱり凄い気がしてきました。
Discussion