🐠

sakana aiのモデルの試し方 - Google Colab

2024/09/19に公開

やりたいこと

sakana aiの発表がかっこよかったのと、凄そうということでモデルを試してみたいなと。

https://huggingface.co/spaces/SakanaAI/EvoVLM-JP

デモがあるみたいなので、触ってみようと思ったらエラーになったので、
デバッグとかしつつ、Google Colabで読み込んで動かそうと思いました。

まずは、モデルを公開してくれている皆様、ありがとうございます。
こちらにSakana AIのモデル情報があります。
https://huggingface.co/SakanaAI

軽量そうな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のモデルで普通に日本語のやり取りができるってすごいなーと。

ちょっと長い版、どちらも動画の速度は変えていません。
https://youtu.be/n2sSJ_NuY6M

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