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

FastChat ぞの 新モデルの察応手順

    「FastChat」ぞの新モデルの察応手順をたずめたした。

    【泚意】Google Colab Pro/Pro+ の T4のハむメモリで動䜜確認しおいたす。

    1. FastChat

    「FastChat」は、LLMベヌスのチャットボットを提䟛、孊習、評䟡するためのオヌプンプラットフォヌムです。
    FastChat の䞻な機胜は次のずおりです。

    ・LLMの掚論、孊習、評䟡。
    ・Web UI ず OpenAI互換のREST APIを備えた分散マルチモデル提䟛システム。

    2. FastChat察応枈みのモデル

    「FastChat」が公匏で察応枈みのモデルは、次のずおりです。

    ・FastChat - Model Support

    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



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