すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:LLMデプロイ

最終更新日:Aug 27, 2024

Platform for AI (PAI) のElastic Algorithm Service (EAS) は、複数のパラメーターを設定してオープンソースのラージランゲージモデル (LLM) を展開できるシナリオベースの展開モードを提供します。 このトピックでは、EASを使用してLLMを展開および呼び出す方法について説明します。このトピックでは、よくある質問に対する回答も提供します。

背景情報

Generative Pre-trained Transformer (GPT) やTongYi Qianwen (Qwen) シリーズのモデルなどのLLMのアプリケーションは、特に推論タスクで大きな注目を集めています。 EASを使用すると、オープンソースのLLMを推論サービスとして簡単にデプロイできます。 サポートされているLLMには、Llama 3、Qwen、Llama 2、ChatGLM、Baichuan、Yi-6B、Mistral-7B、Falcon-7Bが含まれます。 WebUIまたはAPIを使用してモデルを呼び出すだけでなく、LangChainフレームワークを使用してビジネスデータに基づいてカスタム応答を生成することもできます。

  • LangChainはである何:

    LangChainは、AI開発者がGPT-4などのLLMを外部データと統合してパフォーマンスを向上させ、リソース利用を最適化できるようにするオープンソースフレームワークです。

  • LangChainはいかに働きますか:

    LangChainは、ソースデータ (20ページのPDFファイルなど) をより小さなチャンクに分割し、埋め込みモデル (BGEやtext2vecなど) を使用してチャンクを数値ベクトルに変換し、ベクトルデータベースにベクトルを保存します。

    このように、LLMは、ベクトルデータベース内のデータを使用して応答を生成することができる。 各ユーザクエリについて、LangChainは、ユーザクエリに関連するチャンクをベクトルデータベースから取得し、取得した情報とクエリをプロンプトに含め、プロンプトをLLMに送信して回答を生成します。

前提条件

カスタムモデルをデプロイする場合は、次の前提条件が満たされていることを確認してください。

  • モデルファイルと関連する設定ファイルを用意します。 次の図は、モデルファイルのサンプルです。 image.png

    config.jsonファイルを構成ファイルに含める必要があります。 Huggingfaceモデル形式に基づいてconfig.jsonファイルを設定する必要があります。 サンプルファイルの詳細については、「config.json」をご参照ください。

  • モデルファイルを保存するために、Object Storage Service (OSS) バケットまたはNASファイルシステムが作成されます。 また、モデルファイルをPAIのAIアセットとして登録して、管理やメンテナンスを容易にすることもできます。 OSSバケットの作成方法の詳細については、「OSSコンソールを使用して開始する」をご参照ください。

  • モデルファイルと設定ファイルがOSSバケットにアップロードされます。 詳細については、「OSSコンソールを使用して開始する」をご参照ください。

制限事項

  • EASによって提供される推論加速エンジンは、以下のモデルのみをサポートする: Qwen2-7b、Qwen1.5 − 1.8b、Qwen1.5 − 7b、Qwen1.5 − 14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it deepseek-coder-7b-instruct-v1.5。

  • LangChainフレームワークは、推論アクセラレーションエンジンではサポートされていません。

LLMをEASにデプロイ

次の配置方法がサポートされています。

