pytorch与cuda与TensorRT的版本选择

news2025/4/5 5:27:23

VScode版本

linux最新版本的vscode,可能无法进行python的调试
在这里插入图片描述
选择下载1.85 https://code.visualstudio.com/updates/v1_85

CUDA版本

在这里插入图片描述

https://developer.nvidia.com/Cuda-Toolkit-archive

由于受限于TRT的8.6(下面会说明),所以CUDA Version最高为: 12.1,而pytorch的限制只能是12.1或者是11.8。
重装cuda toolkit后,须重装pytorch

Pytorch版本

在这里插入图片描述
https://pytorch.org/get-started/locally/

选择12.1

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

TensorRT版本

在这里插入图片描述
https://developer.nvidia.com/tensorrt/download
受限于CentOS7版本,trt最高为8.6。

安装后的提示,配置路径与卸载命令:

Please make sure that
 -   PATH includes /usr/local/cuda-12.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-12.0/lib64, or, add /usr/local/cuda-12.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-12.0/bin
To uninstall the NVIDIA Driver, run nvidia-uninstall

报错

nn.Conv1d运算报错

在pytorch中使用 nn.Conv1d 算子,会报错:
[1] 17446 segmentation fault python test.py

这个网上无法搜到的问题,就是版本不匹配导致的问题,重装一遍cuda与pytorch。

TensorRT环境的可用性验证

这是一个带loop的完整样例,直接运行看TensorRT是否正常。

import numpy as np
import tensorrt as trt
from tensorrt import INetworkDefinition
from trt_inference import TRTInference


logger = trt.Logger(trt.Logger.WARNING)
# class MyLogger(trt.ILogger):
#     def __init__(self):
#        trt.ILogger.__init__(self)

#     def log(self, severity, msg):
#         pass # Your custom logging implementation here
# logger = MyLogger()

builder = trt.Builder(logger)
network = builder.create_network(trt.NetworkDefinitionCreationFlag.EXPLICIT_PRECISION)


num_iterations = 3
trip_limit = network.add_constant(shape=(), weights=trt.Weights(np.array([num_iterations], dtype=np.dtype("i"))))
accumaltor_value = network.add_input("input1", dtype=trt.float32, shape=(2, 3))
accumaltor_added_value = network.add_input("input2", dtype=trt.float32, shape=(2, 3))
loop = network.add_loop()
# setting the ITripLimit layer to stop after `num_iterations` iterations
loop.add_trip_limit(trip_limit.get_output(0), trt.TripLimit.COUNT)
# initialzing the IRecurrenceLayer with a init value
rec = loop.add_recurrence(accumaltor_value)
# eltwise inputs are 'accumaltor_added_value', and the IRecurrenceLayer output.
eltwise = network.add_elementwise(accumaltor_added_value, rec.get_output(0), op=trt.ElementWiseOperation.SUM)
# wiring the IRecurrenceLayer with the output of eltwise.
# The IRecurrenceLayer output would now be `accumaltor_value` for the first iteration, and the eltwise output for any other iteration
rec.set_input(1, eltwise.get_output(0))
# marking the IRecurrenceLayer output as the Loop output
loop_out = loop.add_loop_output(rec.get_output(0), trt.LoopOutput.LAST_VALUE)
# marking the Loop output as the network output
network.mark_output(loop_out.get_output(0))


inputs = {}
outputs = {}
expected = {}

inputs[accumaltor_value.name] = np.array(
    [
        [2.7, -4.9, 23.34],
        [8.9, 10.3, -19.8],
    ])
inputs[accumaltor_added_value.name] = np.array(
    [
        [1.1, 2.2, 3.3],
        [-5.7, 1.3, 4.6],
    ])

outputs[loop_out.get_output(0).name] = eltwise.get_input(0).shape
expected[loop_out.get_output(0).name] = inputs[accumaltor_value.name] + inputs[accumaltor_added_value.name] * num_iterations
print("Expected:", expected)

builder_config = builder.create_builder_config()
builder_config.set_flag(trt.BuilderFlag.VERSION_COMPATIBLE)
builder_config.set_flag(trt.BuilderFlag.EXCLUDE_LEAN_RUNTIME)
plan = builder.build_serialized_network(network, builder_config)

# v10_runtime = trt.Runtime(logger)
# v8_shim_runtime = v10_runtime.load_runtime('/home/mark.yj/TensorRT-8.6.1.6/bin/trtexec')
# engine = v10_runtime.deserialize_cuda_engine(plan)
trtInfer = TRTInference(plan)
r = trtInfer.infer(inputs, outputs)
print("Prediction:", r)

上述代码中的 TRTInference是一个封装类:

import pycuda.driver as cuda
import pycuda.autoinit
import tensorrt as trt
import os

import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit  # 注意,必须引入
from collections import OrderedDict
import torch
import numpy as np

