Text Generation Inference 文件

文字生成推論架構

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

文字生成推論架構

本文件旨在透過描述各獨立組件之間的呼叫流程,來說明文字生成推論 (TGI) 的架構。

此處可查看高階架構圖

TGI architecture

此圖清楚顯示了這些獨立組件:

  • 路由器 (Router),亦稱為 webserver,負責接收客戶端請求、對請求進行緩衝處理、建立批次 (batches),並準備傳送給模型伺服器的 gRPC 呼叫。
  • 啟動器 (Launcher) 是一個輔助工具,能夠啟動一個或多個模型伺服器(如果模型已分片),並使用相容的參數啟動路由器。
  • 模型伺服器 (Model server),負責接收 gRPC 請求並處理模型的推論。如果模型跨多個加速器(例如:多個 GPU)進行分片,模型伺服器分片可能會透過 NCCL 或同等技術進行同步。

請注意,對於其他後端(例如 TRTLLM),模型伺服器和啟動器是針對該後端特有的。

路由器和模型伺服器可以是兩台不同的機器,不需要部署在一起。

路由器 (The Router)

此組件是一個 Rust Web 伺服器二進位檔,接受使用自定義 HTTP API 以及 OpenAI Messages API 的 HTTP 請求。路由器接收 API 呼叫並處理「批次」(batches) 邏輯(批次處理介紹可參見此處)。它使用不同的策略來減少請求與回應之間的延遲,特別是針對解碼延遲進行優化。它會利用佇列、排程器和區塊分配器來實現這一點,並產生隨後發送到模型伺服器的批次請求。

路由器的命令列

路由器的命令列是傳遞參數給它的方式(它不依賴設定檔)。

Text Generation Webserver

Usage: text-generation-router [OPTIONS]

Options:
      --max-concurrent-requests <MAX_CONCURRENT_REQUESTS>
          [env: MAX_CONCURRENT_REQUESTS=] [default: 128]
      --max-best-of <MAX_BEST_OF>
          [env: MAX_BEST_OF=] [default: 2]
      --max-stop-sequences <MAX_STOP_SEQUENCES>
          [env: MAX_STOP_SEQUENCES=] [default: 4]
      --max-top-n-tokens <MAX_TOP_N_TOKENS>
          [env: MAX_TOP_N_TOKENS=] [default: 5]
      --max-input-tokens <MAX_INPUT_TOKENS>
          [env: MAX_INPUT_TOKENS=] [default: 1024]
      --max-total-tokens <MAX_TOTAL_TOKENS>
          [env: MAX_TOTAL_TOKENS=] [default: 2048]
      --waiting-served-ratio <WAITING_SERVED_RATIO>
          [env: WAITING_SERVED_RATIO=] [default: 1.2]
      --max-batch-prefill-tokens <MAX_BATCH_PREFILL_TOKENS>
          [env: MAX_BATCH_PREFILL_TOKENS=] [default: 4096]
      --max-batch-total-tokens <MAX_BATCH_TOTAL_TOKENS>
          [env: MAX_BATCH_TOTAL_TOKENS=]
      --max-waiting-tokens <MAX_WAITING_TOKENS>
          [env: MAX_WAITING_TOKENS=] [default: 20]
      --max-batch-size <MAX_BATCH_SIZE>
          [env: MAX_BATCH_SIZE=]
      --hostname <HOSTNAME>
          [env: HOSTNAME=] [default: 0.0.0.0]
  -p, --port <PORT>
          [env: PORT=] [default: 3000]
      --master-shard-uds-path <MASTER_SHARD_UDS_PATH>
          [env: MASTER_SHARD_UDS_PATH=] [default: /tmp/text-generation-server-0]
      --tokenizer-name <TOKENIZER_NAME>
          [env: TOKENIZER_NAME=] [default: bigscience/bloom]
      --tokenizer-config-path <TOKENIZER_CONFIG_PATH>
          [env: TOKENIZER_CONFIG_PATH=]
      --revision <REVISION>
          [env: REVISION=]
      --validation-workers <VALIDATION_WORKERS>
          [env: VALIDATION_WORKERS=] [default: 2]
      --json-output
          [env: JSON_OUTPUT=]
      --otlp-endpoint <OTLP_ENDPOINT>
          [env: OTLP_ENDPOINT=]
      --otlp-service-name <OTLP_SERVICE_NAME>
          [env: OTLP_SERVICE_NAME=]
      --cors-allow-origin <CORS_ALLOW_ORIGIN>
          [env: CORS_ALLOW_ORIGIN=]
      --ngrok
          [env: NGROK=]
      --ngrok-authtoken <NGROK_AUTHTOKEN>
          [env: NGROK_AUTHTOKEN=]
      --ngrok-edge <NGROK_EDGE>
          [env: NGROK_EDGE=]
      --messages-api-enabled
          [env: MESSAGES_API_ENABLED=]
      --disable-grammar-support
          [env: DISABLE_GRAMMAR_SUPPORT=]
      --max-client-batch-size <MAX_CLIENT_BATCH_SIZE>
          [env: MAX_CLIENT_BATCH_SIZE=] [default: 4]
  -h, --help
          Print help
  -V, --version
          Print version

