text-generation-inference 文件

文字生成推理架構

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

文字生成推理架構

本文件旨在透過描述獨立元件之間的呼叫流程來闡述文字生成推理(TGI)的架構。

以下是一個高階架構圖

TGI architecture

此圖很好地展示了這些獨立的元件

  • 路由器,也稱為 webserver,它接收客戶端請求,緩衝它們,建立批次,並準備對模型伺服器的 gRPC 呼叫。
  • 啟動器是一個輔助程式,能夠啟動一個或多個模型伺服器(如果模型是分片的),並使用相容的引數啟動路由器。
  • 模型伺服器,負責接收 gRPC 請求並對模型執行推理。如果模型分片到多個加速器(例如:多個 GPU),模型伺服器分片可以透過 NCCL 或等效方式進行同步。

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

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

路由器

此元件是一個 Rust Web 伺服器二進位制檔案,它接受使用自定義 HTTP API 以及 OpenAI 的 Messages API 的 HTTP 請求。路由器接收 API 呼叫並處理“批處理”邏輯(有關批處理的介紹可在此處找到)。它使用不同的策略來減少請求和響應之間的延遲,特別是針對解碼延遲。它將使用佇列、排程器和塊分配器來實現這一點,並生成批處理請求,然後將其傳送到模型伺服器。

路由器的命令列

路由器的命令列將是向其傳遞引數的方式(它不依賴於配置檔案)

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

模型伺服器

模型伺服器是一個 Python 伺服器,能夠啟動一個等待 gRPC 請求的伺服器,載入給定模型,執行分片以提供張量並行,並在等待新請求時保持活動狀態。模型伺服器支援使用 Pytorch 例項化並主要為 CUDA/ROCM 推理最佳化的模型。

模型伺服器變體

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

並非所有變體都提供相同的功能,因為硬體和中介軟體功能不提供相同的最佳化。

命令列介面

伺服器的官方命令列介面 (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. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯

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

呼叫流程

一旦這兩個元件初始化完畢,權重下載完成,模型伺服器啟動並執行,路由器和模型伺服器透過 gRPC 呼叫交換資料和資訊。目前支援兩種模式,v2v3。這兩個版本幾乎相同,除了:

  • 支援文字和影像資料的輸入塊,
  • 支援分頁注意力。

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

sequenceDiagram

    Router->>Model Server: service discovery
    Model Server-->>Router: urls for other shards

    Router->>Model Server: get model info
    Model Server-->>Router: shard info

    Router->>Model Server: health check
    Model Server-->>Router: health OK

    Router->>Model Server: warmup(max_input_tokens, max_batch_prefill_tokens, max_total_tokens, max_batch_size)
    Model Server-->>Router: warmup result

完成這些後,路由器即可接收來自多個客戶端的生成呼叫。以下是一個示例。

sequenceDiagram
    participant Client 1
    participant Client 2
    participant Client 3
    participant Router
    participant Model Server

    Client 1->>Router: generate_stream
    Router->>Model Server: prefill(batch1)
    Model Server-->>Router: generations, cached_batch1, timings
    Router-->>Client 1: token 1

    Router->>Model Server: decode(cached_batch1)
    Model Server-->>Router: generations, cached_batch1, timings
    Router-->>Client 1: token 2

    Router->>Model Server: decode(cached_batch1)
    Model Server-->>Router: generations, cached_batch1, timings
    Router-->>Client 1: token 3

    Client 2->>Router: generate_stream
    Router->>Model Server: prefill(batch2)
    Note right of Model Server: This stops previous batch, that is restarted
    Model Server-->>Router: generations, cached_batch2, timings
    Router-->>Client 2: token 1'

    Router->>Model Server: decode(cached_batch1, cached_batch2)
    Model Server-->>Router: generations, cached_batch1, timings
    Router-->>Client 1: token 4
    Router-->>Client 2: token 2'

    Note left of Client 1: Client 1 leaves
    Router->>Model Server: filter_batch(cached_batch1, request_ids_to_keep=batch2)
    Model Server-->>Router: filtered batch

    Router->>Model Server: decode(cached_batch2)
    Model Server-->>Router: generations, cached_batch2, timings
    Router-->>Client 2: token 3'

    Client 3->>Router: generate_stream
    Note right of Model Server: This stops previous batch, that is restarted
    Router->>Model Server: prefill(batch3)
    Note left of Client 1: Client 3 leaves without receiving any batch
    Router->>Model Server: clear_cache(batch3)
    Note right of Model Server: This stops previous batch, that is restarted

    Router->>Model Server: decode(cached_batch3)
    Note right of Model Server: Last token (stopping criteria)
    Model Server-->>Router: generations, cached_batch3, timings
    Router-->>Client 2: token 4'

< > 在 GitHub 上更新

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