1. 程式人生 > >CUDA加速區塊鏈密碼學運算

CUDA加速區塊鏈密碼學運算

文章目錄

區塊鏈的計算瓶頸

區塊鏈專案中,密碼學計算佔了整體運算量中特別大的比重,特別是對效能要求較高的聯盟鏈。

以筆者參與的XX公司XX專案中,cpu的1/3佔用是簽名驗證,1/3佔用是加密。為了滿足密碼學運算,應用伺服器統統從4核換成16核,增大了專案成本。

至於公鏈,這個問題肯定也是存在的,只不過以公鏈目前可憐的效能,這個問題還沒碰到罷了。


解決思路

最耗時的簽名,加密解密放到微服務架構中,買好的gpu,用cuda

動手驗證

(因為驅動等問題,ubuntu下很容易搞掛,安裝前先備份整機,每步完成後重啟下看看能否進入系統)

1. 安裝nvidia顯示卡驅動 不能用nouveau的預設驅動,要用NVIDIA的專用驅動


$ nvidia-smi  //Driver Version: 384.90

安裝好驅動後用如下命令驗證一下



[email protected]:~$ nvidia-smi

Thu Oct 11 15:24:26 2018       

+-----------------------------------------------------------------------------+

| NVIDIA-SMI 390.77                 Driver Version: 390.77                    |

|-------------------------------+----------------------+----------------------+

| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |

| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |

|===============================+======================+======================|

|   0  GeForce GTX 105...  Off  | 00000000:01:00.0  On |                  N/A |

| 40%   37C    P8    N/A / 100W |    298MiB /  4038MiB |      1%      Default |

+-------------------------------+----------------------+----------------------+

                                                                               

+-----------------------------------------------------------------------------+

| Processes:                                                       GPU Memory |

|  GPU       PID   Type   Process name                             Usage      |

|=============================================================================|

|    0      1063      G   /usr/lib/xorg/Xorg                           115MiB |

|    0      1312      G   /usr/bin/gnome-shell                         180MiB |

+-----------------------------------------------------------------------------+

2. 安裝cuda


$ sudo apt install nvidia-cuda-toolkit

$ nvcc -V


nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2015 NVIDIA Corporation

Built on Tue_Aug_11_14:27:32_CDT_2015

Cuda compilation tools, release 7.5, V7.5.17

cuda安裝

注意:如上安裝不成功時,可以參考如下,不安裝cuda,darknet加速的編譯會不成功,點選如上連線中的cuda主程式下載頁面,其中要選Linux平臺,ubuntu18.04




    `sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb`

    `sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub` 

     //注:看到變數不用慌,上一步命令敲完後會回顯這步完整命令 sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub

    `sudo apt-get update`

    `sudo apt-get install cuda`

安裝完成還有新增環境變數


vim ~/.bashrc

export CUDA_HOME=/usr/local/cuda

export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

source ~/.bashrc

最後驗證下安裝是否成功


nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2018 NVIDIA Corporation

Built on Sat_Aug_25_21:08:01_CDT_2018

Cuda compilation tools, release 10.0, V10.0.130

3. 安裝cuDNN(可選,用darknet框架時,不需要這步)

4. 安裝darknet,驗證應用和cuda可以聯合工作

首先單獨安裝darknet

注:可參考官網簡明教程


//下載 darknet

git clone https://github.com/pjreddie/darknet.git

cd darknet

make

//編譯後

wget https://pjreddie.com/media/files/yolov3.weights

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg 

如果出現predictions.jpg,裡面物體被識別出來,就是安裝成功了,

但是沒有啟用cuda的時候,無論是識別person圖片,還是識別dog圖片,大概都需要15秒以上。

darknet聯合cuda編譯,從而使用上cuda


vi Makefile

將第一行從GPU=0 修改為 GPU=1

make //重新make,看看有無報錯


./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg 

用了cuda,速度提升60倍;用在密碼學上也是一樣,都是大規模平行計算

Loading weights from yolov3.weights...Done!

data/dog.jpg: Predicted in 0.260586 seconds.

dog: 100%

truck: 92%

bicycle: 99%

剛開始編譯報錯,後來發現是少了步驟,如下:

  • 如果沒有如上的export PATH,會報錯找不到cuda程式

  • 另外有些報錯,看下是否是安裝完成cuda後沒有重啟,沒有切換到nvidia顯示卡工作的模式

  • cfg/yolov3.cfg 中修改下batch和subdivisions都從較大數值改為2,否則佔記憶體太多,會"CUDA Error: out of memory … Assertion `0’ failed"


進一步的方案選型討論

用cuda還是專用硬體? 幾個方案
  • 國產加密機。優點是有現成的,缺點是成本高、個人技術能力提升少

    • 國產密碼機選型,參考 資料加密機用於區塊鏈.md 。目前看貴的死貴,便宜的功能太單一,比如只能用於加密,無法用於驗證簽名。
  • 專用硬體:ASIC晶片或FPGA晶片。這個需要懂硬體的團隊,目前國內部分和院校有合作的團隊有在搞,不過也存在應用面窄,和國產加密機搶市場等問題

  • GPU加速計算。優點是成本低,技術繼承性好,而且有業界驗證過的例項

    +《CUDA並行程式設計:GPU程式設計指南》第七章 用到了aes,專題介紹

所以,要解除安裝密碼學計算的壓力,比較好的技術線路是區塊鏈應用拆分成微服務架構,密碼計算的應用採用GPU方案,為整個應用提供加速計算。


cuda cudnn opencl的關係
  • cuda是英偉達一家的;cuda和opencl的關係是類似DirectX和oepncv的關係,但是後者目前生態還很少

  • cuda和cudnn的關係是cudnn是要以cuda為基礎的

《cuda並行程式設計》這本書是推薦的:

  • 第一部分 GPU介紹 也就是大規模平行計算的硬體基礎

  • 第二部分 cuda軟體架構的介紹

  • 第三部分 cuda效能調優

  • 第四部分 cuda專案經驗