日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

基于TensorRT 3的自动驾驶快速INT8推理

發(fā)布時(shí)間:2023/11/28 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于TensorRT 3的自动驾驶快速INT8推理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于TensorRT 3的自動(dòng)駕駛快速I(mǎi)NT8推理

Fast INT8 Inference for Autonomous Vehicles with TensorRT 3

自主駕駛需要安全性,需要一種高性能的計(jì)算解決方案來(lái)處理極其精確的傳感器數(shù)據(jù)。研究人員和開(kāi)發(fā)人員創(chuàng)建用于自動(dòng)駕駛的深度神經(jīng)網(wǎng)絡(luò)(DNNs)必須優(yōu)化其網(wǎng)絡(luò),以確保低延遲推理和能源效率。由于NVIDIA TensorRT中有了一個(gè)新的Python API,這個(gè)過(guò)程變得更加簡(jiǎn)單。

Figure 1. TensorRT optimizes trained neural network models to produce deployment-ready runtime inference engines.

TensorRT是一個(gè)高性能的深度學(xué)習(xí)推理優(yōu)化器和運(yùn)行時(shí)引擎,用于深度學(xué)習(xí)應(yīng)用程序的生產(chǎn)部署。開(kāi)發(fā)人員可以?xún)?yōu)化在TensorFlow或Caffe中訓(xùn)練的模型,以生成內(nèi)存高效的運(yùn)行時(shí)引擎,從而最大限度地提高推理吞吐量,使深度學(xué)習(xí)對(duì)于延遲關(guān)鍵的產(chǎn)品和服務(wù)(如自主駕駛)切實(shí)可行。。

最新的TensorRT 3版本引入了一個(gè)功能齊全的Python API,使研究人員和開(kāi)發(fā)人員能夠使用熟悉的Python代碼優(yōu)化和序列化DNN。使用TySoRRT 3,可以在Python中部署云計(jì)算服務(wù),或者在C++中實(shí)時(shí)應(yīng)用,例如在英偉達(dá)驅(qū)動(dòng)PX AI汽車(chē)計(jì)算機(jī)上運(yùn)行的自主驅(qū)動(dòng)軟件。
在本文中,將向展示如何在主機(jī)上使用TensorRT 3 Python API來(lái)緩存語(yǔ)義分段網(wǎng)絡(luò)的校準(zhǔn)結(jié)果,以便使用INT8 precision進(jìn)行部署。然后,可以使用校準(zhǔn)緩存來(lái)優(yōu)化和部署在驅(qū)動(dòng)PX平臺(tái)上使用C++ API的網(wǎng)絡(luò)。

城市景觀數(shù)據(jù)集與全卷積網(wǎng)絡(luò)The Cityscapes Dataset and Fully Convolutional Network

Figure 2. Sample images from the Cityscapes dataset.

城市景觀數(shù)據(jù)集[Cordts等人。2016]用于城市自主駕駛場(chǎng)景的語(yǔ)義分割。圖2顯示了數(shù)據(jù)集中的示例圖像。該數(shù)據(jù)集共有30個(gè)不同的類(lèi),分為8個(gè)不同的類(lèi)別。為了評(píng)估性能,使用了19個(gè)類(lèi)和7個(gè)類(lèi)別,如圖3所示。

Figure 3. Classes and categories used in the Cityscapes benchmark, and the IoU (Intersection-over-Union) metric.

對(duì)于評(píng)估,使用IoU(Intersection over Union)度量,提供兩個(gè)平均分?jǐn)?shù),一個(gè)用于類(lèi),另一個(gè)用于類(lèi)別。

Figure 4. A sample VGG16-based fully convolutional
network trained for semantic segmentation.

為了證明TensorRT的能力,設(shè)計(jì)了一種全卷積網(wǎng)絡(luò)FCN[Long等人]。基于VGG16,如圖4所示。該網(wǎng)絡(luò)由一個(gè)基于VGG16的編碼器和兩個(gè)使用反卷積層實(shí)現(xiàn)的上采樣層組成。用NVIDIA數(shù)字和Caffe在城市景觀數(shù)據(jù)集上訓(xùn)練了[2014年]網(wǎng)絡(luò)后端。

