Aya 23,8B and 35B をmlx+GradioとOllamaで動かしてみる
昨晩、突如発表された、⌘R、⌘R+を出している会社 Cohereが、新しいモデルを公開しました。
公開と同時にHuggingFaceにモデルもアップロードされましたので、8Bをmlxで動かしてみました。
35BモデルはCohereのplaygroundと、huggingSpaceで試せましたが、8Bはローカルでしか試せない状態でした。
とりあえず、ダイレクトにCLIで動くかを試しました。
mlx_lm.generate --model CohereForAI/aya-23-8B --prompt "Hello"
chat templateも読み込んで、綺麗に出力されてきました。
mlxもmlx-lmもどんどんアップデートしてますので、pip install -U mlx-lm 等忘れずにしてみてください。
以前作ったGradioを使うPythonスクリプトを使って8Bモデルを動かしてみます。(stop words は本当は変更しないといけないのでしょうが、そのままで問題ありませんでした。あと余分なimportもしてあるので適宜削除してください)
import time
import datetime
import json
import gradio as gr
#from mlx_lm import load, generate
import mlx.core as mx
from mlx_lm.utils import load, generate_step
model, tokenizer = load("CohereForAI/aya-23-8B")
stop_words = ["<|im_start|>", "<|im_end|>", "<s>", "</s>"]
def predict(message, history, system_message, context_length, temperature):
tokens = []
skip = 0
prompt = []
for human, assistant in history:
prompt.append({'role': 'user', 'content': human})
prompt.append({'role': 'assistant', 'content': assistant})
prompt.append({'role': 'user', 'content': message})
prompt.insert(0, {'role': 'system', 'content': system_message})
#print (f"履歴の形はこんな感じ:\n {history}")
#print (f"promptの形はこんな感じ:\n {prompt}")
inputs = tokenizer.apply_chat_template(prompt,
tokenize=False,
add_generation_prompt=True)
for (token, prob), n in zip(generate_step(mx.array(tokenizer.encode(inputs)), model, temperature),
range(context_length)):
if token == tokenizer.eos_token_id:
break
tokens.append(token)
text = tokenizer.decode(tokens)
trim = None
for sw in stop_words:
if text[-len(sw):].lower() == sw:
# definitely ends with a stop word. stop generating
return
else:
# if text ends with start of an end word, accumulate tokens and wait for the full word
for i, _ in enumerate(sw, start=1):
if text[-i:].lower() == sw[:i]:
trim = -i
# flush text up till trim point (beginning of stop word)
yield text[skip:trim]
#skip = len(text)
demo = gr.ChatInterface(predict,
title="CohereForAI/aya-23-8B",
description="Dolphin system prompt for general storywriting.",
additional_inputs=[
gr.Textbox("You are Aya, a larage language model trained to have plite, helpful, inclusive conversations with people.", lines=5, max_lines=50, label="System Prompt"),
gr.Slider(100, 3000, value=300, label="Tokens to generate"),
gr.Slider(0, 1, value=0.3, label="Temperture")
]
)
if __name__ == "__main__":
demo.launch()
久しぶりにGradioも立ち上げたので、注意がでたので、Gradioもupgradeしました。
対話例
こんにちは、あなたは誰?
こんにちは!私はコーラルというAIアシスタント・チャットボットです。あなたのお手伝いをするためにここにいます。何かお手伝いできることはありますか?
人生の意味を論じて
人生の意味を探求することは、多くの哲学者や思想家が取り組んできた深い問いです。人生の意味は、個人によって異なるかもしれませんし、時間の経過とともに変化する可能性もあります。人生の意味を見つけるためのいくつかの一般的な考え方は次のとおりです。
目的と目標:人生の意味は、個人的な目標や目的を達成することに見出すことができます。これは、キャリア、家族の構築、社会への貢献、または個人的な情熱の追求など、自分にとって重要なものに焦点を当てることです。目標に向かって努力し、それらを達成することで、人生に目的意識と満足感が得られます。
関係とつながり:多くの人にとって、人生の意味は人間関係やつながりの中に見出されます。家族、友人、コミュニティとの深い絆を築き、愛し、支え合うことで、人生に目的と充実感がもたらされます。他者とのつながりや、より大きな善のための貢献は、人生に意義と目的を与えることができます。
個人的成長と自己実現:人生の意味は、個人的な成長と自己実現の追求にあると考えることもできます。自分の可能性を最大限に発揮し、新しいスキルを学び、自分の限界を押し広げ、自分の限界を押し広げることで、人生に目的意識が生まれます。自己改善
メモ:300トークンに制限してたので、ここで終わりました
メタファーを使って説明して
人生の旅をナビゲートすることは、迷路を歩むようなものです。人生の意味は、その迷路の目的地に達することです。
人生の迷路には、さまざまな道や選択肢が散らばっています。ある人は、成功と富の道を選ぶかもしれません。他の人は、家族やコミュニティとのつながりを育む道を選ぶかもしれません。また、知識や自己発見の探求を選ぶ人もいるでしょう。
人生の意味は、これらの道を歩み、自分の目的地を定義することです。成功や富は、一部の人にとっては人生の意味を見出すための道標となるかもしれません。しかし、家族やコミュニティとの深い絆は、別の人にとっては人生の目的の源泉となるかもしれません。自己発見の旅は、自分の情熱と目的を発見し、人生に独自の意味を与えるための道となる可能性があります。
人生の迷路を歩きながら、私たちは挑戦や障害に直面します。これらの課題は、人生の意味を形作るための機会でもあります。困難を乗り越え、回復力と適応力を養い、逆境を乗り越えることで、私たちは成長し、人生の意味をより深く理解する可能性があります。
人生の意味は、私たちが迷路に沿って残した足跡でもあります。私たちが他の人に与える影響と、
上のような感じで、綺麗な日本語生成がされます。23ヶ国語対応ということで、翻訳にも役立ちそうですが、そこは試してません。
そして、今朝のX(Twitter)をみたら、Ollamaがすでに対応していました。
自分は、Q8の35Bモデルを以下で試しましたが、問題なく動きました。
ollama run aya:35b-23-q8_0
半日の経たないうちにOllamaで使えることがありがたいです。
Ollamaを使う時には、恒例のPage Assistを推しておきます。
⌘Rと同じ35Bですが、多分24言語に絞ったので、それなりに日本語の読解と生成能力も高まったのではと期待しています。
ただ日本国内で培われている人文社会系の知識はまだまだなのは残念です。そのあたりのデータセットがちゃんとできていないのが問題なんだと思います。
とりあえず速報かつお試しの報告です。
#AI #AIとやってみた #やってみた #大規模言語モデル #日本語能力 #プロンプト #Aya #ローカルLLM #LLM