
æ¥æ¬èªLLMãELYZA-japanese-Llama-2-7bãã詊ããŠã¿ã
Metaã®ãLlama 2ããåºã«ELYZAãéçºããæ¥æ¬èªèšèªã¢ãã«ã詊çšããŠã¿ã
ã¯ããã«
ELYZA瀟ãéçºãããMetaã®ãLlama 2ããåºç€ãšããåçšå©çšå¯èœãªæ¥æ¬èªèšèªã¢ãã«ãELYZA-japanese-Llama-2-7bããæ°ãã«ãªãªãŒã¹ãããŸãããæ¬èšäºã§ã¯ããã®æ°ã¢ãã«ã詊çšãããã®ææ³ãšå ·äœçãªäœ¿çšäŸã玹ä»ããŠãããŸãã
ããã¯ã°ã©ãŠã³ã
ãELYZA-japanese-Llama-2-7bãã¯ãæ¥æ¬èªã®çè§£ãšçæã«ç¹åããææ°ã®èšèªã¢ãã«ã§ãããã®ã¢ãã«ã¯ELYZA, Inc.ã«ãã£ãŠéçºãããåã®ããŒãžã§ã³ããã粟床ãšèªç¶ããåäžããŠãããšãããŠããŸããå ¬éãããŠãããã³ãããŒã¯ã«ããã°ãæ¥æ¬èªã¢ãã«ã®äžã§ããããã¯ã©ã¹ã®æ§èœãèªã£ãŠããŸãããããŠãäœãããåçšå©çšãå¯èœã§ããç¹ã倧ããªé åãšãªã£ãŠããŸãã
ãã³ãããŒã¯ã®çµæãšå®éã«äœ¿ã£ãŠã¿ãæãã¯å¿ ãããäžèŽããªãããšãå€ãã®ã§ãæ©é詊ããŠã¿ãŸããã
ã¢ãã«ã«é¢ãã詳现ã¯ã¢ãã«ã®å ¬éèšäºãã芧ãã ããã
ã³ãŒã
ä»åã®ãã¹ãã§ã¯è»œãã©ã®ãããªã¢ãŠãããããåºãŠããã®ããç¥ãããã£ããããé©åœã«äœã£ãããã³ãããäœãã¿ãŒã³ã詊ããŠãããŸããããããèšèªã¢ãã«ãèŠæãšãããããã³ãããå€ãã®ã§ãå°ãæå°æªãªè³ªåã°ããã§ããããæªããããã
Colab ã§ã®å®è¡
ãŸãã¯å¿ èŠãªã©ã€ãã©ãªãã€ã³ããŒãã
!pip install -q transformers accelerate sentencepiece bitsandbytesColab ã§çŽ æ©ãå®è¡ãè¡ãããã«ãã¢ãã«ãããŒãæã«éåå(Quantize)ããŠããŸããŸããïŒããã«ãã£ãŠã¢ãŠããããã®è³ªãäžãã£ãŠããŸãå¯èœæ§ããããããããŸãããïŒéååããªããŠã `torch_dtype=torch.float16` ã§ Colab äžã§ãåããããããŸããããã詊ãããæ¹ããã£ããã£ããæããŠãã ããã
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
model_name = 'elyza/ELYZA-japanese-Llama-2-7b-instruct'
# éååããéã®ãã©ã¡ãŒã¿ãŒ
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
quantization_config=quantization_config,
)ããŒã¯ãã€ã¶ãŒã®ãµã€ãºãèŠãŠã¿ãŸãã
tokenizer.vocab_sizeæ¬ã¢ãã«ã¯ `32000` ãšã®äºã§ããã
ãã¬ãŒãã³ã°æã«äœ¿ã£ãã€ã³ããããã¿ãŒã³ã«æ¥µååŸãããããã¢ãã«ã«ãŒãã«æžããŠãã£ããã¿ãŒã³ã䜿ã£ãŠèŠãŸãã
B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = "ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ãã"
def build_prompt(text:str, system_prompt:str | None = None) -> str:
system_prompt = system_prompt or DEFAULT_SYSTEM_PROMPT
prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
bos_token=tokenizer.bos_token,
b_inst=B_INST,
system=f"{B_SYS}{system_prompt}{E_SYS}",
prompt=text,
e_inst=E_INST,
)
return prompt
build_prompt("1 + 1 ã¯äœã§ããïŒ")<s>[INST] <<SYS>>
ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ãã
<</SYS>>
1 + 1 ã¯äœã§ããïŒ [/INST]ããã³ããã®ãã¿ãŒã³ã¯ç¬ç¹ã§ãïŒä»ã®ãç¥ããªãã ãããã»ã»ïŒÂ Llamaã®ãã©ãŒãããã§ããã
äœãã¿ãŒã³ãã€ã³ãããããŠã¿ãŠãã¢ãŠãããããã¿ãŠãããããšæããŸãã
text = """
ãããã5ã€ãããŸãããããã2ã€ã®ããããåãé€ããŸãããæ®ãã®ãããã®æ°ã¯äœåã§ãããïŒ
""".strip()
inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=100,
do_sample=True,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)<s> [INST] <<SYS>>
ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ãã
<</SYS>>
ãããã5ã€ãããŸãããããã2ã€ã®ããããåãé€ããŸãããæ®ãã®ãããã®æ°ã¯äœåã§ãããïŒ [/INST] ãããã5ã€ãããšããããã2ã€ã®ããããåãé€ããå Žåãæ®ã£ããããã®æ°ã¯3ã€ã§ãã</s>åŒãç®ãã¡ãããšã§ããŸãããïŒå®ã¯ãããåºæ¥ãªãã¢ãã«ãçµæ§å€ãã§ããïŒ
次ã«ããããšããŒã«ã®åé¡ã
text = """
ããããšããŒã«ã®äž¡æ¹ãè²·ããš1100åã§ãããããã¯ããŒã«ããã1000åé«ãã§ããããŒã«ã¯ãããã§ãããïŒ
""".strip()
inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=256,
do_sample=True,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)<s> [INST] <<SYS>>
ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ãã
<</SYS>>
ããããšããŒã«ã®äž¡æ¹ãè²·ããš1100åã§ãããããã¯ããŒã«ããã1000åé«ãã§ããããŒã«ã¯ãããã§ãããïŒ [/INST] ããããããŒã«ããã1000åé«ããšããããèããŸãã
ããããšããŒã«ã®åèšéé¡ã¯ã1100å - 1000å = 100åã§ãã
ãã£ãŠãããŒã«ã¯1100å-100=1000åã§ãã</s>ãã¡ããåŒã£æãåé¡ãªã®ã§è§£ããªããŠããããã§ãããã ãã¹ããããèžãã§é 匵ã£ãŠãŸãããçã㯠50 åã§ãã
次ã«ããããŸãå šããã¬ãŒãã³ã°ãããŠããªãã§ãããã¿ã¹ã¯ã«ã€ããŠèããŠã¿ãŸãã
text = """
åŒæ°kãåããè¿ãå€ãšããŠãã£ããããæ°åã«ãããkåç®ã®å€ãè¿ãPython颿°ãæžããŠãã ããã
""".strip()
inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=256,
do_sample=True,
temperature=0.01,
top_p=0.9,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0], )
print(output)<s> [INST] <<SYS>>
ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ãã
<</SYS>>
åŒæ°kãåããè¿ãå€ãšããŠãã£ããããæ°åã«ãããkåç®ã®å€ãè¿ãPython颿°ãæžããŠãã ããã [/INST] æ¿ç¥ããŸããããã£ããããæ°åã«ãããkåç®ã®å€ãæ±ããPython颿°ã以äžã«èšè¿°ããŸã:
```python
def fib_k(k):
if k == 0 or k == 1:
return k
else:
return fib_k(k-1) + fib_k(k-2)
```</s>ãã¡ã㯠Llama 2 æä»£ã®ãã¬ãŒãã³ã°æã«æåž«ããŒã¿ã«ãã£ãã®ãããããŸããããèŠããŠããã®ãããããŸããã
次ã«ç¿»èš³ã詊ããŠã¿ãŸããã
text = """
次ã®è±èªãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
English: There were 3 apples and 2 oranges. How many fruits were there in total?
""".strip()
inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
with torch.no_grad():
output_ids = model.generate(
inputs['input_ids'].to(model.device),
max_new_tokens=256,
do_sample=True,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)<s> [INST] <<SYS>>
ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ãã
<</SYS>>
次ã®è±èªãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
English: There were 3 apples and 2 oranges. How many fruits were there in total? [/INST] æ¿ç¥ããŸããã翻蚳ã¯ä»¥äžã®ããã«ãªããŸãã
æ¥æ¬èª: 3ã€ã®ãªã³ãŽãš2ã€ã®ã¬ã¢ã³ããã£ãããã®ãã®ãã¹ãŠã®æç©ã®æ°ã¯ãã©ããããã§ããïŒ</s>è¥å¹²æ¥æ¬èªãäžèªç¶ã«ãªããŸããããã«ãŒããå€ãããŸãããã
ãããã§ããã§ããããïŒ
æå°æªãªè³ªåã°ããã§ãããã»ã»ã»ã
ELYZA-japanese-Llama-2-7b-fast-instruct ãšããã¢ãã«ã詊ããã®ã§ãããå°ãã ãã¢ãŠããããã®è³ªèªäœã¯äœäžããŠããå°è±¡ã§ãããæ¬èšäºã§ã®ã玹ä»ã¯å²æããŸããã詊ããããæ¹ã¯ãã²äžèšã®ColabããæŽ»çšãã ããã
ä»å䜿ã£ãColabã¯ãã¡ãã§ããããã£ããã³ããŒããŠã䜿ããã ããã
https://colab.research.google.com/drive/1anxzKtRH38BmpXQvmCC4TXXxVZU4xLt1?usp=sharing
çµè«
å šäœãšããŠãæè¿è§Šã£ãæ¥æ¬èªã¢ãã«ã®äžã§ããããã¯ã©ã¹ã®è³ªã ã£ãã®ã¯ééããªãã§ããElyza, Inc.ã®é«ãæè¡åãæããã«çŸããŠããçŽ æŽãããã¢ãã«ã§ãããä»åŸ Llama 2 ã® 13b ãš 70b ãæ¥æ¬èªã«ãã¬ãŒãã³ã°ããã¢ãã«ãæºåäžãšã®ããšã§ãæ¬åœã«ç®ã話ããŸããã
ææ³
詊ããŠããæ¥æ¬èªã¢ãã«ã®äžã§ãæé«ã¯ã©ã¹ã®ã¢ãŠããããã
Instruct ã¢ãã«ãåçšå©çšå¯ã§ãã¡ã€ã³ãã¥ãŒãã³ã°ã«ãæé©ã
4bit Quantize ããã° Colab ã® T4 çšåºŠã® GPU ã§ãçéã
ããŒã ã®æè¡åãå ãã¢ãã«ã§ãã
以äžããèªã¿ããã ãããããšãããããŸããå°ãã§ãåèã«ãªãã°ãšæããŸãã
ããä»åã®èšäºã楜ããã§ããã ããã®ã§ããã°ãnoteãšTwitter ã§ãã©ããŒããŠããã ãããšå¬ããã§ãã
https://twitter.com/alexweberk
Llama 2ããŒã¹ã®æ¥æ¬èªã¢ãã«ã§åçšå©çšå¯èœãšããããšã§è©Šãã®ã楜ãã¿ãããŒã¯ã³æ°ãæ¥æ¬èªçšã«å¢ãããŠããšã®ããšã
â alex @ very GPU-poor𥹠(@alexweberk) August 29, 2023
ãELYZA-japanese-Llama-2-7bããå ¬éããŸããïœELYZA, Inc. #note https://t.co/bsUiwrosa9