Using CNN to identify SQL and XSS 2
前言
之前寫過這個
使用CNN做SQL和XSS的識別
在前一個post裡,模型的推理速度大約是100us。
在這一篇post裡,我將對這個模型做一些改進,讓這個模型的預測速度更快一點。
實際的步驟
首先,我是利用一個類似與word2vec的思路,將資料轉化為模型輸入的資料的。
總體的演算法是一個迴圈查詢匹配的動作。
這個過程基於資料量的大小,有很多可以作為優化選項的演算法。
這裡,隨手利用一個~ 不做主體來說
然後,如果仔細觀察下CPU利用率的話,
可以發現,在迴圈跑session的過程中,CPU並沒有拉滿。 可見在session執行中,有一些動作會使CPU空轉,或者本身預測的過程,CPU就不容易拉起來。
這一點,可以啟動多個session,並行處理資料
首先,定義總迴圈量,和單執行緒迴圈量
#define TRUE_LOOP_TIME 100000 #define LOOP_TIMES (TRUE_LOOP_TIME / 8)
因為我是使用筆記本的i7 4700mq在跑,所以這裡定義8條執行緒
然後這裡是執行緒共有的資訊
需要的判定字串,以及作為最後統計使用的最大時間
const char* input_line; long long total_time;
然後定義執行緒應該做的事情
- 讀取model,載入
- 迴圈開始
- 填充tensor
- 跑session
- 迴圈結束
-
記錄時間
void TF_Thraed(void) { int i; struct timeval start, end; model_t* model = TF_LoadModel("frozen.pb"); assert(model != NULL); gettimeofday( &start, NULL ); for(i = 0; i < LOOP_TIMES; i ++) { if (!TF_FillTensor(model, input_line)) { puts("TF_FillTensor failed"); return; } TF_RunModel(model); } gettimeofday( &end, NULL ); total_time += ((end.tv_sec - start.tv_sec) * 1000000) + end.tv_usec - start.tv_usec; TF_FreeModel(model); pthread_detach(pthread_self()); }
對應,主執行緒這裡需要做一些修改
建立8條執行緒,並等待執行結束
計算出平均時間,打印出來
這裡是假設全執行緒會佔用全部的效能。 執行緒擴充的時間需要平均被每條執行緒吃掉。 實際上,執行緒完成的速度會稍有區別,得到的平均時間會稍大。
int main(int argc, char const *argv[]) { pthread_t tf_thread[8]; double out_time; if (argc < 2 || !argv[1] ||!InitVocab()) { puts("No input"); return 1; } input_line = argv[1]; total_time = 0; pthread_create(&tf_thread[0], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[1], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[2], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[3], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[4], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[5], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[6], NULL, (void *)TF_Thraed, NULL); pthread_create(&tf_thread[7], NULL, (void *)TF_Thraed, NULL); pthread_join(tf_thread[7], NULL); sleep(2); out_time = (total_time / 8) / TRUE_LOOP_TIME; printf("max time = %f us\n", out_time); return 0; }
這裡還可以把執行緒對應CPU繫結,或者使用更好的執行緒同步的方法。
最後這裡的平均計算時間為17微妙,比上一篇post,提高了6倍左右
結語
擼貓擼貓
- ofollow,noindex" target="_blank">← Previous Post