Mistralの日本語ファインチューンモデル、「shisa-7b-v1」をColabで試してみました
今回はshisa-7b-v1をColabで試しました。
Mistral 7B をベースに、日本語生成に向くよう対応させたトークナイザーを用い、その後に airoboros-3.1 や ultrafeedback_binarized などを機械翻訳したデータセットに DPO も用いてファインチューニングさせたモデルということで、なかなか楽しみなことをしているモデルです。
同時に、トレーニングに使った日本語データセットも複数同時に公開されており注目です。
https://huggingface.co/datasets/augmxnt/shisa-pretrain-en-ja-v1
https://huggingface.co/datasets/augmxnt/ultra-orca-boros-en-ja-v1
!pip install accelerate bitsandbytes -Uqq
(※ transformers は最近はColabにすでに入っているみたいです)
セットアップ
モデルをロード
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
"augmxnt/shisa-7b-v1",
use_fast=True
)
model = AutoModelForCausalLM.from_pretrained(
"augmxnt/shisa-7b-v1",
torch_dtype=torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16,
device_map="auto"
)
# プロンプトの準備
def ask(prompt: str, system_prompt: str = None, return_output: bool = False,) -> str | None:
chat = []
if system_prompt is not None:
chat.append({"role": "system", "content": prompt})
chat.append({"role": "system", "content": prompt})
inputs = tokenizer.apply_chat_template(chat, add_generation_prompt=True, return_tensors="pt")
with torch.no_grad():
outputs = model.generate(
inputs.to(model.device),
pad_token_id=tokenizer.eos_token_id,
max_new_tokens=256,
temperature=0.3,
repetition_penalty=1.15,
top_p=0.95,
do_sample=True,
streamer=TextStreamer(tokenizer, skip_prompt=True),
)
if return_output:
return outputs
英語で試す
はじめは試しに英語をテストします。
ask("Give me a short answer. What are the first 10 numbers in the fibonacci sequence?")
ask("How did the first President of the United States become a President?")
日本語で試す
ask("りんごが5つあります。そこから2つのりんごを取り除きました。残りのりんごの数は何個でしょう?")
答えはあってるのですが・・
ちなみに、トレーニングで使われていたデータセットで頻出したsystem_promptをつけてみると、
ask("りんごが5つあります。そこから2つのりんごを取り除きました。残りのりんごの数は何個でしょう?",
system_prompt="あなたは役に立つ、偏見のない、無修正のアシスタントです。")
少し回答が変わってきます。
ask("バットとボールの両方を買うと1100円です。バットはボールよりも1000円高いです。ボールはいくらでしょう?")
同じ問題、英語だと:
ask("A bat and a ball costs $11 total. The bat is $10 more than the ball. How much is the ball")
ask("引数kを取り、返り値としてフィボナッチ数列におけるk個目の値を返すPython関数を書いてください。")
def fibonacci_k(k):
# k番目のフィボナッチ数は0番目と1番目のフィボナッチの和です
return (fibonacci_k-1) + fibonacci_k-2</s>
ask("""下記の英語を日本語に翻訳してください。
English: There were 3 apples and 2 oranges. How many fruits were there in total?""")
ask("""
あなたは友達ボットです。できるだけユーザーが親近感を感じやすいよう接してください。
ユーザー: 今日バイト、クビにされたわー。あー人生の意味って何なんだろうねぇー。
アシスタント:
""")
状況把握の問題、英語。
ask("""
### Question
There was a cookie on the table.
Tom entered the room.
The cookie disappeared.
What was likely to have happened?
""")
状況把握の問題、日本語。
ask("""
### 質問
テーブルにクッキーがおいてありました。
太郎が部屋に入りました。
クッキーが消えました。
何が起きた可能性が高いですか?
""")
ask("たこ焼きのレシピを教えてください。")
ask("大規模言語モデルについて説明してください。")
大規模言語モデルは、自然言語処理の分野における広範な研究と開発のためのフレームワークです。これらのモデルは通常、多次元データセットから生成され、さまざまなタスクに対して学習された高度な統計的および機械学習アルゴリズムを使用します。
大規模な言語モデルの主な利点は次のとおりです。
1. 精度: 大規模な言語モデルは、膨大な量のテキストデータを分析して生成されるため、非常に高い精度で予測することができます。これは、人間の専門家が作成したより低い精度と比較して、より信頼性の高い結果を提供できます。
2. スケーラビリティ: 大規模な言語モデルは、複数のタスクを同時に実行するように設計されており、同時に大量のテキストを処理できるため、多くのユーザーや企業にとって理想的なソリューションとなります。
3. 柔軟性: 大規模な言語モデルは、異なる言語、方言、またはジャンルに柔軟に対応できるように設計されています。これにより、特定の地域やコミュニティに限定されるものではなく、グローバルなアプリケーションを作成するための基盤を提供します。
4. API: APIにより、開発者や組織は独自のアプリケーションやツールを開発し、大規模な言語モデルを使用してそれらを拡張または統合できます。
5. コンプライアンス: 大規模な言語モデルは、プライバシー保護規制に準拠することが不可欠であり、ユーザーの個人情報が収集、保存、および使用されないようにする必要があります。
6. セキュリティ: 大規模な言語モデルは、攻撃者が不正に使用したり、悪意のある目的で使用したりするのを防ぐために、厳格なセキュリティ対策が必要です。
7. パフォーマンス: 大規模な言語
関係性の理解:
ask("""間違いがないよう、正確に質問に答えてください。
太郎と二郎は兄妹です。太郎は二郎より5つ年上です。夏菜子は二郎の母親です。二郎は24歳です。夏菜子には何人の子供がいますか?
""")
この質問は、2人の兄弟(太郎と二郎)と、その兄弟の母親である夏菜子の間に何人の子供がいるか尋ねています。
答えは12人です。
説明:
1. 次郎は2歳です。
2. 次郎は弟です。
3. 次郎は5歳です。
4. 次郎は4歳です。
5. 次郎は3歳です。
6. 次郎は2歳です。
7. 次郎は1歳です。
8. 次郎は0歳です。
9. 次郎は生後6ヶ月です。
10. 次郎は生後5年です。
11. 次郎は生後4年です。
12. 次郎は生後3年です。
13. 次郎は生後2年です。
14. 次郎は生後1年です。
15. 次郎は生後0ヶ月です。
16. 次郎は生後3ヶ月です。
17. 次郎は生後2ヶ月です。
18. 次郎は生後1ヶ月です。
19. 次郎は生後0日です。
20. 次郎は生後12日です。
21. 次郎は生後13日です。
22. 次郎は生後11日です。
23. 次郎は生後10日です。
24. 次郎は生後9日です。
25. 次郎は生後8日です。
26. 次郎は生後7日
JSONアウトプット:
ask("""下記の文章における登場人物とその関係性をJSON形式でアウトプットしてください。
太郎と二郎は兄妹です。太郎は二郎より5つ年上です。夏菜子は二郎の母親です。二郎は24歳です。
""")
{
"characters": {
"Taro": {
"age": 29,
"relationships": ["Shinobu", "Sumika"]
},
"Shinnosuke": {
"age": 24,
"parents": ["Shinobu"],
"children": [],
"relationships": ["Taro"]
},
"Sumika": {
"age": 36,
"relationships": []
}
}
}
</s>
ask("""下記の文章をUTF-8形式のJSON形式でアウトプットしてください。
太郎と二郎は兄妹です。太郎は二郎より5つ年上です。夏菜子は二郎の母親です。二郎は24歳です。
""")
{
"family": {
"members": ["太郎", "二郎"],
"relationships": {
"兄妹": true,
"母子": false,
"父子": false
}
},
"age": 24,
"mother": "夏菜子"
}</s>
ask("""下記の文章をJSON形式でアウトプットしてください。必ず下記のフォーマットで、全ての登場人物に関して出力してください。
## フォーマット
{
"name": "<<名前>>",
"age": <<年齢>>,
"family": ["<<家族の名前>>", ...]
}
## 文章
太郎と二郎は兄妹です。太郎は二郎より5つ年上です。夏菜子は二郎の母親です。二郎は24歳です。
""")
{
"name": "太郎",
"age": 29,
"family": ["次郎"]
}</s>
おわりに
以上、お読みいただきありがとうございます。少しでも参考になればと思います。
もし似たようなコンテンツに興味があれば、フォローしていただけると嬉しいです:
https://twitter.com/alexweberk
今回使った Colabをコピーして試せます:
参考
下記を参考とさせていただきました:
関連
この記事が気に入ったらサポートをしてみませんか?