模型伺服器 (The Model Server)

模型伺服器是一個 Python 伺服器,能夠啟動並等待 gRPC 請求,載入指定的模型,執行分片以提供張量並行 (tensor parallelism),並保持運作以等待新請求。模型伺服器支援使用 Pytorch 實例化並針對 CUDA/ROCM 推論進行主要優化的模型。

模型伺服器變體

Hugging Face 積極支援數種模型伺服器的變體。

並非所有變體都提供相同的功能,因為硬體和中間件的能力並不提供相同的優化。

命令列介面 (CLI)

伺服器的官方命令列介面 (CLI) 支援三個子命令:download-weightsquantizeserve

  • download-weights 將從 Hub 下載權重,在某些變體中,它會將權重轉換為適合給定實作的格式;
  • quantize 允許使用 qptq 套件對模型進行量化。此功能並非在所有變體中都可用或受到支援;
  • serve 將啟動伺服器,載入模型(或模型分片),從路由器接收 gRPC 呼叫,執行推論,並針對給定請求提供格式化的回應。

TGI 儲存庫上 Serve 的命令列參數如下:

 Usage: cli.py serve [OPTIONS] MODEL_ID

╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ *    model_id      TEXT  [default: None] [required]                                                      │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --revision                                       TEXT                        [default: None]             │
│ --sharded              --no-sharded                                          [default: no-sharded]       │
│ --quantize                                       [bitsandbytes|bitsandbytes  [default: None]             │
│                                                  -nf4|bitsandbytes-fp4|gptq                              │
│                                                  |awq|eetq|exl2|fp8]                                     │
│ --speculate                                      INTEGER                     [default: None]             │
│ --dtype                                          [float16|bfloat16]          [default: None]             │
│ --trust-remote-code    --no-trust-remote-code                                [default:                   │
│                                                                              no-trust-remote-code]       │
│ --uds-path                                       PATH                        [default:                   │
│                                                                              /tmp/text-generation-serve… │
│ --logger-level                                   TEXT                        [default: INFO]             │
│ --json-output          --no-json-output                                      [default: no-json-output]   │
│ --otlp-endpoint                                  TEXT                        [default: None]             │
│ --otlp-service-name                              TEXT                        [default:                   │
│                                                                              text-generation-inference...│
│ --help                                                                       Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯

請注意,某些變體可能支援不同的參數,並且可能接受更多可以透過環境變數傳遞的選項。

呼叫流程 (Call Flow)

一旦兩個組件都初始化完畢、權重下載完成且模型伺服器啟動並運作後,路由器和模型伺服器便會透過 gRPC 呼叫交換資料和資訊。目前支援兩種架構:v2v3。這兩個版本幾乎相同,除了以下區別:

  • 支援文字和圖像資料的輸入區塊 (input chunks);
  • 支援分頁注意力 (paged attention)。

以下是展示路由器和模型伺服器啟動後交換過程的圖表。

完成這些步驟後,路由器即準備好接收來自多個客戶端的產生呼叫。這是一個範例。

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.