Figure 5. Sample FCN network output.

該網(wǎng)絡(luò)設(shè)計(jì)為獲取512×1024的輸入圖像并生成每像素分類(lèi)結(jié)果,如圖5所示。訓(xùn)練后的網(wǎng)絡(luò)IoU類(lèi)平均得分為48.4分,IoU類(lèi)平均得分為76.9分。如果直接使用Caffe和cuDNN在其中一個(gè)驅(qū)動(dòng)器PX autochauffer gpu(Pascal)上運(yùn)行推斷,該網(wǎng)絡(luò)將達(dá)到大約242ms的延遲和大約4個(gè)圖像/秒的吞吐量。在35英里/小時(shí)的速度下,242毫秒相當(dāng)于大約12英尺的行駛距離。這種水平的表現(xiàn)不足以為自動(dòng)駕駛做出及時(shí)的決定。讓來(lái)看看如何才能做得更好。

圖6. DP4A指令:四元點(diǎn)積累加。

作為第一步,使用TensorRT優(yōu)化網(wǎng)絡(luò),使用FP32精度提供了良好的加速。通過(guò)使用TensorRT,實(shí)現(xiàn)了170毫秒的延遲和大約6個(gè)圖像/秒的吞吐量。這比Caffe提高了50%,但是TensorRT可以進(jìn)一步優(yōu)化網(wǎng)絡(luò)。

以下各節(jié)將演示如何使用TensorRT,在保持原FP32網(wǎng)絡(luò)良好精度的同時(shí),使用INT8降低的精度來(lái)提高該網(wǎng)絡(luò)的推理性能。

INT8推理和校準(zhǔn)

驅(qū)動(dòng)器PX autochauffer中的Pascal dGPU能夠執(zhí)行8位整數(shù)4元向量點(diǎn)積(DP4A,見(jiàn)圖6)指令,以加速深層神經(jīng)網(wǎng)絡(luò)推理。雖然這條新指令提供了更快的計(jì)算速度,但在用這種簡(jiǎn)化的INT8格式表示深度神經(jīng)網(wǎng)絡(luò)的權(quán)值和激活方面存在著重大挑戰(zhàn)。如表1所示,與FP32或FP16相比,INT8可表示值的動(dòng)態(tài)范圍和粒度明顯受限。
TensorRT提供了一種快速簡(jiǎn)便的方法來(lái)獲取在FP32中訓(xùn)練過(guò)的模型,并自動(dòng)轉(zhuǎn)換網(wǎng)絡(luò)以供部署,INT8的精度降低,精度損失最小。為了實(shí)現(xiàn)這一目標(biāo),TensorRT使用了一個(gè)校準(zhǔn)過(guò)程,當(dāng)用有限的8位整數(shù)表示逼近FP32網(wǎng)絡(luò)時(shí),該校準(zhǔn)過(guò)程將信息損失最小化。有關(guān)此算法如何工作的更多信息,請(qǐng)參閱TensorRT GPU技術(shù)會(huì)議演示的8位推理。

在準(zhǔn)備校準(zhǔn)數(shù)據(jù)集時(shí),應(yīng)在典型的推斷場(chǎng)景中捕獲預(yù)期的數(shù)據(jù)分布。需要確保校準(zhǔn)數(shù)據(jù)集涵蓋所有預(yù)期場(chǎng)景,例如晴天、雨天、夜景等。如果正在創(chuàng)建自己的數(shù)據(jù)集,建議創(chuàng)建單獨(dú)的校準(zhǔn)數(shù)據(jù)集。校準(zhǔn)數(shù)據(jù)集不應(yīng)與訓(xùn)練、驗(yàn)證或測(cè)試數(shù)據(jù)集重疊,以避免校準(zhǔn)模型僅在這些數(shù)據(jù)集上正常工作的情況。

讓看看如何使用新的TensorRT Python API創(chuàng)建校準(zhǔn)緩存。

