歐洲三航太巨擎 Airbus、Siemens、勞斯萊斯,聯手開發混動飛機

  在歐盟削減航空產業污染的壓力下,歐洲不少航太公司競相轉研製電動引擎,比如空中巴士公司(Airbus)和西門子公司(Siemens)已因此具有多年合作關係。最近,勞斯萊斯公司將加入成為第三方合作夥伴,並各自投資數千萬英鎊開發「E-Fan X」混合動力電動飛機,預計於 2025 年投入商用。   21 世紀從地面到天空都掀起了運輸業的電動革命,美國航太製造商巨擎波音(Boeing)前陣子剛收購了專門開發純電動飛機的 Aurora 公司,後者曾受邀協助 Uber 的飛行計程車計畫。   波音也投入資金支持一家新創公司 Zunum Aero,預計 5 年後推出一台小型油電混合動力飛機;歐洲易捷航空(EasyJet)則在今年 9 月宣布,將與美國創業公司 Wright Electric 合作開發一架全電動客機,但這兩個新創公司雖然雄心勃勃,卻絕對沒有空中巴士、勞斯萊斯和西門子這些老牌公司的經驗和技術。   身為歐洲最大軍火供應製造商空中巴士集團(Airbus Group)的旗下企業,歐洲客機製造商空中巴士(Airbus)自然不落人後,為了符合歐盟委員會(European Commission)訂下的 2050 年航空運輸業願景:飛機每公里二氧化碳排放量減少 60%、氮氧化物污染減少 90%、噪音減少 75%,它們曾玩過純電動飛機,近年則多與德國跨國工業集團西門子公司(Siemens)合作打造混動電動飛機。   最近,飛機發動機在全球市佔率僅次於通用電氣公司(GE)的勞斯萊斯(Rolls-Royce)將成為第三方合作夥伴,共同開發「E-Fan X」混合動力電動飛機,機體基於英國航太 146 型客機(BAe 146)。首要任務是將飛機的 4 台燃氣渦輪發動機改裝成 2 台電動機,他們將面臨熱效應、電控推力管理、電磁兼容性、海拔對電力系統的影響等各種挑戰。   3 家公司各自投資數千萬英鎊在不同領域,空中巴士負責整體整合,包括混合動力電動推進系統、電池的控制架構,以及飛行控制系統等;勞斯萊斯負責研製渦輪發動機、發電機和電力電子設備;西門子則負責提供逆變器、DC/DC 轉換器和配電系統,預計 2020 年進行全面試驗,2025 年投入商用。   電池與設備重量是飛機最需克服的障礙,如果發動機、發電機和電力電子系統可以成功整合減輕重量,未來大幅減少噪音的電動飛機將能安排更多夜間航班。   (合作媒體:。首圖來源:)    

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

聚甘新

中油布局綠能轉型, 3 年內將擴建千個充電站

  中油董事長戴謙在 5 日表示,中油必須轉型朝向綠能目標發展,所以規劃自明年起將編列 20 億元預算,來增設千座電動車充電站。   中油新任董事長戴謙其農牧專業曾被外界質疑是否為董座的合適人選,不過其認為作為南科管理局局長展現的績效可被檢驗。如今上任滿一個月,已決定要宣布中油未來的轉型計畫,將配合政府政策,限縮燃煤,推廣電動機車。目前 Gogoro 全台已有 475 座機車充電站,其中有 109 座是與中油合作。   據《經濟日報》報導,戴謙強調,國營企業當然要支持國家政策,況且如果將來電動機車數量增多了,那中油要加油站做什麼。所以他認為,中油要面對轉型問題,未來成為「中油綠能站」,不只提供化石燃料,也要經營綠能市場,符合社會趨勢。目前中油擬定的做法是要先響應經濟部工業局推廣電池交換站(充電站)計畫,從明年起三年內,要在全台加油站點同時布建一千座充(換)電站,給電動機車充電。   中油副總畢淑蒨也出面說明細節表示,此計畫將以 20 億元預算逐年進行建設,第一年 160 座,第二年 390 座,第三年 450 座等進度來完成,而充電站與交換電池站建設比例大約為 1:9。針對現階段實施地點,畢淑蒨表示,明年將啟動示範場域評估可行性,目前大都會區以及空汙較為嚴重地區會是優先選項,特別的是還包含離島澎湖,這是因為行政院希望能將其打造位智慧及綠能的觀光島。   戴謙表示,雖然如此,但民眾不用擔心未來不會真的沒油可加,中油加油站會先採「加油、加電」雙軌併行,等到真的全台灣全面改用電動汽機車後,再轉型成純加電站。他還強調,中油轉型其電力供應不能光靠台電,未來將藉由社區民眾的綠能設備把電力輸送至中油加油站點裝設的儲能裝置,讓中油轉型成為社區的充換電基載中心,扮演公民電廠、社區貯能的節點角色。   (合作媒體:。首圖來源:中油)    

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司“嚨底家”!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

聚甘新

