Prhub

#49295 [Rust][Benchmark] Use async HTTP clients

原始 PR 作者 BugenZhao 合并时间 2026-07-21 16:53 文件变更 15 提交数 1 评论 2 代码增减 +200 / -122

执行摘要

基准测试 HTTP 客户端异步化

Uncached downloads created reqwest::blocking::Client while the benchmark was running inside a Tokio runtime. Dropping the blocking client could shut down its internal runtime from async context and panic.

此PR展示了在Rust异步生态中处理同步接口的典型模式(block_on + Handle),值得关注Rust/基准测试模块的开发者精读。设计决策清晰,改动干净。

讨论亮点

PR提交后由@BugenZhao发起,经@esmeetu审核批准,无实质讨论。ChatGPT Codex审核未发现重大问题。

实现拆解

  1. ServerTokenizer 异步化:将 client 字段从 reqwest::blocking::Client 改为 reqwest::Client,新增 runtime: tokio::runtime::Handle。原有的同步方法 encode_inner / decode_inner 拆分为同步外皮(通过 block_on 调用异步核心)和异步核心 encode_async / decode_async
  2. HubRepo 重写:去除每下载一个文件就启动一个线程并在其中构建 tokio 运行时的复杂模式。直接使用 hf_hub::api::tokio::ApiRepoget 方法变为 async,构造函数完成一次 API 初始化。
  3. 调用链适配:所有依赖 HubRepo::get 的代码(tiktoken.rshf_dataset.rsspeed_bench.rssharegpt.rs 等)均改为 async,使用 .await 调用下载。涉及函数签名如 try_load_tiktokendownload_hf_datasetget_with_retry 等。
  4. 测试适配#[test] 改为 #[tokio::test],测试中调用 load_tokenizer 等异步函数时使用 .await。部分测试(如 random.rs 中的 test_generate_random_dataset_token_ids)改用内置 Tiktoken 避免网络依赖。
  5. 依赖清理:从 Cargo.toml 中移除 reqwest/blocking 特性。
文件 模块 状态 重要度
rust/src/bench/src/tokenizer.rs 令牌生成器 modified 8.43
rust/src/bench/src/hub.rs HF Hub modified 8.24
rust/src/bench/src/tiktoken.rs Tiktoken 加载 modified 7.78
rust/src/bench/src/datasets/hf_dataset.rs 数据集下载 modified 7.25
rust/src/bench/src/datasets/multi_turn.rs 多轮对话 modified 7.88
rust/src/bench/src/datasets/random.rs 随机数据集 modified 7.15
rust/src/bench/src/benchmark.rs 基准测试 modified 5.9

关键符号

ServerTokenizer::new ServerTokenizer::encode_async ServerTokenizer::encode_inner HubRepo::new HubRepo::get try_load_tiktoken try_load_tiktoken_from_hf extract_pat_str_from_repo download_hf_dataset get_with_retry

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 在同步接口中使用block_on,如果Tokio运行时为current_thread且同步接口在异步上下文中调用,可能导致死锁。但此用法仅在Rust端不支持tokenizer时触发,且ServerTokenizer仅在抛出错误后创建,风险可控。
  2. 改为异步客户端后,网络行为(超时、重试)语义不变,但底层实现变化可能暴露新的超时或连接问题。
  3. 测试使用#[tokio::test]但被#[ignore],不影响CI,但若未来启用可能需要确保Tokio运行时正确配置。

对用户:不直接影响(基准测试工具)。对系统:消除了一个可能panic的场景,提升了基准测试稳定性。对团队:简化了依赖管理(不再需要reqwest的blocking特性),有助于后续全异步化。

运行时死锁风险 异步客户端行为改变 测试依赖 tokio

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论