用NVIDIA-TensorRT构造深度神经网络
用NVIDIA-TensorRT構造深度神經網絡
Deploying Deep Neural Networks with NVIDIA TensorRT
NVIDIA TensorRT是一個用于生產環境的高性能深度學習推理庫。電源效率和響應速度是部署的深度學習應用程序的兩個關鍵指標,因為直接影響用戶體驗和所提供服務的成本。Tensor RT為運行時性能自動優化訓練的神經網絡,在Tesla P100 GPU上提供高達16倍的能效(性能/瓦),而普通的CPU專用深度學習推理系統(見圖1)。圖2顯示了NVIDIA Tesla P100和K80使用TensorRT和相對復雜的GoogLenet神經網絡架構運行推理的性能。
在本文中,將向展示如何在基于GPU的部署平臺上使用Tensor RT從經過訓練的深層神經網絡中獲得最佳的效率和性能。
深度學習訓練和部署
用深層神經網絡求解有監督機器學習問題涉及兩步過程。
第一步是利用gpu對海量標記數據進行深層神經網絡訓練。在這一步中,神經網絡學習數以百萬計的權值或參數,使其能夠將輸入數據示例映射到正確的響應。由于目標函數相對于網絡權值最小,訓練需要在網絡中反復向前和向后傳遞。為了估計真實世界的性能,通常需要訓練幾個模型,并根據訓練期間沒有看到的數據驗證模型的準確性。
下一步——推理——使用經過訓練的模型根據新數據進行預測。在此步驟中,在生產環境(如數據中心、汽車或嵌入式平臺)中運行的應用程序中使用經過最佳訓練的模型。對于一些應用,如自動駕駛,推理是實時進行的,因此高吞吐量是至關重要的。
Figure 3: Deep learning training to eployment workflow with NVIDIA DIGITS and Tensor RT.
要了解更多關于訓練和推理之間的區別,請參閱Michael Andersch關于GPUs推理的文章。
目標部署環境引入了訓練環境中通常不存在的各種挑戰。例如,如果目標是使用經過訓練的神經網絡感知其周圍環境的嵌入式設備,則通過該模型的正向推理將直接影響設備的總體響應時間和功耗。優化的關鍵指標是功率效率:每瓦特的推理性能。
每瓦特性能也是最大化數據中心運營效率的關鍵指標。在這種情況下,需要最小化在地理上和時間上完全不同的大量請求上使用的延遲和能量,這限制了形成大批量的能力。
NVIDIA TensorRT
Tensor RT是一個高性能的推理引擎,旨在為常見的深度學習應用(如圖像分類、分割和目標檢測)提供最大的推理吞吐量和效率。Tensor RT優化訓練的神經網絡以獲得運行時性能,并為web/移動、嵌入式和汽車應用程序提供GPU加速推理。
Figure 4: The TensorRT workflow, showing the two key functionalities of TensorRT: the TensorRT neural network optimizer (middle) and the TensorRT target runtime (right).
TensorRT的使用分為兩個階段:構建和部署。在構建階段,TensorRT對網絡結構進行優化,并生成一個用于計算深神經網絡前向傳遞的優化計劃。該計劃是一個優化的目標代碼,可以序列化并存儲在內存或磁盤上。
部署階段通常采用長時間運行的服務或用戶應用程序的形式,該服務或用戶應用程序接受成批輸入數據,通過對輸入數據執行計劃來執行推理,并返回成批輸出數據(分類、對象檢測等)。使用TensorRT,不需要在部署硬件上安裝和運行深入學習框架。關于推理服務的批處理和管道的討論是另一篇文章的主題;相反,將重點討論如何使用TensorRT進行推理。
TensorRT構建階段
Tensor RT運行時需要三個文件來部署分類神經網絡:
網絡體系結構文件(deploy.prototxt文件),
訓練重量(net.caffemodel網站),和
為每個輸出類提供名稱的標簽文件。
此外,還必須定義批大小和輸出層。代碼清單1演示了如何將Caffe模型轉換為TensorRT對象。構建者(第4-7行)負責讀取網絡信息。或者,如果不提供網絡體系結構文件,則可以使用生成器定義網絡信息(deploy.prototxt文件)。
Tensor RT支持以下層類型。
· Convolution: 2D
· Activation: ReLU, tanh and sigmoid
· Pooling: max and average
· ElementWise: sum, product or max of two tensors
· LRN: cross-channel only
· Fully-connected: with or without bias
· SoftMax: cross-channel only
· Deconvolution
卷積:二維
激活:ReLU,tanh和sigmoid
池化:最大值和平均值
元素:兩個張量的和、積或最大值
LRN:僅跨信道
全連接:有無偏倚
SoftMax: 僅跨通道
反卷積
-
IBuilder* builder = createInferBuilder(gLogger);
-
// parse the caffe model to populate the network, then set the outputs
-
INetworkDefinition* network = builder->createNetwork();
-
CaffeParser parser;
-
auto blob_name_to_tensor = parser.parse(“deploy.prototxt”,
-
trained_file.c_str(),
-
*network,
-
DataType::kFLOAT);
-
// specify which tensors are outputs
-
network->markOutput(*blob_name_to_tensor->find(“prob”));
-
// Build the engine
-
builder->setMaxBatchSize(1);
-
builder->setMaxWorkspaceSize(1 << 30);
-
ICudaEngine* engine = builder->buildCudaEngine(*network);
還可以使用張量RT C++ API來定義沒有CAFE解析器的網絡,如清單2所示。可以使用API定義任何受支持的層及其參數。可以定義在網絡之間變化的任何參數,包括卷積層權重維度和輸出,以及池化層的窗口大小和步長。
ITensor* in = network->addInput(“input”, DataType::kFloat, Dims3{…});
IPoolingLayer* pool = network->addPooling(in, PoolingType::kMAX,…);
在定義或加載網絡之后,必須如清單1的第13行所示指定輸出張量;在示例中,輸出是“prob”(表示概率)。接下來,定義批大小(第16行),根據部署場景的不同,批大小可能有所不同。清單1使用的批處理大小為1,但可以選擇更大的批處理大小來滿足應用程序需要和系統配置。下面,TensorRT執行層優化以減少推理時間。雖然這對API用戶是透明的,但是分析網絡層需要內存,因此必須指定最大工作空間大小(第17行)。
最后一步是調用buildCudaEngine執行層優化,并根據提供的輸入和參數使用優化的網絡構建引擎。一旦模型轉換為TensorRT對象,就可以部署,可以在主機設備上使用,也可以保存并在其地方使用。
TensorRT對神經網絡圖進行了一些重要的轉換和優化。首先,消除未使用輸出的層,以避免不必要的計算。接下來,在可能的情況下,卷積層、偏壓層和ReLU層被融合形成一個單層。圖6顯示了圖5中原始網絡上垂直層融合的結果(融合層在圖6中標記為CBR)。層融合提高了在GPU上運行張量RT優化網絡的效率。
Figure 5: An example convolutional neural network with multiple
convolutional and activation layers.
另一個轉換是水平層融合或層聚合,以及聚合層到各自輸出所需的劃分,如圖7所示。水平層融合通過合并具有相同源張量的層并應用具有相似參數的相同操作來提高性能,從而產生一個更大的層以獲得更高的計算效率。圖7中的示例顯示了圖5中3個1×1 CBR層的組合,這些層將相同的輸入合并到一個更大的1×1 CBR層中。請注意,必須分解此層的輸出,以便從原始輸入圖饋入不同的后續層。
在TensorRT解析器讀取經過訓練的網絡和配置文件之后,TensorRT在構建階段對API用戶透明地執行轉換,如清單1所示。
TensorRT Deploy Phase
推理生成器(IBuilder)buildCudaEngine方法返回指向新的推理引擎運行時對象(ICudaEngine)的指針。此運行時對象已準備好立即使用;或者,可以將其狀態序列化并保存到磁盤或對象存儲以供分發。序列化的目標代碼稱為計劃。
如前所述,與運行時推斷引擎之間的批處理和流式處理數據的整個范圍超出了本文的范圍。清單3演示了使用推理機處理一批輸入數據以生成結果所需的步驟。
/ The execution context is responsible for launching the
// compute kernels
IExecutionContext context = engine->createExecutionContext();
// In order to bind the buffers, we need to know the names of the
// input and output tensors.
int inputIndex = engine->getBindingIndex(INPUT_LAYER_NAME),
int outputIndex = engine->getBindingIndex(OUTPUT_LAYER_NAME);
// Allocate GPU memory for Input / Output data
void buffers = malloc(engine->getNbBindings() * sizeof(void*));
cudaMalloc(&buffers[inputIndex], batchSize * size_of_single_input);
cudaMalloc(&buffers[outputIndex], batchSize * size_of_single_output);
// Use CUDA streams to manage the concurrency of copying and executing
cudaStream_t stream;
cudaStreamCreate(&stream);
// Copy Input Data to the GPU
cudaMemcpyAsync(buffers[inputIndex], input,
batchSize * size_of_single_input,
cudaMemcpyHostToDevice, stream);
// Launch an instance of the GIE compute kernelc
ontext.enqueue(batchSize, buffers, stream, nullptr);
// Copy Output Data to the Host
cudaMemcpyAsync(output, buffers[outputIndex],
batchSize * size_of_single_output,
cudaMemcpyDeviceToHost, stream));
// It is possible to have multiple instances of the code above
// in flight on the GPU in different streams.
// The host can then sync on a given stream and use the results
cudaStreamSynchronize(stream);
使用TensorRT最大化性能和效率
TensorRT 1.0現在可以免費下載給NVIDIA開發者程序的成員。
NVIDIA TensorRT使能夠輕松地部署神經網絡,以最高的性能和效率為產品添加深度學習功能。在構建階段,TensorRT識別優化網絡的機會,在部署階段,TensorRT以最小化延遲和最大吞吐量的方式運行優化的網絡。
如果運行的是由數據中心服務器支持的web或移動應用程序,TensorRT的低開銷意味著可以部署更多樣、更復雜的模型,為產品添加智能,讓用戶感到高興。如果正在使用深入學習來創建下一代智能設備,TensorRT將幫助部署具有高性能、高精度和高能效的網絡。
此外,TensorRT使能夠利用gpu的能力,使用混合精度FP16數據執行神經網絡推理。在Tesla P100和jetsontx2gpu上使用FP16進行神經網絡推理可以減少一半的內存使用,并提供更高的性能。
總結
以上是生活随笔為你收集整理的用NVIDIA-TensorRT构造深度神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机视觉一些项目实战技术(续)
- 下一篇: 基于TensorRT 3的自动驾驶快速I