GPT-4 超えは本当か否か? Xwin-70b を試してみる
今回は AlpacaEval において GPT-4 超えたとされる Xwin-70b を試してみます。
Huggingface: https://huggingface.co/Xwin-LM/Xwin-LM-70B-V0.1
論文: 未発表
ライセンス: Llama 2 License
コードと手順
Colab で試してみます。
まず初めに、Colab 環境で動くよう何かしらの量子化が必要で初め bitsandbytes を使ってみてたのですが、残念ながらパラメーターのデータ量が多すぎて保存領域が足りなくなってしまいました。
そこで、npaka さんの記事を参考に、The Bloke さんが GPTQ 方式で量子化したものをロードすることにしました。
必要なライブラリをインストール
!pip install transformers accelerate sentencepiece optimum auto-gptq -Uqq
モデルの用意
GPTQ 方式で量子化された Xwin-70b モデルをロードします。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# , BitsAndBytesConfig
# quantization_config = BitsAndBytesConfig(
# load_in_4bit=True,
# bnb_4bit_use_double_quant=True,
# bnb_4bit_quant_type="nf4",
# bnb_4bit_compute_dtype=torch.bfloat16,
# )
model_id = "TheBloke/Xwin-LM-70B-V0.1-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
trust_remote_code=True,
# quantization_config=quantization_config,
device_map='auto',
).eval()
トークナイザーのサイズを確認。
tokenizer.vocab_size
まずは Huggingface のモデルカードにあるサンプルを走らせてみます。
(
prompt := "A chat between a curious user and an artificial intelligence assistant. "
"The assistant gives helpful, detailed, and polite answers to the user's questions. "
"USER: Hello, can you help me? "
"ASSISTANT:"
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
samples = model.generate(**inputs, max_new_tokens=200, temperature=0.7)
output = tokenizer.decode(samples[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(output)
まずは英語の解答はとても自然でした。
色々と質問してみる
日本語で質問してみたいと思います。
text = """
USER: りんごが5つあります。そこから2つのりんごを取り除きました。残りのりんごの数は何個でしょう?
ASSISTANT:
""".strip()
inputs = tokenizer(text, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=100,
do_sample=True,
temperature=0.1,
top_p=0.95,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
簡単な引き算はできましたが、生成された日本語は少し不自然です。
text = """
USER: バットとボールの両方を買うと1100円です。バットはボールよりも1000円高いです。ボールはいくらでしょう?
ASSISTANT:
""".strip()
inputs = tokenizer(text, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=512,
do_sample=True,
temperature=0.1,
top_p=0.95,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
正解は50円でした。
text = """
USER: 引数kを取り、返り値としてフィボナッチ数列におけるk個目の値を返すPython関数を書いてください。
ASSISTANT:
""".strip()
inputs = tokenizer(text, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=512,
do_sample=True,
temperature=0.1,
top_p=0.95,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
<s> USER: 引数kを取り、返り値としてフィボナッチ数列におけるk個目の値を返すPython関数を書いてください。
ASSISTANT: def fibonacci_number(k):
if k <= 1:
return k
a, b = 0, 1
for _ in range(k - 2):
c = a + b
a, b = b, c
return b
# テスト
k = 5
print(fibonacci_number(k))
```python
</s>
次に翻訳の問題を試します。
text = """
USER: 次の内容を日本語に訳してください。"There were 3 apples and 2 oranges. How many fruits were there in total?"
ASSISTANT:
""".strip()
inputs = tokenizer(text, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=100,
do_sample=True,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
text = """
USER: 大規模言語モデルについて説明してください。
ASSISTANT:
""".strip()
token_ids = tokenizer.encode(text, 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.2,
top_p=0.95,
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)
英語も試してみます。
text = """
USER: What are the differences in training methods between Pre-training, SFT training, Instruction training, PPO training, RHLF training in the context of LLMs?
ASSISTANT:
""".strip()
inputs = tokenizer(text, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=2048,
do_sample=True,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
生成されている英語はとても品質が高い印象です。ただ、SFT (Supervised Fine-Tuning) に関しては誤った内容が生成されておりました。
参考までに、gpt-3.5-turbo のアウトプットは以下でした。
まとめ
GPT-4 超えと呼ばれる Xwin-70b を試してみましたが、生成内容の品質は高めではあるものの、主観ベースだと gpt-3.5 にも及んでいない印象でした。
日本語よりも英語の生成の品質が圧倒的に高かったという印象です。
ただ、プロンプトの仕方があってないなどはあったのかもしれないのでモデルの本領が発揮できたかはわかりません。また、今回試せたのはGPTQ版ではあるため、それによって品質が低下した可能性も(少しは)あります。
Colab+のプランでも、 70B 規模のモデルともなると GPU のメモリだけではなく Disk 容量の方においても開けるモデルが限られてくる。ぱっと調べた感じだと Colab の Disk 領域を簡単に拡張する方法が見つかりませんでした。
以上、お読みいただきありがとうございます。少しでも参考になればと思います。
もし似たようなコンテンツに興味があれば、フォローしていただけると嬉しいです:
https://twitter.com/alexweberk
今回の Colab はこちらです:
関連
参考
この記事が気に入ったらサポートをしてみませんか?