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" {
#endifint 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 demoPOST_BUILDCOMMAND ${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 speedyIOUfaets = torch.ones(2)
point = torch.ones(2)print(speedyIOU.trilinear_interpolation(faets,point))

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis和mysql

文章目录 一、redis1.1 redis的数据结构都有哪些&#xff1f;1.2 持久化方式有哪些&#xff1f;1.3 怎么保证缓存和数据库数据的一致性?1.4 redis缓存是什么意思&#xff1f; 二、数据库2.1 基本数据类型2.2 MySQL 的内连接、左连接、右连接有什么区别?2.3 MySQL 问题排查都有…

闲置iPad Pro打造真正的生产力工具!使用vscode编程写代码

文章目录 前言视频教程1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7…

Java阶段四Day08

Java阶段四Day08 文章目录 Java阶段四Day08关于pom.xml中的版本关于Session关于Token关于JWT在项目中使用JWTCustomUserDetailsUserDetailServiceImplUserServiceImpl 关于pom.xml中的版本 查看<groupId> 是同一家的只需配一个版本号<version><artifactId>中…

Spring Boot中的Profile:原理、用法与示例

Spring Boot中的Profile&#xff1a;原理、用法与示例 前言 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了很多有用的功能和特性。其中&#xff0c;Profile 是一个常用的功能&#xff0c;它可以根据不同的环境配置来加载不同的配置文件&#xff0c;…

双路高速 DA 实验

目录 双路高速 DA 实验 1、简介 2、实验任务 3、程序设计 3.1、hs_dual_da顶层模块代码 3.2、ROM 波形存储模块&#xff08;rom_1024x10b&#xff09; 创建单端口 ROM IP核 3.2、DA 数据发送模块&#xff08;da_wave_send&#xff09;代码 4、硬件设计 4.1、添加.xdc…

Nginx网站服务

目录 Nginx简介 简述Nginx和Apache的差异 3 Nginx 相对于 Apache 的优点 阻塞与非阻塞 同步与异步 ginx 应用场景 nginx编译安装 Nginx安装和升级 1.关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 2.拖入软件包 3.安装依赖包 3.创建运行用户与组 5.编译安…

【黑马头条-Java微服务项目】

黑马头条-Java微服务项目 (一)、项目介绍1.项目背景介绍(1).基本介绍(2).业务说明(3).项目术语介绍 2.技术栈说明(1).技术栈-基础六层技术(2).技术栈-服务四层技术(3).技术栈-分布 (二)、nacos环境搭建 (一)、项目介绍 1.项目背景介绍 (1).基本介绍 随着智能手机的普及&…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…

Seata 四种模式对比总结

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

Day_56-57kMeans 聚类

目录 Day_56-57 k-Means 聚类 一. 基本概念介绍 二. 具体过程 三. 代码实现与解释 1. 导入数据与数据初始化 2. 核心代码 3. 后续信息的补充 4. 距离计算和随机排列 四. 后续的数据分析 五. 运行结果 Day_56-57 k-Means 聚类 一. 基本概念介绍 同我上一篇博客的介绍&…

【Linux】打开Linux大门,踏入Linux世界(环境搭建再加一群Linux基本指令就OK啦~)

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;Linux系统编程与网络编程 &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#x…

MySQL表的约束

目录 前言 1.什么是约束 2.空属性 3.默认值 4.列描述 5.zerofill 6.主键 7.自增长 8.唯一键 9.外键 总结 前言 hello&#xff0c;各位小伙伴大家好&#xff0c;本章内容为大家介绍关于MySQL约束的相关内容&#xff0c;关于约束这个概念&#xff0c;如果是第一次接触可…