python 加速(1)

文章目录

  • 简单步骤
  • 像Python一样做torch 的一切
    • 安装Cmake
    • 安装 Torch (GPU)
    • CMakeLists.txt
    • 试用小样
    • 设置 CLion 环境
  • Cuda
    • 配置VS C++ 环境
    • 建上手的文件
      • step1: interpolation.cpp
      • step2: interpolation_kernel.cu
      • step3: include/ utils.h
      • step4: setup.py
      • step5: pip install package
      • step6: test.py

因为要修改yolo系列里NMS处的计算,如果用python,速度巨慢。torchvision 有自己的加速后的NMS function。但是不和形变后的IOU通用。因此需要做一个类似的。
回看torchvion, 发现里面有cpp的文件,因为之前没有接触过加速(资源比较丰富)。
C++ 并不是加速NMS那步操作的解药,解药是CUDA kernel。因此,如果要加速任何的function在model里,CUDA kernel 是最终目的。

自己之前误入歧途,以为C++就能加速一切。试图用libtorch & c++ 替代之前python的操作。但其实只要不能加速GPU操作,这些办法都毫无意义。在用libtorch 改写时,发现python导出的.pt文件,并没有办法被C++ 的libtorch直接load. 在试图解决这个bug,发现了,其实我该用cuda 改写~就无语。。。。

感谢:AI葵
https://www.youtube.com/watch?v=_QqG_I8nfH0

简单步骤

Header

wiou.h

#ifndef WIOU_WIOU_H
#define WIOU_WIOU_H

#ifdef __cplusplus
extern "C" {
#endif

int add(int a, int b); // Function declaration

#ifdef __cplusplus
}
#endif

#endif //WIOU_WIOU_H

CPP

wiou.cpp

#include "wiou.h"

extern "C" {
int add(int a, int b) {
    return a + b;
}
}
g++ -shared -o mylibrary.so wiou.cpp
# main.py
import ctypes

# 加载共享库
mylib = ctypes.CDLL('./mylibrary.so')

# 调用共享库中的函数
result = mylib.add(2, 3)
print(result)

像Python一样做torch 的一切

此处必须推荐Clion, 如果你的系统被装得五花八门,如果你赶时间,就用Clion, 最爱这种傻瓜式装环境。

安装Cmake

如果使用conda 环境, 就用conda install
如果不用,就一般操作来。(推荐这个,这个容易上手)
https://cmake.org/download/

如果你是打工族,不出意外都是X64

Windows x64 Installer:
cmake-3.27.0-rc2-windows-x86_64.msi

安装 Torch (GPU)

和python不一样,这里需要下载另一个库,并且需要将cuda 中的4个文件,copy paste到VS code中
https://github.com/NVlabs/tiny-cuda-nn/issues/164
我用的是Clion, 依然需要确保在装cuda的时候,把visual studio 下载了

请添加图片描述
CUDA 11.8 是来自你的nvcc 出来得版本号 nvcc -V
两个都下呗,都可以替换着使用

Copy 文件

源文件夹:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\extras\visual_studio_integration\MSBuildExtensions

  1. CUDA 11.8.props
  2. CUDA 11.8.targets
  3. CUDA 11.8.xml
  4. Nvda.Build.CudaTasks.v11.8.dll

如果你没找到 ‘visual_studio_integration’, 这里重新下载安装一下cuda toolkit
https://developer.nvidia.com/cuda-11-8-0-download-archive
因为整个内容得解药和中心思想都来自visual studio, 所以不能没有这个!

目标文件夹:

D:\visualstudio\MSBuild\Microsoft\VC\v170\BuildCustomizations

这里得D:\visualstudio\ 是取决于你用 visual studio installer 安装时得路径。
默认是C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\

  • v160通常表示Visual Studio 2019,v170表示Visual Studio 2022

CMakeLists.txt

cmake_minimum_required(VERSION 3.25)
project(demo)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_PREFIX_PATH D:\\libtorch-release\\libtorch)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(demo main.cpp) #before target_link_libraries
target_link_libraries(demo "${TORCH_LIBRARIES}")

# The following code block is suggested to be used on Windows.
# According to https://github.com/pytorch/pytorch/issues/25457,
# the DLLs need to be copied to avoid memory errors.
if (MSVC)
    file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
    add_custom_command(TARGET demo
            POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${TORCH_DLLS}
            $<TARGET_FILE_DIR:demo>)
endif (MSVC)

试用小样

#include <iostream>
#include <torch/torch.h>

int main() {
    torch::Tensor tensor = torch::rand({2, 3});
    std::cout << "Hello, World!" << std::endl;
    std::cout << tensor << std::endl;
    return 0;
}

