Text Generation Inference 文件

串流

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

串流 (Streaming)

什麼是串流 (Streaming)?

Token 串流是一種模式,伺服器會在模型生成的同時,將 Token 一個接一個地回傳。這使得我們可以向使用者展示生成的過程,而不必等待整個生成過程結束。串流是終端使用者體驗中不可或缺的一環,因為它減少了延遲,而延遲是影響流暢體驗最關鍵的因素之一。

透過 Token 串流,伺服器可以在生成完整回應之前,就開始逐一回傳 Token。使用者在生成結束前就能感受到生成的品質。這能帶來多種正面的影響:

  • 對於極長的查詢,使用者可以提早數個數量級獲得結果。
  • 可以看到生成過程,讓使用者若發現結果不如預期,可以隨時停止生成。
  • 當結果在早期階段顯示時,感知的延遲會降低。
  • 在對話式 UI 中使用時,體驗會感覺更自然。

例如,系統每秒可以生成 100 個 Token。如果系統要生成 1000 個 Token,在非串流的設定下,使用者需要等待 10 秒才能看到結果。另一方面,在串流設定下,使用者可以立即獲得初步結果,雖然端對端延遲是一樣的,但他們在 5 秒後就能看到一半的生成結果。下方有一個互動式演示,展示了非串流與串流的對比。請點擊下方的產生 (generate)

如何使用串流?

使用 Python 進行串流

若要使用 InferenceClient 串流 Token,只需傳入 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 使用伺服器推送事件 (Server-Sent Events, SSE)。在 SSE 設定中,客戶端發送包含資料的請求,開啟一個 HTTP 連線並訂閱更新。隨後,伺服器會將資料主動推送給客戶端。無需額外的請求;伺服器會持續發送資料。SSE 是單向的,這意味著客戶端不會再向伺服器發送其他請求。SSE 透過 HTTP 發送資料,因此非常容易使用。

SSE 與以下技術不同:

  • 輪詢 (Polling):客戶端持續呼叫伺服器以獲取資料。這意味著伺服器可能會回傳空的回應並造成額外開銷。
  • Webhook:這是一種雙向連線。伺服器可以向客戶端發送資訊,客戶端在第一次請求後也能將資料傳回給伺服器。Webhook 的運作較為複雜,因為它們不只使用 HTTP。

如果同時有太多請求,TGI 會回傳一個帶有 overloaded 錯誤類型的 HTTP 錯誤 (huggingface_hub 會回傳 OverloadedError)。這允許客戶端處理伺服器過載的情況(例如,它可以向使用者顯示忙碌錯誤或使用新請求進行重試)。若要設定最大並發請求數,您可以指定 --max_concurrent_requests,允許客戶端處理背壓 (backpressure)。

在 GitHub 上更新

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