使用Python API創(chuàng)建校準(zhǔn)緩存

隨著TensorRT Python API的引入,現(xiàn)在完全可以在Python中實(shí)現(xiàn)INT8校準(zhǔn)器類(lèi)。這個(gè)例子演示了如何處理圖像數(shù)據(jù)并為校準(zhǔn)器提供數(shù)據(jù)。修改這個(gè)示例以支持Python中不同類(lèi)型的數(shù)據(jù)和網(wǎng)絡(luò)應(yīng)該很簡(jiǎn)單。

import pycuda.driver as cuda

import pycuda.autoinit

import numpy as np

from PIL import Image

import ctypes

import tensorrt as trt

CHANNEL = 3

HEIGHT = 512

WIDTH = 1024

class PythonEntropyCalibrator(trt.infer.EntropyCalibrator):

def init(self, input_layers, stream):

trt.infer.EntropyCalibrator.init(self)

self.input_layers = input_layers

self.stream = stream

self.d_input = cuda.mem_alloc(self.stream.calibration_data.nbytes)

stream.reset()

def get_batch_size(self):

return self.stream.batch_size

def get_batch(self, bindings, names):

batch = self.stream.next_batch()

if not batch.size:

return None

cuda.memcpy_htod(self.d_input, batch)

for i in self.input_layers[0]:

assert names[0] != i

bindings[0] = int(self.d_input)

return bindings

def read_calibration_cache(self, length):

return None

def write_calibration_cache(self, ptr, size):

cache = ctypes.c_char_p(int(ptr))

with open(‘calibration_cache.bin’, ‘wb’) as f:

f.write(cache.value)

return None

PythonEntropyCalibrator類(lèi)是INT8校準(zhǔn)器的Python實(shí)現(xiàn)。這個(gè)類(lèi)負(fù)責(zé)分配CUDA內(nèi)存并為所有輸入層創(chuàng)建綁定。每當(dāng)調(diào)用get_batch()時(shí),會(huì)將校準(zhǔn)輸入數(shù)據(jù)上載到預(yù)先分配的CUDA內(nèi)存。校準(zhǔn)批大小定義了同時(shí)處理多少校準(zhǔn)圖像以收集計(jì)算正確比例因子所需的輸入分布。校準(zhǔn)批大小可以不同于用于推斷的最大批大小參數(shù)。使用較大的校準(zhǔn)批大小通常會(huì)加快校準(zhǔn)過(guò)程,建議使用GPU內(nèi)存中可以容納的最大批大小。

class ImageBatchStream():
def init(self, batch_size, calibration_files, preprocessor): self.batch_size = batch_size
self.max_batches = (len(calibration_files) // batch_size) + \ (1 if (len(calibration_files) % batch_size) \ else 0)
self.files = calibration_files
self.calibration_data = np.zeros((batch_size, CHANNEL, HEIGHT, WIDTH), \
dtype=np.float32)
self.batch = 0
self.preprocessor = preprocessor @staticmethod
def read_image_chw(path):
img = Image.open(path).resize((WIDTH,HEIGHT), Image.NEAREST)
im = np.array(img, dtype=np.float32, order=‘C’)
im = im[:,:,::-1]
im = im.transpose((2,0,1))
return im
def reset(self):
self.batch = 0
def next_batch(self):
if self.batch < self.max_batches:
imgs = []
files_for_batch = self.files[self.batch_size * self.batch : \ self.batch_size * (self.batch + 1)]
for f in files_for_batch:
print("[ImageBatchStream] Processing ", f)
img = ImageBatchStream.read_image_chw(f)
img = self.preprocessor(img)
imgs.append(img)
for i in range(len(imgs)): s
elf.calibration_data[i] = imgs[i]
self.batch += 1
return np.ascontiguousarray(self.calibration_data, dtype=np.float32)
else:
return np.array([])

ImageBatchStream是一個(gè)helper類(lèi),負(fù)責(zé)處理文件I/O、圖像大小的縮放、創(chuàng)建要處理的批處理數(shù)據(jù)、將數(shù)據(jù)布局重新排序?yàn)镃HW格式,以及應(yīng)用預(yù)處理器函數(shù)(例如減去圖像平均值)。

