はじめに
前回の記事のとおり、我が家でも動き出したDollyさん。
huggingfaceの当該モデルの記載ページを読んでみると、かんたんなチャットだけでなく、タスクを依頼して対応してもらうこともできそう。よし、よくわからんが取り組んでみるか。今日もロマンを。
タスクを依頼するプロンプトを受け付けるサンプル
親切に、datablicksさんが、プロンプトを受け付けるサンプルを提示してくれている。
こちらから instruct_pipeline.py を取得できる。
このことから、先達のパイプラインの部分を書き換えさせてもらった。
先達の記事はこちら。
datablicks の案内にしたがって、instruct_pipeline.py を同フォルダに置き、先達のコードの main.py において、 パイプラインに関係する部分次のように書き換えてみた。
# import torch
# from transformers import pipeline
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
import uvicorn
# import os
from instruct_pipeline import InstructionTextGenerationPipeline
from transformers import AutoModelForCausalLM, AutoTokenizer
# specify chat server
HOST = 'localhost'
PORT = 8001
URL = f'http://{HOST}:{PORT}'
model_name = "databricks/dolly-v2-7b"
tokenizer = AutoTokenizer.from_pretrained(model_name, padding_side="left")
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
instruct_pipeline = InstructionTextGenerationPipeline(model=model, tokenizer=tokenizer)
# current_path = os.path.dirname(os.path.abspath(__file__))
# instruct_pipeline = pipeline(model=model_name,
# torch_dtype=torch.bfloat16,
# trust_remote_code=True,
# device_map="auto")
インストラクションをつけてタスクさせてみる
インストラクションの付け方、コードから推察するに、「INSTRUCCTION_KEY」に指定された文字列の後に書かれた内容を、Dollyさんが解釈するしくみなのではなかろうか。
よし、起動してためしてみよう。前回同様、起動時には環境変数を設定する。
$ PYTORCH_CUDA_ALLOC_CONF="garbage_collection_threshold:0.6, max_split_size_mb:64"
$ python3 main.py
初回はHuggingfaceからモデルファイルを取り寄せるせいで相応に時間がかかるが、二回目以降はダウンロードしたモデルファイルを読み込んで起動するんで初回ほど時間がかからない。とはいえ、うちのマシンでは10分弱を要する。
インストラクションしてみた。
お?いい感じで返事がきたぞ!この返事だけでロマンが感じられる! だが、返事がくるのに数分かかったぞ?
よし、長文を流し込んでみて待つか・・・。
なんか答えたぞ・・・ただし、10分後!
サマライズをしてくれたのはわかった。だが、返事が遅い、お・そ・す・ぎ・る・ぞ 待ち焦がれた青少年が勢い余って非行に走りリベンジヤになりかねないぞ、東京は怖いところなんだぞDollyねぇさん!
パイプラインを変えてから遅くなった気がするので、 instruct_pipline.py を眺めてみる。気になる箇所は一箇所。 model.generateの関数 cpu() の書きぶり。ここ、cuda() じゃいかんの?
def _forward(self, model_inputs, **generate_kwargs):
input_ids = model_inputs["input_ids"]
attention_mask = model_inputs.get("attention_mask", None)
generated_sequence = self.model.generate(
input_ids=input_ids.to(self.model.device),
attention_mask=attention_mask,
pad_token_id=self.tokenizer.pad_token_id,
**generate_kwargs,
)[0].cuda()
instruction_text = model_inputs.pop("instruction_text")
return {"generated_sequence": generated_sequence, "input_ids": input_ids, "instruction_text": instruction_text}
cuda() に書き換えて再実行・・・。・・・あんまし変わらん。うーん・・・
インストラクションを変えてみる。サマリを3点に要約してもらおう。
返事はきたが、あいかわらず遅い。返事をマチきれないユーザーが盗んだバイクでゆく宛もなく走っていっちゃうくらい遅いぞ。そして、何をいま3点要約したんだ?Dollyさんの所信表明を聞きたかったわけじゃないんだよ!
インストラクションの渡し方、伝え方(プロンプト)が間違っているのか?たぶん、そうなんだろうな。
レスポンスの遅さ、何をどうすれば早くなるのか
Instruction の使い方がまだよくわからない。そして、そのスピードの遅さ・・・。
Dollyさんとの付き合い方が、ちょっとまだわからない。。使い方を調べながら、つきあっていくわ・・・。
親切に教えてくださるコメントがあれば、何卒よろしくお願いいたします。
おまけ。
余談だが、chatux についてはこちらが詳しい。