text-generation-inference 文件
文字生成推理架構
並獲得增強的文件體驗
開始使用
文字生成推理架構
本文件旨在透過描述獨立元件之間的呼叫流程來闡述文字生成推理(TGI)的架構。
以下是一個高階架構圖
此圖很好地展示了這些獨立的元件
- 路由器,也稱為
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 積極支援模型伺服器的幾種變體
- 預設情況下,模型伺服器將嘗試構建針對 Nvidia GPU 和 CUDA 最佳化的伺服器。此版本的程式碼託管在主 TGI 倉庫中。
- 一個針對 AMD 和 ROCm 最佳化的版本託管在主 TGI 倉庫中。某些模型功能有所不同。
- 一個針對 Intel GPU 最佳化的版本託管在主 TGI 倉庫中。某些模型功能有所不同。
- Intel Gaudi 版本在分叉倉庫中維護,並經常與主TGI 倉庫同步。
- Neuron (AWS Inferentia2) 版本在主 TGI 倉庫中維護。某些模型功能有所不同。
- Google TPU 版本作為 Optimum TPU 的一部分進行維護。
並非所有變體都提供相同的功能,因為硬體和中介軟體功能不提供相同的最佳化。
命令列介面
伺服器的官方命令列介面 (CLI) 支援三個子命令:download-weights
、quantize
和 serve
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 呼叫交換資料和資訊。目前支援兩種模式,v2 和 v3。這兩個版本幾乎相同,除了:
- 支援文字和影像資料的輸入塊,
- 支援分頁注意力。
以下圖表顯示了路由器和模型伺服器啟動後的交換過程。
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'