特斯拉上季呈現虧損;擬針對中國客戶調整電動車功能

美國電動車廠特斯拉(Tesla)公布季度虧損,同時宣布將針對全球最大汽車市場、也就是中國大陸的客戶,調整電動車功能。   特斯拉第 4 季扣除特定項目,每股虧損 13 美分。此外,特斯拉執行長 Elon Musk 先前說過,他預期中國銷售量最快在 2015 年就可能匹敵美國銷售量。但消息人士透露,今年 1 月特斯拉在中國賣出大約 120 輛汽車,遠低於公司目標。   特斯拉表示,目前正在針對中國客戶進行調整,希望能於交車前先在買主家中安裝充電系統,讓更多大陸客戶對購買 Model S 更有信心。      

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

【其他文章推薦】

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

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

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

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

新北清潔公司,居家、辦公、裝潢細清專業服務

中國首屆電動車購車節賣出303輛 北京客戶占69%

中國首屆電動汽車購車節於2月10日正式收官。本次活動由電動汽車垂直網站電動邦主辦,北汽新能源、啟辰、上汽榮威、上海通用、騰勢、比亞迪、大眾、寶馬等多家企業參與,11款主流電動車參與搶購。北京新能源汽車行銷有限公司許國慶表示:“北汽、啟辰、比亞迪是本次活動的最大贏家。”   首屆電動車購車節參與活動的總人數已達10萬餘人次,共賣出了303輛電動車,車款金額達3880萬人民幣。在2月10日10點正式開始的線上搶購中,短短20分鐘時間就有超過220名網友完成了線上搶購。其中,啟辰晨風、北汽E150ev、EV200、騰勢、比亞迪秦等成為最熱銷車型。各車型預約人數為4785人次。而在地域分佈中,北京以69%的用戶數拔得頭籌。

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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

樂視進軍電動車步伐加近:砸數十億美元 美國市場為目標

(圖片來源:leiphone.com)

  2月12日,媒體報導,樂視網資訊技術(北京)股份有限公司稱計畫投資數十億美元開發電動汽車,將美國定為首要目標市場。   此前的1月19日,樂視網正式確認「SEE計畫」即樂視超級汽車計畫。公司表示,這是由控股股東樂視控股所開展的一項旨在打造一個全球獨有的垂直整合汽車互聯網生態系統的重要戰略。   受超級汽車計畫等一系列利好影響,2月11日,樂視網以584億元人民幣(下同)的市值躍升創業板首位。自去年12月23日起,其股價從28.2元的底部漲至11日的69.43元,大漲146%。  