看好電動車需求,嘉能可加大投入銅鈷鎳的生產

  路透社12月5日報導,全球五大礦商之一的嘉能可(Glencore plc)加大投入電動車電池所需金屬的生產,因看好電動車市場的成長。路透社委託S&P Global Market Intelligence所做的研究顯示,嘉能可過去五年的銅與鈷產量都已經倍增,鎳產量更是四倍增長。其中,該公司銅產量從2011年的70萬噸增加至2016年的140萬噸,鈷產量從2011年的12,880公噸增加至2016年的28,300公噸,鎳產量從2011年的28,500公噸增加至2016年的115,100公噸。   報告顯示,銅鈷鎳等電動車相關金屬佔嘉能可核心獲利的五成比重,相比競爭對手包括力拓(Rio Tinto)、必和必拓(BHP Billiton)以及英美資源(Anglo American)等高出一倍。另一方面,嘉能可的股價自2015年以來已經上漲400%,2017年至今的漲幅也超過20%,表現也同樣優於其他三家競爭對手。 2017年1~9月,嘉能可銅產量較去年同期的106萬噸減少11%至94.65萬噸,主要由於尚比亞銅礦遭遇供電問題的影響。嘉能可也將今年全年的銅產量目標下調2%至131萬噸,較該公司去年的銅產量將減少8%。今年第三季,該公司的銅產量年減15%至30.36萬噸。   2017年1~9月,嘉能可的鋅產量年增4.8%至82.74萬噸,但是第三季的產量年減9%至25.66萬噸,較前季也減少12%。該公司也將全年的鋅產量目標下調2%至113萬噸。1~9月,該公司鎳產量年減2%至80,700公噸,全年產量則預估較去年持平為115,000公噸。   必和必拓商務長巴爾惠森(Arnoud Balhuizen)稱銅是「未來的金屬」,因2017年電動車迎來革命性的一年,市場大大低估了銅的需求潛力。國際銅業協會(International Copper Association)報告表示,電動汽車的產業增長,可望令未來十年該產業的銅需求量大幅增長,預估將從2017年的18.5萬噸增長至2027年的174萬噸,主要因為電動汽車較傳統汽車使用更多銅的影響。   加拿大蒙特利爾銀行資本市場(BMO Capital Markets)12月4日報告表示,受惠電動車電池需求的增長,鈷的價格在未來兩年預期將會大幅攀升。報告預估,鈷的價格將從當前的每磅30美元,上漲至2019年的每磅40.50美元(每噸89,290美元),並且不排除有倍增的可能。鈷價2017年至今已經上漲一倍,年初的價格約為每磅14.75美元。電動車電池的正極材料包括鋰、鈷與鎳,負極材料包括石墨與銅箔。   (本文內容由授權使用。首圖來源:public domain CC0)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

受惠於電動車發展,2020年電池產能可達268GW

  目前各個國家逐漸以禁售汽柴油車為目標,此舉不僅讓眾多廠商著手研發電動車,電池市場也隨之受惠,能源顧問公司Wood Mackenzie近日報告指出,到了2020年,電動車電池的產能可達到268GW,而2028年之後,電動車產量越來越高,電池的需求量將逐漸超越產量。   該報告預估,2035年世界上會有超過1.25億輛電動車,電池的需求量將增長三倍,達135 TWh,等同於美國德州的耗電量。   在去年全球8,600萬輛的新車中,電動車比例不到1%,而隨著國家政策轉變,市場趨勢逐漸轉移。以各國政策為例,印度預計2030年全面將汽車汰換成電動車,英國與法國則是預設2040年禁止販售傳統汽車,中國、歐洲與美國也皆強力推動電動車發展。   面對不斷增漲的電動車市場,電池製造廠商也摩拳擦掌,研發各種適用於電動車的電池,包括鋰離子電池、固態電池與燃料電池,不斷推出高續航力、高性能的電池。隨著電動車與電池的技術日益提高與成本逐年下降,產業市場未來備受看好。  
