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


透過令牌流式傳輸,伺服器可以在生成整個響應之前就開始逐個返回令牌。使用者可以在生成結束之前瞭解生成質量。這有不同的積極影響:
- 對於超長查詢,使用者可以提前幾個數量級獲得結果。
- 看到正在進行的生成允許使用者在生成方向與預期不符時停止生成。
- 在早期階段顯示結果時,感知延遲會降低。
- 在對話式 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 上更新