设置 CLion 环境

参考来自于:
https://www.youtube.com/watch?v=Vj06cfj6LyI (1:22开始)

https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#clang-mingw

第一步:
在这里插入图片描述

第二步:
只用新建或者在原有里面改toolchain的地方到–>visual studio


第三步:

先不用管 build. Cmake 一次不成,改正错误就点击 最左边循环的icon, 再次Cmake
在这里插入图片描述

这三步做完,可以确保我们吧torch安装好了。 Torch 安装进去的迹象:
在这里插入图片描述

Cuda

这个比libtorch 好上手多了。基本还是python那一套。用VS code 比较容易。

配置VS C++ 环境

ctrl + shift + P, 找到关于配置C++的 UI选项
compiler path 和 intelliSenseMode 都不用管,我的机子windows,用啥都没关系。重要的是 includePath, 这个保证了在用VS code IDE 写代码时,不会因为找不到torch报错~

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\Users\\Remi\\anaconda3\\envs\\yolov8\\include",
                "C:\\Users\\Remi\\anaconda3\\envs\\yolov8\\Lib\\site-packages\\torch\\include",
                "C:\\Users\\Remi\\anaconda3\\envs\\yolov8\\Lib\\site-packages\\torch\\include\\torch\\csrc\\api\\include"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-clang-x64"
        }
    ],
    "version": 4
}

建上手的文件

按照从上到下顺序,依次建立

step1: interpolation.cpp

//
// Created by Remi on 2023/6/15.
//
#include <torch/extension.h>
#include "include/utils.h"
using namespace torch;

torch::Tensor trilinear_interpolation(
        torch::Tensor feats,
        torch::Tensor points
        ){
    return trilinear_fw_cu(feats,points);
}

PYBIND11_MODULE(TORCH_EXTENSION_NAME, m){
    m.def("trilinear_interpolation", &trilinear_interpolation);
}

step2: interpolation_kernel.cu

#include <torch/extension.h>
torch::Tensor trilinear_fw_cu(
        torch::Tensor feats,
        torch::Tensor points
        ){
    return feats;
}

step3: include/ utils.h

#include <torch/extension.h>

#define CHECK_CUDA(x) TORCH_CHECK(x.is_cuda(), #x " must be a CUDA tensor")
#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous")
#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)

torch::Tensor trilinear_fw_cu(
    const torch::Tensor feats,
    const torch::Tensor points
);

step4: setup.py

如果是仿照写自己的内容时,这里比较容易出错。
sources 一定要包含 c++ 和 cuda 的内容

import glob
import os.path as osp
from setuptools import setup
from torch.utils.cpp_extension import CUDAExtension, BuildExtension
ROOT_DIR = osp.dirname(osp.abspath(__file__))
include_dirs = [osp.join(ROOT_DIR, "include")]
sources = glob.glob('*.cpp')+glob.glob('*.cu')

setup(
    name='speedyIOU',
    version='1.0',
    ext_modules=[
        CUDAExtension(
            name='speedyIOU',
            sources = sources,
            include_dirs = include_dirs
        )
    ],
    cmdclass={
        'build_ext': BuildExtension
    }
)

step5: pip install package

pip install .在这里插入图片描述

step6: test.py

这里的speedyIOU 来自你在step5install的自己的 python 的库。

import torch
import speedyIOU

faets = torch.ones(2)
point = torch.ones(2)

print(speedyIOU.trilinear_interpolation(faets,point))

有东西输出,就说明从python 到 C++ 再到 cuda 这个套路,你就掌握了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【系统架构】第五章-软件工程基础知识(软件测试、净室软件工程、基于构件的软件工程、 软件项目管理)

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 软件测试 一、测试方法 以测试过程中程序执行状态为依据可分为静态测试&#xff08;ST&#xff09;和动态测试&#xff08;DT&#xff09; 以具体实现算法细节和系统内部结构的相关情况为根据…

【强化学习】常用算法之一 “A3C”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

VUE3-组件问题

VUE3-组件问题 文章目录 VUE3-组件问题一、S-Table1.问题描述2.问题展示3.问题解决 二、form表单无法显示1.问题描述2.问题展示3.问题解决 三、input 框为不可编辑状态四、Echarts组件未渲染五、图片正常引用&#xff0c;但是部署服务器部署不上去&#xff0c;看不到图片1.图片…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

Vue3解决:[Vue warn]: Failed to resolve component: el-table(或el-button) 的三种解决方案

1、问题描述&#xff1a; 其一、报错为&#xff1a; [Vue warn]: Failed to resolve component: el-table If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. at <App> 或者&#xff1a; …

实验 4:排序与查找

