📜 [專欄新文章] 區塊鏈管線化的效能增進與瓶頸
✍️ Ping Chen
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
使用管線化(Pipeline)技術可以提升區塊鏈的處理效能,但也可能會產生相應的代價。
Photo by tian kuan on Unsplash
區塊鏈的擴容方案
說到區塊鏈的效能問題,目前討論度最高的應該是分片(sharding)技術,藉由將驗證者分成多組的方式,可以同時分別處理鏈上的交易需求,即使單分片效能不變,總交易量可以隨著分片/驗證者集的數量線性增加。
除了分片,另一個常用來提升程式效能的方案是將計算步驟拆解,以流水線的方式將複雜的運算攤平,降低系統的閒置時間,並大幅提升工作效率。為了達到管線化預期的目的,會需要先知道系統的瓶頸在哪。
區塊鏈的效能瓶頸
熟悉工作量證明設計哲學的人應該會知道,區塊鏈之所以需要挖礦,並不是為了驗證交易的正確性,而是要決定交易的先後順序,從而避免雙花和帳本分裂的發生。可以說,區塊鏈使用低效率的單線程設計,並付給礦工高額的成本,都只為了一件事,就是對交易的全局排序產生共識。
在這樣的基礎之上,區塊鏈在一段時間內可以處理的交易數量是有限的,這之中包含許多方面的限制,包括 CPU 效能、硬碟空間、網路速度等。其中,關於 TPS(每秒交易數) 提升和對硬體的要求大致上是線性增加的,但在設計共識演算法時,通訊複雜度常是平方甚至三次方的關係。
以現在的目標 TPS 來說,處理交易和生成一個合法的區塊並不困難,只是因為區塊鏈的特性,新區塊需要透過洪水法的方式擴散到全網路,每個節點在收到更新請求的時候都要先執行/驗證過區塊內的交易,等於整個廣播的延時會是「驗證區塊時間×經過的 hop 數量」這麼多。似乎網路越分散、節點越多,我們反而會需要降低計算量,以免讓共識不穩定。
管線化的共識機制
使用權益證明取代工作量證明算是行業發展的趨勢,除了環保或安全這些比較顯然的好處之外,權益證明對產生共識的穩定性也很有幫助。首先,權益證明在同一時間參與共識的節點數是已知的,比較容易控制數量級的邊界;其次,權益證明的出塊時間相較工作量證明固定很多,可以降低計算資源不足或閒置的機率。
相較於工作量證明是單一節點出塊,其餘節點驗證,權益證明的出塊本身就需要很多節點共同參與,瓶頸很像是從驗證轉移到通訊上。
以 PBFT 為例,每次產新區塊都需要經過 pre-prepare, prepare, commit 三個階段,你要對同意驗證的區塊簽名,還要對「你有收到某人的簽名」這件事簽名,再對「你有收到 A 說他有收到 B 的簽名」這件事簽名,過程中會有很多簽名飛來飛去,最後才能把一個區塊敲定。
為了降低每兩個區塊間都需要三輪簽名造成的延遲,後來的共識演算法包括 HotStuff 和 Casper FFG 採用了管線化的區塊驗證過程。也就是對區塊 T 的 pre-prepare 同時是對 T-1 的 prepare 和對 T-2 的 commit。再加上簽名聚合技術,出塊的開銷在複雜度等級和係數等級都降低許多。
然而,要保持管線化的區塊生產順利,需要驗證者集合固定不變,且網路通訊狀況良好。如果會經常更動驗證者集合或變換出塊的領導者,前後區塊間的相依性會是個大問題,也就是 T 的驗證者集合取決於 T-1 裡有沒有會導致刪除或新增驗證者的交易,T-1 的合法性又相依於 T-2,以此類推。
當激烈的分叉出現的時候,出塊跟共識的流水線式耦合就從優雅變成災難了。為了避免這種災難,更新的共識演算法會限制驗證者變更的時機,有些叫 epoch 有些叫 checkpoint,每隔一段時間會把前面的區塊徹底敲定,才統一讓驗證者加入或退出。到這些檢查點的時候,出塊的作業流程就會退化成原本的三階段驗證,但在大部分時候還是有加速的效果。
管線化的狀態更新
另一個可以用管線化加速的是區塊鏈的狀態更新。如前所述,現在公鏈的瓶頸在於提高 TPS 會讓區塊廣播變慢,進而導致共識不穩定,這點在區塊時間短的以太坊上尤其明顯。可是如果單看執行一個區塊內的交易所花的時間的話,實際上是遠遠低於區塊間隔的。
只有在收到新區塊的時候,節點才會執行狀態轉移函數,並根據執行結果是否合法來決定要不要把區塊資訊再廣播出去。不過其實只要給定了交易集合,新的狀態 s’ = STF(s, tx) 應該是確定性的。
於是我們有了一個大膽的想法:何不乾脆將交易執行結果移出共識外呢?反正只要大家有對這個區塊要打包哪些交易有共識,計算的結果完全可以當作業留給大家自己算吧。如果真的不放心,我們也可以晚點再一起對個答案,也就是把這個區塊執行後的新狀態根包在下個區塊頭裡面。
這就是對狀態更新的管線化,在區塊 T 中敲定交易順序但暫不執行,區塊 T+1 的時候才更新狀態(以及下一批交易)。這麼做的好處十分顯而易見,就是將原本最緊繃的狀態計算時間攤平了,從原本毫秒必爭的廣播期移出來,變成只要在下個塊出來之前算完就好,有好幾秒的時間可以慢慢來。新區塊在廣播的每個 hop 之間只要驗證交易格式合法(簽名正確,有足夠的錢付手續費)就可以放行了,甚至有些更激進的方案連驗簽名都省略了,如果真的有不合法交易混進去就在下個區塊處罰礦工/提案者便是。
把負擔最重的交易執行移出共識,光用想的就覺得效能要飛天,那代價呢?代價是區塊的使用程度會變得不穩定。因為我們省略了執行,所以對於一筆交易實際用掉多少 gas 是未知的。本來礦工會完整的執行所有交易,並盡可能的塞滿區塊空間,然而在沒有執行的情況下,只能以使用者設定的 gas limit 當作它的用量,能打包的交易會比實際的上限少。
緊接著,下一個問題是退費困難。如果我們仍然將沒用完的手續費退還給使用者,惡意的攻擊者可以透過發送 gas limit 超大,實際用量很小的交易,以接近零的成本「霸佔」區塊空間。所以像已故區塊鏈 DEXON 就直接取消 gas refund,杜絕濫用的可能。但顯然這在使用者體驗和區塊空間效率上都是次優的。
而最近推出的 smartBCH 嘗試擬了一套複雜的退款規則:交易執行後剩餘的 gas 如果小於 gas limit 的一半(代表不是故意的)就退款;如果剩餘量介於 50%-75% 可以退一半;超過 75% 推斷為惡意,不退款。乍看是個合理的方案,仔細一想會發現製造的問題似乎比解決的還多。無論如何,沒用掉的空間終究是浪費了,而根據殘氣比例決定是否退款也不會是個好政策,對於有條件判斷的程式,可能要實際執行才知道走哪條路,gas limit 一定是以高的情況去設定,萬一進到 gas 用量少的分支,反而會噴更多錢,怎麼想都不太合理。
安全考量,退費大概是沒希望了。不過呢,最近以太坊剛上線的 EIP1559 似乎給了一點方向,如果區塊的使用程度能以某種回授控制的方式調節,即使偶爾挖出比較空的區塊似乎也無傷大雅,也許能研究看怎麼把兩者融合吧。
管線化方案的發展性
考慮到以太坊已經堅定地選擇了分片的路線,比較激進的單鏈高 TPS 管線化改造方案應該不太有機會出線,不過管線化畢竟是種歷史悠久的軟體最佳化技巧,還是很有機會被使用在其他地方的,也許是 VDF 之於信標鏈,也許是 rollup 的狀態轉換證明,可以坐等開發者們表演。
倒是那些比較中心化的 EVM fork/sidechain,尤其是專門只 for DeFi 的鏈,管線化加速可以在不破壞交易原子性的前提下擴容,確實是有一些比分片優秀的地方可以說嘴,值得研究研究,但這就要看那些機房鏈們有沒有上進心,願不願意在分叉之餘也投資發展自己的新技術了。
給我錢
ping.eth
區塊鏈管線化的效能增進與瓶頸 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
需求函數怎麼算 在 Facebook 的最佳貼文
是的,指考。
不意外的,又有一波擔憂國家數理發展,以及另一波擔心語言發展,還有其他波的擔心XX發展,加上奧運舉辦,體育發展的憂慮也刷一波
依照各方大德的憂慮,想要達成全部目標,我們現在的國民教育應該會從小一開始改成全住宿制,每天課程排到晚上9,一路上到大學還得要義務化。
簡稱,不可能的任務。
看不懂?嗯,因為這算月經文..........年經文才對。
我的意思很簡單啦,每次大考考完,除了那些每年都要靠邀幾句的校長,總會多出一批新人,憂心教育內容每況愈下,學子未來值得擔憂,國家競爭力缺乏等等。從教改啟動前就開始罵,罵到今天還是沒停。
坦白說,我對罵沒意見,但總要有具體點的建議出來。具體的建議可不是什麼提高數學教學強度,增加閱讀測驗等等,這叫做毫不具體。
具體的事項,要很明確的講出:
「必須從國一開始上三角函數,國二要會球座標」
「當前作文與閱讀課不敷需求,每周要加到5堂課」
用產業界的說法,就是你得提出目標-需求-資源,不然誰曉得你想幹嘛。那種高喊今年業績要提高的老闆很多,拍桌說業務要更積極搶單的經理更多,但具體計畫寫下來,恐怕是沒幾個能動的。
說不出個所以然,只是單純地看到數理教學內容變少,然後看則新聞說半導體落後,就膝蓋反射認定是教改失敗,學生程度太差,這連結相關度說有多高嘛...........
唉
我是希望,每個老師或是教授,真想對教育內容有建設性意見,不要只是碎念,請從現場時數去反推課程合理性,自己做不到也沒關係,試著想一次就曉得多麻煩,沒教過學校會很難這種「分配力學」。
做不到的人可以反過來,從希望達成的目標去反推該做什麼,這個業界也常做。那就是,你覺得我們哪些產業,或是未來需要哪些能力,必需在教育上立刻改變?
例如「半導體業是國家未來重點項目,所以要增加基層作業員素質,故全國技職體系都該開設鍍膜工藝、真空技術、現場操作技巧,所以今年就該鼓勵現場工程師轉職,進修教育學分後,分發到高職開始進行高強度的基層訓練。」(從爆肝工程師變成爆肝技工的概念)
或如「綠能產業是未來重點,所以國中理化課程應該大幅增加相關內容,電磁學要放到國二,基礎理化放到國一,生物課程另開,增加時數從文科挪走。並在國三大幅增加實驗課程,除高中以外,高職開設新的電力與製造工程師課程。」(人社科去死的概念)
不然喔,永遠只是在那邊憂國憂民,因為憂的範圍超級大,所以基本上台灣所有的問題都可以被囊括進去,可以給抱怨者宇宙無敵大的憂國情懷,卻沒有半個人可以提出具體解決辦法。
但不去討論實際運作的狀態,多數人都只是看著小孩課本,抱怨怎麼內容變那麼簡單,然後看了新聞說XX國很強,就反射認為都是課本教壞,這種想法沒有意義啦。
沒篇幅了,所以我這邊就提一個問題,看有沒人會想討論,之後再來講:
我們教育究竟是要傾向全民篩選制,還是積極放長線釣大魚的概念。這兩者雖然可以並行,但若全力推動一種,另一種就會被當成不公平喔。
需求函數怎麼算 在 台灣物聯網實驗室 IOT Labs Facebook 的最讚貼文
訓練AI模型,要多少數據?拆解企業人工智慧專案為何難落地
2020.12.09 by 若水AI Blog
企業導入AI似乎已成為一種趨勢,但是訓練AI模型,需要多少數據?其背後的商業命題與成本又該如何解決?帶你來一起窺探AI專案背後的秘密!
企業的AI專案在釐清問題本質、找到命題之後,首先會面臨到一個問題:收集數據(Data Collection)和建立AI模型(Model Establishing),該以什麼作為評估基準?
訓練一個AI數據模型,需要多少數據?
訓練AI數據模型時,其實有三個要素,彼此互相影響。分別是: 商業問題的複雜度 、 AI模型複雜度 (Model Complexity),以及 數據複雜度 (Data Complexity)。
因此,如果想知道需要多少訓練數據(Training Data),建議先釐清:這個AI專案到底要處理什麼問題,以及這個問題有多複雜?確定之後,再來判斷應該選用哪種程度的模型來做訓練。根據不同的商業命題複雜度,用不同複雜度的模型和精準數據彼此搭配,找出最佳平衡,才能讓AI專案順利落地。
但光憑想像,很難評估實際的AI數據量和成效,所以開始AI的第一步,需要先透過POC概念驗證(Proof of Concept)實驗來找答案。
簡單來說,就是針對不同複雜程度的商業問題,嘗試選用不同複雜度的模型搭配測試,直到模型跑出來的曲線,符合理想目標。
一般狀態下,假設商業問題本身的複雜度很高,我們會預期要選擇複雜度較高的模型。但是如果數據量不足,那麼選擇複雜度較高的AI模型,反而會比用簡單的AI模型效果還差。(上圖左上、右上,分別代表複雜度10和複雜度50的問題,可以明顯看出複雜的模型曲線比較接近學習數據集(Dataset),但是在測試數據集上的誤差 Eout,反而比簡單模型還差了許多。)
上圖的左下和右下,是以不同複雜度的模型去做POC,跑出來的結果曲線圖。藍色線代表的是學習數據(Training Data)成效,紅色線代表的是測試數據(Testing Data)成效。最理想的POC目標,應該是兩條曲線很貼近彼此,而且位置越低越好。
我們會發現,左下這張圖的兩條曲線雖然彼此貼近,但是就算增加數據,也無法降低誤差。這表示模型偏誤(Bias)高,效果不佳,應該要增加模型複雜度 (Model Complexity)。
增加模型複雜度之後,就會像右下這張圖,藍色曲線(學習數據)雖然數值很低,但在學習數據不足的情況下(灰色區塊),紅色曲線(測試數據)卻「飄」得太高。這表示模型變異誤差(Variance)高,應該要增加學習數據。最後在慢慢增加模型複雜度以及學習數據之後,我們就可以達到理想的結果(兩條曲線很貼近彼此,而且位置越低越好)。
數據哪裡來?發展AI人工智慧之前,先建立數據流
先前我在文章裡提到,很多企業會急著開發AI模型,但AI專案落地經驗的三大關鍵之一,其實是先確認:是否已經準備好數據了?如果沒有這樣的能力,談AI落地其實有點好高騖遠。
AI數據收集(Data Collection)最大的挑戰,在於針對不同型態的命題,會產生不同的AI數據需求,因此需要建立的「數據流」(Data Pipeline),AI數據處理 (Data Processing)和數據標註(Data Annotation)的模式及流程也會有所不同。
發展AI之前,如果能建立起從數據收集(Data Collection)、數據處理(Data Processing)到AI模型學習的數據流(Data Pipeline),並確保可以順暢運行,實際訓練AI模型時才會省力很多。
數據不夠或太多怎麼辦?
Google開設的機器學習(Machine Learning)課程中,第一項原則就開宗明義地指出:「Don’t be afraid to launch a product without machine learning」。
如果你的產品或業務不一定需要用到機器學習(Machine Learning),那就別用,除非你有AI數據。有數據,再來談機器學習(Machine Learning)。但在業界的實際狀況,大家不是沒有數據,而是只有一些些,這時候該怎麼辦?我會建議,先從小地方開始做起,也就是從POC專案著手。
POC專案要有具體成效,除了要注意設計專案、實驗模型的指標(Metrics),企業最重要的是要先定義清楚:AI專案要達到什麼樣的指標,才算是成功?這樣最後做出來的成果,才會真正符合商業目標。
如果今天不是沒有AI數據,而是數據很多,又該從何下手呢?
我建議,嘗試減少訓練AI人工智慧時的「 數據大小 」和「 數據筆數 」。
過去曾經處理過一個AI專案,數據多達2億筆。第一次實驗,把數據全部餵進AI模型,取得結果。第二次,只拿其中有代表性的500萬筆出來訓練人工智慧。
猜猜結果如何?兩次實驗的表現,只差異不到1%。
所以,如果企業對於AI數據的品質和數量有一定程度的自信根據,其實不用把數據全部餵進AI模型訓練(Model Training),只用有代表性的AI數據來訓練就可以了。市面上很多常見的AI工具(Cluster),可以做到這點,幫助省時省力。
AI模型訓練,記得校準商業目標
企業發展AI人工智慧的最終目的,還是希望能 達到商業目標,創造價值 。
所以,訓練AI模型時,團隊如果不知道如何判斷哪個指標,對AI模型學習來說比較重要,建議回歸初心,重新釐清「 這個專案想達到的商業目標是什麼 」。
比方,趨勢科技(Trend Micro)要開發一個能夠判斷電腦病毒的AI,但是勒索病毒(denial-of-access attack)和廣告病毒對客戶的傷害程度大不相同。這時候,工程師就會針對這個命題,餵給AI模型不同病毒種類的數據,讓它學會判斷不同病毒的重要性,分辨出哪些病毒比較嚴重不能有判斷錯誤,而哪些病毒比較無害,不一定要做到一百分。
最常見的訓練方法,是用成本函數(Cost Function)的方式,訓練完再回去調整AI模型的評分(Rating),用加扣分的方式,告訴機器它的學習表現是好是壞,做對就加分,做錯就扣分。
上述評分原則的制定,和企業的商業價值考量息息相關,所以一般在組織分工,會由PM專案團隊負責判斷哪些項目重要,請資料科學家設計在上述Cost Function裡面。
很多人以為,AI人工智慧開發要做到很完美才行,但其實根據我們的經驗,只要AI開發成本符合預算、AI模型表現可接受(大約做到60–70分),而且結果有助於降低成本,就可以算是達到商業目標。反過來,即使AI模型表現非常好(高達90分),但成本卻遠超出預算,就不建議執行。
另外,因為POC階段會做很多的實驗,需要拿兩個穩定且可以互相比較的基準做A/B Test,所以做好基礎建設非常重要。
如果一個團隊裡面有三位工程師,但三個人做出來的結果都無法互相比較,那麼這個實驗就會變得霧裡看花,導致AI專案難以落地。
AI數據小學堂:模型指標(metrics)
在做模型實驗時,通常會用混淆矩陣(Confusion Matrix)的四種指標:TP(True Positive)、TN(True Negative)、FP(False Positive)、FN(False Negative),以及Count、Unique和Accuracy等等函數,來判斷這個模型的表現好不好。
P或TN值,代表模型辨識的答案正確,和預期結果一致。例如:模型正確判斷出「這是一隻貓」、「這不是一隻貓」。而FP或FN值,則代表模型的判斷錯誤,例如「明明是貓,模型卻說不是貓」、「明明不是貓,模型卻說它是貓」。
附圖:AI模型 若水國際
AI模型的POC概念驗證實驗怎麼做?
資料來源:https://www.bnext.com.tw/article/60440/ai-strategy-04?fbclid=IwAR1SOhjjGxypdGgOGfaBIl_a1IsZFJAQZ8J2aeDd98spbUfOdg7hiPQP7UA