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

推荐订阅源

D
DataBreaches.Net
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
Y
Y Combinator Blog
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
量子位
I
Intezer
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
Lohrmann on Cybersecurity
L
LINUX DO - 最新话题
The Register - Security
The Register - Security
T
Tailwind CSS Blog
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
T
Troy Hunt's Blog
Stack Overflow Blog
Stack Overflow Blog
Cloudbric
Cloudbric
S
Secure Thoughts
The GitHub Blog
The GitHub Blog
T
The Blog of Author Tim Ferriss
L
LangChain Blog
Recorded Future
Recorded Future
小众软件
小众软件
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Tor Project blog
人人都是产品经理
人人都是产品经理
F
Full Disclosure
O
OpenAI News
Webroot Blog
Webroot Blog
A
Arctic Wolf
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
Jina AI
Jina AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
雷峰网
雷峰网
Microsoft Security Blog
Microsoft Security Blog
H
Heimdal Security Blog
B
Blog RSS Feed
Vercel News
Vercel News

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

【琐记】烟火与尘埃 【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;
}