方法1: シナリオベースのモデル展開 (推奨)

  1. EASページに移動します。

    1. Platform for AI (PAI) コンソールにログインします。

    2. 左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、モデルを配置するワークスペースを見つけ、その名前をクリックして [ワークスペースの詳細] ページに移動します。

    3. 左側のナビゲーションウィンドウで、[モデル展開] > [Elastic Algorithm Service (EAS)] を選択して、[Elastic Algorithm Service (EAS)] ページに移動します。image

  2. [Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。 [シナリオベースのモデル展開] セクションで、[LLM展開] を選択します。

  3. [LLMデプロイ] ページで、次の重要なパラメーターを設定します。 その他のパラメーターについては、「PAIコンソールでのモデルサービスのデプロイ」をご参照ください。

    パラメーター

    説明

    基本情報

    サービス名

    モデルサービスの名称を指定します。

    モデルソース

    モデルのソース。 有効な値:

    • オープンソースモデル

    • カスタム微调整モデル

    モデルタイプ

    • モデルソースオープンソースモデルに設定した場合、Qwen、Llama、ChatGLM、Baichuan、Falcon、Yi、Mistral、Gemma、DeepSeekのモデルを選択できます。

    • モデルソースカスタム微調整モデルに設定した場合、カスタムモデルに基づいてモデルパラメータ数量、および精度パラメータを指定する必要があります。

    モデル設定

    モデルソースカスタム微調整モデルに設定した場合、モデルの格納場所を指定する必要があります。 OSSを例にとる。 [タイプ][マウントOSS] に設定し、モデルファイルが保存されているOSSディレクトリを選択します。

    リソース設定

    リソース設定

    • モデルソース を オープンソースモデルモデルタイプを選択した後、システムは適切なリソース設定を推奨します。

    • モデルソース を カスタム微调整モデルモデルタイプを設定すると、システムは自動的にリソース設定を生成します。 モデルのパラメーター数量に基づいてリソース設定を指定することもできます。 詳細については、「」をご参照ください。別のオープンソースLLMに切り替えるにはどうすればよいですか? このトピックのセクション。

    推論の加速

    モデルタイプをQwen2-7b、Qwen1.5-1.8b、Qwen1.5-7b、Qwen1.5-14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it、またはdeepseek-coder-7b-instruct-v1に設定した場合、推論アクセラレーション機能がサポートされます。 有効な値:

    • 加速されない

    • BladeLLM推論の加速

    • オープンソースvLLM推論アクセラレーション

    説明

    推論アクセラレーション機能を有効にすると、デプロイされたEASサービスはLangChainフレームワークを使用できません。

  4. [デプロイ] をクリックします。

方法2: カスタム展開

  1. EASページに移動します。

    1. Platform for AI (PAI) コンソールにログインします。

    2. 左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、モデルを配置するワークスペースを見つけ、その名前をクリックして [ワークスペースの詳細] ページに移動します。

    3. 左側のナビゲーションウィンドウで、[モデル展開] > [Elastic Algorithm Service (EAS)] を選択して、[Elastic Algorithm Service (EAS)] ページに移動します。image

  2. [モデルオンラインサービス (EAS)] ページで、[サービスのデプロイ] をクリックします。 [カスタムモデルのデプロイ] セクションで、[カスタムデプロイ] をクリックします。

  3. [サービスの作成] ページで、次の重要なパラメーターを設定します。 その他のパラメーターについては、「PAIコンソールでのモデルサービスのデプロイ」をご参照ください。

    パラメーター

    説明

    モデルサービス情報

    サービス名

    モデルサービスの名称を指定します。

    デプロイ方法

    [イメージを使用したWebアプリのデプロイ] を選択します。

    画像の選択

    PAI Imageドロップダウンリストからchat-llm-webuiを選択し、イメージのバージョンとして3.0を選択します。

    説明

    イメージバージョンは頻繁に更新されます。 最新バージョンを選択することを推奨します。

    推論アクセラレーション機能を有効にする場合は、次のイメージバージョンを選択します。

    説明

    推論アクセラレーション機能を有効にすると、デプロイされたEASサービスはLangChainフレームワークを使用できません。

    • 3.0ブレード: BladeLLM推論アクセラレーションエンジンを使用します。

    • 3.0-vllm: vLLM推論アクセラレーションエンジンを使用します。

    モデル設定の指定

    カスタムモデルをデプロイする必要がある場合は、[モデル設定の指定] をクリックしてモデルを設定します。 OSSを例として、次のパラメーターを設定します。

    • [OSSパスのマウント] を選択し、モデルファイルが保存されているOSSディレクトリを選択します。 例: oss:// bucket-test/data-oss/

    • [マウントパス]/dataに設定します。

    • 読み取り専用モードを有効にしないでください。

    コマンド

    • イメージバージョンを選択すると、python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-7B-Chatコマンドとポートが自動的に設定されます。 デフォルトでは、コマンドはQwen1.5-7B-Chatモデルをデプロイします。 コマンドのパラメーターの詳細については、このトピックの詳細パラメーターを参照してください。

    • 他のオープンソースLLMをデプロイする場合は、モデルのCommandを指定します。 詳細については、「」をご参照ください。別のオープンソースLLMに切り替えるにはどうすればよいですか? このトピックのセクション。

    • カスタムモデルをデプロイする必要がある場合は、次のパラメーターをCommandに追加します。

      • -- model-path: このパラメーターを /dataに設定します。これは、Mount Pathパラメーターの値です。

      • -- model-type: モデルのタイプを指定します。

      さまざまな種類のモデルのコマンドの詳細については、このトピックのコマンドを参照してください。

    リソース配置情報

    リソース設定モード

    [一般] を選択します。

    リソース設定

    GPUタイプを選択する必要があります。 費用対効果を高めるために、ml.gu7i.c16m60.1-gu30インスタンスタイプを使用してQwen-7Bモデルをデプロイすることを推奨します。

    別のオープンソースモデルをデプロイするには、モデルのパラメーター量に一致するインスタンスタイプを選択します。 詳細については、「」をご参照ください。別のオープンソースLLMに切り替えるにはどうすればよいですか? このトピックのセクション。

    その他のパラメータ

    パラメーター

    説明

    デフォルト値

    -- モデルパス

    プリセットモデル名またはカスタムモデルパスを指定します。

    • 例1: プリセットモデルを読み込みます。 Llama-2-7b-hf、Llama-2-7b-chat-hf、Llama-2-13b-hf、Llama-2-13b-chat-hfなど、メタラマ /ラマ2-* シリーズのプリセットモデルを使用できます。 例:

      python webui/webui_server.py -- port=8000 -- model-path=meta-llama/Llama-2-7b-chat-hf

    • 例2: オンプレミスのカスタムモデルを読み込みます。

      例: python webui/webui_server.py -- port=8000 -- model-path=/llama2-7b-chat

    メタラマ /Llama-2-7b-chat-hf

    -- cpu

    CPUを使用してモデル推論を実行します。

    例: python webui/webui_server.py -- port=8000 -- cpu

    デフォルトでは、GPUはモデル推論に使用されます。

    -- 精密

    Llama2モデルの精度を指定します。 有効な値: fp32およびfp16。 例: python webui/webui_server.py -- port=8000 -- precision=fp32

    システムは、GPUメモリサイズに基づいて7Bモデルの精度を自動的に指定します。

    -- ポート

    サーバーのリスニングポートを指定します。

    サンプルコード: python webui/webui_server.py -- port=8000

    8000

    -- apiのみ

    ユーザーがAPI操作を呼び出すことによってのみサービスにアクセスできるようにします。 デフォルトでは、サービスはWebUIおよびAPIサーバーを起動します。

    サンプルコード: python webui/webui_server.py -- api-only

    False

    -- no-api

    ユーザーがWebUIを使用してのみサービスにアクセスできるようにします。 デフォルトでは、サービスはWebUIおよびAPIサーバーを起動します。

    サンプルコード: python webui/webui_server.py -- no-api

    False

    -- max-new-tokens

    出力トークンの最大数。

    サンプルコード: python api/api_server.py -- port=8000 -- max-new-tokens=1024

    2048

    -- 温度

    モデル出力のランダム性。 より大きな値は、より高いランダム性を指定する。 値0は固定出力を指定します。 値はFloat型で、0から1の範囲です。

    サンプルコード: python api/api_server.py -- port=8000 -- max_length=0.8

    0.95

    -- max_round

    推論中にサポートされるダイアログの最大ラウンド数。

    サンプルコード: python api/api_server.py -- port=8000 -- max_round=10

    5

    -- top_k

    生成された結果から選択された出力の数。 値は正の整数です。

    例: python api/api_server.py -- port=8000 -- top_k=10

    なし

    -- top_p

    生成された結果から選択された出力の確率しきい値。 値はFloat型で、0から1の範囲です。

    サンプルコード: python api/api_server.py -- port=8000 -- top_p=0.9

    なし

    -テンプレートなし

    Llama 2やFalconなどのモデルは、デフォルトのプロンプトテンプレートを提供します。 このパラメーターを空のままにすると、デフォルトのプロンプトテンプレートが使用されます。 このパラメーターを設定する場合は、独自のテンプレートを指定する必要があります。

    サンプルコード: python api/api_server.py -- port=8000 -- no-template

    このパラメーターを指定しないと、デフォルトのプロンプトテンプレートが自動的に使用されます。

    -- logレベル

    ログ出力レベル。 有効な値: DEBUG、INFO、WARNING、およびERROR。

    サンプルコード: python api/api_server.py -- port=8000 -- log-level=DEBUG

    INFO

    -- export-history-path

    EAS-LLMを使用して、会話履歴をエクスポートできます。 この場合、サービスを開始するときに会話履歴をエクスポートする出力パスを指定する必要があります。 ほとんどの場合、OSSバケットのマウントパスを指定できます。 EASは、特定の期間に発生した会話の記録をファイルにエクスポートします。

    サンプルコード: python api/api_server.py -- port=8000 -- export-history-path=/your_mount_path

    デフォルトで、この機能は無効化されています。

    -- エクスポート間隔

    会話が記録されている期間。 単位は秒です。 たとえば、-- export-intervalパラメーターを3600に設定すると、前の1時間の会話レコードがファイルにエクスポートされます。

    3600

    -- backend

    推論加速エンジン。 有効な値:

    • -- backend=blade: BladeLLM推論アクセラレーション。

    • -- backend=vllm: オープンソースのvLLM推論アクセラレーション。

    説明

    推論アクセラレーション機能は、次のモデルのみをサポートします。Qwen2-7b、Qwen1.5-1.8b、Qwen1.5-7b、Qwen1.5-14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it、deepseek-coder-7b-instruct-v1.5。

    デフォルトでは、推論アクセラレーションは無効になっています。

    コマンド

    モデル

    コマンド

    Llama2

    python webui/webui_server.py -- port=8000 -- model-path=/data -- model-type=llama2

    ChatGLM2

    python webui/webui_server.py -- port=8000 -- model-path=/data -- model-type=chatglm2

    ChatGLM3

    python webui/webui_server.py -- port=8000 -- model-path=/data -- model-type=chatglm3

    クウェン

    python webui/webui_server.py -- port=8000 -- model-path=/data -- model-type=qwen

    ChatGLM

    python webui/webui_server.py -- port=8000 -- model-path=/data -- model-type=chatglm

    Falcon-7B

    python webui/webui_server.py -- port=8000 -- model-path=/data -- model-type=falcon

  4. [デプロイ] をクリックします。

EASサービスを呼び出す

web UIを使用したEASサービスの呼び出し

  1. デプロイされたサービスを見つけ、[サービスタイプ] 列の [Webアプリの表示] をクリックします。 image

  2. WebUIページで推論パフォーマンスをテストします。

    入力テキストボックスに文を入力し、[送信] をクリックして会話を開始します。 サンプル入力: パーソナルファイナンスの学習プランを提供しますimage

  3. LangChainフレームワークを使用して、独自のビジネスデータをサービスに統合し、ローカルのナレッジベースに基づいてカスタマイズされた回答を生成します。

    1. デプロイしたサービスのWebUIページで、[LangChain] タブをクリックします。

    2. ChatLLM-LangChain-WebUIページの左下隅で、画面の指示に従ってナレッジベースをアップロードします。 TXT、Markdown、DOCX、およびPDFの形式でファイルをアップロードできます。 image

      たとえば、README.mdファイルをアップロードし、Vectorstoreのナレッジをクリックします。 次の結果は、ファイル内のデータがロードされたことを示します。 image

    3. アップロードしたデータに関する質問を入力テキストボックスに入力し、[送信] をクリックして会話を開始します。

      サンプル入力: deepspeedのインストール方法 image

API操作を使用したEASサービスの呼び出し

  1. サービスエンドポイントとトークンを取得します。

    1. Elastic Algorithm Service (EAS) ページに移動します。 詳細については、このトピックの「EASにLLMを展開する」を参照してください。

    2. サービスの名前をクリックして、[サービスの詳細] タブに移動します。

    3. [基本情報] セクションで、[呼び出し方法] をクリックします。 表示されるダイアログボックスの [パブリックエンドポイント] タブで、トークンとエンドポイントを取得します。

  2. API操作を呼び出して推論を実行するには、次のいずれかの方法を使用します。

    HTTPの使用

    • 非ストリーミングモード

      cURLコマンドが実行されると、クライアントは次のタイプの標準HTTPリクエストを送信します。

      • ストリング要求

        curl $host -H 'Authorization: $authorization' --data-binary @chatllm_data.txt -v

        $authorizationをトークンに置き換えます。 $hostをエンドポイントに置き換えます。 chatllm_data.txtファイルは、プロンプトを含むプレーンテキストファイルです。

      • 構造化リクエスト

        curl $host -H 'Authorization: $authorization' -H "Content-type: application/json" --data-binary @chatllm_data.json -v -H "Connection: close"

        chatllm_data.jsonファイルを使用して推論パラメーターを設定します。 次のサンプルコードは、chatllm_data.jsonファイルの形式例を示しています。

        {
          "max_new_tokens": 4096,
          "use_stream_chat": false,
          "prompt": "How to install it?",
          "system_prompt": "Act like you are programmer with 5+ years of experience.",
          "history": [
            [
              "Can you tell me what's the bladellm?",
              "BladeLLM is an framework for LLM serving, integrated with acceleration techniques like quantization, ai compilation, etc. , and supporting popular LLMs like OPT, Bloom, LLaMA, etc."
            ]
          ],
          "temperature": 0.8,
          "top_k": 10,
          "top_p": 0.8,
          "do_sample": true,
          "use_cache": true
        }

        次の表に、上記のコードのパラメーターを示します。 ビジネス要件に基づいてパラメーターを設定します。

        パラメーター

        説明

        デフォルト値

        max_new_tokens

        出力トークンの最大数。

        2048

        use_stream_chat

        ストリーミングモードで出力トークンを返すかどうかを指定します。

        true

        プロンプト

        ユーザープロンプト。

        ""

        system_prompt

        システムプロンプト。

        ""

        history

        対話の歴史。 値はList[Tuple(str, str)] 形式です。

        [()]

        temperature

        モデル出力のランダム性。 より大きな値は、より高いランダム性を指定する。 値0は固定出力を指定します。 値はFloat型で、0から1の範囲です。

        0.95

        top_k

        生成された結果から選択された出力の数。

        30

        top_p

        生成された結果から選択された出力の確率しきい値。 値はFloat型で、0から1の範囲です。

        0.8

        do_sample

        出力サンプリングを有効にするかどうかを指定します。

        true

        use_cache

        KVキャッシュを有効にするかどうかを指定します。

        true

      Pythonリクエストパッケージに基づいて独自のクライアントを実装することもできます。 例:

      import argparse
      import json
      from typing import Iterable, List
      
      import requests
      
      def post_http_request(prompt: str,
                            system_prompt: str,
                            history: list,
                            host: str,
                            authorization: str,
                            max_new_tokens: int = 2048,
                            temperature: float = 0.95,
                            top_k: int = 1,
                            top_p: float = 0.8,
                            langchain: bool = False,
                            use_stream_chat: bool = False) -> requests.Response:
          headers = {
              "User-Agent": "Test Client",
              "Authorization": f"{authorization}"
          }
          if not history:
              history = [
                  (
                      "San Francisco is a",
                      "city located in the state of California in the United States. \
                      It is known for its iconic landmarks, such as the Golden Gate Bridge \
                      and Alcatraz Island, as well as its vibrant culture, diverse population, \
                      and tech industry. The city is also home to many famous companies and \
                      startups, including Google, Apple, and Twitter."
                  )
              ]
          pload = {
              "prompt": prompt,
              "system_prompt": system_prompt,
              "top_k": top_k,
              "top_p": top_p,
              "temperature": temperature,
              "max_new_tokens": max_new_tokens,
              "use_stream_chat": use_stream_chat,
              "history": history
          }
          if langchain:
              pload["langchain"] = langchain
          response = requests.post(host, headers=headers,
                                   json=pload, stream=use_stream_chat)
          return response
      
      def get_response(response: requests.Response) -> List[str]:
          data = json.loads(response.content)
          output = data["response"]
          history = data["history"]
          return output, history
      
      if __name__ == "__main__":
          parser = argparse.ArgumentParser()
          parser.add_argument("--top-k", type=int, default=4)
          parser.add_argument("--top-p", type=float, default=0.8)
          parser.add_argument("--max-new-tokens", type=int, default=2048)
          parser.add_argument("--temperature", type=float, default=0.95)
          parser.add_argument("--prompt", type=str, default="How can I get there?")
          parser.add_argument("--langchain", action="store_true")
      
          args = parser.parse_args()
      
          prompt = args.prompt
          top_k = args.top_k
          top_p = args.top_p
          use_stream_chat = False
          temperature = args.temperature
          langchain = args.langchain
          max_new_tokens = args.max_new_tokens
      
          host = "<EAS service public endpoint>"
          authorization = "<EAS service public token>"
      
          print(f"Prompt: {prompt!r}\n", flush=True)
          # System prompts can be included in the requests. 
          system_prompt = "Act like you are programmer with \
                      5+ years of experience."
      
          # Dialogue history can be included in the requests. The client manages the history to implement multi-round dialogues. In most cases, the information from the previous round of dialogue is used. The information is in the List[Tuple(str, str)] format. 
          history = []
          response = post_http_request(
              prompt, system_prompt, history,
              host, authorization,
              max_new_tokens, temperature, top_k, top_p,
              langchain=langchain, use_stream_chat=use_stream_chat)
          output, history = get_response(response)
          print(f" --- output: {output} \n --- history: {history}", flush=True)
      
      # The server returns a JSON response that includes the inference result and dialogue history. 
      def get_response(response: requests.Response) -> List[str]:
          data = json.loads(response.content)
          output = data["response"]
          history = data["history"]
          return output, history

      次のパラメータに注意してください。

      • hostパラメーターをサービスエンドポイントに設定します。

      • authorizationパラメーターをサービストークンに設定します。

    • ストリーミングモード

      ストリーミングモードでは、HTTP SSEメソッドが使用されます。 サンプルコード:

      import argparse
      import json
      from typing import Iterable, List
      
      import requests
      
      
      def clear_line(n: int = 1) -> None:
          LINE_UP = '\033[1A'
          LINE_CLEAR = '\x1b[2K'
          for _ in range(n):
              print(LINE_UP, end=LINE_CLEAR, flush=True)
      
      
      def post_http_request(prompt: str,
                            system_prompt: str,
                            history: list,
                            host: str,
                            authorization: str,
                            max_new_tokens: int = 2048,
                            temperature: float = 0.95,
                            top_k: int = 1,
                            top_p: float = 0.8,
                            langchain: bool = False,
                            use_stream_chat: bool = False) -> requests.Response:
          headers = {
              "User-Agent": "Test Client",
              "Authorization": f"{authorization}"
          }
          if not history:
              history = [
                  (
                      "San Francisco is a",
                      "city located in the state of California in the United States. \
                      It is known for its iconic landmarks, such as the Golden Gate Bridge \
                      and Alcatraz Island, as well as its vibrant culture, diverse population, \
                      and tech industry. The city is also home to many famous companies and \
                      startups, including Google, Apple, and Twitter."
                  )
              ]
          pload = {
              "prompt": prompt,
              "system_prompt": system_prompt,
              "top_k": top_k,
              "top_p": top_p,
              "temperature": temperature,
              "max_new_tokens": max_new_tokens,
              "use_stream_chat": use_stream_chat,
              "history": history
          }
          if langchain:
              pload["langchain"] = langchain
          response = requests.post(host, headers=headers,
                                   json=pload, stream=use_stream_chat)
          return response
      
      
      def get_streaming_response(response: requests.Response) -> Iterable[List[str]]:
          for chunk in response.iter_lines(chunk_size=8192,
                                           decode_unicode=False,
                                           delimiter=b"\0"):
              if chunk:
                  data = json.loads(chunk.decode("utf-8"))
                  output = data["response"]
                  history = data["history"]
                  yield output, history
      
      
      if __name__ == "__main__":
          parser = argparse.ArgumentParser()
          parser.add_argument("--top-k", type=int, default=4)
          parser.add_argument("--top-p", type=float, default=0.8)
          parser.add_argument("--max-new-tokens", type=int, default=2048)
          parser.add_argument("--temperature", type=float, default=0.95)
          parser.add_argument("--prompt", type=str, default="How can I get there?")
          parser.add_argument("--langchain", action="store_true")
          args = parser.parse_args()
      
          prompt = args.prompt
          top_k = args.top_k
          top_p = args.top_p
          use_stream_chat = True
          temperature = args.temperature
          langchain = args.langchain
          max_new_tokens = args.max_new_tokens
      
          host = ""
          authorization = ""
      
          print(f"Prompt: {prompt!r}\n", flush=True)
          system_prompt = "Act like you are programmer with \
                      5+ years of experience."
          history = []
          response = post_http_request(
              prompt, system_prompt, history,
              host, authorization,
              max_new_tokens, temperature, top_k, top_p,
              langchain=langchain, use_stream_chat=use_stream_chat)
      
          for h, history in get_streaming_response(response):
              print(
                  f" --- stream line: {h} \n --- history: {history}", flush=True)
      

      次のパラメータに注意してください。

      • hostパラメーターをサービスエンドポイントに設定します。

      • authorizationパラメーターをサービストークンに設定します。

    WebSocketの使用

    WebSocketプロトコルは、ダイアログ履歴を効率的に処理できます。 WebSocketメソッドを使用してサービスに接続し、1回以上のダイアログを実行できます。 サンプルコード:

    import os
    import time
    import json
    import struct
    from multiprocessing import Process
    
    import websocket
    
    round = 5
    questions = 0
    
    
    def on_message_1(ws, message):
        if message == "<EOS>":
            print('pid-{} timestamp-({}) receives end message: {}'.format(os.getpid(),
                  time.time(), message), flush=True)
            ws.send(struct.pack('!H', 1000), websocket.ABNF.OPCODE_CLOSE)
        else:
            print("{}".format(time.time()))
            print('pid-{} timestamp-({}) --- message received: {}'.format(os.getpid(),
                  time.time(), message), flush=True)
    
    
    def on_message_2(ws, message):
        global questions
        print('pid-{} --- message received: {}'.format(os.getpid(), message))
        # end the client-side streaming
        if message == "<EOS>":
            questions = questions + 1
            if questions == 5:
                ws.send(struct.pack('!H', 1000), websocket.ABNF.OPCODE_CLOSE)
    
    
    def on_message_3(ws, message):
        print('pid-{} --- message received: {}'.format(os.getpid(), message))
        # end the client-side streaming
        ws.send(struct.pack('!H', 1000), websocket.ABNF.OPCODE_CLOSE)
    
    
    def on_error(ws, error):
        print('error happened: ', str(error))
    
    
    def on_close(ws, a, b):
        print("### closed ###", a, b)
    
    
    def on_pong(ws, pong):
        print('pong:', pong)
    
    # stream chat validation test
    def on_open_1(ws):
        print('Opening Websocket connection to the server ... ')
        params_dict = {}
        params_dict['prompt'] = """Show me a golang code example: """
        params_dict['temperature'] = 0.9
        params_dict['top_p'] = 0.1
        params_dict['top_k'] = 30
        params_dict['max_new_tokens'] = 2048
        params_dict['do_sample'] = True
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        # raw_req = f"""To open a Websocket connection to the server: """
    
        ws.send(raw_req)
        # end the client-side streaming
    
    
    # multi-round query validation test
    def on_open_2(ws):
        global round
        print('Opening Websocket connection to the server ... ')
        params_dict = {"max_new_tokens": 6144}
        params_dict['temperature'] = 0.9
        params_dict['top_p'] = 0.1
        params_dict['top_k'] = 30
        params_dict['use_stream_chat'] = True
        params_dict['prompt'] = "Hello! "
        params_dict = {
            "system_prompt":
            "Act like you are programmer with 5+ years of experience."
        }
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        ws.send(raw_req)
        params_dict['prompt'] = "Please write a sorting algorithm in Python."
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        ws.send(raw_req)
        params_dict['prompt'] = "Please convert the programming language to Java."
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        ws.send(raw_req)
        params_dict['prompt'] = "Please introduce yourself."
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        ws.send(raw_req)
        params_dict['prompt'] = "Please summarize the dialogue above."
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        ws.send(raw_req)
    
    
    # Langchain validation test.
    def on_open_3(ws):
        global round
        print('Opening Websocket connection to the server ... ')
    
        params_dict = {}
        # params_dict['prompt'] = """To open a Websocket connection to the server: """
        params_dict['prompt'] = """Can you tell me what's the MNN?"""
        params_dict['temperature'] = 0.9
        params_dict['top_p'] = 0.1
        params_dict['top_k'] = 30
        params_dict['max_new_tokens'] = 2048
        params_dict['use_stream_chat'] = False
        params_dict['langchain'] = True
        raw_req = json.dumps(params_dict, ensure_ascii=False).encode('utf8')
        ws.send(raw_req)
    
    
    authorization = ""
    host = "ws://" + ""
    
    
    def single_call(on_open_func, on_message_func, on_clonse_func=on_close):
        ws = websocket.WebSocketApp(
            host,
            on_open=on_open_func,
            on_message=on_message_func,
            on_error=on_error,
            on_pong=on_pong,
            on_close=on_clonse_func,
            header=[
                'Authorization: ' + authorization],
        )
    
        # setup ping interval to keep long connection.
        ws.run_forever(ping_interval=2)
    
    
    if __name__ == "__main__":
        for i in range(5):
            p1 = Process(target=single_call, args=(on_open_1, on_message_1))
            p2 = Process(target=single_call, args=(on_open_2, on_message_2))
            p3 = Process(target=single_call, args=(on_open_3, on_message_3))
    
            p1.start()
            p2.start()
            p3.start()
    
            p1.join()
            p2.join()
            p3.join()

    次のパラメータに注意してください。

    • authorizationパラメーターをサービストークンに設定します。

    • hostパラメーターをサービスエンドポイントに設定します。エンドポイントのhttpプレフィックスをwsに置き換えます。

    • use_stream_chatパラメーターを使用して、クライアントがストリーミングモードで出力を生成するかどうかを指定します。 デフォルト値は True です。

    • マルチラウンドダイアログを実装するには、上記のコードのon_open_2関数を参照してください。

よくある質問

別のオープンソースLLMに切り替えるにはどうすればよいですか?

以下の手順を実行します。

  1. Elastic Algorithm Service (EAS) ページで、更新するサービスを見つけ、[操作] 列の [更新] をクリックします。

  2. 別のオープンソースLLMに切り替えます。

    • シナリオベースのモデル配置

      [LLMデプロイ] ページで、[モデルタイプ] を目的のLLMに設定し、[デプロイ] をクリックします。

    • カスタムモデルの配置

      [サービスのデプロイ] ページで、[コマンド] および [ノードタイプ] パラメーターを変更し、[デプロイ] をクリックします。 次の表に、さまざまなモデルのパラメーター設定を示します。

      名前

      コマンド

      推奨仕様

      Qwen2-7b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen2-7B-Instrict

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      Qwen2-72b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen2-72B-Instrict

      • 2 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A100 (40 GB)

      • 8 × NVIDIA V100 (32 GB)

      Qwen2-57b-A14b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen2-57B-A14B-Instrict

      • 2 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A100 (40 GB)

      • 4 × NVIDIA V100 (32 GB)

      Qwen1.5-1.8b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-1.8B-チャット

      • 1 × NVIDIA T4

      • 1 × NVIDIA V100 (16 GB)

      • 1 × GU30

      • 1 × NVIDIA A10

      Qwen1.5-7b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-7B-チャット

      • 1 × GU30

      • 1 × NVIDIA A10

      Qwen1.5-14b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-14B-チャット

      • 1 × NVIDIA V100 (32 GB)

      • 1 × NVIDIA A100 (40 GB)

      • 1 × NVIDIA A100 (80 GB)

      • 2 × GU30

      • 2 × NVIDIA A10

      Qwen1.5-32b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-32B-チャット

      • 1 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA V100 (32 GB)

      Qwen1.5-72b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-72B-チャット

      • 8 × NVIDIA V100 (32 GB)

      • 2 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A100 (40 GB)

      Qwen1.5-110b

      python webui/webui_server.py -- port=8000 -- model-path=Qwen/Qwen1.5-110B-チャット

      • 8 × NVIDIA A100 (40 GB)

      • 4 × NVIDIA A100 (80 GB)

      llama3-8b

      python webui/webui_server.py -- port=8000 -- model-path=/huggingface/meta-Llama-3-8B-Instruct/ -- model-type=llama3

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      llama3-70b

      python webui/webui_server.py -- port=8000 -- model-path=/huggingface/meta-Llama-3-70B-Instruct/ -- model-type=llama3

      • 2 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A100 (40 GB)

      • 8 × NVIDIA V100 (32 GB)

      Llama2-7b

      python webui/webui_server.py -- port=8000 -- model-path=meta-llama/Llama-2-7b-chat-hf

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      Llama2-13b

      python webui/webui_server.py -- port=8000 -- model-path=meta-llama/Llama-2-13b-chat-hf

      • 1 × NVIDIA V100 (32 GB)

      • 2 × GU30

      • 2 × NVIDIA A10

      llama2-70b

      python webui/webui_server.py -- port=8000 -- model-path=meta-llama/Llama-2-70b-chat-hf

      • 8 × NVIDIA V100 (32 GB)

      • 2 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A100 (40 GB)

      chatglm3-6b

      python webui/webui_server.py -- port=8000 -- model-path=THUDM/chatglm3-6b

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (16 GB)

      • 1 × NVIDIA V100 (32 GB)

      baichuan2-7b

      python webui/webui_server.py -- port=8000 -- model-path=baichuan-inc/Baichuan2-7B-Chat

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      baichuan2-13b

      python webui/webui_server.py -- port=8000 -- model-path=baichuan-inc/Baichuan2-13B-Chat

      • 2 × GU30

      • 2 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      falcon-7b

      python webui/webui_server.py -- port=8000 -- model-path=tiiuae/falcon-7b-instruct

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      falcon-40b

      python webui/webui_server.py -- port=8000 -- model-path=tiiuae/falcon-40b-instruct

      • 8 × NVIDIA V100 (32 GB)

      • 2 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A100 (40 GB)

      falcon-180b

      python webui/webui_server.py -- port=8000 -- model-path=tiiuae/falcon-180B-chat

      8 × NVIDIA A100 (80 GB)

      Yi-6b

      python webui/webui_server.py -- port=8000 -- model-path=01-ai/Yi-6B-Chat

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (16 GB)

      • 1 × NVIDIA V100 (32 GB)

      Yi-34b

      python webui/webui_server.py -- port=8000 -- model-path=01-ai/Yi-34B-Chat

      • 4 × NVIDIA V100 (16 GB)

      • 1 × NVIDIA A100 (80 GB)

      • 4 × NVIDIA A10

      mistral-7b-instruct-v0.2

      python webui/webui_server.py -- port=8000 -- model-path=mistralai/Mistral-7B-Instruct-v0。2

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      mixtral-8x7b-instruct-v0.1

      python webui/webui_server.py -- port=8000 -- model-path=mistralai/Mixtral-8x7B-Instruct-v0。1

      4 × NVIDIA A100 (80 GB)

      gemma-2b-it

      python webui/webui_server.py -- port=8000 -- model-path=google/gemma-2b-it

      • 1 × NVIDIA T4

      • 1 × NVIDIA V100 (16 GB)

      • 1 × GU30

      • 1 × NVIDIA A10

      gemma-7b-it

      python webui/webui_server.py -- port=8000 -- model-path=google/gemma-7b-it

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      deepseek-coder-7b-instruct-v1.5

      python webui/webui_server.py -- port=8000 -- model-path=deepseek-ai/deepseek-coder-7b-instruct-v1。5

      • 1 × GU30

      • 1 × NVIDIA A10

      • 1 × NVIDIA V100 (32 GB)

      deepseek-coder-33b指示

      python webui/webui_server.py -- port=8000 -- model-path=deepseek-ai/deepseek-coder-33b-指示

      • 1 × NVIDIA A100 (80 GB)

      • 2 × NVIDIA A100 (40 GB)

      • 4 × NVIDIA V100 (32 GB)

      deepseek-v2ライト

      python webui/webui_server.py -- port=8000 -- model-path=deepseek-ai/DeepSeek-V2-Lite-Chat

      • 1 × NVIDIA A10

      • 1 × NVIDIA A100 (40 GB)

      • 1 × NVIDIA L20

関連ドキュメント

EASを使用して、LLMおよびRAG (Retrieval-Augmented Generation) と統合されたダイアログサービスをデプロイできます。 LangChainを使用してビジネスデータを統合した後、WebUIまたはAPI操作を使用してモデルの推論機能を検証できます。 詳細については、「RAGベースのLLMチャットボット」をご参照ください。