動態:正就專案資金與投資方磋商   上任伊始的樂視汽車業務中國負責人呂征宇接受電話採訪時表示,樂視計畫招聘更多人才以加強現有大約260人的電動汽車專案團隊。他說,樂視將這個專案視為一項長期投資,正在就專案資金與投資方進行磋商。樂視計畫投資數十億美元,將美國定為首要目標市場。他沒有透露更多細節。   樂視董事長賈躍亭誓言「顛覆」傳統汽車行業,宣佈要打造一款智慧化和互聯化程度更高的汽車。其目標是比亞迪和長城汽車等更成熟的中國車企未能實現的目標:把汽車賣給美國消費者。   呂征宇曾在日產汽車旗下英菲尼迪供職。他確信,就像賈躍亭所說的那樣,對於每件新生事物,當人們第一次看到的時候,首先會忽視你,然後會笑話你,再然後會反對你,然後你就贏了;利用自己在設計、製造和分銷方面的優勢,樂視有機會顛覆傳統汽車行業。  
回顧:北汽曾表示願意代工   2014年7月21日,國務院公佈《關於加快新能源汽車推廣應用的指導意見》,阿里巴巴與樂視網分別傳出要進軍汽車領域,一個牽手上汽,一個牽手北汽。   2014年4月份,北汽董事長徐和誼在一次公開場合就提出,「汽車企業未來可能會成為互聯網企業的貼牌製造商」這一觀點,甚至點名「樂視網」,表示願意「代工生產樂視汽車」。   在徐和誼看來,新能源汽車按照傳統汽車模式肯定不行。新能源汽車產業與傳統汽車產業不只是在燒油與用電方面的區別,「新能源汽車是一個全新的行業,必須要用全新的模式與之相適應」,而這個新模式的合作物件目前來看首選樂視的可能很大。   知名產業評論家信海光在微信中披露,樂視CEO賈躍亭在美期間,除了佈局海外市場,在美國創立兩家子公司,推動樂視生態業務全球化全面啟動外,另一高度保密專案,就是樂視汽車專案。據悉,賈躍亭在美國和徐和誼密會,初步達成合作汽車的意向,至於細節不得而知。   2014年4月9日,賓士CLA與樂視強強聯合上演了一場時尚行銷秀。賓士發言人表示其品牌看中了樂視網中極具潛力、並願為生活品質買單的高端用戶,而這批用戶對於北汽開拓新能源汽車市場十分關鍵。此外,寶馬、英菲尼迪等高端車企品牌也都上過樂視超級電視廣告。樂視一直強調的「生態」建設,是樂視進軍汽車業的驅動力,也是樂視推出互聯網汽車的良好土壤。   按照目前的樂視產品思路,互聯網行銷方式與產品價格將是撒手鐧,評論人士認為,樂視汽車一旦推向市場,會很大程度推動新能源車或者互聯網汽車的市場普及,而樂視網本身也會很快走向年營收千億元這一量級。  
影響:超級計畫引爆股價   2015年2月11日,樂視網收穫本週第2個、今年第5個漲停板。憑藉密集發力榮登創業板老大的樂視網,以市值584億元遠遠甩開第二名東方財富,後者總市值為498億元。   樂視網市值躍升首位,用了35個交易日。自去年12月23日起,其股價從28.2元的底部漲至11日的69.43元,大漲146%。   市場人士認為,樂視網已經與京東、小米、360一起,組成繼百度、阿里巴巴和騰訊之後的中國互聯網第二梯隊。樂視的總市值已經超越奇虎360,資料顯示,在納斯達克上市的360市值為78億美元,約合人民幣488億元。   樂視網股價任性飆升的背後,是電動超級汽車等計畫獲得了市場認同。   1月14日,美國影響力最大的商業科技媒體Business Insider刊發文章,認為中國互聯網公司樂視CEO賈躍亭將憑藉電動超級汽車,與推出特斯拉電動汽車的埃隆•馬斯克一樣,成為全球矚目的明星企業家。Business Insider文中稱:賈躍亭將是中國的「埃隆•馬斯克」。   1月19日,樂視網正式確認「SEE計畫」即樂視超級汽車計畫。公司表示,這是由控股股東樂視控股所開展的一項旨在打造一個全球獨有的垂直整合汽車互聯網生態系統的重要戰略,樂視網與其運營主體並無股權關係,短期內也不會對公司業績構成影響。   連結:特斯拉跌落神壇敲響警鐘   2月11日,特斯拉中國1月銷量僅為120輛的消息幾乎佔據了各大財經和科技媒體的頭條。這家曾經令中國媒體不惜溢美之詞、引得自主品牌車企紛紛一探究竟的電動車製造企業,在一年後跌落神壇。   特斯拉的失敗不可避免地讓一大批揮師進軍汽車行業的互聯網公司坐立難安。通過「電腦+四個輪子」的品牌形象和打破4S經銷體系、主打直營的銷售模式,特斯拉吸引了不少中國擁躉,其中不乏小米和樂視這樣靠垂直整合起家的手機和電視廠商。   從目前已經公佈的樂視超級汽車等方案來看,特斯拉的這批中國學徒們均給自己貼上了「智慧汽車」、「互聯網汽車」的標籤,但在電動車最核心的電池、電機、電控及底盤技術上卻諱莫如深。   特斯拉希望通過推出廉價版的Model X來緩解單產品線的窘境,而電池成本的下降是實現低價版車型量產的基礎。馬斯克曾樂觀預計10年內特斯拉能夠將電池成本降到100美元/千瓦時,但包括電池專家在內紛紛對馬斯克的預期予以駁斥:不僅在2025年之前,電池成本不可能降低至167美元/千瓦時,而且特斯拉Model X價格將從原本的3萬美元定價提高到5-8萬美元。   特斯拉在中國市場陷入泥潭戳破了電動車的泡沫,當樂視小米們在造車的道路上越走越遠時,不得不回頭看看特斯拉的警示。   (文章來源:長江商報)

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

【其他文章推薦】

新北清潔公司,居家、辦公、裝潢細清專業服務

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

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

※超省錢租車方案

從零開始認識堆排序

一、什麼是堆?

維基百科的解釋是:堆是一種特別的樹狀數據結構,它需要滿足任意的子節點必須都大於等於(最大堆)或者小於等於(最小堆)其父節點。

二、堆排序

堆排序是通過二叉堆數據結構實現,二叉堆滿足一下兩個特性:

1、滿足對的基本特性

2、完全二叉樹,除了最底層外,其它層都已填充滿,且是從左到右填充。

二叉堆的高度即為根節點到恭弘=叶 恭弘子節點的最長簡單路徑長度,即為θ(lgn)。

二叉堆上的操作時間複雜度為O(lgn)。

1、二叉堆中的元素個數

根據二叉堆的特性2,我們知道高度為h的二叉堆重元素個數如下:

根節點為1

第一層為2=21

第二層為4=22

第h-1層為2h-1

第h層元素個數範圍為[1,2h]

最底層之外的元素個數和為1+2+22+…+2h-1=(1-2h-1)/(1-2)=2h-1

高度為h的二叉堆元素個數範圍:[2h-1 + 1,2h-1+2h]=[2h,2h+1-1]

以高度為3的最大堆為例:

圖1

 圖2

2、二叉堆的高度

由二.1推導,我們知道高度為h的二叉堆的元素個數n滿足:

