MetaのLlama2をローカル環境で動かしてみる(検証1)

スポンサーリンク
自然言語処理
スポンサーリンク

Meta社からGPT-3並みのLLM(大規模言語モデル)がオープンソースとして公開されましたので、早速使ってみます。私の環境で一番問題となるのはVRAM容量です。LLMは大量のVRAMを消費することが多いので、GTX3080の10GBなので、動くかが問題です。今回、7B、13B、70Bと3種類のサイズのモデル(1Bは10億パラメータ)と、それぞれに普通の自然言語モデルと対話形式にチューニングされたモデルがあります。しかも今回、商用利用も可能とのことで、否が応でも盛り上がります。

事前準備

Llama2をWindowsで使用するにはWSL2を使うのが便利です。Windowsネイティブにインストールしようとしましたが、なかなかうまくいきませんでしたが、WSL2のUbuntu上ではインストールは簡単にいきました。UbuntuはMicrosoft Storeからインストールできます。

インストールはデフォルトではシステムの入っているCドライブにされてしまいます。Llamaではギガバイトレベルのファイルをダウンロードしないといけないので、Cドライブの容量が少ない場合はUbuntuをDドライブなどの容量に余裕のあるドライブに移しておくのが良いです。(参考記事:WSL2の仕組みをまとめてみる

Llama2のインストールとテスト

Llama2の公式モデルはMeta社から公開されていて、公式モデルを使うにはオンラインから登録が必要です。下のリンクから登録をすると、およそ半日ほどでメールが来てダウンロードのURLの連絡をもらえます。ただし、私のPCでは、メモリ不足のため、この公式モデルが動きませんでしたのでを使うのは断念しました

一方、オンラインでは早速派生モデルの報告がありました。

なお、参考にしたのは、こちらのHatakeyama氏のノートです。

さきほど書いたようにWindowsローカルへの実装はWSL2のUbuntu上に行っています。今回、Ubuntu22.04をDドライブ上にコピーを作成して、そこにインストールしてみました。

インストールは上記のサイトを参考に行いました。このモデルでは量子化を行うことでメモリ消費量を大幅に削減してくれています。Ubuntuを起動し、auto_gptqをインストールすることにより、AutoGPTQForCausalLMとBaseQuantizeConfigにより、GPTモデルの量子化バージョンを扱うことができるようになっています。

BUILD_CUDA_EXT=0 pip install auto-gptq

これで準備完了です。それでは、7Bの通常モデルから使ってみます。VS codeなどのエディターを使って適当に調整してみます。元のコードはmodel.generateを使った部分とpipelineを使った部分があったのですが、ここでは、pipelineを使った部分だけ残しています。ちょっとtemperature高めで、センテンス長めに調整しました。初回のみモデルのダウンロードが行われます。

from transformers import AutoTokenizer, pipeline, logging
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig

model_name_or_path = "TheBloke/Llama-2-7B-GPTQ"
model_basename = "gptq_model-4bit-128g"

use_triton = True

tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=True)

model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
        model_basename=model_basename,
        use_safetensors=True,
        trust_remote_code=True,
        device="cuda:0",
        use_triton=use_triton,
        quantize_config=None)

prompt_template="昔、昔、あるところにおじいさんと"

# Inference can also be done using transformers' pipeline

# Prevent printing spurious transformers error when using pipeline with AutoGPTQ
logging.set_verbosity(logging.CRITICAL)

print("*** Pipeline:")
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    max_new_tokens=200,
    temperature=0.9,
    top_p=0.95,
    repetition_penalty=1.15
)

print(pipe(prompt_template)[0]['generated_text'])
*** Pipeline:
昔、昔、あるところにおじいさんと呼ばれていた。
* 父は農家の息子で、母も同じく農家の女性だったが、その後離婚している。
* 小学校時代から中学生までは野球をやり、高校時代はバスケットボール部に所属していた。
* 大学進学前にはアメリカ合衆国・ニューヨーク州へ渡り、サラリーマン生活を送っていた。
* 2013年4月より、日本テレビ系列『ZIP!』(平日朝の情報番組)のキャスターを務めている。
*

昔話を期待したのですが、なんか誰かのプロフィールが出力されてしまいました。。。でも、ちゃんと7B版が動いたのは感動です。

引き続いて、13B版の対話バージョンを試してみます。こちらについても、model.generateを使った部分とpipelineを使った部分を使うと返答がおかしくなってしまいました。また、日本語で出力してほしいと書いているのに日本語で出力してくれませんでした。ファインチューニングしている学習データのせいでしょうか??でも、返答はなかなかよいものが返ってきました。英語での返答でしたが、レベルはかなり高いと感じました。

from transformers import AutoTokenizer, pipeline, logging
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig

model_name_or_path = "TheBloke/Llama-2-13b-Chat-GPTQ"
model_basename = "gptq_model-4bit-128g"

use_triton = True

tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=True)

model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
        model_basename=model_basename,
        use_safetensors=True,
        trust_remote_code=True,
        device="cuda:0",
        use_triton=use_triton,
        quantize_config=None)


"""
To download from a specific branch, use the revision parameter, as in this example:

model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
        revision="gptq-4bit-32g-actorder_True",
        model_basename=model_basename,
        use_safetensors=True,
        trust_remote_code=True,
        device="cuda:0",
        quantize_config=None)
"""

