对于tensorrt文件,我们将将其加载到引擎中,并为引擎创建Tensorrt上下文。然后,通过调用context->enqueueV2 2(),使用cuda流进行推理。
在创建cudaCreateStream上下文之后,我们需要调用()吗?还是只需要在选择GPU设备之后调用SetDevice()?TensorRT是如何关联库达流和坦索尔特上下文的?
我们可以使用多个流与一个坦索尔的上下文吗?
在多线程C++应用程序中,每个线程使用一个模型进行推理,一个模型可能加载在多个线程中;那么,在一个线程中,我们只需要一个引擎、一个上下文和一个流还是多个流?
发布于 2022-10-27 18:08:46
在创建cudaCreateStream上下文之后,我们需要调用()吗?
cudaCreateStream(),你是指cudaStreamCreate()吗?
您可以在创建引擎和运行时之后创建它们。
作为一个额外的琐事,你根本不必使用CUDA流。我尝试将数据从主机复制到设备,调用enqueueV2(),然后在不使用CUDA流的情况下将from设备复制到主机。效果很好。
TensorRT是如何关联库达流和坦索尔特上下文的?
关联是,您可以将相同的CUDA流作为参数传递给所有函数调用。下面的c++代码将说明这一点:
void infer(std::vector<void*>& deviceMemory, void* hostInputMemory, size_t hostInputMemorySizeBytes, cudaStream_t& cudaStream)
{
auto success = cudaMemcpyAsync(deviceMemory, hostInputMemory, hostInputMemorySizeBytes, cudaMemcpyHostToDevice, cudaStream)
if (not success) {... handle errors...}
if (not executionContext.enqueueV2(static_cast<void**>(deviceMemory.data()), cudaStream, nullptr)
{ ... handle errors...}
void* outputHostMemory; // allocate size for all bindings
size_t outputMemorySizeBytes;
auto success2 = cudaMemcpyAsync(&outputHostMemory, &deviceMemory.at(0), outputMemorySizeBytes, cudaMemcpyDeviceToHost, cudaStream);
if (not success2) {... error handling ...}
cudaStream.waitForCompletion();
}如果希望在这中使用完整的示例,可以检查c++存储库。我上面的代码只是一个例子。
我们可以使用多个流与一个坦索尔的上下文吗?
如果我正确地理解了你的问题,根据这文档,答案是否定的。
在多线程C++应用程序中,每个线程使用一个模型进行推理,一个模型可能加载在多个线程中;那么,在一个线程中,我们只需要一个引擎、一个上下文和一个流还是多个流?
one model might be loaded in more than 1 thread
这听起来不对。
引擎(nvinfer1::ICudaEngine)是从TensorRT引擎文件创建的。引擎创建用于推理的执行上下文。
这是TensorRT开发人员指南的一部分,说明哪些操作是线程安全的。其馀部分可视为非线程安全。
https://stackoverflow.com/questions/73069001
复制相似问题