2≦ n ≦ 2h+1-1

=>

2≦ 2lgn ≦ 2h+1-1

=>

h ≦ lgn < h+1

由此可得,含有n個元素的二叉堆的高度為θ(lgn)

3、使用數組表示堆存儲

節點下標 i,則父節點下標為 i/2,左子節點下標為 2i,右子節點下標 2i + 1。

以圖1最大堆為例:

從根節點開始,根節點下標 1。

第一層節點下標:2、3

第二層節點下標:4、5、6、7

第三層節點下標:8

圖3

數組形式:

 圖4

具體到特定的編程語言,數組以0開始下標的,推導:

對於節點 i,則其父節點為 (i – 1)/2,左子節點下標為 2i + 1,右子節點下標 2i + 2。

4、堆的恭弘=叶 恭弘子節點

對於有n個元素的二叉堆,最後一個元素的下標為為n,根據二叉堆的性質,其父節點下標為n/2,因為每一層是由左向右進行構建,所以其父節點也是倒數第二層的最後一個節點,所以,其後的節點都為最底層節點,為恭弘=叶 恭弘子節點,下標為n/2 + 1、n/2 + 2… n。

具體到特定的編程語言,數組以0開始下標的,推到:

恭弘=叶 恭弘子節點下標為(n-1)/2 + 1、(n-1)/2 + 2… n。

5、堆維護

所謂堆維護,即保持堆的基本特性,以最大堆為例:給定某個節點,維護使得以其為根節點的子堆為滿足子節點都小於等於父節點。

如下,給定堆構建數組,及特定元素下標i:

public static void maxHeapify(int[] arr, int i) {
        int size = arr.length; //堆大小
        int maxIndex = i; //記錄當前節點及其子節點的最大值節點索引
        int left = 2 * i + 1; //左子節點索引
        int right = 2 * i + 2; //右子節點索引

        //對比節點及其左子節點
        if (left < size && arr[left] > arr[maxIndex]) {
            maxIndex = left;
        }

        //對比節點及其右子節點
        if (right < size && arr[right] > arr[maxIndex]) {
            maxIndex = right;
        }

        //不滿足最大堆性質,則進行下沉節點i,遞歸處理
        if (maxIndex != i) {
            int tmp = arr[i];
            arr[i] = arr[maxIndex];
            arr[maxIndex] = tmp;
            maxHeapify(arr, maxIndex);
        }
    }

如下圖,堆中元素9的維護過程:

 

 圖5

堆維護過程的時間複雜度:O(lgn)。

6、構建堆

根據二.4我們可以得到所有恭弘=叶 恭弘子節點的下標。我們可以使用二.5中的堆維護過程,對所堆中所有的非恭弘=叶 恭弘子節點執行堆維護操作進行堆的構建。

public static void buildHeap(int[] arr) {
        for (int i = (arr.length - 1) / 2; i >= 0; i--) {
            maxHeapify(arr, i);
        }
    }

以數組 {27,17,3,16,13,10,1,5,7,12,4,8,9,0} 為例進行堆構建,結果為:{27,17,10,16,13,9,1,5,7,12,4,8,3,0}

圖6

構建最大堆的時間複雜度為O(n)。

7、堆排序

首先執行最大堆構建,當前堆中最大值會上升到根節點,也就是堆數組的首節點。

我們可以通過交換首尾節點,使得最大值轉移至尾部,然後對除尾部元素外的堆數組執行根元素堆維護,上浮堆最大值。

然後,將最大值交換至數組尾部倒數第二個元素位置,重新執行剩餘堆數組的根元素堆維護,依次類推,直至剩餘堆數組大小變為2為止。

以二.6中數組為例:{27,17,3,16,13,10,1,5,7,12,4,8,9,0}

第一次執行:

{27,17,10,16,13,9,1,5,7,12,4,8,3,0},max:27

第二次執行:

{17,16,10,7,13,9,1,5,0,12,4,8,3},max:17

第三詞執行:

{16,13,10,7,12,9,1,5,0,3,4,8},max:16

第四次執行:

{13,12,10,7,8,9,1,5,0,3,4},max:13

第五次執行:

{12,8,10,7,4,9,1,5,0,3},max:12

第六次執行:

{10,8,9,7,4,3,1,5,0},max:10

第七次執行:

{9,8,3,7,4,0,1,5},max:9

第八次執行:

{8,7,3,5,4,0,1},max:8

第九次執行:

{7,5,3,1,4,0},max:7

第十次執行:

{5,4,3,1,0},max:5

第十一次執行:

{4,1,3,0},max:4

第十二次執行:

{3,1,0},max:3

第十三次執行:

{1,0},max:1