校準(zhǔn)結(jié)果可以保存到緩存文件中,因此可以創(chuàng)建優(yōu)化的TensorRT運(yùn)行時(shí)引擎,而無(wú)需在目標(biāo)上重復(fù)校準(zhǔn)過(guò)程。在本例中,生成的文件名是calibration_cache.bin,在write_calibration_cache函數(shù)中處理。

一旦準(zhǔn)備好校準(zhǔn)器類(lèi),剩下的過(guò)程就可以用TensorRT的新的拉氏體Python模塊,旨在抽象出許多低級(jí)細(xì)節(jié),使數(shù)據(jù)科學(xué)家更容易使用TensorRT。這個(gè)包允許添加預(yù)處理和后處理函數(shù),并使能夠利用現(xiàn)有的Python數(shù)據(jù)預(yù)處理例程。在下面的代碼中,函數(shù)sub_mean_chw作為預(yù)處理步驟處理均值減影,函數(shù)color_map處理將輸出類(lèi)ID映射到顏色以可視化輸出。

import glob
from random
import shuffleimport numpy as npfrom PIL
import Image
import tensorrt as trt
import labels #from cityscapes evaluation scriptimport calibrator #calibrator.py
MEAN = (71.60167789, 82.09696889, 72.30508881)
MODEL_DIR = ‘/data/fcn8s/’
CITYSCAPES_DIR = ‘/data/Cityscapes/’
TEST_IMAGE = CITYSCAPES_DIR + ‘leftImg8bit/val/lindau/lindau_000042_000019_leftImg8bit.png’
CALIBRATION_DATASET_LOC = CITYSCAPES_DIR + ‘leftImg8bit/train//.png’
CLASSES = 19
CHANNEL = 3
HEIGHT = 512
WIDTH = 1024
def sub_mean_chw(data):
data = data.transpose((1,2,0)) # CHW -> HWC
data -= np.array(MEAN) # Broadcast subtract
data = data.transpose((2,0,1)) # HWC -> CHW return
data def color_map(output):
output = output.reshape(CLASSES, HEIGHT, WIDTH)
out_col = np.zeros(shape=(HEIGHT, WIDTH), dtype=(np.uint8, 3))
for x in range (WIDTH):
for y in range (HEIGHT):
out_col[y,x] = labels.id2label[labels.trainId2label[np.argmax(output[:,y,x])].id].color
return out_col

這是將所有代碼組合在一起的主要功能。這個(gè)tensorrt.lite模塊提供高級(jí)函數(shù),使用一個(gè)名為tensorrt.lite.Engine.

def create_calibration_dataset(): # Create list of calibration images (filename) # This sample code picks 100 images at random from training set
calibration_files = glob.glob(CALIBRATION_DATASET_LOC)
shuffle(calibration_files)
return calibration_files[:100]
def main():
calibration_files = create_calibration_dataset()
**# Process 5 images at a time for calibration # This batch size can be different from MaxBatchSize (1 in this example)
batchstream = calibrator.ImageBatchStream(5, calibration_files, sub_mean_chw)
int8_calibrator = calibrator.PythonEntropyCalibrator(["**data"], batchstream) # Easy to use TensorRT lite package
engine = trt.lite.Engine(framework=“c1”, deployfile=MODEL_DIR + “fcn8s.prototxt”, modelfile=MODEL_DIR + “fcn8s.caffemodel”, max_batch_size=1,
max_workspace_size=(256 << 20),
input_nodes={“data”:(CHANNEL,HEIGHT,WIDTH)},
output_nodes=[“score”],
preprocessors={“data”:sub_mean_chw},
postprocessors={“score”:color_map}, data_type=trt.infer.DataType.INT8, calibrator=int8_calibrator, logger_severity=trt.infer.LogSeverity.INFO)
test_data = calibrator.ImageBatchStream.read_image_chw(TEST_IMAGE)
out = engine.infer(test_data)[0]
test_img = Image.fromarray(out, ‘RGB’)
test_img.show()

