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,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晶片。這個需要懂硬體的團隊,目前國內部分和院校有合作的團隊有在搞,不過也存在應用面窄,和國產加密機搶市場等問題
-
業界參考例子新聞,具體技術細節不知 中科院計算所加入金鍊盟
-
趣鏈科技官網提到FPGA加速
-
-
GPU加速計算。優點是成本低,技術繼承性好,而且有業界驗證過的例項
-
區塊鏈界用GPU來挖礦已經是常見行為,挖礦也是一種密碼學運算(主要是hash)
+《CUDA並行程式設計:GPU程式設計指南》第七章 用到了aes,專題介紹
-
所以,要解除安裝密碼學計算的壓力,比較好的技術線路是區塊鏈應用拆分成微服務架構,密碼計算的應用採用GPU方案,為整個應用提供加速計算。
cuda cudnn opencl的關係
-
cuda是英偉達一家的;cuda和opencl的關係是類似DirectX和oepncv的關係,但是後者目前生態還很少
-
cuda和cudnn的關係是cudnn是要以cuda為基礎的
《cuda並行程式設計》這本書是推薦的:
-
第一部分 GPU介紹 也就是大規模平行計算的硬體基礎
-
第二部分 cuda軟體架構的介紹
-
第三部分 cuda效能調優
-
第四部分 cuda專案經驗