改造代碼實現:

    /**
     * 最大堆維護
     *
     * @param arr 堆數組
     * @param i 維護元素下標
     * @param offSet 原址偏移量
     */
    public static void maxHeapify(int[] arr, int i, int offSet) {
        int size = arr.length - offSet; //堆大小
        int maxIndex = i; //記錄當前節點及其子節點的最大值節點索引
        int left = 2 * i + 1; //左子節點索引
        int right = 2 * i + 2; //右子節點索引

        //對比節點及其左子節點
        if (left < size && arr[left] > arr[maxIndex]) {
            maxIndex = left;
        }

        //對比節點及其右子節點
        if (right < size && arr[right] > arr[maxIndex]) {
            maxIndex = right;
        }

        //不滿足最大堆性質,則進行下沉節點i,遞歸處理
        if (maxIndex != i) {
            int tmp = arr[i];
            arr[i] = arr[maxIndex];
            arr[maxIndex] = tmp;
            //因為交換了子節點的值,則以子節點為根節點的子堆特性可能發生變化,需要維護
            maxHeapify(arr, maxIndex, offSet);
        }
    }

    /**
     * 構建最大堆
     *
     * @param arr
     */
    public static void buildHeap(int[] arr) {
        for (int i = (arr.length - 1) / 2; i >= 0; i--) {
            maxHeapify(arr, i, 0);
        }
    }

    /**
     * 交換最大值
     *
     * @param arr 堆數組
     * @param maxIndex 最大值元素待交換位置
     */
    public static void swapMax(int[] arr, int maxIndex) {
        int tmp = arr[maxIndex];
        arr[maxIndex] = arr[0];
        arr[0] = tmp;
    }

    /**
     * 堆排序
     *
     * @param arr
     */
    public static void heapSort(int[] arr) {
        buildHeap(arr); //構建堆
        swapMax(arr, arr.length - 1); //交換最大值
        for (int i = 0; i < arr.length - 2 ; i++) {
            maxHeapify(arr, 0, i + 1); //根節點堆維護 offset 偏移元素個數
            swapMax(arr, arr.length - 1 - (i + 1)); //交換最大值
        }
    }

堆排序時間複雜度:O(nlgn)

 

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

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

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

程序員敲代碼時耳機里聽的到底是什麼?

我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!
文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裏面。

程序員上班戴耳機聽歌難道不是正常的嗎,真的還有公司不允許程序員戴耳機的嗎?不戴耳機能寫代碼?

那程序員的耳機里聽的是什麼呢?我採訪了一眾程序員朋友。

鋼鐵程序員王二麻子同學

聽的什麼?我根本就不知道,我只是不想讓別人打擾我

有時候開發確實是比較費腦子的,尤其是遇到複雜邏輯的時候。正當思如泉涌、靈感迸發的時候,旁人看着我坐在那裡一動不動,好像什麼都沒有做,其實我腦子里正在構思一個複雜的流程。

這時候,突然有個人走過來打斷我,前面的思考都白費了,你說傷心不,你說氣人不。

所以,為了防止上面的情況出現,不得不戴上耳機。至於聽什麼,不重要,我只是告訴別人,別過來,我現在沒時間。

生活需要儀式感的劉精神同學

聽什麼不重要,關鍵是儀式感

生活需要儀式感,寫代碼也需要儀式感啊。當我戴上耳機的那一刻,我感覺精神抖擻,彷彿遊離的三魂六魄都回來了,寫代碼更有動力。

要是不戴耳機,感覺渾身無力,只想摸魚,寫代碼什麼的,根本想都想不起來。

心疼自己的高愛己同學

其實我就是不想聽我的机械鍵盤聲音,實在太吵了

你也知道,筆記本自帶的鍵盤總感覺軟綿綿的,敲起來實在不給力,嚴重影響我的工作效率。那必須得買個鍵盤啊,在多個朋友的推薦下,我就買了一個青軸鍵盤。你別說,觸感真不錯,每按一下,都感覺指尖有一股電流滑過,同時伴隨着啪啪啪的聲音,感覺寫代碼效率明顯變高了,更神奇的是 bug 都比以前少了,你說神奇不。

但是呢,有個缺點,就是時間久了吧,感覺稍微有那麼一點點吵,所以我就配了個耳機,從此之後,既得到了直達靈魂的觸感,又不會感覺吵了。更神奇的一點是,以前罵我的同事好像都不罵我了。

真的在聽東西的同學

雖然存在以上幾位同學說的情況,但大多數情況下, 我們是真的在聽東西。比如我,為了聽高品質的,還專門買了網易雲音樂的 VIP 。

為什麼是東西,而不是音樂呢,因為有的人不是在聽音樂。

我聽說有人在寫代碼的時候聽評書,更有厲害的,竟然聽相聲。那我想只有三種可能。

  1. 根本沒在寫代碼,可能是在摸魚。
  2. 評書一點都不精彩,相聲一點都不好笑,僅僅是一門語言的藝術而已。
  3. 這是個大佬,已經進入忘我的境界,聽到的不是語言,而是聲音解析成比特位時產生的白噪音,一般人聽不到,只有某些段位的大佬可以。

當然畢竟大佬不常有,而普通群眾常用。大部分人聽的確實是音樂。比如我吧,我戴耳機真的是在聽音樂,為了降噪、減少干擾,提高專註力,提升效率。