在城市景觀數(shù)據(jù)集中,有獨(dú)立的訓(xùn)練、驗(yàn)證和測(cè)試集,遵循深度學(xué)習(xí)的常見(jiàn)做法。然而,這意味著沒(méi)有單獨(dú)的校準(zhǔn)數(shù)據(jù)集。因此,可以從訓(xùn)練數(shù)據(jù)集中隨機(jī)選擇100幅圖像用作校準(zhǔn)數(shù)據(jù)集,以說(shuō)明校準(zhǔn)過(guò)程的工作情況。正如將看到的,校準(zhǔn)算法可以達(dá)到良好的精度,只有100個(gè)隨機(jī)圖像!

使用包含計(jì)算能力為6.1的NVIDIA GPU的系統(tǒng)(例如Quadro P4000、Tesla P4或P40),可以運(yùn)行INT8優(yōu)化引擎來(lái)驗(yàn)證其準(zhǔn)確性。建議運(yùn)行整個(gè)驗(yàn)證數(shù)據(jù)集,以確保使用降低精度所帶來(lái)的小精度損失是可接受的。通過(guò)使用所有500個(gè)驗(yàn)證圖像運(yùn)行Cityscapes評(píng)估腳本,發(fā)現(xiàn)校準(zhǔn)后的INT8模型實(shí)現(xiàn)了48.1個(gè)平均類(lèi)IoU和76.8個(gè)平均類(lèi)IoU,而原始FP32精度模型分別為48.4和76.9。

Optimizing the INT8 Model on DRIVE PX

TensorRT builder實(shí)現(xiàn)了一種基于分析的優(yōu)化,稱(chēng)為內(nèi)核自動(dòng)調(diào)整。此過(guò)程要求在目標(biāo)設(shè)備上優(yōu)化網(wǎng)絡(luò)。在這個(gè)目標(biāo)優(yōu)化階段,可以使用從主機(jī)生成的校準(zhǔn)緩存文件生成INT8模型,而不需要校準(zhǔn)數(shù)據(jù)集。需要編寫(xiě)一個(gè)實(shí)現(xiàn)readCalibrationCache函數(shù)的校準(zhǔn)器類(lèi),以告訴TensorRT使用緩存的結(jié)果,如下代碼所示。

class Int8CacheCalibrator : public IInt8EntropyCalibrator {
public:
Int8CacheCalibrator(std::string cacheFile) : mCacheFile(cacheFile) {}
virtual ~Int8CacheCalibrator() {}
int getBatchSize() const override {return 1;}
bool getBatch(void* bindings[], const char* names[], int nbBindings) override
{
return false;
}
const void* readCalibrationCache(size_t& length) override
{
mCalibrationCache.clear();
std::ifstream input(mCacheFile, std::ios::binary);
input >> std::noskipws;
if (input.good())
{
std::copy(std::istream_iterator(input), std::istream_iterator(), std::back_inserter(mCalibrationCache));
}
length = mCalibrationCache.size();
return length ? &mCalibrationCache[0] : nullptr;
}
private: std::string mCacheFile;
std::vector mCalibrationCache;

利用TensorRT的INT8推斷,該模型現(xiàn)在可以在一個(gè)驅(qū)動(dòng)器PX autochauffer的Pascal GPU上以50毫秒的延遲或20個(gè)圖像/秒的速度運(yùn)行。圖7總結(jié)了TensorRT使用FP32和INT8推斷獲得的性能。

Figure 7. INT8 inference with TensorRT improves inference throughput and latency by about 5x compared to the original network running in Caffe.

可以將優(yōu)化的引擎序列化到一個(gè)文件中進(jìn)行部署,然后就可以在驅(qū)動(dòng)器PX上部署INT8優(yōu)化的網(wǎng)絡(luò)了!

總結(jié)

以上是生活随笔為你收集整理的基于TensorRT 3的自动驾驶快速INT8推理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。