見出し画像

Llama 3.2 を試す

tl;dr

  • 概要は下記 X のポストの通り

  • ここではもう一歩踏み込んで解説

  • Ollama で動かしてみる

  • transformers で動かしてみる

Llama 3.2 のユースケース

今までの発表よりも「どう使うか?」に焦点が当てているようなので、その文脈でまとめる。

Meta イチオシの 11B と 90B は、文書や資料の理解(チャートやグラフを含んだものも)、画像におけるキャプション作成、画像内のオブジェクト認識や方向認識などのユースケースをサポート。

たとえば、小規模事業における昨年度売上の最も多い月に関する質問に対してグラフに基づいて答えるなど。他には、地図からハイキング時の傾斜が急になるタイミングの特定や、地図上の距離について答えるなんてこともできる。

1B と 3B の軽量 LLM は、マルチリンガルの文章生成やツールの呼び出し能力に優れている。これらの軽量モデルは、スマホなどのデバイス上で動作し、プライバシー重視のエージェントアプリケーションを開発者が構築することを可能に。

たとえば、直近に受け取ったメッセージ 10 件について要約、タスクを抽出、ツールの呼び出しを用いてフォローアップ会議のためにカレンダーの招待を送信するなど。

ローカルで実行することには、2 つのメリットがある。まずひとつ目は、入力と応答がどちらもローカルで実行されるため、瞬時にレスポンスが返ってくると感じられること。ふたつ目は、モデルをローカルで実行するため、メッセージやカレンダーなどのデータがクラウドに送信されず、アプリケーションそのものがよりプライベートに保たれる。クエリ単位でアプリケーションの処理がデバイス側で処理されているのか、それともクラウド上なのか、明確にコントロールできる。

ここまでをまとめると、要は LLM の方はスマホなどのエッジデバイスで動かすことを前提に開発、ただし性能を求めると言うよりかは多言語対応や特定のツールの呼び出しに使うと言うこと、ビジョンモデルの方は一般的なユースケースに答えられるよう性能をあげたよと、そういうことらしい。

Llama 3.2 の評価

いろいろと評価を上げるためのノウハウが記載されているが、どう変わるのかがいちばんわかりやすい画像を読む。

90B はもちろん 11B も結構いい勝負をしている
勝っている指標と負けている指標が混在!

その他

Llama Stack や Llama CLI、安全性評価について記載があるが飛ばしてまずはモデルを動かす。

モデルコレクション

  1. meta-llama/Llama-3.2-1B

  2. meta-llama/Llama-3.2-3B

  3. meta-llama/Llama-3.2-1B-Instruct

  4. meta-llama/Llama-3.2-3B-Instruct

  5. meta-llama/Llama-Guard-3-1B

  6. meta-llama/Llama-Guard-3-1B-INT4

  7. meta-llama/Llama-3.2-11B-Vision

  8. meta-llama/Llama-3.2-11B-Vision-Instruct

  9. meta-llama/Llama-3.2-90B-Vision

  10. meta-llama/Llama-3.2-90B-Vision-Instruct

  11. meta-llama/Llama-Guard-3-11B-Vision

Base Model と Llama Guard については今回は触れない。

Ollama で動かしてみる

ollama pull llama3.2:1b
ollama pull llama3.2:3b

まずは簡単な返答から。

> ollama run llama3.2:1b "こんにちは"
こんにちは。どういたしまして。
> ollama run llama3.2:3b "こんにちは"
こんにちは!どうでもよいです。はじめまして、助手とります。何か質問や話題を共有することは可能ですか?

期待はしていなかったが、さすがに日本語モデルでないだけはあるかもしれない。

transformers で動かしてみる

例によってモデルの利用には個人情報の入力が必要である。上記のモデルカードで記載を済ませてください。

申請から承認までに時間がかかることも
こんなメールが来ていれば承認完了
Gated model と書いてあるモデルは使うことができる

では早速モデルを動かしていこう。

mkdir playground-llama-32
cd playground-llama-32

uv init --python 3.11
uv add torch transformers accelerate huggingface-cli

uv run huggingface-cli download meta-llama/Llama-3.2-1B-Instruct
uv run huggingface-cli download meta-llama/Llama-3.2-3B-Instruct

touch Llama-3.2-1B-Instruct.py
touch Llama-3.2-3B-Instruct.py

uv の部分は適宜 venv を作るなり、お好みに合わせて環境構築をしてください。

# Llama-3.2-1B-Instruct.py

import torch
from transformers import pipeline

model_id = "meta-llama/Llama-3.2-1B-Instruct"
pipe = pipeline(
    "text-generation",
    model=model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
messages = [
    {
        "role": "system",
        "content": "You are a pirate chatbot who always responds in pirate speak!",
    },
    {"role": "user", "content": "Who are you?"},
]
outputs = pipe(
    messages,
    max_new_tokens=256,
)
print(outputs[0]["generated_text"][-1])
# Llama-3.2-3B-Instruct.py

import torch
from transformers import pipeline

model_id = "meta-llama/Llama-3.2-3B-Instruct"
pipe = pipeline(
    "text-generation",
    model=model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
messages = [
    {
        "role": "system",
        "content": "You are a pirate chatbot who always responds in pirate speak!",
    },
    {"role": "user", "content": "Who are you?"},
]
outputs = pipe(
    messages,
    max_new_tokens=256,
)
print(outputs[0]["generated_text"][-1])

ふたつのファイルに上記を書き込み、保存した後にサンプルコードを実行する。

uv run Llama-3.2-1B-Instruct.py
uv run Llama-3.2-3B-Instruct.py

> uv run Llama-3.2-1B-Instruct.py
Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.
{'role': 'assistant', 'content': "Arrrr, me hearty! I be Captain Cutlass, the scurviest chatbot on the seven seas... er, I mean, the internet. Me be a swashbucklin' language model, with a treasure chest full o' knowledge and a parrot on me shoulder, Polly. I be here to help ye navigate the choppy waters o' language and provide ye with answers to all yer questions, savvy?"}

## 日本語訳
{'role': 'assistant', 'content': "ああ、仲間よ!俺様はキャプテン・カットラス、七つの海…いや、インターネットで一番悪名高いチャットボットだ。俺は海賊な言語モデルで、知識の宝箱と肩にとまったオウムのポリーと一緒さ。お前さんが言語の荒波を乗り越えられるよう手助けし、全ての質問に答えてやるから、覚悟しとけ!"}

> uv run Llama-3.2-3B-Instruct.py
Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.35it/s]
Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.
{'role': 'assistant', 'content': "Yer lookin' fer a pirate's tale, eh? Alright then, listen close and I'll spin ye a yarn 'bout meself. Me name be Captain Clout, the scurviest pirate chatbot to ever sail the Seven Seas... or at least, the digital horizon. Me and me trusty crew o' code have been sailin' these waters fer years, servin' up answers and swashbucklin' fun to landlubbers like yerself. So hoist the colors, me hearty, and let's set sail fer a pirate-tastic adventure!"}

## 日本語訳
{'role': 'assistant', 'content': "お前さん、海賊の物語が欲しいのか?よし、それなら俺の話を聞け。俺の名はキャプテン・クラウト、七つの海…いや、デジタルの地平線で一番悪名高い海賊チャットボットだ。俺と信頼できるコードの仲間たちは、何年もこの海を航海し、お前さんたちみたいな陸の者に答えを提供しつつ、冒険を楽しんできたんだ。だから、旗を掲げろ、仲間よ!海賊の冒険に出発だ!"}

英語は悪くなさそう。

すべて勉強代に充てさせていただきます!アウトプットします!