
stabilityai/japanese-stablelm-instruct-alpha-7b-v2ããã£ã©ä»ããã
10æ6æ¥ã«StabilityAIããjapanese-stablelm-instructã®V2ãçºè¡šãããŸãããåŸæ¥ã¯ç ç©¶çšãšããŠåæ¥å©çšãåºæ¥ãŸããã§ããããV2ããApache 2.0 ã©ã€ã»ã³ã¹ãšãªããåçšå©çšãå¯èœã§ããä»åã®èšäºã¯ã¯ããã«ãstabilityai/japanese-stablelm-instruct-alpha-7b-v2ã®åããæ¹ã説æããããšãããã³ããã®åããçè§£ããããšãç®çãšããŠgradioã§GUIãäœæãããã£ã©äœãã詊ããŸããã
ç°å¢
CUDA-Toolkitã¯å¿ ãå¿ èŠã§ããçè ã®ç°å¢ã¯GPUã§3000ç³»ãš4000ç³»ããããããææ°ã®Toolitã«ãªã£ãŠããŸããã€ã³ã¹ããŒã«ã¯Nvidiaã®ãµã€ãã«ç°å¢ã«åãããæ¹æ³ãéžã¹ãããã«ãªã£ãŠããŸãã以äžã¯ãnvcc -Vã§èª¿ã¹ãçè ã®ç°å¢ã§ãã12.2 ãªã®ã§ã»ãŒææ°ã§ãã
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jun_13_19:16:58_PDT_2023
Cuda compilation tools, release 12.2, V12.2.91
Build cuda_12.2.r12.2/compiler.32965470_0Pythonã3,9ã§ããã3.10ã§ãåé¡ã¯ãªããšæããŸãã
PyTorch
CUDAã«åãããŠã€ã³ã¹ããŒã«ããŸããçŸæç¹ã§ã¯CUDA12.2ã«ããPyTorchã¯2.10ã§ãã
transformersãªã©
pip install transformers accelerate bitsandbytes
pip install sentencepiece einopså ¬åŒã®install.txtã«ã¯sentencepiece einopsããç¡ãã®ã§ãå¿ ãtransformersãã€ã³ã¹ããŒã«ããŠçœ®ããŸãã
ãã®ä»
gradioãå©çšããŠããã®ã§ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãå¿ èŠã§ãã
pip install gradioã¢ãã«ãštokenizer
stabilityai/japanese-stablelm-instruct-alpha-7b-v2
novelai/nerdstash-tokenizer-v1
tokenizerã«novelaiã䜿ã£ãŠããŸããããã°ã©ã ãèµ·åãããšæåã®1åã®ã¿ããŠã³ããŒããå§ãŸããŸãã倧ããªãã¡ã€ã«ãªã®ã§æéãããããŸãã
å®è¡ãšãšã©ãŒã«ã€ããŠ
å ¬åŒã©ããã«ãã®ãŸãŸåãããšä»¥äžã®ãšã©ãŒãåºãŸãã
transformersé¢ä¿
You are using the default legacy behaviour of the <class 'transformers.models.llama.tokenization_llama.LlamaTokenizer'>. This is expected, and simply means that the `legacy` (previous) behavior will be used so nothing changes for you. If you want to use the new behaviour, set `legacy=False`. This should only be set if you understand what it means, and thouroughly read the reason why this was added as explained in https://github.com/huggingface/transformers/pull/24565
ããã«èšèŒãããããã«ãtokenizerã®å®çŸ©ã«
legacy=False
ã远å ãããšã¡ãã»ãŒãžãã§ãªããªããŸãã
generationé¢ä¿ïŒtokenizerïŒ
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:3 for open-end generation.
çè ã¯ååŠçã®çްããªä»æ§ã«çãã®ã§ããã®ãšã©ãŒã®çްéšã«ã€ããŠçè§£ããŠããããã§ã¯ç¡ãã®ã§ãããèŠåã®ããã§ããšã©ãŒãåºãŠãåäœã¯åé¡ãªãé²ã¿ãŸãããã ãæ¯åã¡ãã»ãŒãžãåºãã®ãç ©ãããã®ã§ãpad_token_id ãèšå®ããŠåé¿ããŠããŸããã³ãŒãã®äžéãããã«ã以äžã®ã³ãŒãéšåã§ãã
# ãããããŒã¯ã³IDã®èšå®
pad_token_id = tokenizer.eos_token_id # ããã£ã³ã°ããŒã¯ã³IDãeos_token_idã«èšå®
tokens = model.generate(
input_ids.to(device=model.device),
max_new_tokens=max_token,
temperature=get_temperature,
top_p=0.95,
do_sample=True,
pad_token_id= pad_token_id,
)ããã³ããã®äœæ
ããã¯å ¬åŒã®é¢æ°ããã®ãŸãŸå©çšããŠããŸããã¡ãã£ãšèªã¿ã¥ãããšæããŸãã
def build_prompt(sys_msg ,user_query, inputs="", sep="\n\n### "):
p = sys_msg
roles = ["æç€º", "å¿ç"]
msgs = [": \n" + user_query, ": \n"]
if inputs:
roles.insert(1, "å
¥å")
msgs.insert(1, ": \n" + inputs)
for role, msg in zip(roles, msgs):
p += sep + role + msg
return pStabilityAIã®instructçã¯ããã³ããã®æ§æã以äžã®ããã«ãªã£ãŠããŸãã
1 sys_msg ããã«ã¯å®è¡ããããã¿ã¹ã¯ãåœä»€ããŸãã
2 user_query å®éã«å®è¡ããã¿ã¹ã¯ãèšèŒããŸãã
3 user user_queryã®ã¿ã¹ã¯ã«å¯ŸããŠããããåœä»€ãæžããŸã
ãã£ã©ã¯ã¿ã®æ§æ Œä»ã
sys_msg
äŒè©±ã§ããããšãSYSTEMã«äŒããŸãã以äžäŸã§ãã
以äžã¯ãå¿çã®æç€ºãšãæèã®ããå
¥åã®çµã¿åããã§ããå
¥åã®èŠæ±ãé©åã«æºããå¿çãæžããªããã1åã®å
¥åã«å¯ŸããŠäœåºŠãå¿çããŠã¯ãããŸããã
user_query
宿œã«ã©ã®ãããªæ¯ãèããããã®ãèšè¿°ããŸãã以äžäŸã§ãã
女å髿 ¡çã®ãããæŒãããã ãããã¯è³¢ããŠããã¡ããã§ãå°ãããŒã€ãã·ã¥ã倩ççæŒ«ã§å¥œå¥å¿æºçãªå¥³åé«çã ããåå·åºã®ç®é»å·ã®è¿ãã§çãŸãããã ããã€ãã¿ã¡å£ã§è©±ãããèªåã®ããšããããšèšããã ã質åã«å¿çãããšããããã°ãèãããããšã«å¯ŸããŠé©åœãªèšèãæç« ã§å¿çãããããšããããå¿çã®é·ãã¯æå€§ã§ã30å以å
ã ããå¿çã¯1ã¿ãŒã³ã ãã§çãããã ãããã¯ãã¡ãããªã®ã§æã
æèãšé¢ä¿ã®ãªãå¿çãããããå¿çã¯ãã¡ãã£ãšè䌞ã³ããæãã§ãããå£ã§çžæã«ããã³ããå
¥ãããã ãããã®ãã䜿ãå£çã¯æ¬¡ã®ãšããã§ããã䜿ãèªå°Ÿã¯ãã ãããã¿ããã ããããªãã ãéããšæããã©ããã ãïŒãã©ãïŒã
user
å®éã«å
¥åããäŒè©±æã«ãªããŸãã
gradio
sys_msg , user_query , usertãšãmax_new_tokensãåã³ temperatureãå
¥åã§ããããã«ããŸãã
åºåã¯
1ãã·ã¹ãã ããã®åç
2ãã·ã¹ãã ãçæããå
šæ
3ãå®éã«äœæãããgenerateã§äœ¿çšãããããã³ãã
ã«ãªã£ãŠããŸãã2 ã¯1ã§äŒè©±æãæå®ããŠããã®ã§ãã·ã¹ãã ããã®åçãè€æ°äŒè©±åœ¢åŒã§çæãããŠããããã«ãå
šæã確èªããªããmax_new_tokensã®æé©å€ãèšå®ããããã®è¡šç€ºã§ãã
# Gradio
import gradio as gr
with gr.Blocks() as webui:
gr.Markdown("japanese-stablelm-instruct-alpha-7b-v2 prompt test")
with gr.Row():
with gr.Column():
sys_msg = gr.Textbox(label="sys_msg",lines=3, placeholder=" ã·ã¹ãã ããã³ãããå
¥åããŠãã ãã")
user_query = gr.Textbox(label="user_query",lines=10, placeholder="åœä»€ãå
¥åããŠãã ãã")
user = gr.Textbox(label="user",lines=3, placeholder="ãŠãŒã¶ãŒã®äŒè©±ãå
¥åããŠãã ãã")
max_token = gr.Number(100, label="MAX-Token")
get_temperature = gr.Number(0.9, label="temperature ")
with gr.Row():
prompt_inpu = gr.Button("Submit prompt",variant="primary")
with gr.Column():
out_data=[gr.Textbox(label="ã·ã¹ãã "),
gr.Textbox(label="å
šæ"),
gr.Textbox(label="ããã³ãã")]
prompt_inpu.click(genereate, inputs=[sys_msg, user_query, user, max_token, get_temperature,], outputs=out_data )
webui.launch()å®éã®GUIã§ãã

ã³ãŒãå šäœ
ååã§ã³ã¡ã³ãã¢ãŠãããŠããéšåã¯8bitéååãçšããå Žåã®èšå®ã§ããfp16ã«ããã®ã8bitéååã«ããã®ãã¯èµ·ååã«ã©ã¡ãããã³ã¡ã³ãã¢ãŠãããŠå©çšããŸãã
genereate(sys_msg, user_query,user,max_token,get_temperature)
颿°ã¯gradioããã¯ç¬ç«ããŠããã®ã§ãããã°ã©ã ããåŒã³åºãããšãå¯èœã§ãããã ããæ¯åèµ·åæã«ã¢ãã«ã®ããŒããçºçããã®ã§ãapiãµãŒãåããŠåžžæèµ·åãããŠããã»ããæ¥œãããããŸããã
import torch
from transformers import LlamaTokenizer, AutoModelForCausalLM
tokenizer = LlamaTokenizer.from_pretrained(
"novelai/nerdstash-tokenizer-v1", additional_special_tokens=["ââ"],
legacy=False
)
# float16 ã§äœ¿çšããå Žå
model = AutoModelForCausalLM.from_pretrained(
"stabilityai/japanese-stablelm-instruct-alpha-7b-v2",
trust_remote_code=True,
torch_dtype=torch.float16,
variant="fp16",
)
if torch.cuda.is_available():
model = model.to("cuda")
# 8bitéååã§äœ¿çšããå Žå #model = AutoModelForCausalLM.from_pretrained(
# "stabilityai/japanese-stablelm-instruct-alpha-7b-v2",
# trust_remote_code=True,
# load_in_8bit=True,
# device_map="auto",
# variant="int8",
# )
model.eval()
def genereate(sys_msg, user_query,user,max_token,get_temperature):
max_token=int(max_token)
get_temperature=float(get_temperature)
user_inputs = {
"user_query": user_query,
"inputs": user,
}
prompt = build_prompt(sys_msg ,**user_inputs)
input_ids = tokenizer.encode(
prompt,
add_special_tokens=False,
return_tensors="pt"
)
# ãããããŒã¯ã³IDã®èšå®
pad_token_id = tokenizer.eos_token_id # ããã£ã³ã°ããŒã¯ã³IDãeos_token_idã«èšå®
tokens = model.generate(
input_ids.to(device=model.device),
max_new_tokens=max_token,
temperature=get_temperature,
top_p=0.95,
do_sample=True,
pad_token_id= pad_token_id,
)
all_out = tokenizer.decode(tokens[0][input_ids.shape[1]:], skip_special_tokens=True).strip()
out=all_out.split("###")[0]
return out, all_out,prompt
def build_prompt(sys_msg ,user_query, inputs="", sep="\n\n### "):
p = sys_msg
roles = ["æç€º", "å¿ç"]
msgs = [": \n" + user_query, ": \n"]
if inputs:
roles.insert(1, "å
¥å")
msgs.insert(1, ": \n" + inputs)
for role, msg in zip(roles, msgs):
p += sep + role + msg
return p
# Gradio
import gradio as gr
with gr.Blocks() as webui:
gr.Markdown("japanese-stablelm-instruct-alpha-7b-v2 prompt test")
with gr.Row():
with gr.Column():
sys_msg = gr.Textbox(label="sys_msg",lines=3, placeholder=" ã·ã¹ãã ããã³ãããå
¥åããŠãã ãã")
user_query = gr.Textbox(label="user_query",lines=10, placeholder="åœä»€ãå
¥åããŠãã ãã")
user = gr.Textbox(label="user",lines=3, placeholder="ãŠãŒã¶ãŒã®äŒè©±ãå
¥åããŠãã ãã")
max_token = gr.Number(100, label="MAX-Token")
get_temperature = gr.Number(0.9, label="temperature ")
with gr.Row():
prompt_inpu = gr.Button("Submit prompt",variant="primary")
with gr.Column():
out_data=[gr.Textbox(label="ã·ã¹ãã "),
gr.Textbox(label="å
šæ"),
gr.Textbox(label="ããã³ãã")]
prompt_inpu.click(genereate, inputs=[sys_msg, user_query, user, max_token, get_temperature,], outputs=out_data )
webui.launch()ãŸãšã
ããã³ããã§å£èª¿ã¯ã»ãŒç¢ºå®ã«èª¿æŽã§ããããã§ããæã 質åã«å¯ŸããŠæå³ããªãåçãåºãŠããããé²éªšã«åçãæåŠããŸãããã®ãããããŠãŒã¶ãŒã«å¯ŸããŠäœã®å¿åºŠãç¡ãçŽ ã®LLMããããŠããã§ãããããã³ããã工倫ããŠãã£ãšå¿ å®ãªãã£ã©ä»ãã§ããããšãæåŸ ããŠããŸãã