
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幎代åã°ãäºå®ããŠããŸãã
æ°éäŒæ¥ã®åå ¥: ãŽãŒã°ã«ããã«ã»ã²ã€ããåºè³ããäŒæ¥ãå«ããå€ãã®æ°éäŒæ¥ãæ žèåç ç©¶ã«åå ¥ããŠããŸããæ°æè¡ã®å°å ¥ãã³ã¹ãåæžã«æåŸ ãå¯ããããŠããŸãã
æ žèåçºé»ã¯ãå°æ¥ã®æç¶å¯èœãªãšãã«ã®ãŒæºãšããŠéåžžã«ææã§ãããæè¡ç課é¡ã®è§£æ±ºãšåæ¥åãžã®éã®ãã¯ãŸã é·ãç¶æ³ã§ãã
è¥å¹²ç¿»èš³ãããªããŠããªã以å€ã¯ãããããŸãšãããã ã2025 幎㫠ITER ã®ãã©ãºãå®éšïŒãã¡ãŒã¹ããã©ãºãã®ç¹ç«ïŒã¯ã¡ãã£ãšå³ããããªïŒæ å ±ãããªãå€ãïŒããŸãããããã³ãšããªãŠã ã§ã¯ãããã«æ žèååå¿ã¯èµ·ãããªãã
ç·ããŠãã«ã·ããŒã·ã§ã³ã®äœæžããã§ããã°æ¥æ¬èªã¢ãã«ãšããŠãåå䜿ãããããªæè§Šãæã¡ãŸããã
ã§ã¯ããŒã«ã«ç°å¢ã§åãããŠã¿ãŸãã
Mac Studio 2023
Apple M2 Ultra
Memory 192GB
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 ãçããããŸãããããã¯åè«æãã«ãããã


Ollama ã§åãããŠã¿ã
ollama run nemotron
â ollama (@ollama) October 16, 2024
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 ãèµ·åããŠããç¶æ ã§ãŸãã¯ã¢ãã«ã®ããŠã³ããŒããããŸãããã
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.0pip ã䜿çšããå Žå
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 ã§ããã°ããåããããšãã§ããã®ã§éãã§ã¿ãŠãã ããã
çŽè¿ãããã®ã€ãã³ãâã«åºæ²¡ããŸãïŒãããéœåã®åãæ¹ããããããéã³ã«æ¥ãŠãã ããïŒ