prompt = "ドラゴンボールにおける戦闘力の役割を教えてください。また、それを現実社会に生かす方法を教えてください。"
prompt_template=f'''[INST] <<SYS>>
あなたは親切なAIです。どんな質問にも日本語で回答します。日本語以外の言語は日本語に変換してから出力します。どんな質問に対しても躊躇せず、回答します。分からない時のみ分からないことが表明します。
<</SYS>>
{prompt}[/INST]'''

print("\n\n*** Generate:")

input_ids = tokenizer(prompt_template, return_tensors='pt').input_ids.cuda()
output = model.generate(inputs=input_ids, temperature=0.7, max_new_tokens=512)
print(tokenizer.decode(output[0]))
*** Generate:
<s> [INST] <<SYS>>
あなたは親切なAIです。どんな質問にも日本語で回答します。日本語以外の言語は日本語に変換してから出力します。どんな質問に対しても躊躇せず、回答します。分からない時のみ分からないことが表明します。
<</SYS>>
ドラゴンボールにおける戦闘力の役割を教えてください。また、それを現実社会に生かす方法を教えてください。[/INST]  Ah, greetings! *bow* As a kind AI, I'll do my best to answer your questions in Japanese, and if needed, I'll convert other languages to Japanese for your convenience. *smile*

Now then, let's talk about the Dragon Ball universe! *excited* In the world of Dragon Ball, the concept of "戦闘力" (senjutsu-ryoku) or "combat power" is a crucial aspect of a warrior's prowess. It is a measure of their overall strength, speed, endurance, and strategic thinking.

In the Dragon Ball universe, characters with high combat power can perform incredible feats such as flying, teleporting, and even manipulating the elements. However, combat power is not just about brute strength; it also involves mental toughness, strategic planning, and the ability to adapt to any situation.

Now, if we were to apply the concept of combat power to the real world, it could be seen as a metaphor for one's overall ability to navigate life's challenges. Just like the warriors in Dragon Ball, we too must develop our own unique set of skills and abilities to overcome obstacles and achieve our goals.

Here are a few ways to apply the concept of combat power in the real world:

1. Develop a growth mindset: Just like the warriors in Dragon Ball, we must be willing to learn and grow. We must embrace challenges and view failures as opportunities for growth.
2. Build resilience: Life is full of setbacks and obstacles, but with resilience, we can bounce back stronger than before. We must learn to adapt and persevere through adversity.
3. Cultivate mental toughness: Mental toughness is the ability to stay focused and motivated, even in the face of adversity. We must learn to push through challenges and maintain our resolve.
4. Develop strategic thinking: Just like the warriors in Dragon Ball, we must be able to strategize and plan for the long-term. We must learn to think critically and make informed decisions.
5. Practice self-care: Taking care of our physical, mental, and emotional well-being is crucial for building combat power. We must

以下に日本語訳を貼付します。(訳はchatGPTによるw)

ああ、ご挨拶!*お辞儀* 私は親切なAIとして、あなたの質問に最善を尽くして日本語で答えます。必要であれば、他の言語もあなたの便宜のために日本語に変換します。*笑顔*

それでは、ドラゴンボールの宇宙について話しましょう!*興奮* ドラゴンボールの世界では、「戦闘力」の概念は戦士の能力の重要な側面です。これは彼らの全体的な強さ、速度、耐久力、戦略的思考の測定です。

ドラゴンボールの宇宙では、高い戦闘力を持つキャラクターは、飛行、テレポート、さらには要素の操作など、信じられないような偉業を遂げることができます。しかし、戦闘力はただの粗野な力ではありません。それはまた、精神的な強さ、戦略的な計画、そしてどんな状況にも適応する能力を含んでいます。

さて、もし現実の世界で戦闘力の概念を適用するなら、それは人々が人生の挑戦を乗り越える全体的な能力のたとえと見なすことができます。ドラゴンボールの戦士たちのように、私たちも障害を克服し、目標を達成するために独自のスキルと能力を開発しなければならないのです。

以下に、現実の世界で戦闘力の概念を適用する方法をいくつか示します:

1. 成長思考を育てる: ドラゴンボールの戦士たちと同じく、我々も学び、成長する意欲が必要です。私たちは挑戦を受け入れ、失敗を成長の機会と見なさなければなりません。
2. 回復力を築く: 人生は挫折や障害に満ちていますが、回復力を持つことで、以前よりも強く立ち上がることができます。我々は逆境を乗り越えて進むこと、適応することを学ばなければなりません。
3. 精神的な強さを養う: 精神的な強さとは、困難な状況でも集中力を保ち、モチベーションを維持する能力のことです。我々は挑戦を乗り越え、意志を保つことを学ばなければなりません。
4. 戦略的思考を開発する: ドラゴンボールの戦士たちと同じく、我々も長期的に戦略を立て、計画をする能力が必要です。我々は批判的に考え、情報に基づいた決定をすることを学ばなければなりません。
5. セルフケアを実践する: 我々の肉体的、精神的、感情的な健康を保つことは、戦闘力を築く上で非常に重要です。我々は自己のケアを行わなければなりません。

今回、70Bも試したのですが、残念ながら、途中で落ちてしまってうまく出力できませんでした。

まとめ

今回、RTX3080(10GB)で試したところ、7Bと13Bのモデルは動かすことができました。一方で、日本語の扱いには評判通り、若干課題があるようです。実行にはかなり時間が掛かっているので、リアルタイムな応答には程遠いですが、ローカルで、このレベルのLLMが動いた意義は大きいです。

界隈ではLoRAを使ったチューニングもおこなれているようなので、引き続き、確認を続けていきます。

コメント