东莞理工的学生可以借鉴&#xff0c;请勿抄袭 1.实验目的 通过实验达到&#xff1a; 理解典型排序的基本思想&#xff0c;掌握典型排序方法的思想和相应实现算法&#xff1b; 理解和掌握用二叉排序树(BST)实现动态查找的基本思想和相应的实现 算法。 理解和掌握哈希(HASH)存…

【Django】图形验证码显示及验证

图形验证码显示及验证 开发项目时&#xff0c;在登陆或者注册功能中为防止脚本恶意破坏系统&#xff0c;故而添加图形验证码。 文章目录 图形验证码显示及验证1 安装配置2 验证码显示及正确性验证3 效果显示 1 安装配置 安装第三方库 pip install django-simple-captcha配置s…

《计算机系统与网络安全》 第六章 密钥管理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

mysql8.0新特性详解

一、my.ini或my.cnf的全局参数 一个连接最少占用内存是256K&#xff0c;最大是64M&#xff0c;如果一个连接的请求数据超过64MB&#xff08;比如排序&#xff09;&#xff0c;就会申请临时空间&#xff0c;放到硬盘上。 #最大连接数 max_connections3000 #最大用户连接数 max_…

RS485转Profinet通讯

RS485转Profinet通讯 概述系统组成流量积算仪网关 软件总结 概述 一个支持RS485的流量积算仪的数据要被Profinet的PLC读取。制作一个网关&#xff0c;实现RS485到Profinet的转换。 系统组成 流量积算仪 支持RS485通讯&#xff0c;通讯协议是modbus RTU。采用功能码3可以读取…

ChatGPT从入门到精通,深入认识Prompt

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公&#xff01;行动起来吧。欢迎关注专栏 1、ChatGPT从入门到精通&#xff0…

【SQL Server】数据库开发指南(八)高级数据处理技术 MS-SQL 事务、异常和游标的深入研究

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;#MS-SQL Server 专栏中。 本系列文章列表如下&#xff1a; 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南&#xff08;一&#xff09;数据库设计的核心概念…

【Unity 实用插件篇】 | UI适配神器 Device Simulator 移动设备模拟器 的详细使用方法

前言 【Unity 实用插件篇】 UI适配神器 Device Simulator 移动设备模拟器 的详细使用方法一、安装Device Simulator包二、使用Device Simulator模拟各种设备三、自定义设备类型信息 总结 &#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由…

错误C2039:‘退出‘:不是‘`全局名称空间‘的成员

问题 VC\Tools\MSVC\14.27.29110\include 目录里的cstdint文件的内容 原因 一种典型的Microsoft产品错误. 解决 运行 点击修复

Windows 驱动开发环境搭建

Windows 驱动开发环境搭建及 windbg 调试工具安装使用 引言了解 Windows 驱动开发环境下载 Windows 驱动开发环境根据需要下载安装对应版本的 Visual Studio下载安装对应的 WDK 工具包 编写第一个驱动代码总结参考资料 引言 对于 Windows 驱动开发&#xff0c;在微软官方的文档…

windows 下安装 mysql-8.0.25 解压版

介绍 此文介绍 mysql-8.0.25-winx64 的 zip 解压版&#xff0c;在 windows 下的安装与配置过程。 官方下载 官网下载页&#xff1a; https://downloads.mysql.com/archives/community/ 进入官网&#xff0c;选择默认版本就行&#xff0c;不需要包含测试工具套件的版本 本地解…

【spring源码系列-03】xml配置文件启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

[RocketMQ] Consumer消费者启动主要流程源码 (六)

客户端常用的消费者类是DefaultMQPushConsumer, DefaultMQPushConsumer的构造器以及start方法的源码。 1.创建DefaultMQPushConsumer实例 最终都是调用下面四个参数的构造函数: /*** 创建DefaultMQPushConsumer实例** param namespace namespace地址* par…

两两交换链表中的节点(LeetCode 24)

题目 24. 两两交换链表中的节点 思路 最开始自己画&#xff0c;越画越复杂比较复杂&#xff0c;写不出来&#xff01;&#xff08;呜呜&#xff09;去看了解题思路&#xff0c;发现只需要三步。&#xff0c;按以下思路写了代码&#xff0c;循环停止那里的条件我还以有更好的写…

【Docker】Docker Desktop更换非C盘符(减轻占用率)

Win10中的Docker Desktop调整到其他盘符&#xff0c;由于新版本已经不让修改软连接了&#xff0c;只好另谋策略&#xff0c;最终还是改成功了。 出现问题 使用软连接修改 上面代码我们可以科幻的理解一下 幻想破灭 //TODO 用户点击执行安装 if(检查文件夹是否软连接){有则&a…
最新文章