class HostDeviceMem(object):
    def __init__(self, host_mem, device_mem, dtype, size):
        self.host = host_mem
        self.device = device_mem
        self.dtype = dtype
        self.size = size

def allocate_buffers(engine, context, input_data):
    # 根据input_data改shape
    for key, value in input_data.items():
        r = context.set_binding_shape(engine.get_binding_index(key), value.shape)
        if not r:
            print(f"set binding shape False: {key}")
    
    inputs = OrderedDict()
    outputs = OrderedDict()
    bindings = []

    for binding_idx, binding_name in enumerate(engine):
        size = trt.volume(context.get_binding_shape(binding_idx))
        # size = trt.volume(engine.get_binding_shape(binding))
        dtype = trt.nptype(engine.get_binding_dtype(binding_idx))
        # Allocate host and device buffers
        host_mem = cuda.pagelocked_empty(size, dtype)
        device_mem = cuda.mem_alloc(host_mem.nbytes)
        # Append the device buffer to device bindings.
        bindings.append(int(device_mem))
        # Append to the appropriate list.
        if engine.binding_is_input(binding_idx):
            inputs[binding_name] = HostDeviceMem(host_mem, device_mem, dtype, size)
        else:
            outputs[binding_name] = HostDeviceMem(host_mem, device_mem, dtype, size)
    return inputs, outputs, bindings

# This function is generalized for multiple inputs/outputs for full dimension networks.
# inputs and outputs are expected to be lists of HostDeviceMem objects.
def do_inference_v2(context, bindings, inputs:map, outputs, stream):
    inputs, outputs = inputs.values(), outputs.values()
    # Transfer input data to the GPU.
    for inp in inputs:
        cuda.memcpy_htod_async(inp.device, inp.host, stream)
    # Run inference.
    context.execute_async_v2(bindings=bindings, stream_handle=stream.handle)
    # Transfer predictions back from the GPU.
    for out in outputs:
        cuda.memcpy_dtoh_async(out.host, out.device, stream)
    # Synchronize the stream
    stream.synchronize()
    # Return only the host outputs.
    return [out.host for out in outputs]

class TRTInference(object):
    def __init__(self, plan):
        TRT_LOGGER = trt.Logger()
        self.trt_runtime = trt.Runtime(TRT_LOGGER)
        if isinstance(plan, str):
            plan = open(plan, "rb").read()
        self.trt_engine = self.trt_runtime.deserialize_cuda_engine(plan)
        self.context = self.trt_engine.create_execution_context()
    
    def infer(self, input_data:map, output_shapes:map):
        # This allocates memory for network inputs/outputs on both CPU and GPU
        self.inputs, self.outputs, self.bindings = \
            allocate_buffers(self.trt_engine, self.context, input_data)
        
        self.stream  = cuda.Stream()
        
        for binding_name, mem in self.inputs.items():
            input_type = mem.dtype
            input_fix = np.ascontiguousarray(input_data[binding_name].astype(input_type))
            mem.host = input_fix
            # input = np.array(input_data[binding_name], dtype=mem.dtype, order='C')
            # np.copyto(mem.host, input.ravel())

        # Fetch output from the model
        res = do_inference_v2(
            self.context, bindings=self.bindings, inputs=self.inputs,
            outputs=self.outputs, stream=self.stream)

        # Before doing post-processing, we need to reshape the outputs as the common.do_inference will
        # give us flat arrays.
        outputs_reshape = []
        for binding_name, shape in output_shapes.items():
            ot = self.outputs[binding_name]
            outputs_reshape.append(ot.host.reshape(shape))
        # And return results
        return outputs_reshape

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求值(河南萌新2024)

我真的服了,注意数据范围!!!!!!!!!!!!!!!!!!&#…

秋招突击——7/29——复习{有塔游戏——关联传递性}——新作{随机链表的复制、合并K个升序链表,二叉树——二叉树的中序遍历、二叉树的最大深度、反转二叉树}

文章目录 引言复习有塔游戏——关联传递性实现复习实现参考实现 新作随机链表的复制个人实现参考实现 排序链表个人实现参考实现 二叉树章节二叉树的中序遍历个人实现 二叉树的最大深度个人实现参考实现 反转二叉树个人实现参考实现 总结 引言 旅游完回来了,今天继…

SSM流浪狗信息管理系统-计算机毕业设计源码07154

目录 1 绪论 1.1 研究背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程分析…

vmware上,虚机经常丢失网卡。导致无法上网。

1、winR 输入 services.msc 2、重启这两个服务。 VMware NAT service和VMware DHCP service

【Rust日报】query.rs - 搜索Rust的一切

rucola - 在终端中管理你的markdown文档 很酷的一个终端软件。 query.rs - 搜索Rust的一切 https://query.rs/ 文档,crate,错误代码等等。 就是Rust生态的google. 使用Rust 10年后,我想吐槽几句 这篇文章分享了作者在使用Rust编程语言中的经验…

