讓Faster R-CNN支援TX1的fp16(half float, float16)特性
為什麼要用float16?
一句話,float16的運算速度是float32運算速度的2倍。nVidia說的,資料不對不要怪我,(≖ ‿ ≖)✧
在說一下缺點,也是一句話,精度損失了。(臥槽,廢話,(*´Д`*))
會損失多少呢?
IEEE754(wiki)這裡描述各種float的規則,這裡鄙視一下百度百科。 눈_눈
float32: 負 -3.4028235E+38 到 -1.401298E-45,正 1.401298E-45 到 3.4028235E+38
float16: 半精度佔2個位元組,1位符號位,5位階碼,10位尾陣列成,精度為0.001,所以它的範圍,自己算 ,(´・ω・`) ,不會就去問老師(。◕ˇ∀ˇ◕)。
看來還是可以和float32比一比的嘛,(喂喂,這麼果斷得出結論真的好嗎?)
既然那麼厲害, 反正拿到了TX1,那就試試呀,(臥槽,真的不打算解釋了麼)!搞一個超大的矩陣乘,然而事實是cuda目前也只提供float16的矩陣乘運算,_(:3 」∠)_
先貼個程式碼,請直接略過,程式碼有點長,有點亂,請隨便介意,因為不是我寫的,(。◕ˇ∀ˇ◕)
- #include <algorithm>
- #include <iostream>
- #include <time.h>
- #include <cublas.h>
- #include <cublas_v2.h>
- #include <assert.h>
- #include <stdio.h>
- #include <cuda_fp16.h>
- usingnamespace std;
- #define IDX2C(i,j,leading) (((j)*(leading))+(i))
- typedefstruct _data *PDATA;
- typedefstruct _data
- {
- int _rows;
- int _cols;
- float *data;
- } Data;
- typedefstruct _hdata *PHDATA;
- typedefstruct
- {
- int _rows;
- int _cols;
- half *data;
- } HData;
- void free_mat(PDATA mat)
- {
- free(mat->data);
- free(mat);
- }
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
- half uint16_as_fp16 (uint16_t a)
- {
- half res;
- #if defined (__cplusplus)
- memcpy (&res, &a, sizeof (res));
- #else /* __cplusplus */
- volatileunion {
- half f;
- uint16_t i;
- } cvt;
- cvt.i = a;
- res = cvt.f;
- #endif /* __cplusplus */
- return res;
- }
- uint32_t fp32_as_uint32 (float a)
- {
- uint32_t res;
- #if defined (__cplusplus)
- memcpy (&res, &a, sizeof (res));
- #else /* __cplusplus */
- volatileunion {
- float f;
- uint32_t i;
- } cvt;
- cvt.f = a;
- res = cvt.i;
- #endif /* __cplusplus */
- return res;
- }
- /* host version of device function __float2half_rn() */
- half float2half_rn (float a)
- {
- uint32_t ia = fp32_as_uint32 (a);
- uint16_t ir;
- ir = (ia >> 16) & 0x8000;
- if ((ia & 0x7f800000) == 0x7f800000) {
- if ((ia & 0x7fffffff) == 0x7f800000) {
- ir |= 0x7c00; /* infinity */
- } else {
- ir = 0x7fff; /* canonical NaN */
- }
- } elseif ((ia & 0x7f800000) >= 0x33000000) {
- int shift = (int)((ia >> 23) & 0xff) - 127;
- if (shift > 15) {
- ir |= 0x7c00; /* infinity */
- } else {
- ia = (ia & 0x007fffff) | 0x00800000; /* extract mantissa */
- if (shift < -14) { /* denormal */
- ir |= ia >> (-1 - shift);
- ia = ia << (32 - (-1 - shift));
- } else { /* normal */
- ir |= ia >> (24 - 11);
- ia = ia << (32 - (24 - 11));
- ir = ir + ((14 + shift) << 10);
- }
- /* IEEE-754 round to nearest of even */
- if ((ia > 0x80000000) || ((ia == 0x80000000) && (ir & 1))) {
- ir++;
- }
- }
- }
- return uint16_as_fp16 (ir);
- }
- PHDATA mat_product(PHDATA mat1,PHDATA mat2)
- {
- if(mat1->_cols!=mat2->_rows)
- {
- printf("this is not right\n");
- return NULL;
- }
- PHDATA mat3=new HData;
- mat3->data=(half *)malloc(sizeof(half)*(mat1->_rows)*(mat2->_cols));
- mat3->_rows=mat1->_rows;
- mat3->_cols=mat2->_cols;
- /*
- *INIT the matrix we want calculate
- * col primary
- */
- {
- half *d_a,*d_b,*d_c;
- cublasInit();
- cublasAlloc((mat1->_cols)*(mat1->_rows),sizeof(half),(void **)&d_a);
- cublasAlloc((mat2->_cols)*(mat2->_rows),sizeof(half),(void **)&d_b);
- cublasAlloc((mat3->_rows)*(mat3->_cols),sizeof(half),(void **)&d_c);
- cudaMemcpy(d_a,mat1->data,sizeof(half)*(mat1->_cols)*(mat1->_rows),cudaMemcpyHostToDevice);
- cudaMemcpy(d_b,mat2->data,sizeof(half)*(mat2->_rows)*(mat2->_cols),cudaMemcpyHostToDevice);
- cublasHandle_t handle;
- cublasCreate(&handle);
- half alpha=float2half_rn(float(1.0));
- half beta=float2half_rn(float(0.0));
- cudaEvent_t start,stop;
- <span style="white-space:pre"> </span>cudaEventCreate(&start);
- <span style="white-space:pre"> </span>cudaEventCreate(&stop);
- <span style="white-space:pre"> </span>cudaEventRecord(start,0);
- cublasHgemm(handle,CUBLAS_OP_N,CUBLAS_OP_N,mat1->_rows,mat2->_cols,
- mat2->_rows,&alpha,d_a,mat1->_rows,d_b,mat2->_rows,&beta,d_c,mat1->_rows);
- <span style="white-space:pre"> </span>cudaEventRecord(stop,0);
- <span style="white-space:pre"> </span>cudaEventSynchronize(stop);
- <span style="white-space:pre"> </span>float ela=0;
- <span style="white-space:pre"> </span>cudaEventElapsedTime(&ela,start,stop);
- <span style="white-space:pre"> </span>cout<<"GPU: "<<ela<<"ms"<<endl;
- cudaMemcpy(mat3->data,d_c,sizeof(half)*(mat3->_rows)*(mat3->_cols),cudaMemcpyDeviceToHost);
- cublasFree(d_a);
- cublasFree(d_b);
- cublasFree(d_c);
- cublasShutdown();
- }
- /* need to trans the mat3*/
- return mat3;
- }
- void ele_mat_show(PDATA mat)
- {
- for (int i=0;i<mat->_rows;i++){
- for (int j=0;j<mat->_cols;j++){
- cout<<mat->data[IDX2C(i,j,mat->_rows)]<<"\t";
- }
- cout<<endl;
- }
- }
- float myrand()
- {
- return rand()%10;
- }
- int main()
- {
- //clock_t start,end;
- #if 0
- for (int i=0;i<M*N;i++)
- {
- cout<<c[i]<<"\t";
- }
- cout<<endl;
- #endif
- PDATA mat1,mat2,mat3;
- PHDATA mat4,mat5,mat6;
- /* remember to initialize the point*/
- mat1=(PDATA)malloc(sizeof(Data));
- mat2=(PDATA)malloc(sizeof(Data));
- mat3=(PDATA)malloc(sizeof(Data));
- mat4=(PHDATA)malloc(sizeof(HData));
- mat5=(PHDATA)malloc(sizeof(HData));
- mat6=(PHDATA)malloc(sizeof(HData));
- mat1->_rows=5000;
- mat1->_cols=50000;
- mat4->_rows=5000;
- mat4->_cols=50000;
- mat1->data=(float *)malloc(sizeof(float)*mat1->_rows*mat1->_cols);
- mat4->data=(half *)malloc(sizeof(half)*mat1->_rows*mat1->_cols);
- for (int i=0;i<mat1->_rows;i++)
- for (int j=0;j<mat1->_cols;j++)
- mat1->data[IDX2C(i,j,mat1->_rows)]=i+j;
- for (int i=0;i<mat1->_rows;i++)
- for (int j=0;j<mat1->_cols;j++)
- mat4->data[IDX2C(i,j,mat1->_rows)]=float2half_rn(mat1->data[IDX2C(i,j,mat1->_rows)]);
- mat2->_rows=50000;
- mat2->_cols=2000;
- mat5->_rows=50000;
- mat5->_cols=2000;
- mat2->data=(float *)malloc(sizeof(float)*mat2->_rows*mat2->_cols);
- mat5->data=(half *)malloc(sizeof(half)*mat2->_rows*mat2->_cols);
- for (int i=0;i<mat2->_rows;i++)
- for (int j=0;j<mat2->_cols;j++)
- mat2->data[IDX2C(i,j,mat2->_rows)]=i+j;
- for (int i=0;i<mat2->_rows;i++)
- for (int j=0;j<mat2->_cols;j++)
- mat5->data[IDX2C(i,j,mat2->_rows)]=float2half_rn(mat2->data[IDX2C(i,j,mat2->_rows)]);
- mat6=mat_product(mat4,mat5);
- return 0;
- }
我擦咧, (╯‵□′)╯︵┻━┻還真尼瑪快了兩倍,nVidia你贏了。
那如此一來,就得開始幹活啦,讓faster rcnn支援TX1的半精度運算。
怎麼做
1.環境:cuda7.5,python,TX1等等 2.需要caffe支援半精運算 3.新增faster rcnn新增的層:roi_pooling_layer和smooth_L1_loss_layer 4.測試(做好後將會在我的部落格中公佈結果)目前情況
1.Faster R-CNN在TX1上執行。 2.讓mnist在TX1上跑半精運算。 3.正在重寫roi_pooling_layer和smooth_L1_loss_layer相關推薦
讓Faster R-CNN支援TX1的fp16(half float, float16)特性
為什麼要用float16? 一句話,float16的運算速度是float32運算速度的2倍。nVidia說的,資料不對不要怪我,(≖ ‿ ≖)✧ 在說一下缺點,也是一句話,精度損失了。(臥槽,廢話,(*´Д`*)) 會損失多少呢? IEEE754(wiki)這裡描述各種f
tensorflow object detection faster r-cnn 中keep_aspect_ratio_resizer是什麽意思
ng- 最小 圖片 sta fault overflow cti hub .com 如果小夥伴的英語能力強可以直接閱讀這裏:https://stackoverflow.com/questions/45137835/what-the-impact-of-differe
Faster R-CNN技巧
工作 並行 labels ast 個數 draw 默認 物體 ray 1.盡量控制圖片大小在1024以內,不然顯存會爆炸。 2.盡量使用多GPU並行工作,訓練下降速度快。 3.當需要被檢測的單張圖片裏物體太多時,記得修改Region_proposals的個數 4.測試的時候
Faster R-CNN:詳解目標檢測的實現過程
最大的 中心 width 小數據 等等 eat tar 優先 博文 本文詳細解釋了 Faster R-CNN 的網絡架構和工作流,一步步帶領讀者理解目標檢測的工作原理,作者本人也提供了 Luminoth 實現,供大家參考。 Luminoth 實現:h
純C++版500VIP源碼下載的Faster R-CNN(通過caffe自定義RPN層實現)
方便 預測 大致 ole test cto oop 可執行文件 names 這裏500VIP源碼下載 dsluntan.com 介紹的是通過添加自定義層(RPN層)代替python層,實現c++版的Faster R-CNN,因為去掉python了,所以部署時不會因為牽扯到p
論文閱讀筆記(六)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
采樣 分享 最終 產生 pre 運算 減少 att 我們 作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian SunSPPnet、Fast R-CNN等目標檢測算法已經大幅降低了目標檢測網絡的運行時間。可是盡管如此,仍然
【Faster RCNN】《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
NIPS-2015 NIPS,全稱神經資訊處理系統大會(Conference and Workshop on Neural Information Processing Systems),是一個關於機器學習和計算神經科學的國際會議。該會議固定在每年的12月舉行
R-CNN、Fast R-CNN、Faster R-CNN
在介紹Faster R-CNN之前,先來介紹一些前驗知識,為Faster R-CNN做鋪墊。 一、基於Region Proposal(候選區域)的深度學習目標檢測演算法 Region Proposal(候選區域),就是預先找出圖中目標可能出現的位置,通
Faster R-cnn中的RPN網路詳細解釋
作者RPN網路前面的g層借用的是ZF網路,網路相對較淺,不過並不影響後期介紹。 1、首先,輸入圖片大小是 224*224*3(這個3是三個通道,也就是RGB三種) 2、然後第一層的卷積核維度是 7*7*3*96 (所以大家要認識到卷積核都是4維的,在caffe的矩陣計算中都是這麼實現的); 3、
Faster R-CNN 英文論文翻譯筆記
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun reference link:ht
Faster R-CNN改進篇(二): RFCN ● RON
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/linolzhang/article/details/75137050 @改進1:RFCN 論文:R-FCN: Object Detecti
Faster R-CNN改進篇(一): ION ● HyperNet ● MS CNN
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/linolzhang/article/details/74159463 一. 源起於Faster 深度學習於目標檢測的里程碑成果,來自於這篇
Faster R-CNN論文及原始碼解讀
R-CNN是目標檢測領域中十分經典的方法,相比於傳統的手工特徵,R-CNN將卷積神經網路引入,用於提取深度特徵,後接一個分類器判決搜尋區域是否包含目標及其置信度,取得了較為準確的檢測結果。Fast R-CNN和Faster R-CNN是R-CNN的升級版本,在準確率和實時性方面都得到了較大提升。在F
Faster R-CNN 論文學習
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 演算法簡介 Abstract 1. Introduction 2. Relat
一文讀懂目標檢測 R-CNN Fast R-CNN Faster R-CNN YOLO SSD
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
執行Keras版本的Faster R-CNN
Keras版本的Faster R-CNN原始碼下載地址:https://github.com/yhenon/keras-frcnn下載以後,用PyCharm開啟(前提是已經安裝了Tensorflow-gpu和Keras),開啟以後可以看到專案的結構: 修改requirements.txt,設定Keras
Faster R-CNN 目標檢測演算法詳細總結分析(two-stage)(深度學習)(NIPS 2015)
論文名稱:《 Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 》 論文下載:https://papers.nips.cc/paper/5638-faster-r-cnn-t
Faster R-CNN 學習筆記
Faster RCNN 學習 Faster R-CNN這篇論文著重解決了這個系統中的三個問題: 1. 如何設計區域生成網路;RPN 2. 如何訓練區域生成網路; 3. 如何讓區域生成網路和Fast RCNN網路共享特徵提取網路。 圖1:Faster RCNN 結構 Fa
譯文:Faster R-CNN
【翻譯】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun 摘要:
Faster R-CNN:利用區域提案網路實現實時目標檢測 論文翻譯
Faster R-CNN論文地址:Faster R-CNN Faster R-CNN專案地址:https://github.com/ShaoqingRen/faster_rcnn 摘要 目前最先進的目標檢測網路需要先用區域提案演算法推測目標位置,像SPPnet1和Fast R-CNN2