惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
The Exploit Database - CXSecurity.com
I
Intezer
P
Privacy & Cybersecurity Law Blog
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
K
Kaspersky official blog
AWS News Blog
AWS News Blog
Schneier on Security
Schneier on Security
雷峰网
雷峰网
www.infosecurity-magazine.com
www.infosecurity-magazine.com
宝玉的分享
宝玉的分享
G
Google Developers Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Forbes - Security
Forbes - Security
T
The Blog of Author Tim Ferriss
S
Security @ Cisco Blogs
NISL@THU
NISL@THU
N
News and Events Feed by Topic
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
Blog — PlanetScale
Blog — PlanetScale
Help Net Security
Help Net Security
F
Full Disclosure
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
D
Docker
T
Tailwind CSS Blog
L
LangChain Blog
The Last Watchdog
The Last Watchdog
美团技术团队
博客园 - Franky
H
Hacker News: Front Page
Stack Overflow Blog
Stack Overflow Blog
W
WeLiveSecurity
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recorded Future
Recorded Future
V
Visual Studio Blog
N
Netflix TechBlog - Medium
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
S
Schneier on Security
Know Your Adversary
Know Your Adversary

Пусть этот камень будет более крепким, чем человек

【琐记】烟火与尘埃 【Triton】Triton实现矩阵乘 【LLM推理加速】FlashAttention 【LLM推理加速】PagedAttention 【LLM推理加速】Online Softmax LLM基础知识【1】 Transformer模型 【AI编译】LayerGroup Tiling Tile的疑惑和思考 【AI编译】深度优先的Tile调度,万事大吉? 【AI编译】多级流水线Tile调度策略 【CUDA C++】GPU内存使用【3】 【AI编译】Cache缓存地址映射 【CUDA C++】GPU存储【2】 【CUDA C++】GPU基本介绍【1】 【00】0序章-不受欢迎的来客 【转载】我来了——持续低熵 【Halide】调度优化【2】 【感想】写作进度报告5 【Halide】调度优化【1】 【转载】北大中文男足战报2 【BYOC】TVM切分子图 【转载】北大中文男足战报1 【AI编译】张量生命周期管理 SystemC 用寄存器同步建模方法 【脉动阵列】脉动阵列类型 【im2col】AScend conv accelerate 【感想】写作进度报告4 【BYOC】TVM添加自定义编译器 ccompiler 【感想】写作进度报告3 【Tengine】推理流程脑图【2】 【Tengine】推理流程脑图【1】 【NCNN】学习ncnn模型转换 【编译器】使用llvm编译自定义语言【3】编译 object 【编译器】使用llvm编译自定义语言【2】转llvm IR 【编译器】使用llvm编译自定义语言【1】构建AST 【AI编译】如何进行内存分配 【感想】写作进度报告2 【AI编译】layer-group之后如何tiling 【AI编译】如何进行layer-group 【Gemm】内存对齐 【gemm】Gemm计算加速 【TVM】通过代码学习编译流程【5】FuseOps 【TVM】通过代码学习编译流程【6】CodeGen 【TVM】通过代码学习类【3.5】Pass 【TVM】通过代码学习编译流程【4】BuildRelay 【AI编译】Tiling操作能优化什么时间 【TVM】通过代码学习编译流程【3】模型编译 【TVM】通过代码学习编译流程【2】模型转换 【TVM】通过代码学习编译流程【1】必要知识 【感想】写作进度报告1 【Winograd】卷积加速算法原理及实现 SystemC 等待异步事件解决方案 【TVM】Python脚本实现模型编译和保存 【推理引擎】常见AI推理框架 【3D建模】T110E3卡迪夫蓝调皮肤模型 【TVM】C++部署运行TVM 【推理引擎】NCNN和Tengine量化推理逻辑对比 【3D建模】IS-7攻城锤流纹岩皮肤展示 【TVM】根据例子走通代码库 博客汇总目录 【Im2Col】卷积加速算法【2】NHWC 【Im2Col】卷积加速算法【1】 NCHW openBlas库的安装与简单使用 C语言工程调用Cpp库解决方案 foo Hello World
【量化】连续卷积层首尾量化的可行性
Post author: XianMu@Пусть этот камень будет более крепким, чем ч · 2025-01-03 · via Пусть этот камень будет более крепким, чем человек
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#include <string.h>
typedef struct conv_info{
    float weight[4];
    float bias[4];
    int weight_int8[4];
    int bias_int[4];
    float scale;
}conv_info;
typedef struct tensor_info{
    float data[4];
    int data_int8[4];
    float scale;
}tensor_info;
void init_tensor(struct tensor_info* tensor, float* data, int num){
    for(int i=0; i<num; i++){
        tensor->data[i] = data[i];
    }
}
void init_conv(struct conv_info* conv, float* weight, float* bias, int num){
    for(int i=0; i<num; i++){
        conv->weight[i] = weight[i];
        conv->bias[i] = bias[i];
    }
}
void CalculateConvScale(struct conv_info* conv, int num){
    float abs_max=0;
    float *data = conv->weight;
    for(int i=0; i<num; i++){
        if(fabs(data[i])>abs_max){
            abs_max = fabs(data[i]);
        }
    }
    conv->scale = abs_max/127.0;
    for(int i=0; i<num; i++){
        int temp = round(data[i]/(conv->scale));
        conv->weight_int8[i] = temp;
    }
}
void ClaculateConvBiasInt8(struct conv_info* conv,  struct tensor_info* tensor, int num){
    for(int i=0; i<num; i++){
        int temp = round(conv->bias[i]/(conv->scale*tensor->scale));
        conv->bias_int[i] = temp;
    }
}
void CalculateTensorScale(struct tensor_info* tensor, int num){
    float abs_max=0;
    float *data = tensor->data;
    for(int i=0; i<num; i++){
        if(fabs(data[i])>abs_max){
            abs_max = fabs(data[i]);
        }
    }
    tensor->scale = abs_max/127.0;    
}
void ConvFloat(struct tensor_info* input, struct conv_info* conv, struct tensor_info* output, int num){
    for(int i=0; i<num; i++){
        output->data[i] = input->data[i]*conv->weight[i]+conv->bias[i];
    }
}
void ConvInt(struct tensor_info* input, struct conv_info* conv, struct tensor_info* output, int num){
    
    for(int i=0; i<num; i++){
        
        int input_int8 = round(input->data[i] / input->scale);  
        
        int out_int8 = input_int8 * conv->weight_int8[i];
        
        int out_bias_int8 = out_int8 + conv->bias_int[i];
        
        output->data[i] = out_bias_int8 * input->scale * conv->scale;
    }
}
void updateBiasInt8(struct conv_info* conv, float scale, int num){
    for(int i=0; i<num; i++){
        int temp = round(conv->bias[i]/scale);
        conv->bias_int[i] = temp;
    }
}
void ConvFrontTial(struct tensor_info* input, struct conv_info* conv1, struct conv_info* conv2, struct conv_info* conv3, 
        struct tensor_info* output, int num){
    for(int i=0; i<num; i++){
        
        int input_int = round(input->data[i] / input->scale);
        
        int input_int_1 = input_int * conv1->weight_int8[i] + conv1->bias_int[i];
        
        int input_int_2 = input_int_1 * conv2->weight_int8[i] + conv2->bias_int[i];
        
        int input_int_3 = input_int_2 * conv3->weight_int8[i] + conv3->bias_int[i];
        
        output->data[i] = input_int_3 * input->scale * conv1->scale * conv2->scale * conv3->scale;
    }
}
int main(){
    tensor_info* input = (tensor_info*) malloc(sizeof(tensor_info));
    float input_data[4] = {0.24, -0.08, 0.16, -0.61};
    init_tensor(input, input_data, 4);
    conv_info* conv1 = (conv_info*) malloc(sizeof(conv_info));
    float weight_data1[4] = {0.02, 0.01, -0.04, 0.01} ;
    float bias1[4] = {11.4, -6.3, -57.2, 5.48};
    init_conv(conv1, weight_data1, bias1, 4);
    conv_info* conv2 = (conv_info*) malloc(sizeof(conv_info));
    float weight_data2[4] = {0.6, 0.25, -0.48, 0.69} ;
    float bias2[4] = {10.4, -6.3, -31.2, 5.48};
    init_conv(conv2, weight_data2, bias2, 4);
    conv_info* conv3 = (conv_info*) malloc(sizeof(conv_info));
    float weight_data3[4] = {-2.4, 6.4, 1.2, 0.69} ;
    float bias3[4] = {-5.4, 7.2, 26.3, 3.24};
    init_conv(conv3, weight_data3, bias3, 4);
    printf("\n 1  ********   float 推理   ********  \n");
    tensor_info* middle1 = (tensor_info*) malloc(sizeof(tensor_info));
    tensor_info* middle2 = (tensor_info*) malloc(sizeof(tensor_info)); 
    tensor_info* output_res = (tensor_info*) malloc(sizeof(tensor_info));
    ConvFloat(input, conv1, middle1, 4);
    ConvFloat(middle1, conv2, middle2, 4);
    ConvFloat(middle2, conv3, output_res, 4);
    for(int i=0; i<4; i++){
         printf("  %f ", output_res->data[i]);
    }
    printf("\n 2 ********   量化推理   ********  \n");
    CalculateConvScale(conv1, 4);
    CalculateConvScale(conv2, 4);
    CalculateConvScale(conv3, 4);
    CalculateTensorScale(input, 4);
    CalculateTensorScale(middle1, 4);
    CalculateTensorScale(middle2, 4);
    ClaculateConvBiasInt8(conv1, input, 4);
    ClaculateConvBiasInt8(conv2, middle1, 4);
    ClaculateConvBiasInt8(conv3, middle2, 4);
    ConvInt(input, conv1, middle1, 4);
    ConvInt(middle1, conv2, middle2, 4);
    ConvInt(middle2, conv3, output_res, 4);
    
    for(int i=0; i<4; i++){
        printf("  %f ", output_res->data[i]);
    }
    
    printf("\n 3 ********   首尾量化推理   ********  \n");
    updateBiasInt8(conv1, input->scale*conv1->scale, 4);
    updateBiasInt8(conv2, input->scale*conv1->scale*conv2->scale, 4);
    updateBiasInt8(conv3, input->scale*conv1->scale*conv2->scale*conv3->scale, 4);
    ConvFrontTial(input, conv1, conv2, conv3, output_res, 4);
    for(int i=0; i<4; i++){
        printf("  %f ", output_res->data[i]);
    }
    
    
    
    printf("\n【第一个卷积】  输入scale:%f   权重scale:%f  \n", input->scale, conv1->scale);
    for(int i=0; i<4; i++){
        printf("weight_scaled(int8):%d  bias_scaled(int32):%d  ",conv1->weight_int8[i], conv1->bias_int[i]);
    }
    printf("\n【第二个卷积】  输入scale:%f   权重scale:%f  \n", middle1->scale, conv2->scale);
    for(int i=0; i<4; i++){
        printf("weight_scaled(int8):%d  bias_scaled(int32):%d  ",conv2->weight_int8[i], conv2->bias_int[i]);
    }
    printf("\n【第三个卷积】  输入scale:%f   权重scale:%f  \n", middle2->scale, conv3->scale);
    for(int i=0; i<4; i++){
        printf("weight_scaled(int8):%d  bias_scaled(int32):%d  ",conv3->weight_int8[i], conv3->bias_int[i]);
    }
    return 0;
}