跳至主要内容

非同步 API

AsyncModel 將同步的 tinyloop_py.Model 綁定包裝起來,讓每個阻塞的 CUDA 呼叫在執行緒池中執行,使您可以在任何 asyncio 協程中 await 推理,而不會阻塞事件迴圈。

快速開始

import asyncio
from tinyloop_tools.async_model import AsyncModel

async def main():
async with AsyncModel("model.tinyloop") as model:
tokens = await model.generate([1, 2, 3], max_tokens=32, loops=8)
print(tokens)

asyncio.run(main())

並行模型

底層 C++ 模型非執行緒安全AsyncModel 透過 asyncio.Lock 序列化所有呼叫,因此並行的 await 會自動排隊。

單執行緒 ThreadPoolExecutor 執行阻塞的 CUDA 工作:

  • 事件迴圈在 GPU 計算期間保持回應。
  • 多個並行 await model.generate(...) 呼叫被序列化,而非平行化。
  • GIL 在 C++ 執行期間透過 pybind11 的 gil_scoped_release 釋放。

API 參考

建構子

AsyncModel(path, max_seq_len=2048, prefill_chunk=0, max_workers=1)

評分

logits = await model.score(tokens, loops=8) # [seq_len, vocab]
logits = await model.score_last(tokens, loops=8) # [vocab]
logits = await model.score_logit_lens(tokens, loops=8) # [loops, vocab]
traj = await model.score_trajectory(tokens, loops=8) # dict

生成

tokens = await model.generate(prompt, max_tokens=128, loops=8,
temperature=0.0, top_k=50)

支援同步 API 的所有 generate 參數:cache_windowrepetition_penaltysample_seedl_warmup_tokensl_warmup_Lsafety_checksafety_norm_threshold

串流

async for token_id in model.generate_stream(prompt, max_tokens=128, loops=8):
print(token_id, end=" ")

串流透過 asyncio.Queue 從 C++ 回呼橋接 — token 生成後立即產出。

推測式解碼

result = await model.generate_speculative(prompt, draft_loops=2,
verify_loops=8, draft_ahead=4)

批次生成

outputs = await model.generate_batch(
[prompt1, prompt2, prompt3],
max_tokens=64, loops=8,
per_lane_loops=[4, 8, 16] # 可選 L-aware 批處理
)

上下文管理器

async with AsyncModel("model.tinyloop") as model:
... # 自動呼叫 model.close()

工具

cfg = model.config() # 同步 — 回傳 dict
vram = await model.vram_usage_mb()