“postman请求JSON格式,Body内数据无法被idea后端接收,值为null“问题的解决方式

问题描述: 传递数据一切正常,但是: 原因剖析: 这是因为我们实体类里面属性的命名格式不符合驼峰命名,比如我这种“大写字母开头如CAD”/“一个小写字母一个大写字母如aDddddd”都不行。 解决方法: 方法1&#xff1a…

LangChain大模型应用开发指南-大模型Memory不止于对话

上节课,我我为您介绍了LangChain中最基本的链式结构,以及基于这个链式结构演化出来的ReAct对话链模型。 今天我将由简入繁,为大家拆解LangChain内置的多种记忆机制。本教程将详细介绍这些记忆组件的工作原理、特性以及使用方法。 【一一AGI大…

二叉搜索树的第 k 大的节点

题目描述 给定一棵二叉搜索树,请找出其中第 k 大的节点。 解题基本知识 二叉搜索树(Binary Search Tree)又名二叉查找树、二叉排序树。它是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子…

C语言第九天笔记

数组的概念 什 么是数组 数组是 相同类型, 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…

数据安全、信息安全、网络安全区别与联系

关键字: 信息安全 数据安全 网络安全 [导读] 让人更好理解 “数据安全”、“信息安全”、“网络安全” 三者间的区别与联系了,我们汇总了官方机构给这三者的定义,并且网友也给出了自己的看法,一起来看看。 在 “互联网 ” 被广…

tomcat10环境的搭建及发布一个动态服务

Day 15 # 构建项目 [rootstatic-server eleme_web]# npm run build # 将静态的项目移动到nginx [rootstatic-server eleme_web]# ls [rootstatic-server eleme_web]# ls dist/ css favicon.ico index.html js [rootstatic-server eleme_web]# vim dist/index.html [r…

数据虚拟化和传统数据集成方式(如 ETL)有何区别?

要理解数据虚拟化,我们先说一下什么是虚拟化(Virtualization)? 所谓虚拟化(Virtualization),通常指的是对 IT 资源的抽象,它屏蔽了这些资源的物理性质和边界。IT 资源可以是服务器、…

DjangoRF-11-创建testcases子应用--任务模块

这里先写任务应用,再写套件,然后写接口,最后再写请求, 这个是新的应用,要创建子应用,然后添加到settings的注册里面 1、和往常一样先写模型,序列化,权限,视图&#xf…

【正版软件分享】FastCopy Pro:Windows 文件复制的加速器,让数据传输更高效

在数字化时代,数据的快速、安全传输是每个用户和企业的核心需求。今天,我们将深入探讨一款名为 FastCopy Pro 的 Windows 文件复制、备份和删除软件,它以其卓越的性能和易用性在众多工具中脱颖而出。 FastCopy Pro 简介 FastCopy Pro 是一款…

jetbrain插件市场无法下载插件/idea插件install无效

最近把电脑重装了一次系统,发现idea插件市场可以搜到插件,但是不显示overview之类的信息,点install也没反应。 于是打算直接到插件市场的官网plugins.jetbrains.com下载插件安装。 结果发现同样可以搜索到插件,但是无法下载。 在…

多地气温连创新高,快递小哥高温补贴有多少

被热浪笼罩的多个城市,再度进入“烧烤模式”。朋友圈都在被同一句话刷屏——“我和烤肉之间只差一撮孜然的距离”。 在如此炎热时,快递小哥们依旧头顶烈日,穿梭在城市的车水马龙和摩天大楼之间,电话不离耳、腿脚不停歇&#xff0…

LLaMA-Factory私有化部署 -- PAI-DSW

LLaMA-Factory是一款比较流行的大语言模型微调框架。本文主要记录在阿里云人工智能平台PAI的DSW实例中部署LLaMA-Factory的过程,主要参考的教程是B站视频LLaMA-Factory私有化部署。 LLaMA-Factory的私有化部署与部署大模型的过程大体相同,都包括创建Pyt…

培训第十九天(安装nginx代理tomcat)

上午 1、构建vue发行版本 [rootserver ~]# cd eleme_web/[rootserver eleme_web]# npm run buid //项目未执行时运行该命令,创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件[rootserver dist]# lscss favicon.ico img in…

git创建远程仓库

注册 请自行注册github账号 创建远程仓库 自己在上图那里可以创建一个远程仓库 克隆远程仓库 我们需要将远程仓库克隆到本地之后,在本地修改最后上传到远程仓库,关系如下: 由于我们的仓库是私密仓库,需要通过ssh密钥的方法才…

day19(安装nginx代理 + tomcat)

1、构建vue发行版本 [rootserver ~]# cd eleme_web/ [rootserver eleme_web]# npm run buid //项目未执行时运行该命令,创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件 [rootserver dist]# ls css favicon.ico img index…