什麼類型的音樂更受程序員歡迎呢

英文歌

英文歌是大多數程序員的最愛。請看網易雲音樂給我的每日歌曲推薦,除了伍佰的一首中文歌亂入,剩下的都是英文歌。

你真的認為我英語很好嗎,正好相反,之所以英文歌那麼受歡迎,就是因為聽不懂歌詞是什麼意思,這樣才不會被歌詞帶跑偏,沒錯,我們聽的就是這個節奏。

那要是中文歌就不一樣了,比如說當我聽到「你的酒館對我打了烊,子彈在我心頭上了膛」的時候,我就以為真的要打烊了,子彈真的要上膛了,從而引發一系列思考,酒館為什麼對我打烊,子彈為什麼要上膛,生意不做了嗎,刑法基本法則不懂嗎。

為了證明這一點,我到網易雲音樂上搜了「程序員」相關的歌單,點進去一看,大部分也都是英文歌,看來大家英文都不太好。

然後我又搜了「產品狗」相關的歌單,同樣也是英文歌為主,可見我們雖然不太對付,請參考歌單『產品狗如何說服程序猿』和『程序員如何回應產品狗』,但是方法論還是差不多的。

純音樂

純音樂也是很受歡迎的,我有個同事最喜歡聽貝多芬的命運交響曲,我就沒那麼文藝了。我一般都是聽那種激昂的小提琴或者聽完感覺自己馬上要登基了的那種,不容易犯困。

白噪音

小提琴太勁爆,不能常聽,犯困的下午聽聽可以提神,bug 太多又不想改的時候可以聽聽。大多數時候,不需要那麼亢奮,保持內心的平靜就是寫代碼最好的狀態。那就聽聽白噪音好了,比如雨聲、風聲、溪水聲、鳥唱蟬鳴。

我最喜歡的就是雨聲,嘩啦啦的大雨,再配上驚雷,簡直不要太平靜,innerpeace。

比如下面這個,一聽就是一個小時。

保留曲目

每個人都有自己家私藏的歌單,百聽不厭的那種,當然每個人的品位不一樣、口味兒不一樣,比如當年有個哥們兒異常興奮的把他的珍藏歌單分享給我,我當即表示很感動,一定要認真聽一聽。可當我硬着頭皮聽完第二首的時候,我內心是拒絕的,只能委婉的跟哥們兒說:這 TM 什麼玩意兒。當然是不會破壞友誼的小船的,如果是不熟的朋友,那肯定會豎起大拇指,並且連連點頭稱讚:真不錯,品位棒棒噠。

我沒有薦歌啊,向別人推薦歌曲犹如喂別人食物,你覺得好吃別人並一定覺得好吃。下面是我的 2018 年年度聽歌報告,Sophie Zelmani(蘇菲.珊曼妮)的熱門50單曲就是我的保留曲目,白聽不厭,而且更重要的不仔細聽,還是聽不出歌詞的意思,正好適合寫代碼用。

另外,作為一個程序員鼓勵師,為了鼓勵我自己,我也創建了一個「程序員鼓勵師」的歌單,經常拿出來聽聽接收鼓勵。

作為程序員的你,耳機里有什麼特殊的內容嗎?

壯士且慢,先給點個贊吧,總是被白嫖,身體吃不消!

我是風箏,公眾號「古時的風箏」。一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇現在就關注我,或者看看歷史文章再關注也不遲。

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

【其他文章推薦】

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

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

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

※超省錢租車方案

深入淺出騰訊BERT推理模型–TurboTransformers

Overview

TurboTransformers是騰訊最近開源的BERT推理模型,它的特點就是一個字,快。本人用BERT(huggingface/transformers)在V100上做了測試,測試結果和官宣的基本一致:TurboTransformers的推理速度要比Pytorch快上1~4倍。

它之所以快,是因為它是專用於BERT的輕量級推理模型。

分層

不管是計算機的硬件、軟件,還是現在的深度學習,它們都遵循着一個很重要的設計思想–分層:

  • 用簡單的代碼(或電路)來實現一個基本功能組件。
  • 用幾個基本組件組合成一個功能更強的複雜組件。
  • 從簡單到複雜,像搭積木一樣,一層層地搭建出擁有很強功能的組件。

開發者只需要基於PyTorch的幾個基本組件就能搭建出BERT模型,而且這些組件本身對他們來說都是透明的。正因如此,PyTorch才越來越受到研究者青睞。

分層設計的優點很多,例如,可以簡化問題、降低創新門檻、加速開發等,但它的缺點也很明顯:

  • 流程固定化
  • 存在中間層延遲

深度神經網絡里有個經典套路:一個激活函數層後面緊跟着一個dropout層。PyTorch需要lanuch兩個GPU kernel程序來完成這兩步計算。

F.dropout(F.relu(x))

實際上,這兩項計算都是element-wise的,是可以合併成一個kernel的。但目前來說,不管是PyTorch,還是其他的通用訓練框架,它們都很少有提供這種融合計算的API。

