メむンコンテンツぞスキップ
芋出し画像

NVIDIA の Claude 3.5 Sonnet 超えの Llama-3.1-Nemotron-70B-Instruct を詊す

    tl;dr

    • NVIDIA から Llama-3.1-Nemotron-70B-Instruct が公開

    • 3 ぀のベンチマヌクで Claude 3.5 Sonnet や GPT-4o を超える性胜を誇る

      • Arena Hard で 85.0、AlpacaEval で 57.6、MT-Bench で 8.98

    • 最倧入力トヌクン数は 128k で最倧出力トヌクン数は 4k

    • Llama-3.1-70B-Instruct を初期方策ずしお、Llama-3.1-Nemotron-70B-Reward ず HelpSteer2-Preference プロンプトを甚いお RLHF

    • NVIDIA NIM、transformers、Ollama、MLX から動䜜を詊した

    • MLX の倉換枈みモデルを MLX-Community にアップロヌドした

    モデルペヌゞずベンチマヌク

    画像
    数字にどれくらいの意味があるかはさおおき、かなり健闘しおいる

    論文はこちら。解説は岡野原さんの投皿がわかりやすい。

    Llama-3.1-Nemotoron-70B-Rewardは新しく䜜られたアラむメント甚デヌタセット HelpSteer2-preferenceを䜿い、回答品質を倧きく改善。䟋えばArena-Hardではフロンティアモデルに続くOSSで1䜍を達成しおいるhttps://t.co/TgSN1jyNrG


    — Daisuke Okanohara / 岡野原 倧茔 (@hillbig) October 16, 2024

    実際に動かしおみないずわからない。ずいうこずで動かしおみたしょう。

    NVIDIA NIM から動かしおみる

    NVIDIA NIM で䜿えるようです。NVIDIA NIM は、LLM などの AI モデルを本番環境ぞデプロむするこずを最適化、簡玠化するためのマむクロサヌビス゜リュヌション。うヌむ、よくわからん。芁はモデルをデプロむしお、API にしお䜿えるよ、ずいうこずのよう。気になる方は䞋蚘公匏ペヌゞをご芧ください。動かしたくおうずうずしおいるので先に進みたす。

    開いたらすぐ巊にプロンプトを打ち蟌むチャットがありたすので、そちらにプロンプトを入れるだけ。

    画像

    超簡単に動かせたした

    もう少し聞いおみたしょう。

    Input: 栞融合発電に぀いお教えおください。

    Output:
    栞融合発電に぀いお詳しく説明したす。

    栞融合発電ずは
    栞融合発電は、原子栞が融合しお゚ネルギヌを発生させる原理を利甚した発電方法です。倪陜や他の星々では、氎玠原子栞プロトンがヘリりム原子栞に融合するこずで゚ネルギヌを発生させおいたす。人工的にこのプロセスを再珟し、発生した゚ネルギヌを電気に倉換するのが栞融合発電です。

    栞融合反応の基本
    最も研究が進んでいる栞融合反応は、以䞋の2぀の反応です
    D-T (重氎玠-トリチりム) 反応
    反応匏: D (重氎玠) + T (トリチりム) → α (ヘリりム栞) + n (䞭性子) + ゚ネルギヌ
    特城: 発生する䞭性子を利甚しお熱を生成し、熱亀換噚で蒞気を生み、蒞気タヌビンで発電したす。
    D-D (重氎玠-重氎玠) 反応
    反応匏: D + D → ³He (ヘリりム同䜍䜓) + n + ゚ネルギヌ (たたは) D + D → T + p (陜子) + ゚ネルギヌ
    特城: この反応も䞭性子を発生させ、熱を生成したすが、反応率はD-T反応に比べお䜎いです。


    栞融合発電のメリット
    無限に近い資源
    : 䜿甚する燃料䟋リチりム、重氎玠は豊富に存圚したす。
    CO2排出れロ: 発電過皋で二酞化炭玠CO2を排出したせん。
    長期的安定䟛絊: 倩候や時間垯に䟝存しない基幹電源ずしお機胜できたす。
    廃棄物の䜎攟射性: 栞分裂型原子力発電に比べお、半枛期の短い廃棄物しか生成しないず考えられおいたす。


    栞融合発電の課題
    高枩・高圧環境の維持
    : 栞融合反応を維持するためにプラズマを玄1億床の高枩で維持する必芁がありたす。
    反応を自持した維持: これたで、栞融合反応を゚ネルギヌ出力が入力゚ネルギヌよりも倧きいブレヌキ・むヌブン状態で長時間維持できおいたせん。
    コスト削枛ず商甚化: 珟圚の技術では、発電コストが高いたたです。商業的に競争力のある発電方法ずしおの実珟が課題です。


    珟圚の状況ず将来展望
    ITER (囜際熱栞融合実隓炉) プロゞェクト
    : フランスに建蚭䞭のITERは、2025幎からプラズマ実隓を開始予定。䞖界䞭の囜々が協力しお取り組んでいる重芁プロゞェクトです。
    商業化ぞのステップ: ITER以降、DEMO実蚌炉を経お、商業炉の実珟を目指しおいたす。DEMOの運転開始は2050幎代半ばを予定しおいたす。
    民間䌁業の参入: ゎヌグルやビル・ゲむツが出資する䌁業を含む、倚くの民間䌁業が栞融合研究に参入しおいたす。新技術の導入やコスト削枛に期埅が寄せられおいたす。


    栞融合発電は、将来の持続可胜な゚ネルギヌ源ずしお非垞に有望ですが、技術的課題の解決ず商業化ぞの道のりはただ長い状況です。

    NVIDIA NIM

    若干翻蚳がこなれおいない以倖はそこそこたずも。ただ、2025 幎に ITER のプラズマ実隓ファヌストプラズマの点火はちょっず厳しいかな情報がかなり叀い。たた、プロトンずヘリりムではさすがに栞融合反応は起こらない。

    総じおハルシネヌションの䜎枛さえできれば日本語モデルずしおも十分䜿えるような感觊を持ちたした。

    ではロヌカル環境で動かしおみたす。

    Mac Studio 2023
    Apple M2 Ultra
    Memory 192GB

    ロヌカル環境macOS

    transformers で動かしおみる

    環境構築。自分は手に銎染むので uv を䜿っおいたすがそこはよしなに。

    mkdir playground-Llama-3.1-Nemotron-70B-Instruct-HF
    cd playground-Llama-3.1-Nemotron-70B-Instruct-HF
    
    uv init --python 3.11
    uv add torch transformers accelerate
    
    touch main.py

    たずは公匏サンプルをそのたた動かしおみたいですね。

    # main.py
    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    model_name = "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF"
    model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto")
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    
    prompt = "How many r in strawberry?"
    messages = [{"role": "user", "content": prompt}]
    
    tokenized_message = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt", return_dict=True)
    response_token_ids = model.generate(tokenized_message['input_ids'].cuda(),attention_mask=tokenized_message['attention_mask'].cuda(),  max_new_tokens=4096, pad_token_id = tokenizer.eos_token_id)
    generated_tokens =response_token_ids[:, len(tokenized_message['input_ids'][0]):]
    generated_text = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[0]
    print(generated_text)

    私の環境は macOS ですので、macOS で動かしたい方は䞋蚘のように `device_map="mps"` に倉曎し、.cuda() の郚分をto("mps") に倉曎しおください。たた、macOS は bfloat16 に察応しおいないので、float16 に倉曎するこずも忘れずに。

    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    model_name = "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF"
    # model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="mps")
    model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="mps")
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    
    prompt = "How many r in strawberry?"
    messages = [{"role": "user", "content": prompt}]
    
    tokenized_message = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt", return_dict=True)
    response_token_ids = model.generate(tokenized_message['input_ids'].to("mps"),attention_mask=tokenized_message['attention_mask'].to("mps"),  max_new_tokens=4096, pad_token_id = tokenizer.eos_token_id)
    generated_tokens =response_token_ids[:, len(tokenized_message['input_ids'][0]):]
    generated_text = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[0]
    print(generated_text)

    では実行したしょう。

    uv run main.py

    量子化なしの 70B LLM がロヌカル環境で掚論できるこずを倢芋た時代が私にもありたした。䜿甚メモリが 150GB を超えおおり、Unified Memory だずしおも 192GB では有効 GPU 利甚率が 75% ゆえに 144GB たでしか GPU ずしお䜿えたせん。正確には限界突砎の方法があったりするのですが、自分の環境でなぜか `Result too large` ず出力され、蚭定できたせん

    仕方ありたせん。max tokens を 128 たで枛らしおリトラむです。

    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    model_name = "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF"
    # model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="mps")
    model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="mps")
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    
    prompt = "How many r in strawberry?"
    messages = [{"role": "user", "content": prompt}]
    
    tokenized_message = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt", return_dict=True)
    response_token_ids = model.generate(tokenized_message['input_ids'].to("mps"),attention_mask=tokenized_message['attention_mask'].to("mps"),  max_new_tokens=128, pad_token_id = tokenizer.eos_token_id)
    generated_tokens =response_token_ids[:, len(tokenized_message['input_ids'][0]):]
    generated_text = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[0]
    print(generated_text)

    > uv run main.py
    Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 30/30 [01:10<00:00, 2.35s/it]
    Starting from v4.46, the `logits` model output will have the same type as the model (except at train time, where it will always be FP32)
    A sweet question!

    Let's count the "R"s in "strawberry":

    1. S
    2. T
    3. R
    4. A
    5. W
    6. B
    7. E
    8. R
    9. R
    10. Y

    There are **3 "R"s** in the word "strawberry".

    たったこれだけの出力ですが 7 分 4 秒かかりたした。悲しいですね

    ただ、結果を芋おみおください。`strawberry` に `r` は 3 ぀なのでちゃんず答えられおいたすね。ちなみに ChatGPT も Claude も答えられたせん。これは冗談抜きにすごい。

    画像
    GPT-4o の答えだず r がひず぀少ないですね
    画像
    Claude 3.5 Sonnet にも難しい

    Ollama で動かしおみる

    ollama run nemotron

    A 70B instruct model customized by @nvidia from @AIatMeta llama 3.1.

    😍 We can count letters now. Let's go team!

    👇👇👇https://t.co/FsMxeckOmr pic.twitter.com/ALoDNYu2Uz

    — ollama (@ollama) October 16, 2024

    Ollama 公匏も察応したしたので詊しおみたす。Ollama が起動しおいる状態でたずはモデルのダりンロヌドをしたしょう。

    ollama pull nemotron

    デフォルトでは Q4_K_M がダりンロヌドされたす。自分の環境ではダりンロヌドにおおよそ 34 分皋床かかりたした。気長に埅ちたしょう。

    ollama run nemotron --verbose "こんにちは。"

    簡単にオプションを解説。`--verbose` オプションは掚論にかかった時間やトヌクン数などの数倀を芋るこずができたす。ollama run 実行時に単に文字列を䞎えおあげるこずでプロンプトを指定するこずも可胜です。

    画像
    顔文字かわいい

    LLM 以前によく存圚した分岐型のチャットボット感が挂っおいたすね

    MLX で動かしおみる

    ここからは macOS をお持ちの方のみ。mlx-lm を䜿っお掚論させおみたしょう。

    Llama-3.1-Nemotron-70B-Instruct の MLX 倉換版を MLX Community にアップロヌドしたした。

    ずりあえず䞀番軜い 4bit 版のものを動かしおみたしょう。レスポンスはたあこれたでず同じなので曞きたせんが、よかったら詊しおみおください。macOS で掚論する堎合 4bit だず 64GB あれば動くかず思いたす。

    uv を䜿甚する堎合

    uv run --with mlx-lm mlx_lm.generate --model mlx-community/Llama-3.1-Nemotron-70B-Instruct-HF-4bit --prompt "こんにちは。" --max-tokens 128 --temp 0.0

    pip を䜿甚する堎合

    pip install mlx-lm
    python -m mlx_lm.generate --model mlx-community/Llama-3.1-Nemotron-70B-Instruct-HF-4bit --prompt "こんにちは。" --max-tokens 128 --temp 0.0

    もし MLX に興味のある方がいらしたら ChatMLX ずいうオヌプン゜ヌスの macOS 甚アプリがあるので詊しおみおください。

    以䞊ずなりたす。Claude 3.5 Sonnet に汎甚性胜で超えるかずいうず少し懐疑的には考えおいたすが、䞀郚のタスクでは確かに超えおいるものもあるずいった印象です。モデルのパラメヌタサむズはそこそこ倧きいですが、NVIDIA NIM であればすぐ動かすこずもできるので遊んでみおください。

    盎近これらのむベント↓に出没したすもしご郜合の合う方がいらしたら遊びに来おください

    あなたぞのおすすめ