
FastChat ãžã® æ°ã¢ãã«ã®å¯Ÿå¿æé
ãFastChatããžã®æ°ã¢ãã«ã®å¯Ÿå¿æé ããŸãšããŸããã
ãæ³šæãGoogle Colab Pro/Pro+ ã® T4ã®ãã€ã¡ã¢ãªã§åäœç¢ºèªããŠããŸãã
1. FastChat
ãFastChatãã¯ãLLMããŒã¹ã®ãã£ããããããæäŸãåŠç¿ãè©äŸ¡ããããã®ãªãŒãã³ãã©ãããã©ãŒã ã§ãã
FastChat ã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
ã»LLMã®æšè«ãåŠç¿ãè©äŸ¡ã
ã»Web UI ãš OpenAIäºæã®REST APIãåãã忣ãã«ãã¢ãã«æäŸã·ã¹ãã ã
2. FastChatå¯Ÿå¿æžã¿ã®ã¢ãã«
ãFastChatããå ¬åŒã§å¯Ÿå¿æžã¿ã®ã¢ãã«ã¯ã次ã®ãšããã§ãã
3. FastChatã§ã®æšè«ã®å®è¡
FastChatã§ã®æšè«ã®å®è¡æé ã¯ã次ã®ãšããã§ãã
(1) Colabã®ããŒãããã¯ãéããã¡ãã¥ãŒãç·šé â ããŒãããã¯ã®èšå®ãã§ãT4ãã®ããã€ã¡ã¢ãªããéžæã
(2) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
# ããã±ãŒãžã®ã€ã³ã¹ããŒã«
!git clone https://github.com/lm-sys/FastChat
%cd FastChat
!pip install -e ".[model_worker,webui]"(3) CUIçã®æšè«ã®å®è¡ã
ä»åã¯ããFastChatããšéçºå
ãåããVicunaã(lmsys/vicuna-7b-v1.5)ã䜿ããŸããã--debugãã®ãããã°åºåã§å
éšããã³ããã確èªã§ããŸãã
!python -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --debug(4) ãUSER: ããšè¡šç€ºããããã¡ãã»ãŒãžå
¥åã
ä»åã¯ããæ¥æ¬äžé«ãå±±ã¯ïŒããšå
¥åããŸããã
USER: æ¥æ¬äžé«ãå±±ã¯ïŒ
ASSISTANT: æ¥æ¬ã§æãé«ãå±±ã¯ãç«ã¡ã¯ã ãããå¯å£«å±±ãã§ããå¯å£«å±±ã¯ãæ¥æ¬ã®å±±å²³å°åž¯ã«äœçœ®ããæšé«ã¯1å5åã¡ãŒãã«ã§ããå¯å£«å±±ã¯ãå€ä»£ããä¿¡ä»°ãããæ¥æ¬ã®åœã®ç¥ã§ããã倧åç¥ããšãããå€ãã®ç»å±±è ã蚪ããŸãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®èªç¶ã®çŸããã代衚ããå±±ã§ãããæ¥æ¬ã®å±±å²³å°åž¯ã«ãããŠæãæåãªå±±ã®äžã€ã§ãã
ãããã°åºåã¯ã次ã®ãšããã§ãã
{
  'conv_template': 'vicuna_v1.1',
  'prompt': "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.  USER: æ¥æ¬äžé«ãå±±ã¯ïŒÂ ASSISTANT:",
  'outputs': 'æ¥æ¬ã§æãé«ãå±±ã¯ãç«ã¡ã¯ã ãããå¯å£«å±±ãã§ããå¯å£«å±±ã¯ãæ¥æ¬ã®å±±å²³å°åž¯ã«äœçœ®ããæšé«ã¯1å5åã¡ãŒãã«ã§ããå¯å£«å±±ã¯ãå€ä»£ããä¿¡ä»°ãããæ¥æ¬ã®åœã®ç¥ã§ããã倧åç¥ããšãããå€ãã®ç»å±±è ã蚪ããŸãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®èªç¶ã®çŸããã代衚ããå±±ã§ãããæ¥æ¬ã®å±±å²³å°åž¯ã«ãããŠæãæåãªå±±ã®äžã€ã§ãã',
  'speed (token/s)': 12.66
}
(5) å床ãUSER: ããšè¡šç€ºããããã¡ãã»ãŒãžå
¥åã
ä»åã¯ããæ¥æ¬äžé«ãå±±ã¯ïŒããšå
¥åããŸããã
User: ãã®å±±ã¯äœçã«ããïŒ
Assistant: å¯å£«å±±ã¯ãæ¥æ¬ã®å±±å²³å°åž¯ã«äœçœ®ããé岡çãšå±±æ¢šçã®å¢ã«ãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®æé«å³°ã§ãããæ¥æ¬ã®å±±å²³å°åž¯ã«ãããŠæãæåãªå±±ã®äžã€ã§ãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®æåçãªéºç£ãšããŠãéèŠã§ãããå€ãã®èгå 客ã蚪ããŸãã
ãããã°åºåã¯ã次ã®ãšããã§ãã
{
  'conv_template': 'vicuna_v1.1',
  'prompt': "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.  USER: æ¥æ¬äžé«ãå±±ã¯ïŒ ASSISTANT: æ¥æ¬ã§æãé«ãå±±ã¯ãç«ã¡ã¯ã ãããå¯å£«å±±ãã§ããå¯å£«å±±ã¯ãæ¥æ¬ã®å±±å²³å°åž¯ã«äœçœ®ããæšé«ã¯1å5åã¡ãŒãã«ã§ããå¯å£«å±±ã¯ãå€ä»£ããä¿¡ä»°ãããæ¥æ¬ã®åœã®ç¥ã§ããã倧åç¥ããšãããå€ãã®ç»å±±è ã蚪ããŸãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®èªç¶ã®çŸããã代衚ããå±±ã§ãããæ¥æ¬ã®å±±å²³å°åž¯ã«ãããŠæãæåãªå±±ã®äžã€ã§ãã</s>
USER: ãã®å±±ã¯äœçã«ããïŒ Â ASSISTANT:",
  'outputs': 'å¯å£«å±±ã¯ãæ¥æ¬ã®å±±å²³å°åž¯ã«äœçœ®ããé岡çãšå±±æ¢šçã®å¢ã«ãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®æé«å³°ã§ãããæ¥æ¬ã®å±±å²³å°åž¯ã«ãããŠæãæåãªå±±ã®äžã€ã§ãããŸããå¯å£«å±±ã¯ãæ¥æ¬ã®æåçãªéºç£ãšããŠãéèŠã§ãããå€ãã®èгå 客ã蚪ããŸãã',
  'speed (token/s)': 15.63
}
äŒè©±å±¥æŽãå«ãŸããŠããããšãããããŸãã
4. æ°ã¢ãã«ã®åäœç¢ºèª
察å¿åã ãšæ£ããäŒè©±ãã³ãã¬ãŒããèšå®ãããŠãªãããã粟床ãèœã¡ãŸããä»åã¯ããJapanese StableLM Gamma 7Bããå®è¡ããŸãã
(1) ã--debugãä»ãã§æšè«ã®å®è¡ã
!python -m fastchat.serve.cli --model-path stabilityai/japanese-stablelm-instruct-gamma-7b --debug(2) æšè«ã詊ãã
<|USER|>: æ¥æ¬äžé«ãå±±ã¯ïŒ
<|ASSISTANT|>: å¯å£«å±±ã<|SYSTEM|># StableLM Tuned (Alpha version)âŠäžèŠãªé·æâŠ
ãããã°åºåã¯ã次ã®ãšããã§ãã
{
  'conv_template': 'stablelm',
  'prompt': '<|SYSTEM|># StableLM Tuned (Alpha version)\n- StableLM is a helpful and harmless open-source AI language model developed by StabilityAI.\n- StableLM is excited to be able to help the user, but will refuse to do anything that could be considered harmful to the user.\n- StableLM is more than just an information source, StableLM is also able to write poetry, short stories, and make jokes.\n- StableLM will refuse to participate in anything that could harm a human.\n<|USER|>æ¥æ¬äžé«ãå±±ã¯ïŒ<|ASSISTANT|>',
  'outputs': 'å¯å£«å±±ã<|SYSTEM|># StableLM Tuned (Alpha version)\n- StableLM is a helpful and harmless open-source AI language model developed by StabilityAI...äžèŠãªé·æ...',
  'speed (token/s)': 13.4
}
æ£ããäŒè©±ãã³ãã¬ãŒããèšå®ãããŠãªããããå¿çãæžåŒãå£ããŠãããšãããããŸãã
5. æ°ã¢ãã«ã®å¯Ÿå¿
ãFastChatãã§ãJapanese StableLM Gamma 7Bããåãããã«èšå®ããŸãã
æ°ã¢ãã«ã®å¯Ÿå¿æé ã¯ã次ã®ãšããã§ãã
5-1. äŒè©±ãã³ãã¬ãŒãã®å®è£
ãfastchat/conversation.pyãã以äžã®ããã«ç·šéããŸãã
(1) ãSeparatorStyleãã«å®æ°ãJSLM_GAMMAãã远å ã
æ°ã¢ãã«ã®ã¹ã¿ã€ã«ã衚ã宿°ã§ãã
class SeparatorStyle(IntEnum):
"""Separator styles."""
ADD_COLON_SINGLE = auto()
ADD_COLON_TWO = auto()
:
FALCON_CHAT = auto()
JSLM_GAMMA = auto() # â远å (2) Conversationã¯ã©ã¹ã®get_prompt()ã«ããã³ããçæãå®è£
ã
ä»ã®ã¢ãã«ãåèã«ããŠãæ°ã¢ãã«ã®ããã³ããçæãå®è£
ããŸãã
elif self.sep_style == SeparatorStyle.FALCON_CHAT:
ret = ""
if self.system_message:
ret += system_prompt + self.sep
for role, message in self.messages:
if message:
ret += role + ": " + message + self.sep
else:
ret += role + ":"
return ret
elif self.sep_style == SeparatorStyle.JSLM_GAMMA: # â远å
ret = self.system_message + self.sep
for role, message in self.messages:
if message:
ret += role + ": \n" + message + self.sep
else:
ret += role + ": \n"
return ret(2) Conversationã¯ã©ã¹çæã®è¿œå ã
ä»ã®ã¢ãã«ãåèã«ããŠãæ°ã¢ãã«ã®Conversationã¯ã©ã¹çæãå®è£
ããŸãã
# conv template for JSLM Gamma tokenizer
# source: https://huggingface.co/stabilityai/japanese-stablelm-base-gamma-7b
register_conv_template(
Conversation(
name="jslm_gamma",
system_message="以äžã¯ãã¿ã¹ã¯ã説æããæç€ºãšãæèã®ããå
¥åã®çµã¿åããã§ããèŠæ±ãé©åã«æºããå¿çãæžããªããã",
roles=("æç€º", "å¿ç"),
sep_style=SeparatorStyle.JSLM_GAMMA,
sep="\n\n### ",
stop_token_ids=[2],
stop_str="###",
)
)5-2. ã¢ãã«ã¢ããã¿ã®å®è£
ãfastchat/model/model_adapter.pyã ã以äžã®ããã«ç·šéããŸãã
(1) ModelAdapterã¢ããã¿ã¯ã©ã¹ã®å®çŸ©ã
ä»ã®ã¢ãã«ãåèã«ããŠãæ°ã¢ãã«ã®ModelAdapterã¯ã©ã¹çæãå®è£
ããŸãã
class JSLMGammaAdapter(BaseModelAdapter): # â远å
"""
Model adapter for Japanese StableLM Gamma instruct model
https://huggingface.co/stabilityai/japanese-stablelm-base-gamma-7b
"""
model_variation = None
def match(self, model_path: str):
model_path = model_path.lower()
if model_path == "japanese-stablelm-instruct-gamma-7b":
self.model_variation = "gamma"
return True if self.model_variation else False
def load_model(self, model_path: str, from_pretrained_kwargs: dict):
revision = from_pretrained_kwargs.get("revision", "main")
tokenizer = LlamaTokenizer.from_pretrained(
"stabilityai/japanese-stablelm-instruct-gamma-7b"
)
from_pretrained_kwargs.pop("trust_remote_code", None)
clm_cls = AutoModelForCausalLM
model = clm_cls.from_pretrained(
model_path,
low_cpu_mem_usage=True,
trust_remote_code=True,
**from_pretrained_kwargs
)
return model, tokenizer
def get_default_conv_template(self, model_path:str):
return get_conv_template("jslm_gamma")(2) ModelAdapterã¢ããã¿ã¯ã©ã¹ã®è¿œå ã
register_model_adapter()ã䞊ãã§ããéšåã«è¿œå ããŸãã
# Note: the registration order matters.
# The one registered earlier has a higher matching priority.
register_model_adapter(JSLMGammaAdapter) # â远å
register_model_adapter(PeftModelAdapter)
register_model_adapter(VicunaAdapter)
register_model_adapter(AiroborosAdapter)6. æ°ã¢ãã«ã®å¯Ÿå¿ã®åäœç¢ºèª
æ°ã¢ãã«ã®å¯Ÿå¿ã®åäœç¢ºèªçµæã¯ã次ã®ãšããã§ãã
æç€º: æ¥æ¬äžé«ãå±±ã¯ïŒ
å¿ç: æ¥æ¬æé«å³°ã®å±±ã¯å¯å£«å±±ã§ããæšé«ã¯3,776mã§ãã å¯å£«å±±ã¯ãæ¥æ¬ã®ã¿ãªãããäžççã«ãæåãªç«å±±ã§ãã å±±é ããã¯ã倩æ°ããããã°ãäŒè±åå³¶ããæ¿ç·åå³¶ãŸã§èŠãããšãã§ããŸãã æ¯å¹Žããããã®äººãå¯å£«å±±ã«ç»ããŸãããæšé«3,000mãè¶ ãããšãç»å±±è ã®ååã¯é äžã«å°éã§ããªããšèšãããŠããŸãã å¯å£«å±±ã¯ãæ¥æ¬äžã®é«ããèªãã ãã§ãªããæ¥æ¬äžçŸããå±±ãšããŠãç¥ãããŠããŸãã
ãããã°åºåã¯ã次ã®ãšããã§ãã
{
  'conv_template': 'jslm_gamma',
  'prompt': '以äžã¯ãã¿ã¹ã¯ã説æããæç€ºãšãæèã®ããå ¥åã®çµã¿åããã§ããèŠæ±ãé©åã«æºããå¿çãæžããªããã\n\n### æç€º: \næ¥æ¬äžé«ãå±±ã¯ïŒ\n\n### å¿ç: \n',
  'outputs': 'æ¥æ¬æé«å³°ã®å±±ã¯å¯å£«å±±ã§ããæšé«ã¯3,776mã§ãã å¯å£«å±±ã¯ãæ¥æ¬ã®ã¿ãªãããäžççã«ãæåãªç«å±±ã§ãã å±±é ããã¯ã倩æ°ããããã°ãäŒè±åå³¶ããæ¿ç·åå³¶ãŸã§èŠãããšãã§ããŸãã æ¯å¹Žããããã®äººãå¯å£«å±±ã«ç»ããŸãããæšé«3,000mãè¶ ãããšãç»å±±è ã®ååã¯é äžã«å°éã§ããªããšèšãããŠããŸãã å¯å£«å±±ã¯ãæ¥æ¬äžã®é«ããèªãã ãã§ãªããæ¥æ¬äžçŸããå±±ãšããŠãç¥ãããŠããŸãã',
  'speed (token/s)': 13.66
}
ãã«ãã¿ãŒã³ã®äŒè©±ã確èªããŠã¿ãŸãã
æç€º: ãã®å±±ã¯äœçã«ããïŒ
å¿ç: é岡çã«ããã
{
 'conv_template': 'jslm_gamma',
 'prompt': '以äžã¯ãã¿ã¹ã¯ã説æããæç€ºãšãæèã®ããå ¥åã®çµã¿åããã§ããèŠæ±ãé©åã«æºããå¿çãæžããªããã\n\n### æç€º: \næ¥æ¬äžé«ãå±±ã¯ïŒ\n\n### å¿ç: \næ¥æ¬æé«å³°ã®å±±ã¯å¯å£«å±±ã§ããæšé«ã¯3,776mã§ãã å¯å£«å±±ã¯ãæ¥æ¬ã®ã¿ãªãããäžççã«ãæåãªç«å±±ã§ãã å±±é ããã¯ã倩æ°ããããã°ãäŒè±åå³¶ããæ¿ç·åå³¶ãŸã§èŠãããšãã§ããŸãã æ¯å¹Žããããã®äººãå¯å£«å±±ã«ç»ããŸãããæšé«3,000mãè¶ ãããšãç»å±±è ã®ååã¯é äžã«å°éã§ããªããšèšãããŠããŸãã å¯å£«å±±ã¯ãæ¥æ¬äžã®é«ããèªãã ãã§ãªããæ¥æ¬äžçŸããå±±ãšããŠãç¥ãããŠããŸãã å¯å£«å±±ã®åšãã«ã¯ãæš¹æšãã»ãšãã©ãªããå±±ã®åœ¢ãæçã§ããã å¯å£«å±±ã¯ãæ¥æ¬ã®åœè±ã§ããæ¡ãèŠãããšãã§ãããäžçã§æãçŸããå±±ã®ã²ãšã€ãšãããŠããŸãã å¯å£«å±±ã®æº¶å²©ããŒã ã¯ãæ¥æ¬æé«å³°ã®ç«å±±ã§ããã å¯å£«å±±ã®å±±é ã¯ãæšé«3,776mã§ãæ¥æ¬æé«å³°ã®å±±ã§ããã å¯å£«å±±ã¯ãäžçæé«å³°ã®å±±ãšããŠãå€ãã®äººã ãæ¹ãã€ããŠããŸãã å¯å£«å±±ã®å±±é ã«ã¯ãæšé«3,776mã®å±±é ããããŸãã å¯å£«å±±ã¯ã倿¥ããæ¥æ¬ã®äººã ã«ãšã£ãŠç¥èãªå±±ãšãããå€ãã®æåŠäœåãçµµç»ã®é¡æãšãªã£ãŠããŸãã å¯å£«å±±ã¯ãäžçéºç£ã«ç»é²ãããŠããŸãã å¯å£«å±±ã¯äžçã§æãçŸããå±±ãšãããŠããŸãã å¯å£«å±±ã¯ãäžç\n\n### æç€º: \nãã®å±±ã¯äœçã«ããïŒ\n\n### å¿ç: \n',
 'outputs': 'é岡çã«ããã',
 'speed (token/s)': 6.6
}
ä»åã¯ã以äžã®ãããªäŒè©±ãã³ãã¬ãŒãã§èšå®ããŠããŸãã
{ã·ã¹ãã ã¡ãã»ãŒãž}
### æç€º:
{ã¡ãã»ãŒãž1}
### å¿ç:
{ã¬ã¹ãã³ã¹1}
### æç€º:
{ã¡ãã»ãŒãž2}
### å¿ç:
ãStableLMãã¯ããLLaMa-2ãããRinna-4Bãã®ãããªããã«ãã¿ãŒã³çšã®æç€ºã®æžåŒãæç€ºãããŠãªãã£ãã®ã§ãä»®ã®äŒè©±ãã³ãã¬ãŒãã«ãªããŸãã
ãããŸããELYZA-japanese-Llama-2-7b
ãELYZA-japanese-Llama-2-7bãã¯ãLLaMa 2ãäŒè©±ãã³ãã¬ãŒãæºæ ãã€ã¢ãã«IDã«ãLLaMa-2ãã®èšè¿°ããããããèªåçã«æ£ããäŒè©±ãã³ãã¬ãŒããéžæãããŸããã
!python -m fastchat.serve.cli --model-path elyza/ELYZA-japanese-Llama-2-7b-fast-instruct --debug