至於中間層延遲,最經典的要屬“hello world”程序。雖然只有幾行代碼,但實際上要經過的中間層數根本數不過來。

你可以閱讀深入淺出PyTorch(算子篇)來了解下矩陣相乘這個最基本的計算在PyTorch里要經過多少个中間層。

分層展開

要想將程序的低延遲最大化,就需要把分層的代碼完全展開,並重構代碼。典型例子就是嵌入式系統,為了實現某種需求,它可以打破應用程序、程序庫、操作系統甚至是硬件設備的界限,打造一個軟硬件一體化產品。

這種分層展開的設計模式當然也有它的局限性:專用。由於高度定製化,它通常只能用於完成某個特定功能。低延遲和專用化是呈絕對的正相關的。

TurboTransformers就是採用這種設計:只實現BERT模型前向傳播所需要的算子,並融合那些可以合併的算子。

turbo.Tensor

首先,它用CUDA開發了一個輕量級的tensor計算庫,所謂的輕量級,指的是不用考慮反向傳播、稀疏矩陣等操作,只實現BERT前向傳播所必需的operator。

雖然tensor庫是用C++寫的,但考慮到python在AI開發中的地位,它用pybind11將C++ API暴露給前端的python Tensor類。

# turbo_transformers/python/pybind.cpp
 72   py::class_<core::Tensor>(m, "Tensor")                      
 73       .def_static("from_dlpack",
 74                   [](py::capsule capsule) -> std::unique_ptr<core::Tensor> {
 75                     auto tensor = (DLManagedTensor *)(capsule);
 76                     PyCapsule_SetName(capsule.ptr(), "used_tensor");
 77                     return absl::make_unique<core::Tensor>(tensor);
 78                   })
 79       .def("to_dlpack",
 80            [](core::Tensor &tensor) -> py::capsule {
 81              auto *dlpack = tensor.ToDLPack();                    
 82              return py::capsule(dlpack, "dltensor", DLPack_Capsule_Destructor);
 83            })
 84       .def("n_dim", &core::Tensor::n_dim)
 85       .def("shape", &core::Tensor::shape)

從預訓練模型(PyTorch)那遷移參數時,turbo.Tensor不能直接對接torch.Tensor,需要先將PyTorch的參數轉成dlpack格式, 再通過from_dlpack()將這些數據導入生成TurboTransformers tensor。除了dlpack之外,還支持*.npz文件格式。

turbo.xxxlayer

TurboTransformers用CUDA重構了Embedding、self-attention、intermediate、output、LayerNorm和pooler等layer。turbo.layer不僅代碼結構簡潔,overhead少,還合併了一部分算子。

這裏以intermediate layer為例,來分析這些算子的特點。

intermediate layer的實現比較簡單:一個Linear layer後面緊跟着一個gelu activation layer。

PyTorch的intermediate layer的會lanuch 3個kernel來完成這部分計算:

  • #1: y = input.matmul(weight)
  • #2: y = y + bias
  • #3: y = gelu(y)

由於#2和#3都是element-wise kernel,turbo把它們進行了融合–AddBiasAct(),相同的計算操作,只需要lanuch 2個kernel,計算速度當然更快。

和PyTorch一樣,turbo的MatMul算子也是調用cuBLAS來進行矩陣運算,而且turbo還啟用了Tensor Core來加速計算(CUBLAS_TENSOR_OP_MATH)。

總結

到此,本文基本上講清了TurboTransformers的速度優勢來源,由於篇幅所限,不能分析所有的算子。BERT的核心模塊是self-attention,如果想了解更多,可以閱讀深入淺出Transformer。

更多精彩文章,歡迎掃碼關注下方的公眾號 ~~ 歡迎關注和點贊,你的鼓勵將是我創作的動力

歡迎轉發至朋友圈,公眾號轉載請後台留言申請授權~

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

【其他文章推薦】

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

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

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

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

.NET高級調試系列-Windbg調試入門篇

Windbg是.NET高級調試領域中不可或缺的一個工具和利器,也是日常我們分析解決問題的必備。準備近期寫2篇精華文章,集中給大家分享一下如果通過Windbg進行.NET高級調試。

今天我們來一篇入門的文章。首先,Windbg是什麼?

Windows Debugger,簡稱WinDbg,.NET 最強分析調試利器。它可以用來:

  • 調試內核模式和用戶模式代碼
  • 分析Crash dump
  • 分析代碼執行時 CPU 寄存器信息

我們可以通過WinDbg調試以下具體問題:

  • 線程阻塞
  • 內存泄露
  • 分析查詢運行時線程堆棧和變量
  • 分析進程Crash原因
  • 分析消耗CPU原因
  • 查看並調試CLR異常

那麼,首先我們先進行Windbg下載安裝、配置。

一、下載安裝WinDbg,配置調試環境

1. 推薦下載鏈接

https://raw.githubusercontent.com/EasyDarwin/Tools/master/Windbg_x86_x64/dbg_amd64.msi

或者從Windows Store下載 WingDbg Preview版本

