text-generation-inference 文件

流式傳輸

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

流式傳輸

什麼是流式傳輸?

令牌流式傳輸是指伺服器在模型生成令牌時逐個返回令牌的模式。這使得能夠向用戶顯示逐步生成的進度,而不是等待整個生成完成。流式傳輸是終端使用者體驗的一個重要方面,因為它減少了延遲,這是流暢體驗最關鍵的方面之一。

透過令牌流式傳輸,伺服器可以在生成整個響應之前就開始逐個返回令牌。使用者可以在生成結束之前瞭解生成質量。這有不同的積極影響:

  • 對於超長查詢,使用者可以提前幾個數量級獲得結果。
  • 看到正在進行的生成允許使用者在生成方向與預期不符時停止生成。
  • 在早期階段顯示結果時,感知延遲會降低。
  • 在對話式 UI 中使用時,體驗感覺更自然。

例如,一個系統每秒可以生成 100 個令牌。如果系統生成 1000 個令牌,在非流式設定下,使用者需要等待 10 秒才能獲得結果。另一方面,在流式設定下,使用者會立即獲得初始結果,儘管端到端延遲將是相同的,但他們可以在五秒鐘後看到一半的生成。下面您可以看到一個互動式演示,並排顯示非流式傳輸與流式傳輸。點選下面的“**生成**”。

如何使用流式傳輸?

使用 Python 進行流式傳輸

要使用 `InferenceClient` 進行令牌流式傳輸,只需傳入 `stream=True` 並迭代響應即可。

from huggingface_hub import InferenceClient

client = InferenceClient(base_url="http://127.0.0.1:8080")
output = client.chat.completions.create(
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Count to 10"},
    ],
    stream=True,
    max_tokens=1024,
)

for chunk in output:
    print(chunk.choices[0].delta.content)

# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10

`huggingface_hub` 庫還附帶了一個 `AsyncInferenceClient`,以防您需要併發處理請求。

from huggingface_hub import AsyncInferenceClient

client = AsyncInferenceClient(base_url="http://127.0.0.1:8080")
async def main():
    stream = await client.chat.completions.create(
        messages=[{"role": "user", "content": "Say this is a test"}],
        stream=True,
    )
    async for chunk in stream:
        print(chunk.choices[0].delta.content or "", end="")

asyncio.run(main())

# This
# is
# a
# test
#.

使用 cURL 進行流式傳輸

要使用與 OpenAI Chat Completions 相容的 Messages API `v1/chat/completions` 端點與 curl 互動,您可以新增 `-N` 標誌,該標誌停用 curl 預設緩衝並顯示從伺服器到達的資料。

curl localhost:8080/v1/chat/completions \
    -X POST \
    -d '{
  "model": "tgi",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful assistant."
    },
    {
      "role": "user",
      "content": "What is deep learning?"
    }
  ],
  "stream": true,
  "max_tokens": 20
}' \
    -H 'Content-Type: application/json'

使用 JavaScript 進行流式傳輸

首先,我們需要安裝 ` @huggingface/inference ` 庫。

npm install @huggingface/inference

無論您使用 Inference Providers(我們的無伺服器 API)還是 Inference Endpoints,您都可以呼叫 `InferenceClient`。

import { InferenceClient } from '@huggingface/inference';

const client = new InferenceClient('hf_YOUR_TOKEN', { endpointUrl: 'https://YOUR_ENDPOINT.endpoints.huggingface.cloud' });

// prompt
const prompt = 'What can you do in Nuremberg, Germany? Give me 3 Tips';

const stream = client.textGenerationStream({ inputs: prompt });
for await (const r of stream) {
  // yield the generated token
  process.stdout.write(r.token.text);
}

流式傳輸在底層如何工作?

在底層,TGI 使用伺服器傳送事件(SSE)。在 SSE 設定中,客戶端傳送帶有資料的請求,開啟 HTTP 連線並訂閱更新。之後,伺服器將資料傳送到客戶端。無需進一步請求;伺服器將繼續傳送資料。SSE 是單向的,這意味著客戶端在第一次請求後不會向伺服器傳送其他請求。SSE 透過 HTTP 傳送資料,使其易於使用。

SSE 與以下不同:

  • 輪詢:客戶端不斷呼叫伺服器以獲取資料。這意味著伺服器可能會返回空響應並導致開銷。
  • Webhook:雙向連線。伺服器可以將資訊傳送到客戶端,但客戶端也可以在第一次請求後將資料傳送到伺服器。Webhook 更復雜,因為它們不僅僅使用 HTTP。

如果同時有太多請求,TGI 會返回一個帶有 `overloaded` 錯誤型別(`huggingface_hub` 返回 `OverloadedError`)的 HTTP 錯誤。這允許客戶端管理過載的伺服器(例如,它可以向用戶顯示繁忙錯誤或透過新請求重試)。要配置最大併發請求數,您可以指定 `--max_concurrent_requests`,從而允許客戶端處理背壓。

< > 在 GitHub 上更新

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