CUDA异步流(CUDA Streams)优化

——AI推理性能优化的核心并行技术

author: 周均扬

date: 2026.06.07


1. 为什么需要CUDA Streams?

在GPU上,默认所有操作(kernel执行、内存拷贝、事件)都属于默认流(Default Stream / NULL Stream),这些操作是串行的。即使GPU有很强的并行能力,H2D(Host-to-Device)、D2H(Device-to-Host)、Kernel计算之间也无法重叠。

CUDA Stream 的核心价值在于:

典型收益:在AI推理中,合理使用Stream可将端到端延迟降低 20%~60%,吞吐提升 30%~2x(取决于模型和硬件)。

2. CUDA Stream 基础概念

关键API(CUDA Runtime):

cudaStream_t stream;
cudaStreamCreate(&stream);                    // 创建
cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking);  // 推荐:非阻塞
cudaStreamDestroy(stream);

// 异步操作
cudaMemcpyAsync(d_data, h_data, size, cudaMemcpyHostToDevice, stream);
kernel<<<grid, block, 0, stream>>>(...);
cudaMemcpyAsync(h_out, d_out, size, cudaMemcpyDeviceToHost, stream);

3. AI推理中的异步流优化实战

1. 经典三阶段流水线重叠

在推理中典型流程:

  1. H2D(输入传输)
  2. Kernel计算(前向推理)
  3. D2H(输出传输)

使用多个Stream + 环形缓冲(Ping-Pong / Triple Buffering)可以实现三者高度重叠。

推荐架构(多Stream + 多缓冲):

2. PyTorch 中的异步流优化

import torch

# 创建Stream
stream = torch.cuda.Stream()

with torch.cuda.stream(stream):
    # 在此Stream中执行
    gpu_tensor = pinned_tensor.to('cuda', non_blocking=True)
    output = model(gpu_tensor)

# 等待特定Stream完成
stream.synchronize()
# 或使用事件
event = torch.cuda.Event(enable_timing=True)
event.record(stream)
event.synchronize()

高级:torch.cuda.Stream 结合 torch.compile、torch.utils.data.DataLoader(pin_memory=True, num_workers=...) 实现端到端异步流水线。

3. TensorRT 中的异步执行

TensorRT 是异步流优化的典范:

// 创建执行上下文
IExecutionContext* context = engine->createExecutionContext();

// 绑定多个Stream
cudaStream_t stream;
cudaStreamCreate(&stream);

context->enqueueV3(stream);   // 或 execute_async_v2
cudaStreamSynchronize(stream);

结合 I/O Binding + Pinned Memory + 多Stream 是工业级高性能推理的标准做法。

4. 高级优化技巧

  1. Stream Priority(流优先级)
    cudaStreamCreateWithPriority(&high_stream, cudaStreamNonBlocking, -1); // 高优先级
    

    适合把关键路径(推理kernel)放入高优先级Stream。

  2. CUDA Events(事件同步)
    • 用于精细控制依赖关系,而不阻塞整个Stream。
    • cudaEventRecord、cudaEventSynchronize、cudaStreamWaitEvent。
  3. Graph Capture(CUDA Graphs) + Stream
    • CUDA 10.0+ 引入,捕获一系列kernel操作成Graph,降低CPU launch overhead。
    • 在LLM推理中结合Stream使用,可极大提升小批量推理性能。
  4. 多GPU + Multi-Stream
    • NCCL + Stream 实现数据并行/流水线并行(Pipeline Parallelism)。
  5. Memory Pool + Stream
    • 使用 cudaMallocAsync(CUDA 11.2+)结合Stream,实现异步内存分配,减少分配开销。

5. 最佳实践与注意事项

推荐配置:

常见坑:

性能指标参考(RTX 4090 / A100 典型场景):

6. 未来趋势


总结:Zero Copy 解决“拷贝开销”问题,CUDA Async Stream 解决“串行等待”问题。两者结合 + CUDA Graphs,是当前AI推理(尤其是实时和LLM serving)最高性能的组合。

CUDA 异步流优化流程图,重叠计算与传输,显著提升AI推理性能。 AI Inference CUDA Async_Streams