python 加速(1)

news2024/10/7 10:13:32

文章目录

  • 简单步骤
  • 像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.coloradmin.cn/o/650306.html

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

相关文章

FPGA_学习_08_有限状态机

状态机是FPGA编程必学内容之一&#xff0c;因为状态机在项目用的特别多。 那为什么状态机这么重要呢&#xff1f; 在写这篇blog之前&#xff0c;搜到CSDN一位大佬的博客&#xff0c;有一句话令我醍醐灌顶&#xff1a; “FPGA不同于CPU的一点特点就是CPU是顺序执行的&#xff0c…

操作系统页面置换算法详解(OPT算法、FIFO算法、LRU算法解释+缺页数计算)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 〇、页面置换算法是什么&#xff1f;一、OPT算法1、算法介绍2、举例二、FIFO算法1、…

【嵌入式模型转换】算能盒子SE5 芯片板子BM1684

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.环境准备2. 开发机安装环境 前言 官网文档指引&#xff1a;https://doc.sophgo.com/sdk-docs/v23.03.01/docs_latest_release/docs/SophonSDK_doc/zh/html/c…

ffmpeg capture decklink

确保decklink设备已经接入 lspci | grep Blackm02:00.0 Multimedia video controller: Blackmagic Design DeckLink SDI Micro 确保decklink驱动已经正确安装 lsmod | grep blackmagicblackmagic_io 2068480 2 确保ffmpeg已经启用decklink&#xff0c;如何配置之前的博文已经…

高磁场型霍尔效应测试系统

高磁场型霍尔效应测试系统由&#xff1a;电磁铁、电磁铁电源、高精度恒流源高精度电压表、高斯计、霍尔效应样品支架、标准样品、系统软件。用于测量半导体材料的载流子浓度、迁移率、电阻率、霍尔系数等重要参数&#xff0c;而这些参数是了解半导体材料电学特性必须预先掌控的…

conda下jupyter lab 多kernel

1.安装ipykernel pip install ipykernel2.手动添加 --kernel python -m ipykernel install --name tensorflow --display-name "tensroflow"3. 查看创建的kernel jupyter kernelspec list4. 修改配置文件kernel.json&#xff0c;使得已创建的kernel匹配 5. 修改配…

【Axure教程】根据标签数自动调整尺寸的多选下拉列表

​多选下拉列表常用于需要用户从一组选项中选择多个选项的情况。它提供了一个下拉菜单&#xff0c;用户可以点击展开并选择他们感兴趣的多个选项。多选下拉列表可以用于展示可选标签&#xff0c;并允许用户选择多个标签。例如&#xff0c;在一个博客发布界面上&#xff0c;可以…

【Flutter】如何在 Flutter 中获取设备 ID

文章目录 一、 前言二、 设备 ID 的重要性1. 什么是设备 ID2. 设备 ID 的作用 三、 在 Flutter 中获取设备 ID1. 需要的工具和库2. 简单代码示例3. 完整可以运行的代码 四、 注意事项1. 权限问题2. 设备兼容性问题 五、 总结 一、 前言 在移动应用开发中&#xff0c;有时我们需…

飞书小程序开发教程——获取app_access_token

前言 最近在玩飞书小程序&#xff0c;真是受够了某信的小程序&#xff0c;一坨坨的限制加恶心人的手段。体验了飞书加飞书文档的功能真的还是飞书好用&#xff0c;又可以定制机器人啥的真方便。 但是飞书除了开发者文档真没啥资料&#xff0c;估计没啥人写吧…本专栏后续就慢慢…

DVPP媒体数据处理视频编码问题案例

DVPP&#xff08;Digital Vision Pre-Processing&#xff09;是昇腾AI处理器内置的图像处理单元&#xff0c;通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力&#xff0c;主要功能包括图像编解码、视频编解码、图像抠图缩放等。 本期就分享几个关于DVPP视频编码问题…

未磁科技全球首台64通道无液氦心磁图仪及首个培训基地落户北京安贞医院

【全球首台64通道无液氦心磁图仪在北京安贞医院举行开机仪式】 近日&#xff0c;在北京安贞医院举行了未磁科技全球首台64通道无液氦心磁图仪开机仪式&#xff0c;中国医学装备协会赵自林理事长、北京安贞医院纪智礼书记、张宏家院长、宋现涛教授&#xff0c;以及未磁科技蔡宾…

【离散化+枚举】代码源每日一题div2 全部相等

全部相等 - 题目 - Daimayuan Online Judge 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;子序列最长&#xff0c;想到了DP&#xff0c;但是子序列DP&#xff0c;D不出来&#xff0c;所以要放弃想法 不难发现&#xff0c;这道题和顺序没有关系&#xff0c;所以可以说…

Vision Pro,难成初代iPhone

“一个全新的增强显示平台&#xff0c;一个革命性的新产品”&#xff0c;这是苹果CEO库克给Apple Vision Pro的评价。 当苹果拿出Vision Pro时&#xff0c;想必整个科技行业都感到震惊。这不仅是因为苹果时隔十六年后&#xff0c;再次在WWDC带来“革命性产品”&#xff0c;更是…

Ai 赋能|这 6 款免安装的工具,功能超神~

今天小呆给小伙伴们分享几款小巧好用的工具&#xff0c;功能非常实用&#xff0c;而且全都免费&#xff0c;值得大家使用&#xff01; 1、Pix Fix 修复画质损坏的图像 Pix Fix 是一个免费的线上图片工具&#xff0c;可以对过度压缩造成损毁的图片以算法为基础进行噪点的修复&…

【枚举+数学】代码源每日一题div2 数学

数学 - 题目 - Daimayuan Online Judge 题意&#xff1a; 思路&#xff1a; 首先把条件理一下 gcd(s1,s2)K 按照惯用套路 设 s1k1*K s2k2*K 那么就是(k1k2)*Ksum 所以K是sum的一个因子 因此只需要枚举sum的因子即可 但是注意数据范围&#xff1a;1e9 说明不能直接枚…

MySQL数据库加密

有时候为防止别人攻击数据库&#xff0c;直接读取修改数据&#xff0c;我们会对数据库数据进行加密。 一&#xff1a;AES_ENCRYPT(需要加密的数据,密钥) AES_DECRYPT(需要解密的数据,刚才的密钥) 如&#xff1a;update area set jiamiAES_ENCRYPT(test数据加密,miyao) where …

Python基础知识掌握之 字符串格式化

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 为了确保字符串按预期显示&#xff0c;我们可以使用 format() 方法对结果进行格式化。 字符串 format() format() 方法允许您格式化字符串的选定部分。 有时文本的一部分是你无法控制的&#xff0c;也许它们来自数据…

分享几个免费设计生成工具 (第二期)

今天来给大家分享几个国外免费的设计生成工具 A. Tools https://www.a.tools/ 一个免费实用的在线工具箱&#xff0c;提供了 85 个特色工具&#xff0c;包含图形图像、日期和时间、文本编辑器、解密和加密、编程与设计、图表生成器等等&#xff0c;还有热门的 AI聊天提示生成器…

freemarker学习记录

freemarker 介绍 FreeMarker 是一款模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c…

electron 生命周期

生命周期事件&#xff1a; reday: app初始化完成dom-ready:一个窗口的文本加载完成&#xff0c;可以进行dom操作did-finish-load: 导航完成时触发,选项卡旋转器停止旋转时&#xff08;发生在dom-ready后&#xff09;比如点击一个选项卡后&#xff0c;某一个选项下的dom加载完成…