下載后一步一步安裝即可

 2. 配置調試符號

大家會問一個問題:為什麼要配置調試符號?

若要使用 WinDbg 提供的所有高級功能,必須加載適當的符號:比如說我們可以調試、查看.NET CLR程序堆棧,此時要加載對應的調試符號。

 微軟提供了統一的調試服務服務器地址:

http://msdl.microsoft.com/download/symbols,將這個地址提供的調試符號,下載緩存到本地,Windbg調試的時候可以用上。
srv*c:\symcache*http://msdl.microsoft.com/download/symbols;c:\symcache

  

3. 下載並使用WinDbg調試器擴展

 Windbg調試器擴展是Windbg調試的精華和核心,可以這麼說,掌握各類Windbg調試器擴展,你就掌握了各類調試技能。

 默認情況下,WinDbg的調試指令是有限的,通過一些WinDbg調試器擴展,可以方便我們進行.NET 程序調試

 SOS調試擴展 : 隨着.NET Framework安裝,可以直接加載:  .load sos clr

 SOS這個dll在哪裡呢(分32位和64位)?

 4.0, 32-bit –> C:\Windows\Microsoft.NET\Framework\v4.0.30319
 4.0, 64-bit –> C:\Windows\Microsoft.NET\Framework64\v4.0.30319

  MEX調試擴展:This extension is widely used by Microsoft Support Engineers in troubleshooting process applications

 下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=53304

 下載完成后,將32/64位的Mex.dll 拷貝到windbg安裝目錄中

 例如:C:\Program Files\Debugging Tools for Windows (x64)\Mex.dll

 詳細使用說明:https://github.com/REhints/WinDbg/tree/master/MEX

 下載、安裝、配置完成Windbg之後,接下來我們了解一下一些基本的調試命令。

二、基本的WinDbg調試指令

1. WinDbg自帶的調試指令

 

   

    更多指令,可以查看一下鏈接:

    https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/getting-started-with-windbg

 2. SOS調試擴展常用的調試指令

   

    

    

 

  

  

  

  

 

  

   3. Mex調試擴展常用的調試指令

   

     

    

    

    

    

     更多Mex調試指令,可以查看鏈接:https://github.com/REhints/WinDbg/tree/master/MEX

 

  以上是整個Windbg調試入門篇的介紹,希望大家能夠掌握,下一篇我們將通過一些具體的案例,示意各個指令的使用場景。

 

周國慶

2020/6/27

 

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

【其他文章推薦】

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

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

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

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

新北清潔公司,居家、辦公、裝潢細清專業服務

GCC編譯和鏈接過程

GCCGNU Compiler CollectionGNU編譯器套件),是由 GNU 開發的編程語言編譯器。它是以GPL許可證所發行的自由軟件,也是 GNU計劃的關鍵部分。GCC原本作為GNU操作系統的官方編譯器,現已被大多數類Unix操作系統(如LinuxBSDMac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows

 

一、源代碼

 

 

二、編譯過程

 

1)預處理:

 

 預處理就是將要包含(include)的文件插入原文件中、將宏定義展開、根據條件編譯命令選擇要使用的代碼,最後將這些代碼輸出到一個“.i”文件中等待進一步處理。

結果:見文件0617_Demo.i

 

 2)編譯

 

 

 編譯就是把C/C++代碼(比如上面的“.i”文件)“翻譯”成彙編代碼。

結果:見文件0617_Demo.s

 

 3)彙編

 

 

 紅色箭頭處的relocatable表示可重定位,也即是可以和庫等依賴文件鏈接。

彙編就是將第二步輸出的彙編代碼翻譯成符合一定格式的機器代碼,在Linux系統上一般表現位ELF目標文件(OBJ文件)

結果:見文件0617_Demo.o

 

 這個就是沒有連接的目標代碼,也是01序列,需要使用二進制查看器如Hex Editor Neo等查看。

 

4)鏈接

 

 鏈接就是將彙編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平台運行的可執行程序。如圖中紅色箭頭所示。

結果:見文件0617_Demo

 

 總結:在編譯過程中。除非使用了“-c”,“-S,“-E”選項(或者編譯錯誤阻止了完整的過程),否則統一完整鏈接步驟。

 

三、鏈接原理

gcc -c -o 0617_Demo.o 0617_Demo.c 不作最後一步鏈接,得到0617_Demo.o二進制OBJ文件

gcc -v -o 0617_Demo 0617_Demo.o 先看一下鏈接過程是怎樣的:

 

  

l  crt1.ocrti.ocrtbegin.ocrtend.ocrtn.ogcc加入的系統標準啟動文件,對於一般應用程序,這些啟動是必需的。

l  -lc:鏈接libc庫文件,其中libc庫文件中就實現了printf等函數。

 

 

 

 

 

GCC編譯和鏈接過程

 