石油市場受影響   根據石油輸出國組織(OPEC)的預估,2020年石油市場中,全球用於運輸的油佔60%以上,其中柴油與航空煤油的佔比最大,達到37.3%,其次則是汽油,使用佔比為26.6%。如汽車或運輸產業的燃油逐漸被電池取代,將對原油業產生巨大的衝擊。   報告指出,在未來20年內,電動車將占汽車市場的20%,全球石油需求量將下滑7%,預估每日減少500萬桶石油。   再加上各國為了達成「巴黎協定」,也逐漸減少對石油與天然氣的使用量,日前世界銀行更宣布,為了與各國一同響應排碳目標,2019年之後將不再資助石油與天然氣的探勘與開採。   (首圖來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

聚甘新

BMW攜手Solid Power押寶全固態電池

  德國豪華車廠BMW與美國全固態電池領航企業Solid Power周一(12/18)宣布結盟,將合作開發下一世代電動車電池技術。   Solid Power在聲明稿上表示,BMW將在先進技術方面給予協助指導,務求全固態電池效能跨越高性能電動車的要求門檻。   全固態電池具高能量密度,且安全性高,有望取代傳統的液態鋰電池,成為新世代電動車的動力來源。值得一提的是,全固態電池的續航力也是高人一等。   研發低成本、高效能電池,是目前各大電動車廠的當務之急。Solid Power說其可回充式固態電池可免除加諸在鋰電池的安全設施,達成降低成本的目的,BMW顯然也看到潛力可期。   (本文內容由授權使用。首圖為電動車用鋰電池示意圖,來源:Kokam)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

聚甘新

拚空污防制,政院:目標2040年汽車全面電動化

  為整合部會推動空氣品質改善工作,行政院長賴清德12月21日在行政院會聽取環保署「空氣污染防制行動方案」報告,並於會後親自召開記者會。賴清德表示,國人對空氣品質的要求日益提升,政府展現決心,針對不同汙染源也提出「空氣污染防制行動方案:紅害減半大作戰」,除加強執行已律定的政策外,也提出新的管制與防制措施。相關指標性政策目標,包括2019年空污紅害日減半、2035年機車全面電動化、2040年汽車全面電動化等目標。   賴揆指出,今年4月林全前院長核定「空氣污染防制策略」,經相關部會與地方縣市政府努力,空污減量已獲初步成果。近期民眾、專家學者及社會團體輿論,要求政府進一步對空氣汙染問題提出更有效的方法,因此上週行政院會通過「空氣汙染防製法」修正草案,並在與立法委員溝通,聽取地方政府意見後,於院會提出「空氣污染防制行動方案」。會請各部會與環保署共同推動、逐項落實,未來政院也會加強與地方政府合作,希望化危機為轉機。   賴揆表示,地方政府實際執行空氣汙染防制的相關工作,尤其桃園、台中、雲林及高雄等設有火力發電廠的縣市,直接承受來自民眾的壓力;而台中市整合雲林縣、嘉義縣、嘉義市、苗栗縣、彰化縣及南投縣6縣市的建議,包括加速綠能發電;訂定全國鍋爐加嚴排放標準並全面補助;增加空污基金地方分配比例;捷運延伸中台灣以及公車營運補助全面加碼等4項要求,與政院的目標不謀而合。   環保署則明確表示,「空氣污染防制行動方案」訂定數項指標性政策目標,包括2019年空污紅害日減半、2030年公務車輛全面電動化、2035年機車全面電動化、2040年汽車全面電動化等目標;針對細懸浮微粒排放量較大者,提出具體管制與防制措施,包括要求國營事業達超低排放的世界最嚴標準、全面禁止烏賊車上路、加強餐飲業油煙、道路、營建工程及河川揚塵的管理等。   環保署並指出,除修法加嚴標準或加重罰則、擴大處分對象等行政手段外,也將提供優惠貸款以鼓勵業者汰換高污染的老舊大客貨車,目標自2018年起,將8萬輛一、二期老舊柴油大貨車汰換為符合最新的環保排放標準,1萬輛公車全面更換為電動車。   賴揆也進一步強調,空污問題並非是環保署或地方政府可以獨立面對,是需要跨部會共同合作。同時也希望地方政府與中央攜手執行,研議訂定紅害減半目標,並請上述7縣市針對固定與移動汙染源等屬於地方政府負責事項,擬訂具體策略。   (本文內容由授權使用。首圖來源:public domain CC0)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

一起玩轉微服務(4)——如何實施微服務

一、如何實施微服務

微服務是一種架構的理念,提出了微服務的設計原則,從理論為具體的技術落地提供了指導思想。
實施微服務需要具備以下條件:

  • 計算和存儲資源能否快速的分配
  • 是否具備快速部署的能力,因為微服務每個服務都比較微小,所以不管是測試環境還是生產環境都需要快速部署的能力
  • 基本的監控,包括CPU、內存、網絡等
  • 標準化的RPC

Spring Boot 是一套快速配置腳手架,可以基於 Spring Boot 快速開發單個微服務。
Spring Cloud 是一個基於 Spring Boot 實現的服務治理工具包;Spring Boot 專註於快速、方便集成的單個微服務個體;Spring Cloud 關注全局的服務治理框架。
Spring Boot / Cloud 是微服務實踐的最佳落地方案。
當然,微服務的設計還對運維提出了更高的要求,如何進行自動構建,如何進行自動發布,對於應用程序的質量管理以及遇到峰值時如何通過橫向擴展、彈性伸縮對於整個技術團隊都提出了更高的要求。

二、最流行6種微服務RPC技術

 

 

 

 

開源 RPC 框架有哪些呢?

 

一類是跟某種特定語言平台綁定的,另一類是與語言無關即跨語言平台的。
跟語言平台綁定的開源 RPC 框架主要有下面幾種。

  • Dubbo:國內最早開源的 RPC 框架,由阿里巴巴公司開發並於 2011 年末對外開源,僅支持 Java 語言。
  • Motan:微博內部使用的 RPC 框架,於 2016 年對外開源,僅支持 Java 語言。
  • Tars:騰訊內部使用的 RPC 框架,於 2017 年對外開源,僅支持 C++ 語言。
  • Spring Cloud:國外 Pivotal 公司 2014 年對外開源的 RPC 框架,僅支持 Java 語言

而跨語言平台的開源 RPC 框架主要有以下幾種。

  • gRPC:Google 於 2015 年對外開源的跨語言 RPC 框架,支持多種語言。
  • Thrift:最初是由 Facebook 開發的內部系統跨語言的 RPC 框架,2007 年貢獻給了 Apache 基金,成為 Apache 開源項目之一,支持多種語言。

三、rest

1. 什麼是REST

REST是一種架構風格,指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。REST規範把所有內容都視為資源,網絡上一切皆資源。

REST並沒有創造新的技術,組件或服務,只是使用Web的現有特徵和能力。 可以完全通過HTTP協議實現,使用 HTTP 協議處理數據通信。REST架構對資源的操作包括獲取、創建、修改和刪除資源的操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法。

REST與RPC比較

比較項        規範 REST RPC
通信協議 HTTP 一般使用TCP
性能
靈活度

高與低是對實現兩種規範框架的相對比較,但也不是絕對的,需要根據實際情況而定。

都是網絡交互的協議規範。通常用於多個微服務之間的通信協議。

2. REST與RPC應用場景

REST和RPC都常用於微服務架構中。

  • HTTP相對更規範,更標準,更通用,無論哪種語言都支持http協議。如果你是對外開放API,例如開放平台,外部的編程語言多種多樣,你無法拒絕對每種語言的支持,現在開源中間件,基本最先支持的幾個協議都包含RESTful。

RPC在微服務中的作用,RPC 框架作為架構微服務化的基礎組件,它能大大降低架構微服務化的成本,提高調用方與服務提供方的研發效率,屏蔽跨進程調用函數(服務)的各類複雜細節。讓調用方感覺就像調用本地函數一樣調用遠端函數、讓服務提供方感覺就像實現一個本地函數一樣來實現服務。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司“嚨底家”!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

聚甘新

Spark如何與深度學習框架協作,處理非結構化數據

隨着大數據和AI業務的不斷融合,大數據分析和處理過程中,通過深度學習技術對非結構化數據(如圖片、音頻、文本)進行大數據處理的業務場景越來越多。本文會介紹Spark如何與深度學習框架進行協同工作,在大數據的處理過程利用深度學習框架對非結構化數據進行處理。

Spark介紹

Spark是大規模數據處理的事實標準,包括機器學習的操作,希望把大數據處理和機器學習管道整合。

Spark使用函數式編程範式擴展了MapReduce模型以支持更多計算類型,可以涵蓋廣泛的工作流。Spark使用內存緩存來提升性能,因此進行交互式分析也足夠快速(如同使用Python解釋器,與集群進行交互一樣)。緩存同時提升了迭代算法的性能,這使得Spark非常適合機器學習。

由於Spark庫提供了Python、Scale、Java編寫的API,以及內建的機器學習、流數據、圖算法、類SQL查詢等模塊;Spark迅速成為當今最重要的分佈式計算框架之一。與YARN結合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了對於K8s的支持,為Spark與AI能力的融合提供了更好的支持。

 

深度學習框架介紹

TensorFlow

TensorFlow最初是由Google機器智能研究部門的Google Brain團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成為如今用戶最多的深度學習框架。

TensorFlow是一個非常基礎的系統,因此也可以應用於眾多領域。但由於過於複雜的系統設計,對讀者來說,學習TensorFlow底層運行機制更是一個極其痛苦的過程。TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向後兼容性,這導致現在許多開源代碼已經無法在新版的TensorFlow上運行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。

Keras

Keras 於2015年3月首次發布,擁有“為人類而不是機器設計的API”,得到Google的支持。它是一個用於快速構建深度學習原型的高層神經網絡庫,由純Python編寫而成,以TensorFlow、CNTK、Theano和MXNet為底層引擎,提供簡單易用的API接口,能夠極大地減少一般應用下用戶的工作量。

嚴格意義上講,Keras並不能稱為一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作為Theano的高級API而誕生,後來增加了TensorFlow和CNTK作為後端。學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間里,用戶主要是在調用接口,很難真正學習到深度學習的內容。

PyTorch

PyTorch於2016年10月發布,是一款專註於直接處理數組表達式的低級API。 前身是Torch(一個基於Lua語言的深度學習庫)。Facebook人工智能研究院對PyTorch提供了強力支持。PyTorch支持動態計算圖,為更具數學傾向的用戶提供了更低層次的方法和更多的靈活性,目前許多新發表的論文都採用PyTorch作為論文實現的工具,成為學術研究的首選解決方案。

Caffe/Caffe2.0

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,於2013年底由加州大學伯克利分校開發,核心語言是C++。它支持命令行、Python和MATLAB接口。Caffe的一個重要特色是可以在不編寫代碼的情況下訓練和部署模型。如果您是C++熟練使用者,並對CUDA計算游刃有餘,你可以考慮選擇Caffe。

在Spark大數據處理中使用深度學習框架

在Spark程序中使用一個預訓練過的模型,將其并行應用於大型數據集的數據處理。比如,給定一個可以識別圖片的分類模型,其通過一個標準數據集(如ImageNet)訓練過。可以在一個Spark程序中調用一個框架(如TensorFlow或Keras)進行分佈式預測。通過在大數據處理過程中調用預訓練模型可以直接對非結構化數據進行直接處理。

我們重點介紹在Spark程序中使用Keras+TensorFlow來進行模型推理。

使用深度學習處理圖片的第一步,就是載入圖片。Spark 2.3中新增的ImageSchema包含了載入數百萬張圖像到Spark DataFrame的實用函數,並且以分佈式方式自動解碼,容許可擴展地操作。

使用Spark’s ImageSchema:

from pyspark.ml.image import ImageSchema
image_df = ImageSchema.readImages("/data/myimages")
image_df.show()

也可以利用Keras的圖片處理庫:

from keras.preprocessing import image
img = image.load_img("/data/myimages/daisy.jpg", target_size=(299, 299))

可以通過圖片路徑來構造Spark DataFrame:

def get_image_paths_df(sqlContext, dirpath, colName):
    files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')]
    return sqlContext.createDataFrame(files, StringType()).toDF(colName)

使用Keras接口加載預訓練模型:

from keras.applications import InceptionV3
model = InceptionV3(weights="imagenet")
model.save('/tmp/model-full.h5')
model = load_model('/tmp/model-full.h5')

定義圖片識別推理方法:

def iv3_predict(fpath):
            model = load_model('/tmp/model-full.h5')
            img = image.load_img(fpath, target_size=(299, 299))
            x = image.img_to_array(img)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
 
            preds = model.predict(x)
            preds_decode_list = decode_predictions(preds, top=3)
            tmp = preds_decode_list[0]
            res_list = []
            for x in tmp:
                res = [x[0], x[1], float(x[2])]
                res_list.append(res)
            return res_list

定義推理輸入結果Schema:

def get_labels_type():    
    ele_type = StructType()    
    ele_type.add("class", data_type=StringType())    
    ele_type.add("description", data_type=StringType())    
    ele_type.add("probability", data_type=FloatType())    
    return ArrayType(ele_type)

將推理方法定義成Spark UDF:

spark.udf.register("iv3_predict", iv3_predict, returnType=get_labels_type())

載入圖片定義為數據表:

df = get_image_paths_df(self.sql)
df.createOrReplaceTempView("_test_image_paths_df")

使用SQL語句對接圖片進行處理:

df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_image_paths_df")
df_images.printSchema()
df_images.show(truncate=False)

結語

在大數據Spark引擎中使用深度學習框架加載預處理模型,來進行非結構數據處理有非常多的應用場景。但是由於深度學習框架目前比較多,模型與框架本身是深度耦合,在大數據環境中安裝和部署深度學習框架軟件及其依賴軟件會非常複雜,同時不利於大數據集群的管理和維護,增加人力成本。

華為雲DLI服務,採用大數據Serverless架構,用戶不需要感知實際物理集群,同時DLI服務已經在大數據集群中內置了AI計算框架和底層依賴庫(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版本中已經支持k8s+Docker生態,並開放用戶自定義Docker鏡像能力,提供給用戶來擴展自己的AI框架、模型、算法包。在Serverless基礎上,為用戶提供更加開放的自定義擴展能力。

DLI支持多模引擎,企業僅需使用SQL或程序就可輕鬆完成異構數據源的批處理、流處理等,挖掘和探索數據信息,揭示其中的規律並發現數據潛在價值,華為雲618年中鉅惠,大數據+AI專場,歷史低價,助力企業“智能化”,業務“數據化”。

 

點擊關注,第一時間了解華為雲新鮮技術~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

利用Azure Functions和k8s構建Serverless計算平台

題記:昨晚在一個技術社區直播分享了“利用Azure Functions和k8s構建Serverless計算平台”這一話題。整個分享分為4個部分:Serverless概念的介紹、Azure Functions的簡單介紹、k8s和KEDA的介紹和最後的演示。

Serverless

Serverless其實包含了兩種概念:BaaS(Backend as a Service)和FaaS(Function as a Service)。這次的分享主要針對的是FaaS概念。

FaaS的最大特徵就是:無需管理自己的服務器或擁有自己的持續運行的服務應用的情況下運行後端代碼。 上面加粗的地方其實也揭示了FaaS和PaaS的本質區別:你為了運行後端代碼,需不需要擁有一套持續運行的服務端完整應用(不管是WebSite還是Web API)。

另外,FaaS還擁有如下特徵:

  • 可以使用任何語言,不需要針對特定框架和函數進行編碼
  • 部署方式和傳統系統有很大不同
  • 水平伸縮完全自動化、彈性,並由平台供應商管理
  • 函數通常由事件觸發,部分平台供應商支持接收HTTP觸發

當然判斷什麼東西不是FaaS也有一些標準:

  • 能否在20ms啟動半秒執行完,根本區別在於伸縮性的方式
  • FaaS也可能依賴容器,但是和其他使用容器的應用區別在於伸縮性的自動化、透明和細度
  • 沒有傳統的Ops,但是應用本身運維過程還是需要,甚至更難(因為不同)

使用FaaS有其優缺點,這裏就報喜不報憂,只列一下優點:

  • 降低運維成本
    • 基礎設施共享
    • 減少基礎設施維護人工成本
  • 降低伸縮成本
    • 按量付費:偶爾請求,流量忽高忽低
    • 優化代碼即可省錢
  • 更易運維
    • 伸縮的好處利於降低運維難度
    • 降低打包和部署複雜度
    • 快速投入市場,持續優化

Azure Functions

以官方文檔的介紹:Azure Functions 允許你運行小段代碼(稱為“函數”)且不需要擔心應用程序基礎結構。 藉助 Azure Functions,雲基礎結構可以提供應用程序保持規模化運行所需的所有最新狀態的服務器。 函數由特定類型的事件“觸發”。 支持的觸發器包括對數據更改做出響應、對消息做出響應、按計劃運行,或者生成 HTTP 請求的結果。 雖然你始終可以直接針對大量服務編寫代碼,但使用綁定可以簡化與其他服務的集成。 使用綁定,你能夠以聲明方式訪問各種 Azure 服務和第三方服務。

Azure Functions包含如下功能:

  • 無服務器應用程序:使用 Functions,可在 Microsoft Azure 上開發無服務器應用程序。
  • 語言選擇:使用所選的 C#、Java、JavaScript、Python 和 PowerShell 編寫函數。
  • 按使用付費定價模型:僅為運行代碼所用的時間付費。
  • 自帶依賴項:Functions 支持 NuGet 和 NPM,允許你訪問你喜歡的庫。
  • 集成的安全性:使用 OAuth 提供程序(如 Azure Active Directory、Facebook、Google、Twitter 和 Microsoft 帳戶)保護 HTTP 觸發的函數。
  • 簡化的集成:輕鬆與 Azure 服務和軟件即服務 (SaaS) 產品/服務進行集成。
  • 靈活開發:直接在門戶中編寫函數代碼,或者通過 GitHub、Azure DevOps Services 和其他受支持的開發工具設置持續集成和部署代碼。
  • 有狀態無服務器體繫結構:使用 Durable Functions 協調無服務器應用程序。
  • 開放源代碼:Functions 運行時是開源的,可在 GitHub 上找到。

大家看到了,Azure Functions雖然是來源於微軟Azure的技術,但是是使用MIT協議開源的,且已經貢獻給.NET Foundation

所以,你可以使用Azure Functions來搭建(甚至定製)自己的Serverless計算平台。開源的不僅是Azure Functions框架本身,還包括了命令行工具(可以支持本地調試)和VSCode的擴展。當然,開發工具除了前面兩者,你還是可以使用宇宙第一的IDE:Visual Studio。

下面是相關開源的地址:

  • 框架:https://github.com/Azure/azure-functions-host
  • 命令行工具:https://github.com/Azure/azure-functions-core-tools
  • VSCode擴展:https://github.com/Microsoft/vscode-azurefunctions

只有開源的框架還不行,還需要運行環境,正如大部分開源FaaS框架一樣,Azure Functions也把k8s作為運行環境。不過為了達到自動伸縮、不使用就不消耗資源的目標,還需要搭配其他中間件才能達到效果。

k8s和KEDA

眾所周知,Kubernetes已經成為最主流的PaaS平台,各大公有雲提供商都提供了k8s的服務,比如微軟Azure上的AKS或者阿里雲的ACK。

為了更好的理解為什麼k8s可以作為Serverless完美的運行環境,是需要對如下概念有一些深入的理解的:

  • Pod和Deployment:Pod代表了運行函數的實例,而Deployment用於控制函數的實例數。
  • HPA(Horizontal Pod Autoscaler):k8s內置的水平Pod自動伸縮器,其基於一些度量指標(比如內存、CPU等)來對Deployment的Pod實例數進行伸縮。
  • Helm Charts:一個強大的打包、發布k8s應用的包管理器。我們開發好的函數在編譯為Docker Image之後,可以用Helm Charts來打包(當然也可以直接用k8s的yaml文件)。

k8s雖然提供了HPA,但是它無法基於更靈活的事件源來進行伸縮,也無法把Pod的實例數縮到0,或者由0伸到1。這個時候,就需要另外一個開源項目KEDA出場了(貢獻者來自微軟、AWS等大公司,以及很多社區志願者)。

KEDA:Kubernetes Event-driven Autoscaling。項目地址在:https://github.com/kedacore/keda。其具有如下特點:

  • 事件驅動
  • 輕而易舉實現自動伸縮
  • 內置伸縮器
  • 多種負載類型
  • 社區開源項目
  • 支持Azure Functions

KEDA的架構如下圖所示:

從這個架構圖,我們看到KEDA包含了3個組件,Metric Adapter給k8s的HPA提供度量指標讓其進行1-n/n-1的伸縮,Controller控制Pod進行1-0/0-1的伸縮,Scaler偵聽配置的觸發器所觸發的事件。

且支持的伸縮器涵蓋了大部分主流雲組件或中間件:

  • Apache Kafka
  • AWS CloudWatch
  • AWS Kinesis Stream
  • AWS SQS Queue
  • Azure Blob Storage
  • Azure Event Hubs
  • Azure Monitor
  • Azure Service Bus
  • Azure Storage Queue
  • External
  • GCP Pub/Sub
  • Huawei Cloudeye
  • Liiklus Topic
  • MySQL
  • NATS Streaming
  • PostgreSQL
  • Prometheus
  • RabbitMQ Queue
  • Redis List

演示

既然Azure Functions是開源技術,為了驗證技術中立性,在演示過程中特意選擇了阿里雲的ACK作為運行環境(Kubernetes託管版),並使用RabbitMQ作為伸縮觸發器。

同時,我們採用C#/.NET Core來作為函數的開發語言。為什麼用這個選擇,是因為有第三方對AWS Lambda上的支持的語言進行了性能測試,得到的結論是.NET Core的C#和F#語言性能最高:

來源:https://read.acloud.guru/comparing-aws-lambda-performance-of-node-js-python-java-c-and-go-29c1163c2581

環境準備

首先,需要到阿里雲上創建一個k8s集群,創建的選項截圖如下:

通過如下命令來部署KEDA到k8s:

helm repo add kedacore https://kedacore.github.io/charts
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda

通過如下命令來部署RabbitMQ到k8s:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install rabbitmq --set rabbitmq.password=PASSWORD,service.type=LoadBalancer bitnami/rabbitmq

這裏需要注意(當然也可能是我打開方式不對),阿里雲的ACK不能自動創建pv,所以rabbitmq部署後會有問題,所以需要到阿里雲的ACK的控制面板裏面手動創建pv,並重建rabbitmq所需的同名pvc。

創建Azure Functions項目

訪問:https://github.com/Azure/azure-functions-core-tools,安裝命令行工具。

在命令行中輸入:

func init --docker

來初始化一個帶有Dockerfile的Azure Functions項目,worker runtime選擇dotnet。

在命令行中輸入:

func function create

來創建一個函數,template選擇QueueTrigger,輸入你想要的函數名稱。

使用你喜歡的編輯器(比如VSCode)打開項目文件夾,修改csproj文件中的PackageReference為如下內容:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.3" />
  <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.RabbitMQ" Version="0.2.2029-beta" />
</ItemGroup>

修改函數代碼為如下內容:

[FunctionName("MyMqFunction")]
public static void Run(
    [RabbitMQTrigger("queue", ConnectionStringSetting = "RabbitMqConnection")] string inputMessage,
    [RabbitMQ(QueueName = "downstream", ConnectionStringSetting = "RabbitMqConnection")] out string outputMessage,
        ILogger log)
{
    Thread.Sleep(5000);
    outputMessage = inputMessage;
    log.LogInformation($"RabittMQ output binding function sent message: {outputMessage}");
}

這個函數從一個名為”queue“的隊列中讀取inputMessage,延遲5秒后,把消息存儲到名為”downstream”的隊列中。

打開local.settings.json文件,在Values節點下添加RabbitMqConnection:

"Values": {
  "AzureWebJobsStorage": "UseDevelopmentStorage=true",
  "FUNCTIONS_WORKER_RUNTIME": "dotnet",
  "RabbitMqConnection":"amqp://user:PASSWORD@rabbitmq.default.svc.cluster.local:5672"
},

這裏RabbitMQ的地址使用了k8s內部的默認Service地址,為了方便本地調試,你可以獲取到RabbitMQ在k8s的公網IP后,給這個域名添加host配置。

在命令行中輸入:

func start

就可以進行本地調試了。調試無誤,就可以進行發布到k8s的工作了。

以上示例代碼可以在這裏找到:https://github.com/heavenwing/AzFuncOnK8S

發布函數到k8s並驗證伸縮能力

考慮到我用的阿里雲拉取Docker Hub比較慢,所以我是編譯出Docker Image后,push到了阿里雲的鏡像倉庫當中。 另外,我這裏還遇到一個問題,就是能在AKS中正常運行的Docker Image在ACK中無法正常運行,出現”Access to the path ‘/proc/1/map_files’ is denied”的錯誤,我的臨時解決辦法是修改Dockerfile文件,添加WORKDIR命令。

在把Docker Image推送到鏡像倉庫后,可以在命令行中輸入:

func kubernetes deploy --name azfunconk8s --image-name registry.cn-chengdu.aliyuncs.com/zygcloud/azfunconk8s:latest --dry-run > deploy-funcs.yaml

得到部署的yaml文件后,我們需要對ScaledObject進行一點修改,為rabbitmq的trigger配置添加queueLength,根據需要配置maxReplicaCount屬性,如下所示:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: azfunconk8s
  namespace: default
  labels:
    deploymentName: azfunconk8s
spec:
  scaleTargetRef:
    deploymentName: azfunconk8s
  maxReplicaCount: 20
  triggers:
  - type: rabbitmq
    metadata:
      type: rabbitMQTrigger
      queueName: queue
      name: inputMessage
      host: RabbitMqConnection
      queueLength: "20"

現在就可以把函數部署到k8s了,在命令行中輸入:

kubectl apply -f .\deploy\deploy-funcs.yaml

這個時候應該可以看到k8s出現了名為azfunconk8s的Deployment,且需要實例和運行實例數都是為0:

另外寫一個小程序,往RabbitMQ的queue隊列裏面放一些測試消息,經過30秒(默認pollingInterval時間)那麼就會看到這個Deployment的所需實例數在提高,一直提高到你設置的maxReplicaCount。等隊列中的消息處理完成,又會看到所需實例數在降低,等沒有消息需要處理之後過上5分鐘(默認cooldownPeriod時間),所需實例數就會變為0。

紅包

能看到這裏的小夥伴都是愛學習的,應該紅包獎勵,不過當然是需要回答問題的。
問:KEDA解決的是非http的觸發器伸縮,那麼什麼東西可以解決http觸發器伸縮問題?
在我的公眾號中輸入答案,獲取支付寶紅包口令,數量有限先答對先得。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

聚甘新

使用四叉樹優化碰撞檢測

四叉樹是干什麼的?

百度百科
四元樹又稱四叉樹是一種樹狀數據結構,在每一個節點上會有四個子區塊。四元樹常應用於二維空間數據的分析與分類。 它將數據區分成為四個象限。數據範圍可以是方形或矩形或其他任意形狀。
從定義我們可以看出重點信息:

  1. 樹狀結構
  2. 四個區塊
  3. 分類
  4. 矩形

圖示講解

講解之前需要先說明一下四叉樹是用來做什麼的,明白了原理才好理解它的行為。
使用四叉樹就是使用分類的方法,減少碰撞節點的個數,只取出與給定碰撞體相同區域或者壓在碰撞體所在區域邊上的對象。

  1. 將遊戲屏幕分為四個區域。
  2. 插入對象
  3. 插入的對象超過了我們設置的閾值時,劃分
  4. 插入的對象再次超過了我們設置的閾值時,繼續分。

分析

插入

從上面的圖示我們可以很好理解四叉樹的原理。涉及的都是插入操作。
那麼插入操作具體都做了什麼呢?

從代碼中我們可以看出:

  1. 當插入第一個對象的時候只走了2;這個時候沒有子樹,所以不會走1,因為objects(管理的對象)的長度還沒有超過我們設置的閾值MAX_OBJECTS,所以也不會走3。
  2. 一直插入,當objects中的數量,超過了我們設置的閾值MAX_OBJECT,就會開始劃分,產生子樹,有了nodes,劃分之後將自己管理的節點插入到子樹中。再此之前,都不會走1,因為還沒有產生子樹。
  3. 劃分之後再次插入新對象,如果對象可以獲得對應的象限,就會走1 不會走2和3,如果沒有獲得對應的象限才會走2,3(沒有獲得的情況可能是你創建的對象在屏幕外,遊戲中很多情況是敵人從屏幕外走進屏幕的,具體可參考我做的《星際迷航》或者《星際戰》遊戲)。

更新對象

我是把四插入作為了對象管理器使用,要不然對象也需要更新,所以有了這一步操作。如果不這樣你需要自己創建對象管理器,一個一個放進去,刪除。通過四叉樹直接管理省了不少事情。

更新象限信息。

這是一個遞歸操作,更新象限做的事情比較多了。

  1. 檢查對象是否存活,如果死亡就回收,我這裏使用了對象池,所以對象實現了poolAble接口。

  2. 判斷對象的所佔區域是否在四叉樹的區域內
    這裏需要說明的是一個四叉樹本身的區域是它管理的四個象限這麼大。也就是一個四叉樹管理四個象限

    不在管理區域的話需要判斷當前this是否為根節點,如果是說明對象已經出屏了。(這個時候可以通過對象實現的isVisible接口來控制是否回收,因為不是所有在屏幕外的都要回收,比如要進入屏幕的敵人,是不可能回收的,所以需要自己用isVisible接口來控制)。如果不是就將對象放入根節點,重新劃分。

  3. 在管理區域內,就看看在四叉樹管理的哪個象限里。更新象限信息。

    如果沒有變化什麼都不過,如果有變化,先判斷象限是否為-1,為什麼會出現-1,也就是不在四個象限的任何一個象限?因為壓線了。此番操作后的結果如下圖。

根據給定矩形獲取對象列表

  1. 第一個是步長,用於獲取深度,當然深度越長,處理的時間越長,獲取的對象也精細。這個可以根據自己遊戲的同屏四叉樹層級而定了。
  2. 如果通過obj的rect獲得對象所在象限如果獲得了對應的象限,用獲得的象限的四叉樹再獲取。如果壓線的話就需要將碰撞的兩個象限的內容都取出來。
  3. 返回四叉樹中沒有分割象限的對象。

怎麼用呢?

自然就是把要碰撞的對象傳給retrieve函數獲得需要碰撞的對象列表進行碰撞檢測了。
也就是文章靠頭說的:
使用四叉樹就目的是為了減少碰撞節點的個數。使用的是分類的方法。
至於用什麼樣的碰撞檢測函數,不是四叉樹關心的事情,

至於用幾個四叉樹管理對象,也不是四叉樹關心的事情。

結語

想要demo的同學可以去我的微店或者官方creator商城購買《跨引擎遊戲框架》源碼,跟demo是一個項目。買過的同學請加我好友,群已經建好,有更新我會群里直接發包。

源碼購買入口:

demo展示:

項目截圖:

框架的相關模塊教程可以到《我的專輯》遊戲開發進階教程中獲取。
後續還會推出更多與框架有關的教程:如:戰鬥框架,教學框架等等。並附帶完整的遊戲實現(飛行射擊遊戲為例,學會做飛行射擊遊戲不是目的,目的是通過這一款遊戲,你可以獲得做其他所有類型的遊戲的思路)。希望可以在不餓死自己的前提下幫助更過的朋友們快速找到開發思路。

長按下方二維碼,關注《微笑遊戲》公眾號,獲取更多精彩內容。

歡迎掃碼關注公眾號《微笑遊戲》,瀏覽更多內容。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

聚甘新