前面的文章(飛槳paddlespeech語(yǔ)音喚醒推理C浮點(diǎn)實(shí)現(xiàn))講了飛槳paddlespeech語(yǔ)音喚醒推理的C浮點(diǎn)實(shí)現(xiàn)。但是嵌入式設(shè)備通常CPU頻率低和memory小,在嵌入式設(shè)備上要想流暢的運(yùn)行語(yǔ)音喚醒功能,通常用的是定點(diǎn)實(shí)現(xiàn)。于是我就在浮點(diǎn)實(shí)現(xiàn)(把卷積層和相應(yīng)的batchNormal層合并成一個(gè)卷積層)的基礎(chǔ)上做了定點(diǎn)實(shí)現(xiàn)。需要說(shuō)明的是目前完成的是16bit的定點(diǎn)實(shí)現(xiàn),后面會(huì)在此基礎(chǔ)上做8bit的定點(diǎn)實(shí)現(xiàn)。
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-589673.html
做定點(diǎn)實(shí)現(xiàn)主要包括兩部分工作,一是模型參數(shù)的量化和定Q格式等,二是基于Q格式的定點(diǎn)實(shí)現(xiàn)。關(guān)于模型參數(shù)的量化,我曾寫過相關(guān)的文章(深度學(xué)習(xí)中神經(jīng)網(wǎng)絡(luò)模型的量化),有興趣的可以去看看。我用的是對(duì)稱量化,這里簡(jiǎn)述一下這部分的工作。
?
1,? 在python下根據(jù)paddlepaddle提供的API(named_parameters)得到模型每層的參數(shù)(weight & bias),同時(shí)看每層的weight和bias的絕對(duì)值的最大值,從而確定參數(shù)的Q格式,再以這個(gè)Q格式對(duì)weight 和bias做量化。
?
2,? 在python下得到測(cè)試集里非常多個(gè)文件每層的輸入和輸出的絕對(duì)值的最大值,從而確定每層的輸入和輸出的Q格式。
?
至于代碼的定點(diǎn)化,主要包括如下幾點(diǎn):
?
1,? 卷積層的定點(diǎn)化
主要是做好乘累加以及輸出的移位和防飽和處理。在文章(深度學(xué)習(xí)中神經(jīng)網(wǎng)絡(luò)模型的量化)里有詳細(xì)描述,這里就不細(xì)講了。
?
2,? sigmoid的定點(diǎn)化
調(diào)研了一下,sigmoid的定點(diǎn)化主要用查表法來(lái)實(shí)現(xiàn)。Sigmoid(x)在x<=-8時(shí)近似為0,在x>=8時(shí)近似為1,因此做表時(shí)在[-8,8)之間就可以了。 若表中有256個(gè)值,則表中x的間隔是16/256 = 0.0625。表中第一個(gè)值對(duì)應(yīng)的是x=-8時(shí)sigmoid的值,第二個(gè)值對(duì)應(yīng)的是x=-7.9375(-8 + 0.0635 = -7.9375)時(shí)sigmoid的值,以此類推。Sigmoid輸出的取值范圍是(0,1),因此用的Q格式是Q0.15。例如當(dāng)x=0時(shí),sigmoid(0) = 0.5,表示成Q0.15格式是0x4000。當(dāng)x在[-8,8)范圍內(nèi)每隔0.0625的256個(gè)sigmoid值都算出來(lái)并換算成Q0.15格式,就得到表中的256個(gè)值了。
具體實(shí)現(xiàn)時(shí)參考率CMSIS_5的代碼,如下圖:
做表時(shí)把前128個(gè)值(x < 0時(shí)的)與后128個(gè)值(x>=0時(shí)的)做了位置上的互換。主要是因?yàn)樘幚頃r(shí)先對(duì)x定點(diǎn)化后的16位輸入值做右移8位處理,就變成了8位的值,再變成unsigned char(U8)用于做表的索引。 U8(0) = 0, U8(127) = 127, 但U8(-128) = 128, U8(-127) = 129, ……, U8(-1) = 255。所以表中的位置前后部分就互換了。再看sigmoid層的輸入與sigmoid函數(shù)的輸入的關(guān)系。 假設(shè)sigmoid函數(shù)輸入的16位定點(diǎn)值為0x1869,右移8位后為0x18,即為24。表中第24個(gè)代表的是x=1.5(24 * 0.0675 = 1.5)時(shí)的sigmoid值。我的sigmoid層的輸入Q格式是Q7.8, 1.5用Q7.8表示就是0x0180, 而函數(shù)中要求的是0x18XX,所以需要把層的輸入的值做左移4位處理。由于sigmoid函數(shù)只對(duì)[-8,8)內(nèi)的值做處理,因此首先需要對(duì)層的輸入值做[-8,8)的限幅處理。上面兩步的代碼如下圖:
調(diào)sigmoid_q15()時(shí)把int_width設(shè)成3,就表示輸入范圍是[-8,8)。 由于輸入的x值不一定正好落在表中的那些點(diǎn)上,如x = 0.0325就落在點(diǎn)0.0和點(diǎn)0.0625之間。 為了使sigmoid的輸出值更準(zhǔn)確,函數(shù)中用線性插值法求那些不落在點(diǎn)上的sigmoid值。我在文章(基于sinc的音頻重采樣(二):實(shí)現(xiàn))中講過線性插值法,有興趣的可以去看看。要想sigmoid的輸出值更準(zhǔn)確,還可以擴(kuò)大表里值的個(gè)數(shù),比如變成512個(gè)值,代價(jià)是多用些memory。
?
3,? 確定好評(píng)估的指標(biāo)
我在文章(深度學(xué)習(xí)中神經(jīng)網(wǎng)絡(luò)模型的量化)中對(duì)評(píng)估指標(biāo)有所描述。這里我選用的是歐氏距離(Euclidean Distance)。具體調(diào)試時(shí)浮點(diǎn)實(shí)現(xiàn)和定點(diǎn)實(shí)現(xiàn)并行運(yùn)行。即算出的浮點(diǎn)的fbank值作為浮點(diǎn)實(shí)現(xiàn)模型的輸入,將浮點(diǎn)的Fbank值根據(jù)定標(biāo)轉(zhuǎn)換成定點(diǎn)值作為定點(diǎn)實(shí)現(xiàn)模型的輸入,然后每層的浮點(diǎn)實(shí)現(xiàn)和定點(diǎn)實(shí)現(xiàn)并行運(yùn)行。浮點(diǎn)實(shí)現(xiàn)得到的結(jié)果是浮點(diǎn)值,定點(diǎn)實(shí)現(xiàn)得到的結(jié)果是定點(diǎn)值,再根據(jù)輸出的Q格式轉(zhuǎn)換成浮點(diǎn)值。最后再用歐氏距離對(duì)輸出結(jié)果進(jìn)行評(píng)估。下圖給出了某一depthwise卷積層的實(shí)現(xiàn)代碼。先做浮點(diǎn)的卷積層運(yùn)算,結(jié)果保存在fbankFloat里,然后做定點(diǎn)的卷積層運(yùn)算,結(jié)果保存在fbankFix里,再根據(jù)輸出的Q格式將fbankFix轉(zhuǎn)換成浮點(diǎn)值,最后算歐氏距離。歐氏距離越小越好。
下圖給出了調(diào)試好后部分層的歐氏距離的值,都是很小的(圖中0/1/2等表示卷積層ID)。
?
4,如何調(diào)試
模型定點(diǎn)化調(diào)試時(shí)要從第一層到最后一層一層一層的調(diào)試,只有當(dāng)上一層的歐氏距離達(dá)標(biāo)后再去調(diào)下一層。具體到調(diào)試某一層時(shí),通過log找到那些浮點(diǎn)值與定點(diǎn)轉(zhuǎn)浮點(diǎn)后的值差值較大的值,再到浮點(diǎn)實(shí)現(xiàn)和定點(diǎn)實(shí)現(xiàn)里打印出輸入和運(yùn)算后的具體值,分析具體原因。有可能是定點(diǎn)實(shí)現(xiàn)里移位防飽和等沒做好,也有可能是參數(shù)量化沒作對(duì),還有可能是輸入和輸出的Q格式?jīng)]定好導(dǎo)致誤差偏大等。在定輸入和輸出的Q格式時(shí),是根據(jù)絕對(duì)值的最大值來(lái)的。如果發(fā)現(xiàn)精度不夠,有可能需要調(diào)整輸入或輸出的Q格式(小數(shù)位要多一位,依據(jù)是看超出定標(biāo)最大值出現(xiàn)的次數(shù),次數(shù)占比較小就可以)。
?
調(diào)試時(shí)是用一個(gè)音頻文件去調(diào)。等模型調(diào)試完成后要在一個(gè)大的數(shù)據(jù)集上對(duì)定點(diǎn)實(shí)現(xiàn)做全面的評(píng)估,看喚醒率和誤喚醒率的變化。我做完定點(diǎn)實(shí)現(xiàn)后在一個(gè)有兩萬(wàn)五千多音頻文件的數(shù)據(jù)集上做評(píng)估,跟浮點(diǎn)實(shí)現(xiàn)比,喚醒率下降了0.2%,誤喚醒率上升了0.3%。說(shuō)明定點(diǎn)化后性能沒有出現(xiàn)明顯的下降。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-589673.html
到了這里,關(guān)于飛槳paddlespeech語(yǔ)音喚醒推理C定點(diǎn)實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!