非同步 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_window、repetition_penalty、sample_seed、l_warmup_tokens、l_warmup_L、safety_check、safety_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()