GCCGNU Compiler CollectionGNU編譯器套件),是由 GNU 開發的編程語言編譯器。它是以GPL許可證所發行的自由軟件,也是 GNU計劃的關鍵部分。GCC原本作為GNU操作系統的官方編譯器,現已被大多數類Unix操作系統(如LinuxBSDMac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows

 

一、源代碼

 

二、編譯過程

1)預處理:

預處理就是將要包含(include)的文件插入原文件中、將宏定義展開、根據條件編譯命令選擇要使用的代碼,最後將這些代碼輸出到一個“.i”文件中等待進一步處理。

結果:見文件0617_Demo.i

 

2)編譯

編譯就是把C/C++代碼(比如上面的“.i”文件)“翻譯”成彙編代碼。

結果:見文件0617_Demo.s

 

3)彙編

紅色箭頭處的relocatable表示可重定位,也即是可以和庫等依賴文件鏈接。

彙編就是將第二步輸出的彙編代碼翻譯成符合一定格式的機器代碼,在Linux系統上一般表現位ELF目標文件(OBJ文件)

結果:見文件0617_Demo.o

這個就是沒有連接的目標代碼,也是01序列,需要使用二進制查看器如Hex Editor Neo等查看。

 

4)鏈接

鏈接就是將彙編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平台運行的可執行程序。如圖中紅色箭頭所示。

結果:見文件0617_Demo

 

總結:在編譯過程中。除非使用了“-c”,“-S,“-E”選項(或者編譯錯誤阻止了完整的過程),否則統一完整鏈接步驟。

 

三、鏈接原理

gcc -c -o 0617_Demo.o 0617_Demo.c 不作最後一步鏈接,得到0617_Demo.o二進制OBJ文件

gcc -v -o 0617_Demo 0617_Demo.o 先看一下鏈接過程是怎樣的:

 

l  crt1.ocrti.ocrtbegin.ocrtend.ocrtn.ogcc加入的系統標準啟動文件,對於一般應用程序,這些啟動是必需的。

l  -lc:鏈接libc庫文件,其中libc庫文件中就實現了printf等函數。

 

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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

當我們創建HashMap時,底層到底做了什麼?

jdk1.7中的底層實現過程(底層基於數組+鏈表)

在我們new HashMap()時,底層創建了默認長度為16的一維數組Entry[ ] table。當我們調用map.put(key1,value1)方法向HashMap里添加數據的時候:

首先,調用key1所在類的hashCode()計算key1的哈希值,通過key1的hash值與數組的最大索引進行位運算以後,得到了在 Entry數組中的存放位置:

如果此位置上的數據為空,此時的key1-value1添加成功。

如果此位置上的數據不為空(意味着此位置已經存在一個或多個數據),比較key1和已經存在的一個或多個數據的哈希值:

如果key1的哈希值與已經存在的數據的哈希值都不相同,此時key1-value1添加成功。

如果key1的哈希值與已經存在的數據的某一個數據的哈希值相同,繼續比較:調用key1所在類的equals()方法:

如果equals()返回false,此時key1-value1添加成功;

如果equals()返回true,使用value1替換value2。

需要注意的是,若原來位置已有數據,則此時key1-value1和原來的數據以鏈表的方式存儲。

在不斷的添加過程中,會涉及到擴容問題,當數組容量大於數組現有長度乘以加載因子(如16*0.75,默認的加載因子為0.75)的時候,就會進行數組擴容,以減少哈希衝突(哈希衝突是指哈希函數算出來的地址被別的元素佔用了),提高查詢效率。默認的擴容方式,擴容為原來容量的2倍,並將原有的數據複製過來。

jdk1.8的底層實現過程(底層基於數組+鏈表+紅黑樹)

jdk1.8與jdk1.7中底層的創建過程相似,但有不同,首先,new HashMap()底層沒有創建出一個長度為16的數組,在調用put()方法時,判斷數組是否存在,如果不存在創建長度為16的Node[ ]數組。接下來的過程與jdk1.7相似。最後,當某一個索引位置上的元素以鏈表形式存在的數據個數>8且當前數組的長度>64時,此時此索引位置上的所有數據改為使用紅黑樹存儲。

在jdk1.7中,即使在“數組容量大於數組現有長度乘以加載因子”時擴容,也不可避免地會有哈希衝突存在,因此,在jdk1.8中引入紅黑樹是為了進一步減少哈希衝突,提高查詢效率。

紅黑樹是一種自平衡的二叉查找樹,是一種數據結構,典型的用途是實現關聯數組。根節點必須是黑色,其他每個節點要麼是紅色,要麼是黑色。

結論:HashMap鍵是不能重複的,去除重複的條件是依賴鍵的hashCode方法和equals方法,如果鍵是自己的對象類型,必須要重寫hashCode方法和equals方法,否則,不能去除重複的鍵。

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

【其他文章推薦】

新北清潔公司,居家、辦公、裝潢細清專業服務

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

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

※超省錢租車方案

砍斷手臂、背刺 批評非法棕櫚油開發 兩名印尼記者身亡

環境資訊中心外電;姜唯 翻譯;林大利 審校;稿源:Mongabay

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

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

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心